Category: Security, Identity, & Compliance*


IPv6 サポートの更新 – CloudFront、WAF、S3 Transfer Acceleration

先日のブログ「Amazon S3 で IPv6 をサポート」の続報として、今回は Amazon CloudFrontAmazon S3 Transfer AccelerationAWS WAF と 50 か所以上に渡るすべての CloudFront エッジロケーションでも IPv6 サポートが利用可能になったことをお知らせします。AWS では、すべての自律システムネットワーク (ASN) で IPv6 を有効にするための段階的な移行プロセスを本日より開始し、今後数週間に渡りすべてのネットワークで拡張する予定です。

CloudFront IPv6 のサポート
Amazon CloudFront ディストリビューションごとに IPv6 サポートを有効にすることができます。IPv6 を使用して CloudFront エッジロケーションに接続する閲覧者とネットワークは自動的に IPv6 でコンテンツを取得します。IPv4 を使用して接続する場合は以前のように機能します。オリジンサーバーへの接続には IPv4 を使用します。

新たに作成したディストリビューションでは自動的に IPv6 が有効になります。既存のディストリビューションを変更するには [Enable IPv6] を有効にします。これはコンソールまたは CloudFront API から設定できます。

この新機能の重要事項については次をご覧ください。

  • エイリアスレコード – ディストリビューションで IPv6 サポートを有効にすると、ディストリビューションの DNS エントリは AAAA レコードを含むものに更新されます。Amazon Route 53 とエイリアスレコードを使用してディストリビューションのドメインすべてまたは一部をマップしている場合、そのドメインに AAAA エイリアスを追加する必要があります。
  • ログファイルCloudFront アクセスログを有効にしている場合、IPv6 アドレスが c-ip フィールドで表示されるので、ログ処理システムがそれに対処できるようにしておいてください。
  • 信頼された署名者信頼された署名者と IP アドレスのホワイトリストを併せて使用している場合は、IP ホワイトリストと実際のコンテンツの IPv4/IPv6 ディストリビューションを備える、信頼された署名者 URL の IPv4 に限られたディストリビューションの使用を強くお勧めします。このモデルでは、IPv4 アドレスを使用して送信した署名リクエストにサインしたことで、コンテンツのリクエストがホワイトリストに載っていない別の IPv6 アドレスから届くといった問題を回避することができます。
  • CloudFormation – CloudFormation サポートを準備中今回のリリースでは、CloudFormation テンプレートから作成したディストリビューションで IPv6 は有効になりません。既存のスタックを更新する場合、スタックで参照したディストリビューションの設定に変更はありません。
  • AWS WAFAWS WAF と CloudFront を併せて使用している場合は、IPv6 アドレスのホワイトリストまたはブラックリストで適切となるように WebACL と IP ルールセットを必ず更新してください。
  • Forwarded ヘッダー – ディストリビューションで IPv6 を有効にする場合は、オリジンに渡した X-Forwarded-For ヘッダーに IPv6 アドレスが含まれているようにしてください。オリジンがこの形式のヘッダーを処理できるか確認してください。

詳しくは「Amazon CloudFront で IPv6 をサポート」をご覧ください。

AWS WAF IPv6 サポート
AWS WAF はアプリケーションレイヤーで発生する攻撃からアプリケーションを保護します (詳しくは「新機能 – AWS WAF」をご覧ください)。

AWS WAF が IPv4 アドレスまたは IPv6 アドレス経由で届くリクエストを調べられるようになりました。IPv6 と一致するウェブ ACL を作成することができます。詳しくは「IP Match Conditions の使用」をご覧ください。

既存の WAF 機能はすべて IPv6 に対応、そのパフォーマンスで目に見える変化はありません。IPv6 は WAF が収集し表示したサンプルリクエストで表示されます。

S3 Transfer Acceleration IPv6 サポート
この重要で新しい S3 機能が IPv6 をサポートするようになりました (詳しくは「AWS ストレージの更新 – Amazon S3 Transfer Acceleration + より多くのリージョンでさらに大きくなった Snowballs」をご覧ください)。アップロードに使用できるデュアルスタックのエンドポイントに簡単に切り替えることができます。次のように変更するだけです。

https://BUCKET.s3-accelerate.amazonaws.com

https://BUCKET.s3-accelerate.dualstack.amazonaws.com

クライアントオブジェクトの作成とデュアルスタック転送の有効を可能にする AWS SDK for Java 使用コードは次の通りです。

AmazonS3Client s3 = new AmazonS3Client();
s3.setS3ClientOptions(S3ClientOptions.builder().enableDualstack().setAccelerateModeEnabled(true).build());

大半のアプリケーションとネットワークスタックは自動的に IPv6 の使用を好む傾向があるので、これ以上の設定は必要ありません。IPv6 アドレスと併せて使用する上で機能動作に問題がないことを確認するため、パケットの IAM ポリシーを見直すことをお勧めします。詳しくは「IPv6 を使用して Amazon S3 にリクエストを送信」をご覧ください。

テストを忘れずに
AWS リージョンへの IPv6 接続に制限があったり存在しない場合は、代わりに IPv4 が使用されます。以前公開したブログでも触れましたが、IPv6 をサポートするようにクライアントシステムを設定することができます。ただし、その場合は IPv6 パケットをインターネットにルートするように設定していないネットワークに接続する必要があります。こうした理由から、IPv6 に切り替える前に何らかのアプリケーションレベルで行うエンドツーエンド接続のテストを行うことをお勧めします。

Jeff;

新発表 – AWS Key Management ServiceでのBring Your Own Keys機能

AWS Key Management Service (KMS) は暗号鍵のシームレスな中央集中管理を提供します。私達のお客様は、鍵管理インフラストラクチャ(KMI)に関する、可用性、スケーラビリティ、物理的なセキュリティ、ハードウェアメンテナンスを自動的にハンドルするこのフルマネージドなサービスをとても気に入っています。また、KMSは、作成、ローテーション、ライフサイクル管理機能を持つ一つのダッシュボードで鍵管理を集中化します。初期費用無し、カスタマーマスターキー(CMK)1つ当たり月額$1の利用価格をベースとして、KMSは、S3, EBS, RDS, Redshift, およびその他のKMSとインテグレートされたAWSサービス内に保管されたデータを容易に暗号化することが出来ます。

多くのAWSのお客様は、鍵を作成して管理するのにKMSを利用しています。しかしながら、KMSが提供するその他の機能を活用しながら、鍵に対するローカルコントロールを維持したいというお客様がいらっしゃいます。お客様は私たちに、世代や鍵の保管場所に関するローカルコントロールは、よりセンシティブなワークロードをクラウドで稼働させるためのセキュリティとコンプライアンス要求を満たすのに役立つと仰っています。

Bring Your Own Keys 
このような重要なユースケースをサポートするために、本日、KMSにユーザー独自の鍵を持ち込むことが可能になったことを発表できることを嬉しく思います。この機能により、極めてセンシティブなワークロードが保護でき、AWSの外に鍵のセキュアなコピーを保持することが可能になります。この新しい機能により、RSA PKCS #1標準をサポートする全ての鍵管理およびHSM(Hardware Security Module)ソリューションからの鍵のインポートが可能になり、その鍵をAWSサービスおよびアプリケーションから利用することが可能になります。また、KMSは詳細な監査情報を提供するためにAWS CloudTrailと協調して動きます。全てをまとめると、高可用性を提供するためにAWSを利用すれば、鍵のライフサイクルと耐久性に強大なコントロールを得ることができます。今日のほとんどの鍵管理ソリューションはHSMをバックエンドに使っていますが、全てのHSMが鍵管理ソリューションを提供するわけでは有りません。

インポートプロセスは、AWSマネージメントコンソールを使う,  AWS CLIを使う,  あるいは KMS APIをコールすることによって開始できます。オープンな環境に秘密鍵を転送させないために、インポートプロセスでは、アカウントにユニークな、KMSによって提供される公開鍵を使って、事前にユーザーのKMIの鍵をラップすることが求められます。鍵をラップするために、PKCS #1 スキームを利用することができます。

私は、Importing Key Material in AWS Key Management Serviceの指示に従って、KMSコンソールでCreate keyをクリックすることから始めます:


エイリアスと説明を入力し、外部(External)を選択し、“I understand…”チェックボックスにチェックを付けました:


それから、鍵管理のためのKMS APIを許可するIAMユーザーのセットを選びます。(このステップは、次に行うようにKMSおよび外部キーの両方に適用されます。):


次に、鍵を使ってデータの暗号化/復号化ができるIAMユーザーのセットを選択します:


キーポリシーを確認し、ラッピングキーとインポートトークンをダウンロードしました。ラッピングキーは、私がKMSにインポートして使おうとしている256bitの秘密鍵を暗号化するのに利用する2048bitのRSA公開鍵です。インポートトークンは、私の鍵をKMSに正しくインポートさせるためのメタデータを含んでいます。


ZIPファイルを展開し、ラッピングキーを私のEC2インスタンス上のディレクトリ上に配置しました。それから、opensslコマンドを2度使いました:一度目は秘密鍵を生成するためで、2度目はその秘密鍵をラッピングキーでラップするためです。インポートする256bit鍵を生成するためにopensslを便利な方法で利用している事に注目してください。本番データ用としては、鍵の生成と保管にもっとセキュアな方法(商用の鍵管理やHSMソリューションが望ましい)を利用すべきです。

$ openssl rand -out plain_text_aes_key.bin 32
$ openssl rsautl -encrypt -in plain_text_aes_key.bin -oaep \
-inkey wrappingKey_fcb572d3-6680-449c-91ab-ac3a5c07dc09_0804104355 \
-pubin -keyform DER -out enc.aes.key

最後に、“I am ready to upload…”をチェックしてNextをクリックし、鍵の有効期限と共に鍵マテリアルを指定して、全ての情報が集まります。有効期限を過ぎた後はAWSから利用できなくなるので、要件がはっきりするまで有効期限無しのオプションを選択したいと考えるかもしれません。いつでも同じ鍵を再インポートして、有効期限を後からリセットすることができます。


Finishをクリックして、鍵が有効化され利用できるようになりました:

これが私がやらなければいけなかったことの全てです!

私は鍵の有効期限を設定したので、KMSは自動的に鍵の有効期限までの残り時間を追跡するためのCloudWatchメトリックを生成しました。このメトリックに対して、有効期限に近づいた時に鍵を再インポートするためのリマインダーとしてCloudWatchアラームを作成することが可能です。鍵が有効期限切れになったら、CloudWatchイベントが生成されます。これを利用してプログラマティックにアクションを取る事もできます。

Available Now

この新しい機能は、AWS GovCloud (US)および、中国(Beijing)を除く全てのコマーシャルAWSリ―ジョンでご利用可能です。本日から使いはじめることが出来ます。

Jeff;(翻訳はSA布目が担当しました。原文はこちら)

Amazon Inspector でセキュリティ脆弱性テストを拡大

私の同僚である Eric Fitzgerald による次の記事は、AWS Lambda 関数を使用して Amazon Inspector による評価結果をお客様のチケット発行システムやワークフローシステムに転送する方法についてご説明しています。


Jeff


AWS Re:Invent 2015 にて、セキュリティ脆弱性評価サービスの Amazon Inspector をご紹介しました。同サービスは、お客様が早期かつ頻繁にセキュリティ脆弱性テストを実施できるようにサポートするものです。Amazon Inspector をご利用いただくと、お客様は開発環境、テスト環境、実稼働環境でセキュリティテストを自動化することができます。セキュリティ脆弱性をソフトウェア開発、デプロイ、運用ライフサイクル全体の一部として識別します。Amazon Inspector の自動セキュリティテストは、お客様から非常に高く評価されています。Amazon InspectorAnalyze Application Security により、セキュリティ評価を今まで以上に頻繁に実行できるようになったほか、以前に比べセキュリティ脆弱性の早期発見に繋がったと報告を受けています。けれども、セキュリティ脆弱性を識別するだけでは完全といえません。脆弱性を発見したら問題を修正する必要があります。多くのお客様は Amazon Inspector による評価結果に対応するためのワークフローを自動化そして加速するために、Amazon Inspector を自社のワークフローシステムやチケット発行システムと統合しています。Amazon Inspector はそうしたポイントを念頭にを設計しているので、Amazon Inspector による評価結果をメールやワークフローシステムまたはチケット発行システムで統合する方法のひとつを詳しくご説明することにいたしました。

AWS Lambda を使用して Amazon Inspector による評価結果をチケット発行システムにプッシュする
この例では AWS Lambda 関数を使用して、メール経由で作成するインシデントに対応できるシステムに Amazon Inspector を接続します。イベントのフローは次のとおりです。

  1. Amazon Inspector が実行しセキュリティ評価を行います。実行終了前に Amazon Simple Notification Service (SNS) トピックへメッセージを送信します。
  2. SNS メッセージが Lambda 関数を呼び出します。
  3. 関数がセキュリティ評価から結果を取得します。
  4. 別の SNS トピックを使用してフォーマットした評価結果をメールで送信します。

途中、この関数は宛先トピックを作成し、必要であればサブスクリプションをメールで送信します。

関数を設定する
Amazon Inspector からの評価を実行する AWS リージョンで、この関数を設定してください。複数のリージョンで Amazon Inspector を実行している場合は、各リージョンで同じステップを繰り返してください。ステップは次のとおりです。

  1. Amazon Inspector の SNS トピックを作成します。
  2. Amazon Inspector を設定して、新しく作成したトピックに評価結果を送信します。
  3. 評価結果を取得、フォーマット、メールで送信できるように Lambda 関数を設定します。

SNS トピックを設定する
まず、新しい結果報告がある場合に Amazon Inspector が通知する Amazon SNS トピックを設定します。Amazon SNS トピックがフォーマットした後、他のシステムにメールで評価結果を送信します。Amazon SNS コンソールにアクセスして新しい Amazon SNS トピックを作成します。このトピックが Amazon Inspector 通知の送信先になります。トピック名はお好きなものをお選びください。次のポリシーをトピックに指定します。トピックを選択してから [Other topic actions] をクリックし [Edit topic policy] を選択してください。アドバンスビューで既存のポリシーテキストを次のポリシーに置き換えます。

{
  "Version": "2008-10-17",
  "Id": "inspector-sns-publish-policy",
  "Statement": [
    {
      "Sid": "inspector-sns-publish-statement",
      "Effect": "Allow",
      "Principal": {
        "Service": "inspector.amazonaws.com"
      },
      "Action": "SNS:Publish",
      "Resource": "arn:aws:sns:*"
    }
  ]
}

AWS Identity and Access Management (IAM) ポリシーに詳しい方は、ポリシーの Resource の値が Amazon SNS トピックの ARN と同じになるように変更すると Amazon Inspector を制限することが可能になり、このトピックに対してのみ発行することができるので、セキュリティの視点からもこれがベストプラクティスになります。Amazon Inspector を設定する
Amazon Inspector コンソールにアクセスし、評価テンプレートのページで外部システムに送信したい評価結果の評価テンプレートを選択します。その行を展開すると SNS トピックのセクションが表示されます。Amazon SNS トピックの左側にある鉛筆アイコンをクリックすると、ドロップダウンリストから先ほど作成したばかりの Amazon SNS トピックを選択することができます。トピックを選択したら [Save] をクリックしてください。

Lambda 関数を設定する
Lambda コンソールにアクセスし SNS-message-python 設計図を使用して新しい関数を作成します。

イベントソースの SNS を選択してから、ステップ 1 で作成した SNS トピックを選びます。

関数の設定を完了するには [Next] をクリックしてください。関数の名前と説明を入力し、Python 2.7 runtime を選択して関数のサンプルコードを次のコードに置き換えます。

from __future__ import print_function
import boto3
import json
import datetime
 
sns = boto3.client('sns')
inspector = boto3.client('inspector')
 
# SNS topic - will be created if it does not already exist
SNS_TOPIC = "Inspector-Finding-Delivery"
 
# Destination email - will be subscribed to the SNS topic if not already
DEST_EMAIL_ADDR = "eric@example.com"
 
# quick function to handle datetime serialization problems
enco = lambda obj: (
    obj.isoformat()
    if isinstance(obj, datetime.datetime)
    or isinstance(obj, datetime.date)
    else None
)
 
def lambda_handler(event, context):
 
    # extract the message that Inspector sent via SNS
    message = event['Records'][0]['Sns']['Message']
 
    # get inspector notification type
    notificationType = json.loads(message)['event']
 
    # skip everything except report_finding notifications
    if notificationType != "FINDING_REPORTED":
        print('Skipping notification that is not a new finding: ' + notificationType)
        return 1
   
    # extract finding ARN
    findingArn = json.loads(message)['finding']
 
    # get finding and extract detail
    response = inspector.describe_findings(findingArns = [ findingArn ], locale='EN_US')
    print(response)
    try:
        finding = response['findings'][0]
    except OSError as err:
        print("OS error: {0}".format(err))
    except:
        print("Unexpected error:", sys.exc_info()[0])
        raise
       
    # skip uninteresting findings
    title = finding['title']
    if title == "Unsupported Operating System or Version":
        print('Skipping finding: ', title)
        return 1
       
    if title == "No potential security issues found":
        print('Skipping finding: ', title)
        return 1
   
    # get the information to send via email
    subject = title[:100] # truncate @ 100 chars, SNS subject limit
    messageBody = "Title:\n" + title + "\n\nDescription:\n" + finding['description'] + "\n\nRecommendation:\n" + finding['recommendation']
   
    # un-comment the following line to dump the entire finding as raw json
    # messageBody = json.dumps(finding, default=enco, indent=2)
 
    # create SNS topic if necessary
    response = sns.create_topic(Name = SNS_TOPIC)
    snsTopicArn = response['TopicArn']
 
    # check to see if the subscription already exists
    subscribed = False
    response = sns.list_subscriptions_by_topic( TopicArn = snsTopicArn )
 
    # iterate through subscriptions array in paginated list API call
    while True:
        for subscription in response['Subscriptions']:
            if ( subscription['Endpoint'] == DEST_EMAIL_ADDR ):
                subscribed = True
                break
       
        if 'NextToken' not in response:
            break
       
        response = sns.list_subscriptions_by_topic(
            TopicArn = snsTopicArn,
            NextToken = response['NextToken']
            )
       
    # create subscription if necessary
    if ( subscribed == False ):
        response = sns.subscribe(
            TopicArn = snsTopicArn,
            Protocol = 'email',
            Endpoint = DEST_EMAIL_ADDR
            )
 
    # publish notification to topic
    response = sns.publish(
        TopicArn = snsTopicArn,
        Message = messageBody,
        Subject = subject
        )
 
    return 0

次の [ DEST_EMAIL_ADDR ] の値を必ず編集してください。次にインシデント管理システムにインシデントを送信する時に使用するメールアドレスを入力します。オプションとして、 Amazon Inspector が評価結果を送信する時に使用する SNS トピックの名前を変更することもできます。ハンドラー関数 (lambda_function.lambda_handler) はそのままにし、関数に名前を指定します。

Role のドロップダウンリストから [*Basic execution role] を選択します。Lambda が新しいページにアクセスしたら、ポリシードキュメントを表示して代わりに次を使用してください。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": "arn:aws:logs:*:*:*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "inspector:DescribeFindings",
                "SNS:CreateTopic",
                "SNS:Subscribe",
                "SNS:ListSubscriptionsByTopic",
                "SNS:Publish"
            ],
            "Resource": "*"
        }
    ]
}

[Allow] ボタンをクリックしロールを作成したら AWS Lambda に戻り、高度な設定はそのままにしておきます。Review ページで [Enable event source] を必ずクリックしてください。

[Create function] をクリックして関数を保存します。これでステップが完了しました。

準備完了
評価結果を別のシステムに送信する場合は、評価テンプレートに最初の Amazon SNS トピック (ここで紹介した手順で作成したもの) を追加し、新しい評価結果レポートがそのトピックに公開されるよう選択されていることを確認します。最初に評価を実行すると、Amazon Inspector が新しい評価結果について Lambda に通知します。作成した Lambda 関数が SNS トピックを作成し (まだ存在しない場合)、そのトピックに宛先のメールアドレスを受信登録して (登録されていない場合)、そのアドレスにメールで評価結果を送信します。Lambda がメールアドレスをそのトピックに受信登録する必要があった場合は、受信登録の希望を確認するためのリンクが含まれたメールが 1 件届きます。このリンクをクリックして確認すると、Amazon Inspector がそのメールアドレスに評価結果を送信します。Atlassian の Jira Service Desk に接続する手順は、非常に簡単になります。Jira ServiceDesk で、Customer Channels にアクセスします。メールを受信し、新しい問題を作成できるメールアドレスが表示されます。Lambda 関数の Python スクリプトにそのメールアドレスを入力します。このメールアドレスに Inspector から評価結果が送信されます。ServiceDesk によってこれらの問題が自動的に ServiceDesk 問題に変えられるため、ここでワークフローを管理できます。

最新情報
Amazon Inspector をご利用いただき、ありがとうございます。今後の最新情報にご期待ください。

Eric Fitzgerald、Principal Security Engineer