目次

クロスリージョン検索またはクロスアカウント検索を設定する

AWSリージョンにアカウントScanner Stackをデプロイしたら、クロスリージョンScannerを許可するようにAmazon EventBridgeを設定する必要があります。

デプロイされたアカウント検索Scanner Stackでは、EnableCrossAccountScanningパラメータが「true」に設定されている必要があります。

AWS Web Management Consoleを使用する

地域ごと

S3 Object Createdイベントを、アカウントScanner StackがデプロイされたリージョンのEventBridgeバスに送信するルールを作成します。

  1. Amazon EventBridgeコンソールを開きます。

  2. [ルール] に移動し、[作成] をクリックします。

  3. ルールに名前を付け、[イベントパターンタイプのRule] を選択します。 [次へ] をクリックします。

  4. [イベントソース] で [ AWSイベントまたはEventBridgeパートナーイベント] を選択します。

  5. [イベントパターン] パネルまで下にスクロールします。次のように選択します:

    • [イベントソース] にはAWS のサービス
    • AWSサービスにはSimple Storage Service (S3)
    • [イベントの種類] にはAmazon S3 イベント通知
    • 特定のイベント
    • Object Createdイベント
  6. [次へ] をクリックします。

  7. [対象の種類] で [ EventBridgeイベントバス]を選択し、[対象の種類] で [別のアカウントのイベントバスまたはリージョン] を選択します。アカウントScanner Stackがデプロイされたリージョンの初期設定のEventBridgeバスのARNを入力します。

  8. [次へ] をクリックします。

  9. (オプション) この新しいルールのタグを設定し、[次へ] をクリックします。

  10. ルール設定を確認し、[ルールの作成] をクリックします。

バケットごと

[このバケット内のすべてのイベントについてAmazon EventBridgeに通知を送信する] 機能をオンにして、アカウントScanner StackでScannerのLambda関数をトリガーします。

  1. 追加するS3バケットで、[プロパティ] タブに移動し、[ Amazon EventBridge ] パネルまでスクロールします。 [編集] をクリックします。

  2. この機能をオンにして、[変更の保存] をクリックします。

  3. アカウントScanner Stackによるオブジェクトの検索とタグ付けを許可するようにバケットポリシーを設定します。

    S3バケットがアカウントScanner Stackと同じAWSアカウントにある場合は、この手順を省略できます。

  4. [権限] タブに移動し、[バケットポリシー] パネルで [編集] をクリックします。

  5. 以下のJSONを貼り付け、正しいARNとバケット名を入力します。 [変更を保存] をクリックします。


{
   "Version": "2012-10-17",
   "Statement": [
      {
         "Sid": "AllowScannerToScanFile",
         "Effect": "Allow",
         "Principal": {
            "AWS": "<SCANNER_LAMBDA_EXECUTION_ROLE>"
         },
         "Action": "s3:GetObject",
         "Resource": "arn:aws:s3:::/*"
      },
      {
         "Sid": "AllowPostScanActionLambdaToTagResult",
         "Effect": "Allow",
         "Principal": {
            "AWS": "<POST_SCAN_ACTION_LAMBDA_EXECUTION_ROLE>"
         },
         "Action": "s3:PutObjectTagging",
         "Resource": "arn:aws:s3:::/*"
      },
      {
         "Sid": "PostScanActionLambdaQuarantineRequire-1",
         "Effect": "Allow",
         "Principal": {
            "AWS": "<POST_SCAN_ACTION_LAMBDA_EXECUTION_ROLE>"
         },
         "Action": "s3:GetObject",
         "Resource": "arn:aws:s3:::/*"
      },
      {
         "Sid": "PostScanActionLambdaQuarantineRequire-2",
         "Effect": "Allow",
         "Principal": {
            "AWS": "<POST_SCAN_ACTION_LAMBDA_EXECUTION_ROLE>"
         },
         "Action": "s3:GetObjectTagging",
         "Resource": "arn:aws:s3:::/*"
      },
      {
         "Sid": "PostScanActionLambdaQuarantineRequire-3",
         "Effect": "Allow",
         "Principal": {
            "AWS": "<POST_SCAN_ACTION_LAMBDA_EXECUTION_ROLE>"
         },
         "Action": "s3:DeleteObject",
         "Resource": "arn:aws:s3:::/*"
      }
   ]
}

ここで:

  • SCANNER_LAMBDA_EXECUTION_ROLEは、アカウントScanner Stack内のScannerLambda関数のARNに置き換えられます。
  • POST_SCAN_ACTION_LAMBDA_EXECUTION_ROLEは、アカウントScanner Stackの検索後処理のLambda関数のARNに置き換えられます。 BUCKET_NAMEは、検索バケットの名前に置き換えられます。

いくつかのファイルをアップロードして検索結果を表示することで、Scannerをテストできます。

AWS CLIを使用する

地域ごと

IAMロールと、アカウントScanner StackがデプロイされたリージョンのEventBridgeバスにS3 Object Createdイベントを送信するルールを作成する必要があります。

1. ルールの呼び出しに使用するIAMロールを作成します。


aws iam create-role --role-name  --assume-role-policy-document "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":{\"Service\": \"events.amazonaws.com\"},\"Action\":\"sts:AssumeRole\"}]}"

aws iam put-role-policy --role-name  --policy-name  --policy-document "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Action\":[\"events:PutEvents\"],\"Resource\":[\"\"]}]}"

ここで:

  • ROLE_FOR_EVENT_BRIDGE_RULEは、新しいIAMロールの名前に置き換えられます。任意の名前を使用できます。例: eventbridge-bus-forward-to-another-default-bus-role
  • POLICY_NAMEは、IAMポリシーの名前に置き換えられます。任意の名前を使用できます。例: policy-allow-eventbridge-bus-put-events
  • DEFAULT_EVENT_BRIDGE_BUS_ARN_IN_SCANNER_REGIONは、アカウントScanner StackのリージョンのデフォルトバスのARNに置き換えられます。

2. このリージョンのS3イベント通知を、アカウントScanner Stackがデプロイされているリージョンに転送するルールを作成します。

aws events put-rule --name <EVENT_BRIDGE_RULE_NAME> --event-pattern "{\"source\":[\"aws.s3\"],\"detail-type\":[\"Object Created\"]}"

aws events put-targets --rule <EVENT_BRIDGE_RULE_NAME> --targets "Id"="1","Arn"="<DEFAULT_EVENT_BRIDGE_BUS_ARN_IN_SCANNER_REGION>","RoleArn"="<ROLE_ARN_FOR_EVENT_BRIDGE_RULE>"

ここで:

  • EVENT_BRIDGE_RULE_NAMEは、新しいEventBridgeルールの名前に置き換えられます。任意の名前を使用できます。例: rule-to-forward-events-to-another-region

  • DEFAULT_EVENT_BRIDGE_BUS_ARN_IN_SCANNER_REGIONは、アカウントScanner StackのリージョンのデフォルトバスのARNに置き換えられます。

  • ROLE_FOR_EVENT_BRIDGE_RULEは、前の手順で作成したIAMロールの名前に置き換えられます。

バケットごと

1. [このバケット内のすべてのイベントについてAmazon EventBridgeに通知を送信する] をオンにして、アカウントのScanner StackでScannerのLambda関数をトリガーします。

aws s3api create-bucket --bucket <SCAN_BUCKET_NAME> --create-bucket-configuration LocationConstraint=<BUCKET_REGION>

aws s3api put-bucket-notification-configuration --bucket <SCAN_BUCKET_NAME> --notification-configuration='{ "EventBridgeConfiguration": {} }'

ここで:

  • SCAN_BUCKET_NAMEは、新しい検索バケットの名前に置き換えられます。任意の名前を使用できます。例: scan-bucket-in-us-east-1

  • BUCKET_REGIONはAWSリージョンの名前に置き換えられます。例: us-east-2

2. アカウントScanner Stackによるオブジェクトの検索とタグ付けを許可するようにバケットポリシーを設定します。

S3バケットがアカウントScanner Stackと同じAWSアカウントにある場合は、この手順を省略できます。

aws s3api put-bucket-policy --bucket <SCAN_BUCKET_NAME> --policy "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\": \"AllowScannerToScanFile\",\"Effect\": \"Allow\",\"Principal\": {\"AWS\": \"&lt;SCANNER_LAMBDA_EXECUTION_ROLE&gt;\"},\"Action\": \"s3:GetObject\",\"Resource\": \"arn:aws:s3:::<BUCKET_NAME>/*\"},{\"Sid\": \"AllowPostScanActionLambdaToTagResult\",\"Effect\": \"Allow\",\"Principal\": {\"AWS\": \"&lt;POST_SCAN_ACTION_LAMBDA_EXECUTION_ROLE&gt;\"},\"Action\": \"s3:PutObjectTagging\",\"Resource\": \"arn:aws:s3:::<BUCKET_NAME>/*\"},{\"Sid\": \"PostScanActionLambdaQuarantineRequire-1\",\"Effect\": \"Allow\",\"Principal\": {\"AWS\": \"&lt;POST_SCAN_ACTION_LAMBDA_EXECUTION_ROLE&gt;\"},\"Action\": \"s3:GetObject\",\"Resource\": \"arn:aws:s3:::<BUCKET_NAME>/*\"},{\"Sid\": \"PostScanActionLambdaQuarantineRequire-2\",\"Effect\": \"Allow\",\"Principal\": {\"AWS\": \"&lt;POST_SCAN_ACTION_LAMBDA_EXECUTION_ROLE&gt;\"},\"Action\": \"s3:GetObjectTagging\",\"Resource\": \"arn:aws:s3:::<BUCKET_NAME>/*\"},{\"Sid\": \"PostScanActionLambdaQuarantineRequire-3\",\"Effect\": \"Allow\",\"Principal\": {\"AWS\": \"&lt;POST_SCAN_ACTION_LAMBDA_EXECUTION_ROLE&gt;\"},\"Action\": \"s3:DeleteObject\",\"Resource\": \"arn:aws:s3:::<BUCKET_NAME>/*\"}]}"

ここで:

  • SCAN_BUCKET_NAMEは、前の手順で作成した検索バケットの名前に置き換えられます。
  • SCANNER_LAMBDA_EXECUTION_ROLEは、アカウントScanner Stack内のScannerLambda関数のARNに置き換えられます。
  • POST_SCAN_ACTION_LAMBDA_EXECUTION_ROLEは、アカウントScanner Stackの検索後処理のLambda関数のARNに置き換えられます。

サーバ側の暗号化を有効にする

アカウントScanner Stackとは別のAWSアカウントにAWS KMSキーをデプロイする場合にのみ、これらの手順が必要です。

SQSキューの場合

アカウントScanner StackでSQSキューのサーバ側の暗号化を有効にするには、AWSコンソールでSQSキューの暗号化に使用して、KMSキーのキーポリシーを更新する必要があります。

1. Scanner、scanner dead-letter、およびpost-scan-action dead-letter Lambda関数の実行ロールのARNを取得します。

aws cloudformation describe-stacks --stack-name <ACCOUNT_SCANNER_STACK_NAME> --query 'Stacks[*].Outputs[?OutputKey==ScannerExecutionRoleARN].OutputValue[]'

aws cloudformation describe-stacks --stack-name <ACCOUNT_SCANNER_STACK_NAME> --query 'Stacks[*].Outputs[?OutputKey==ScannerDeadLetterExecutionRoleARN].OutputValue[]'

aws cloudformation describe-stacks --stack-name <ACCOUNT_SCANNER_STACK_NAME> --query 'Stacks[*].Outputs[?OutputKey==PostScanActionDeadLetterExecutionRoleARN].OutputValue[]'

2. キーポリシーに2つのStatementオブジェクトを追加します。

{ "Sid": "Grant encrypt permission", "Effect": "Allow", "Principal": { "AWS": <ScannerExecutionRoleARN> }, "Action": [ "kms:Decrypt", "kms:GenerateDataKey" ], "Resource": "*" }

{ "Sid": "Grant decrypt permission", "Effect": "Allow", "Principal": { "AWS": [ <ScannerDeadLetterExecutionRoleARN>, <PostScanActionDeadLetterExecutionRoleARN> ] }, "Action": [ "kms:Decrypt" ], "Resource": "*" }

3. キーポリシーを更新します。

aws kms put-key-policy --policy-name key-policy --key-id <KMS_KEY_ID> --policy file://key_policy.json

SNSトピックスの場合

アカウントScanner StackでSNSトピックのサーバ側の暗号化を有効にするには、AWSコンソールでSNSトピックの暗号化に使用するKMSキーのキーポリシーを更新する必要があります。

1. Scanner、scanner dead-letter、およびpost-scan-action Lambda関数の実行ロールのARNを取得します。

aws cloudformation describe-stacks --stack-name <ACCOUNT_SCANNER_STACK_NAME> --query 'Stacks[*].Outputs[?OutputKey==ScannerExecutionRoleARN].OutputValue[]'

aws cloudformation describe-stacks --stack-name <ACCOUNT_SCANNER_STACK_NAME> --query 'Stacks[*].Outputs[?OutputKey==ScannerDeadLetterExecutionRoleARN].OutputValue[]'

aws cloudformation describe-stacks --stack-name <ACCOUNT_SCANNER_STACK_NAME> --query 'Stacks[*].Outputs[?OutputKey==PostScanActionExecutionRoleARN].OutputValue[]'

2. キーポリシーにStatementオブジェクトを1つ追加します。

{ "Sid": "Grant encrypt permission", "Effect": "Allow", "Principal": { "AWS": [ <ScannerExecutionRoleARN>, <ScannerDeadLetterExecutionRoleARN>, <PostScanActionExecutionRoleARN> ] }, "Action": [ "kms:Decrypt", "kms:GenerateDataKey" ], "Resource": "*" }

3. キーポリシーを更新します。

aws kms put-key-policy --policy-name key-policy --key-id <KMS_KEY_ID> --policy file://key_policy.json

バケット用

バケットのサーバ側の暗号化を有効にするには、AWSコンソールでバケットの暗号化に使用するKMSキーのキーポリシーを更新する必要があります。

1. Scanner、scanner dead-letter、およびpost-scan-action Lambda関数の実行ロールのARNを取得します。

aws cloudformation describe-stacks --stack-name <ACCOUNT_SCANNER_STACK_NAME> --query 'Stacks[*].Outputs[?OutputKey==ScannerExecutionRoleARN].OutputValue[]'

aws cloudformation describe-stacks --stack-name <ACCOUNT_SCANNER_STACK_NAME> --query 'Stacks[*].Outputs[?OutputKey==PostScanActionExecutionRoleARN].OutputValue[]'

2. キーポリシーにStatementオブジェクトを1つ追加します。

{ "Sid": "Grant encrypt permission", "Effect": "Allow", "Principal": { "AWS": [ , ] }, "Action": [ "kms:Decrypt" ], "Resource": "*" }

3. キーポリシーを更新します。

aws kms put-key-policy --policy-name key-policy --key-id <KMS_KEY_ID> --policy file://key_policy.json