はじめに
こんにちは、はやぴー(@HayaP)です。
複数のAWSアカウントを運用(マルチアカウント戦略)する組織は、近年増えてきました。
しかしながら、クロスアカウントでログをどう集約したら良いか、迷う事も多いと思います。
また、マルチアカウント管理のサービスであるAWS Control Towerは非常に便利ですが、自動で集約されるログは限られています。
例えば、脆弱性検査サービスであるAmazon Inspector検出結果ログは含まれておりません。
セキュリティ対策を考えると、脆弱性状況などの結果は管理され、(セキュリティチーム等が)定期的に検査する事が望まれます。
外部サービスとの連携要件もあるでしょう。
本記事では、脆弱性検査サービスであるAmazon Inspector検出結果をSecurityHubで集約し、
その結果をログ集約バケット(S3)に集約する方法を紹介します。
対象読者
- AWSを利用している企業や組織のクラウドエンジニア、システム管理者、セキュリティ担当者
- 複数のAWSアカウントを運用している企業や組織のアーキテクトや運用チーム
- Amazon InspectorやSecurityHubを利用して、セキュリティ対策を強化したい方
概要
TL;DR (忙しい人用)
- Inspector検出結果は、SecurityHubに転送できる(To 監査アカウント)
- SecurityHubを用いることで、全アカウントのInspector検出結果を監査アカウントに集約できる
- Amazon Inspectorの検出結果をトリガーとするEventBridgeルールを作成できる
- EventBridgeルールのターゲットを、Kinesis Data Firehoseに設定できる
- Kinesis Data Firehoseの転送先は、クロスアカウントのS3バケットを設定できる(To ログ集約アカウント)
目次
- システム概要
- マルチアカウント戦略
- ログ集約の流れ
- 各アカウントでAmazon Inspectorのセットアップ
- Amazon Inspectorエージェントのインストール
- Amazon Inspectorの設定
- Auditアカウントで全アカウントの検出結果をSecurityHubで集約
- SecurityHubの有効化
- Kinesis Data Firehoseを使ってクロスアカウントでLogArchiveアカウントのS3に集約
- LogArchiveアカウントでS3バケットの作成とバケットポリシーの設定
- IAMロールの作成とKinesis Data Firehoseへのアタッチ
- Kinesis Data Firehoseの作成
- EventBridgeルールの作成
- オブジェクトの確認
詳細
前提
リソースの構築、設定にはAWS CLI(v2)を使用します。
1. システム概要
1.1. マルチアカウント戦略
AWSのベストプラクティスである、AWS Control Tower参考に
下記アカウント構成とします。
- 管理アカウント
- ログ集約アカウント
- 監査アカウント
2. 各アカウントでAmazon Inspectorのセットアップ
Amazon Inspectorを利用するには、下記手順を実施します。
なお今回は、EC2サーバーのみを対象としますが、AWS Lambdaなども診断可能です。
詳細は公式ドキュメントを参照してください
2.1. Amazon Inspectorエージェントのインストール
EC2サーバーに、Inspectorエージェントをインストールする必要があります。
Amazon Linux 2の場合、以下のコマンドを実行してエージェントをインストールします。
sudo yum install -y amazon-inspector
他のオペレーティングシステムに対応するコマンドは、公式ドキュメントを参照してください。
2.2. Amazon Inspectorの設定
Amazon Inspectorの設定では、アセスメントターゲットとアセスメントテンプレートを作成します。
アセスメントターゲットは検査対象のリソースを定義し、アセスメントテンプレートは検査の設定を定義します。
リソースグループの作成
リソースグループは、検査対象のリソース(この場合はEC2インスタンス)を定義するために使用されます。
リソースグループを、タグを用いてグループ化することができます。
以下のコマンドを使用して、リソースグループを作成します。
aws inspector create-resource-group --tags Key=<key>,Value=<value>
"key"と"value"には、対象のEC2インスタンスに設定されているタグのキーと値を指定します。
アセスメントターゲットの作成
以下のコマンドを使用して、アセスメントターゲットを作成します。
aws inspector create-assessment-target --assessment-target-name <target-name> --resource-group-arn <resource-group-arn>
"target-name"には、アセスメントターゲットの名前を指定します。
"resource-group-arn"には、先ほど作成したリソースグループのARNを指定します。
ルールセットの選択
Amazon Inspectorでは、検査に使用するルールセットを選択する必要があります。
以下のコマンドを実行して、利用可能なルールセットをリストします。
aws inspector list-rules-packages
後ほど使用するので、ルールセットのARNをメモしておいてください。
アセスメントテンプレートの作成
アセスメントテンプレートでは、アセスメントターゲット、ルールセット、検査の期間を指定します。
以下のコマンドを使用して、アセスメントテンプレートを作成します。
aws inspector create-assessment-template --assessment-target-arn <target-arn> --assessment-template-name <template-name> --duration-in-seconds <duration> --rules-package-arns <rules-package-arn1> <rules-package-arn2> ...
"target-arn"には、先ほど作成したアセスメントターゲットのARNを指定します。
"template-name"には、アセスメントテンプレートの名前を指定します。
"duration" には、検査の期間を秒単位で指定します(最小1800秒)。
検査期間に応じて実行されるジョブ数が増減するため、利用コストに影響します。
"rules-package-arn1" "rules-package-arn2"には、先ほどリストしたルールセットのARNを指定します。
複数のルールセットがある場合は、スペースで区切って指定します。
アセスメントが完了すると、検出結果がAmazon Inspectorで確認できます。
3. Auditアカウントで全アカウントの検出結果をSecurityHubで集約
Amazon Inspector の検出結果を Audit アカウントに集約するには、AWS Security Hub を使用することで実現できます。
以下の手順で、各アカウントのSecurityHubをAudit アカウントに集約します。
3.1 SecurityHubの有効化
AuditアカウントでSecurityHubを有効化
SecurityHubを"enable"(有効化)します。
aws securityhub enable-security-hub
個別アカウントでSecurityHubを有効化し、Auditアカウントと連携
下記を実行します。
aws securityhub enable-security-hub
aws securityhub create-members --account-details AccountId=<audit-account-id>,Email=<audit-account-email>
aws securityhub invite-members --account-ids <audit-account-id>
正常に完了すると、監査アカウントのSecurity hubに他アカウントのデータが集約されます。
4. Kinesis Data Firehoseを使ってクロスアカウントでLogArchiveアカウントのS3に集約
Kinesis Data Firehoseを用いて、AuditアカウントからLogArchiveアカウントのS3バケットに検出結果を集約する方法を説明します。
4.1. LogArchiveアカウントのS3バケット作成とバケットポリシー設定
LogArchiveアカウントでS3バケットを作成し、バケットポリシーを設定してAuditアカウントからのアクセスを許可します。
S3バケットを作成するには、以下のコマンドを実行してください。
aws s3api create-bucket --bucket <your-bucket-name> --region <your-region> --create-bucket-configuration LocationConstraint=<your-region>
次に、バケットポリシーを作成します。
jsonファイルを作成してください。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<YourAuditAccountID>:root"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::<YourBucketName>/*"
}
]
}
作成したバケットポリシーを適用します。
aws s3api put-bucket-policy --bucket <your-bucket-name> --policy file://bucket_policy.json
作成したS3のARNは、後ほど使用するので控えておいてください。
4.2. Kinesis Data FirehoseにアタッチするIAMロールの作成
以下のコマンドを実行して、Kinesis Data FirehoseにアタッチするためのIAMロールを作成します。
aws iam create-role --role-name <your-role-name> --assume-role-policy-document '{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "firehose.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}'
次に、以下のコマンドを実行して、作成したIAMロールにポリシーを追加します。
このポリシーは、Kinesis Data FirehoseがLogArchiveアカウントのS3バケットにオブジェクトをPUTする権限を与えます。
aws iam put-role-policy --role-name <your-role-name> --policy-name <your-policy-name> --policy-document '{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::<YourBucketName>/*"
}
]
}'
作成したIAM RoleのARNは、後ほど使用するので控えておいてください。
4.3. Kinesis Data Firehoseの作成
Kinesis Data Firehoseデリバリーストリームを作成します。
以下のコマンドをAuditアカウントで実行し、DestinationBucketARNとDestinationRoleARNを
先ほど作成したものに置き換えてください。
aws firehose create-delivery-stream --delivery-stream-name inspector-results-firehose \
--s3-destination-configuration "RoleARN=<DestinationRoleARN>,BucketARN=<DestinationBucketARN>"
4.4. EventBridgeルールの作成
以下のコマンドを実行して、Amazon EventBridgeルールを作成します。
このルールは、Security Hubからのイベントをフィルタリングして、Amazon Inspectorの検出結果に基づいてアクションをトリガーします。
aws events put-rule --name <RuleName> --event-pattern '{
"source": ["aws.securityhub"],
"detail-type": ["Inspector Assessment Run State Change"],
"detail" : {
"findings" : {
"ProductName" : ["Inspector"]
}
}
}'
次に、以下のコマンドを実行して、作成したルールにKinesis Data Firehoseをターゲットとして追加します。
これにより、ルールがトリガーされると、検出結果がKinesis Data Firehoseを通じてLogArchiveアカウントのS3バケットに送信されます。
aws events put-targets --rule <RuleName> --targets "Id=1,Arn=<FirehoseArn>,RoleArn=<RoleArn>"
以上で、Inspectorの検出結果がLogArchiveアカウントのS3バケットに集約されるようになります。
5. オブジェクトの確認
検出結果がLogArchiveアカウントのS3バケットに集約されていることを確認します。
以下のコマンドをLogArchiveアカウントで実行し、S3バケット内のオブジェクトを表示します。
aws s3 ls s3://<your-log-archive-bucket>/inspector-results/
まとめ
いかがでしたか?
本記事では、Amazon Inspectorのマルチアカウント戦略について解説しました。
この方法を用いることで、複数のアカウントでのAmazon Inspector検出結果を効率的に一元管理し、
セキュリティ分析や運用効率の向上に役立てることができます。是非、ご自身の環境に合わせて活用してみてください。