Amazon Inspectorのマルチアカウント戦略を考えてみた（セキュリティ監査とログ集約の効率化）


# はじめに
こんにちは、はやぴー（@HayaP）です。

複数のAWSアカウントを運用（マルチアカウント戦略）する組織は、近年増えてきました。
しかしながら、クロスアカウントでログをどう集約したら良いか、迷う事も多いと思います。

また、マルチアカウント管理のサービスである[AWS Control Tower](https://docs.aws.amazon.com/ja_jp/controltower/latest/userguide/accounts.html)は非常に便利ですが、自動で集約されるログは限られています。

例えば、脆弱性検査サービスである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 ログ集約アカウント)

![Inspector集約ブログ-Page-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478323/ce28a7a8-c60e-770e-a815-f9f2d6c1e61d.jpeg)

## 目次
1. システム概要
    1. マルチアカウント戦略
    1. ログ集約の流れ
1. 各アカウントでAmazon Inspectorのセットアップ
    1. Amazon Inspectorエージェントのインストール
    1. Amazon Inspectorの設定
1. Auditアカウントで全アカウントの検出結果をSecurityHubで集約
    1. SecurityHubの有効化
1. Kinesis Data Firehoseを使ってクロスアカウントでLogArchiveアカウントのS3に集約
    1. LogArchiveアカウントでS3バケットの作成とバケットポリシーの設定
    1.  IAMロールの作成とKinesis Data Firehoseへのアタッチ
    1. Kinesis Data Firehoseの作成
    1. EventBridgeルールの作成
1. オブジェクトの確認

# 詳細
## 前提
リソースの構築、設定には[AWS CLI(v2)](https://aws.amazon.com/jp/cli/)を使用します。

## 1. システム概要
### 1.1. マルチアカウント戦略
AWSのベストプラクティスである、AWS Control Tower参考に
下記アカウント構成とします。

- 管理アカウント
- ログ集約アカウント
- 監査アカウント

![Inspector集約ブログ-ページ2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478323/33f72d41-a311-22ba-e7b6-7629fa105687.jpeg)

## 2. 各アカウントでAmazon Inspectorのセットアップ
![Inspector集約ブログ-ページ3 (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478323/685dadae-cb1c-6147-92d0-e6bed1f16182.jpeg)

Amazon Inspectorを利用するには、下記手順を実施します。
なお今回は、**EC2サーバーのみ**を対象としますが、AWS Lambdaなども診断可能です。
詳細は[公式ドキュメント]()を参照してください

### 2.1. Amazon Inspectorエージェントのインストール
EC2サーバーに、Inspectorエージェントをインストールする必要があります。
Amazon Linux 2の場合、以下のコマンドを実行してエージェントをインストールします。
```bash
sudo yum install -y amazon-inspector
```

他のオペレーティングシステムに対応するコマンドは、[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/inspector/latest/user/getting_started_tutorial.html)を参照してください。

### 2.2. Amazon Inspectorの設定
Amazon Inspectorの設定では、アセスメントターゲットとアセスメントテンプレートを作成します。
アセスメントターゲットは**検査対象のリソース**を定義し、アセスメントテンプレートは**検査の設定**を定義します。

#### リソースグループの作成
リソースグループは、検査対象のリソース（この場合はEC2インスタンス）を定義するために使用されます。
リソースグループを、タグを用いてグループ化することができます。

以下のコマンドを使用して、リソースグループを作成します。
```bash
aws inspector create-resource-group --tags Key=<key>,Value=<value>
```
"key"と"value"には、対象のEC2インスタンスに設定されているタグのキーと値を指定します。

#### アセスメントターゲットの作成
以下のコマンドを使用して、アセスメントターゲットを作成します。
```bash
aws inspector create-assessment-target --assessment-target-name <target-name> --resource-group-arn <resource-group-arn>
```
"target-name"には、アセスメントターゲットの名前を指定します。
"resource-group-arn"には、先ほど作成したリソースグループのARNを指定します。

#### ルールセットの選択
Amazon Inspectorでは、検査に使用するルールセットを選択する必要があります。
以下のコマンドを実行して、利用可能なルールセットをリストします。

```bash
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で集約

![Inspector集約ブログ-ページ4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478323/11c8c25b-1bbd-36c7-1173-0190769c1eb3.jpeg)

Amazon Inspector の検出結果を Audit アカウントに集約するには、AWS Security Hub を使用することで実現できます。
以下の手順で、各アカウントのSecurityHubをAudit アカウントに集約します。
### 3.1 SecurityHubの有効化
### AuditアカウントでSecurityHubを有効化
SecurityHubを"enable"（有効化）します。
```bash
aws securityhub enable-security-hub
```
#### 個別アカウントでSecurityHubを有効化し、Auditアカウントと連携
下記を実行します。

```bash
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に集約
![Inspector集約ブログ-ページ5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478323/5e86c3ce-4294-2e18-b9eb-99ef643f674a.jpeg)
Kinesis Data Firehoseを用いて、AuditアカウントからLogArchiveアカウントのS3バケットに検出結果を集約する方法を説明します。

### 4.1. LogArchiveアカウントのS3バケット作成とバケットポリシー設定
LogArchiveアカウントでS3バケットを作成し、バケットポリシーを設定してAuditアカウントからのアクセスを許可します。
S3バケットを作成するには、以下のコマンドを実行してください。

```bash
aws s3api create-bucket --bucket <your-bucket-name> --region <your-region> --create-bucket-configuration LocationConstraint=<your-region>
```

次に、バケットポリシーを作成します。
jsonファイルを作成してください。
```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::<YourAuditAccountID>:root"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::<YourBucketName>/*"
        }
    ]
}
```
作成したバケットポリシーを適用します。

```bash
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ロールを作成します。

```bash
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する権限を与えます。
```bash
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を
先ほど作成したものに置き換えてください。

```bash
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の検出結果に基づいてアクションをトリガーします。

```bash
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バケットに送信されます。
```bash
aws events put-targets --rule <RuleName> --targets "Id=1,Arn=<FirehoseArn>,RoleArn=<RoleArn>"
```
以上で、Inspectorの検出結果がLogArchiveアカウントのS3バケットに集約されるようになります。

## 5. オブジェクトの確認
検出結果がLogArchiveアカウントのS3バケットに集約されていることを確認します。
以下のコマンドをLogArchiveアカウントで実行し、S3バケット内のオブジェクトを表示します。

```bash
aws s3 ls s3://<your-log-archive-bucket>/inspector-results/
```

# まとめ
いかがでしたか？
本記事では、Amazon Inspectorのマルチアカウント戦略について解説しました。

この方法を用いることで、複数のアカウントでのAmazon Inspector検出結果を効率的に一元管理し、
セキュリティ分析や運用効率の向上に役立てることができます。是非、ご自身の環境に合わせて活用してみてください。