「セキュアで堅牢なAWSアカウント」を実現する CloudFormationテンプレート - ①サービスの有効化

# はじめに

AWSにはアカウントやリソースへの脅威検知に対応した、**AWS IAM Access Analyzer**, **AWS Security Hub**, **Amazon Detective**, **Amazon Inspector**, **Amazon GuardDuty**, **AWS CloudTrail**, **AWS Config** などのサービスが用意されています。

また、**AWS Security Hub** では、[**CIS AWS Foundations Standard**](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/securityhub-standards-cis.html) , [**Payment Card Industry Data Security Standard**](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/securityhub-standards-pcidss.html) , [**AWS Foundational Security Best Practices Standard**](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/securityhub-standards-fsbp.html) などのセキュリティ標準が公開されており、このガイドラインは、**AWSアカウントをセキュアに保つために必要なAWSのセキュリティ設定**を集めた**ベストプラクティス集**として活用できます。

本記事では、アカウントやリソースへの**脅威検知が可能なAWSサービスを有効化**するとともに、上記のセキュリティ標準に限りなく準拠することで、セキュアで堅牢なAWSアカウントを実現します。また、これらを**お手軽に実現できるCloudFormationテンプレートを公開**しています。

+ [**aws-cloudformation-templates/security - GitHub**](https://github.com/eijikominami/aws-cloudformation-templates/blob/master/security/README_JP.md)

# TL;DR

以下の``CloudFormation``テンプレートを実行することで、**セキュアで堅牢なAWSアカウントをお手軽に実現**します。下にあるボタンをクリックすると、自身のAWSアカウント（Asia Pacific Tokyo - ap-northeast-1）で、この``CloudFormation``テンプレートを実行することが可能となります。

[![cloudformation-launch-stack](https://raw.githubusercontent.com/eijikominami/aws-cloudformation-templates/master/images/cloudformation-launch-stack.png)](https://console.aws.amazon.com/cloudformation/home?region=ap-northeast-1#/stacks/create/review?stackName=DefaultSecuritySettings&templateURL=https://eijikominami.s3-ap-northeast-1.amazonaws.com/aws-cloudformation-templates/security/template.yaml) 

作成されるAWSリソースとそのアーキテクチャ図はこちら。

![](https://raw.githubusercontent.com/eijikominami/aws-cloudformation-templates/master/images/architecture-default-security-settings.png)

この``CloudFormation``テンプレートは、``Nested Stack``の構成となっており、**下記のAWSサービスを単体で作成することも可能**です。

| 作成されるAWSサービス | 個別のCloudFormationテンプレート |
| --- | --- |
| AWS IAM Access Analyzer | [![cloudformation-launch-stack](https://raw.githubusercontent.com/eijikominami/aws-cloudformation-templates/master/images/cloudformation-launch-stack.png)](https://console.aws.amazon.com/cloudformation/home?region=ap-northeast-1#/stacks/create/review?stackName=IAM&templateURL=https://eijikominami.s3-ap-northeast-1.amazonaws.com/aws-cloudformation-templates/security/iam.yaml) |
| AWS Security Hub | [![cloudformation-launch-stack](https://raw.githubusercontent.com/eijikominami/aws-cloudformation-templates/master/images/cloudformation-launch-stack.png)](https://console.aws.amazon.com/cloudformation/home?region=ap-northeast-1#/stacks/create/review?stackName=SecurityHub&templateURL=https://eijikominami.s3-ap-northeast-1.amazonaws.com/aws-cloudformation-templates/security/securityhub.yaml) |
| Amazon Detective | [![cloudformation-launch-stack](https://raw.githubusercontent.com/eijikominami/aws-cloudformation-templates/master/images/cloudformation-launch-stack.png)](https://console.aws.amazon.com/cloudformation/home?region=ap-northeast-1#/stacks/create/review?stackName=Detective&templateURL=https://eijikominami.s3-ap-northeast-1.amazonaws.com/aws-cloudformation-templates/security/detective.yaml) |
| Amazon Inspector | [![cloudformation-launch-stack](https://raw.githubusercontent.com/eijikominami/aws-cloudformation-templates/master/images/cloudformation-launch-stack.png)](https://console.aws.amazon.com/cloudformation/home?region=ap-northeast-1#/stacks/create/review?stackName=Inspector&templateURL=https://eijikominami.s3-ap-northeast-1.amazonaws.com/aws-cloudformation-templates/security/inspector.yaml&param_PrefixOfLogicalName=Inspector) |
| Amazon GuardDuty | [![cloudformation-launch-stack](https://raw.githubusercontent.com/eijikominami/aws-cloudformation-templates/master/images/cloudformation-launch-stack.png)](https://console.aws.amazon.com/cloudformation/home?region=ap-northeast-1#/stacks/create/review?stackName=GuardDuty&templateURL=https://eijikominami.s3-ap-northeast-1.amazonaws.com/aws-cloudformation-templates/security/guardduty.yaml) |
| AWS CloudTrail | [![cloudformation-launch-stack](https://raw.githubusercontent.com/eijikominami/aws-cloudformation-templates/master/images/cloudformation-launch-stack.png)](https://console.aws.amazon.com/cloudformation/home?region=ap-northeast-1#/stacks/create/review?stackName=CloudTrail&templateURL=https://eijikominami.s3-ap-northeast-1.amazonaws.com/aws-cloudformation-templates/security/cloudtrail.yaml&param_PrefixOfLogicalName=CloudTrail) |
| AWS Config | [![cloudformation-launch-stack](https://raw.githubusercontent.com/eijikominami/aws-cloudformation-templates/master/images/cloudformation-launch-stack.png)](https://console.aws.amazon.com/cloudformation/home?region=ap-northeast-1#/stacks/create/review?stackName=Config&templateURL=https://eijikominami.s3-ap-northeast-1.amazonaws.com/aws-cloudformation-templates/security/config.yaml&param_PrefixOfLogicalName=Config) |

# セキュリティ標準

このテンプレートは、``CIS AWS Foundations``, ``Payment Card Industry Data Security Standard (PCI DSS)``, ``AWS Foundational Security Best Practices`` の以下の項目に準拠します。現時点では全ての項目には対応できていませんが、対応範囲を今後順次増やしていく予定です。

## CIS AWS Foundations

| No. | ルール | 実行内容 |
| --- | --- | --- |
| 1.3 | [90 日間以上使用されていない認証情報は無効にします](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/securityhub-cis-controls.html#securityhub-cis-controls-1.3) | **Config** で定期的に確認を行い、非準拠の場合は **Lambda** で自動的に削除します。 |
| 1.4 | [アクセスキーは 90 日ごとに更新します](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/securityhub-cis-controls.html#securityhub-cis-controls-1.4) | **Config** で定期的に確認を行い、非準拠の場合は **Lambda** で自動的に削除します。 |
| 1.5 | [IAM パスワードポリシーには少なくとも 1 つの大文字が必要です](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/securityhub-cis-controls.html#securityhub-cis-controls-1.5) | **Config** で定期的に確認を行い、非準拠の場合は **SSM Automation** で自動修復を行います。 |
| 1.6 | [IAM パスワードポリシーには少なくとも 1 つの小文字が必要です](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/securityhub-cis-controls.html#securityhub-cis-controls-1.6) | **Config** で定期的に確認を行い、非準拠の場合は **SSM Automation** で自動修復を行います。 |
| 1.7 | [IAM パスワードポリシーには少なくとも 1 つの記号が必要です](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/securityhub-cis-controls.html#securityhub-cis-controls-1.7) | **Config** で定期的に確認を行い、非準拠の場合は **SSM Automation** で自動修復を行います。 |
| 1.8 | [IAM パスワードポリシーには少なくとも 1 つの数字が必要です](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/securityhub-cis-controls.html#securityhub-cis-controls-1.8) | **Config** で定期的に確認を行い、非準拠の場合は **SSM Automation** で自動修復を行います。 |
| 1.9 | [IAM パスワードポリシーは 14 文字以上の長さが必要です](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/securityhub-cis-controls.html#securityhub-cis-controls-1.9) | **Config** で定期的に確認を行い、非準拠の場合は **SSM Automation** で自動修復を行います。 |
| 1.10 | [IAM パスワードポリシーはパスワードの再使用を禁止しています](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/securityhub-cis-controls.html#securityhub-cis-controls-1.10) | **Config** で定期的に確認を行い、非準拠の場合は **SSM Automation** で自動修復を行います。 |
| 1.12 | [ルートアカウントキーが存在しないことを確認します](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/securityhub-cis-controls.html#securityhub-cis-controls-1.12) | **Config** で定期的に確認を行い、非準拠の場合は **SSM Automation** で自動修復を行います。 |
| 2.1 | [CloudTrail はすべてのリージョンで有効になっています](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/securityhub-cis-controls.html#securityhub-cis-controls-2.1) | **CloudTrail** と関連サービスを有効化します。 |
| 2.2 | [CloudTrail ログファイルの検証は有効になっています](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/securityhub-cis-controls.html#securityhub-cis-controls-2.2) | **CloudTrail** と関連サービスを有効化します。 |
| 2.3 | [CloudTrail が記録する S3 バケットはパブリックアクセスできません](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/securityhub-cis-controls.html#securityhub-cis-controls-2.3) | **CloudTrail** と関連サービスを有効化します。 |
| 2.4 | [CloudTrail 証跡は Amazon CloudWatch Logs によって統合されています](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/securityhub-cis-controls.html#securityhub-cis-controls-2.4) | **CloudTrail** と関連サービスを有効化します。 |
| 2.5 | [すべてのリージョンで AWS Config が有効になっていることを確認します](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/securityhub-cis-controls.html#securityhub-cis-controls-2.5) | **Config** と関連サービスを有効化します。 |
| 2.6 | [S3 バケットアクセスログ記録が CloudTrail S3 バケットで有効になっていることを確認します](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/securityhub-cis-controls.html#securityhub-cis-controls-2.6) | **CloudTrail** と関連サービスを有効化します。 |
| 2.7 | [CloudTrail ログは保管時に AWS KMS CMK を使用して暗号化されていることを確認します](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/securityhub-cis-controls.html#securityhub-cis-controls-2.7) | **CloudTrail** と関連サービスを有効化します。 |
| 2.9 | [すべての VPC で VPC フローログ記録が有効になっていることを確認します](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/securityhub-cis-controls.html#securityhub-cis-controls-2.9)  | **Config** で定期的に確認を行い、非準拠の場合は **SSM Automation** で自動修復を行います。  |
| 3.1 | [不正な API 呼び出しに対してログメトリクスフィルタとアラームが存在することを確認します](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/securityhub-cis-controls.html#securityhub-cis-controls-3.1) | ログメトリクスフィルタとCloudWatchアラームを作成します。 |
| 3.2 | [MFA なしの AWS マネジメントコンソール サインインに対してログメトリクスフィルタとアラームが存在することを確認します](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/securityhub-cis-controls.html#securityhub-cis-controls-3.2) | ログメトリクスフィルタとCloudWatchアラームを作成します。 |
| 3.3 | [「ルート」アカウントに対してログメトリクスフィルタとアラームが存在することを確認します](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/securityhub-cis-controls.html#securityhub-cis-controls-3.3)  | ログメトリクスフィルタとCloudWatchアラームを作成します。 |
| 3.4 | [MFA なしの IAM ポリシーの変更に対してログメトリクスフィルタとアラームが存在することを確認します](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/securityhub-cis-controls.html#securityhub-cis-controls-3.4) | ログメトリクスフィルタとCloudWatchアラームを作成します。 |
| 3.5 | [MFA なしの CloudTrail 設定の変更に対してログメトリクスフィルタとアラームが存在することを確認します](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/securityhub-cis-controls.html#securityhub-cis-controls-3.5) | ログメトリクスフィルタとCloudWatchアラームを作成します。 |
| 3.6 | [AWS マネジメントコンソール 認証の失敗に対してログメトリクスフィルタとアラームが存在することを確認します](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/securityhub-cis-controls.html#securityhub-cis-controls-3.6) | ログメトリクスフィルタとCloudWatchアラームを作成します。 |
| 3.7 | [カスタマー作成の CMK の無効化またはスケジュールされた削除に対してログメトリクスフィルタとアラームが存在することを確認します](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/securityhub-cis-controls.html#securityhub-cis-controls-3.7) | ログメトリクスフィルタとCloudWatchアラームを作成します。 |
| 3.8 | [S3 バケットの変更に対してログメトリクスフィルタとアラームが存在することを確認します](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/securityhub-cis-controls.html#securityhub-cis-controls-3.8) | ログメトリクスフィルタとCloudWatchアラームを作成します。 |
| 3.9 | [AWS Config 設定の変更に対してログメトリクスフィルタとアラームが存在することを確認します](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/securityhub-cis-controls.html#securityhub-cis-controls-3.9) | ログメトリクスフィルタとCloudWatchアラームを作成します。 |
| 3.10 | [セキュリティグループの変更に対するメトリクスフィルタとアラームが存在することを確認します](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/securityhub-cis-controls.html#securityhub-cis-controls-3.10) | ログメトリクスフィルタとCloudWatchアラームを作成します。 |
| 3.11 | [ネットワークアクセスコントロールリスト (NACL) への変更に対するログメトリクスとアラームが存在することを確認します](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/securityhub-cis-controls.html#securityhub-cis-controls-3.11) | ログメトリクスフィルタとCloudWatchアラームを作成します。 |
| 3.12 | [ネットワークゲートウェイへの変更に対するログメトリクスとアラームが存在することを確認します](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/securityhub-cis-controls.html#securityhub-cis-controls-3.12) | ログメトリクスフィルタとCloudWatchアラームを作成します。 |
| 3.13 | [ルートテーブルの変更に対してログメトリクスフィルタとアラームが存在することを確認します](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/securityhub-cis-controls.html#securityhub-cis-controls-3.13) | ログメトリクスフィルタとCloudWatchアラームを作成します。 |
| 3.14 | [VPC の変更に対してログメトリクスフィルタとアラームが存在することを確認します](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/securityhub-cis-controls.html#securityhub-cis-controls-3.14)  | ログメトリクスフィルタとCloudWatchアラームを作成します。 |
| 4.1 | [どのセキュリティグループでも 0.0.0.0/0 からポート 22 への入力を許可しないようにします](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/securityhub-cis-controls.html#securityhub-cis-controls-4.1) | **Config** で定期的に確認を行い、非準拠の場合は **SSM Automation** で自動修復を行います。 |
| 4.2 | [どのセキュリティグループでも 0.0.0.0/0 からポート 3389 への入力を許可しないようにします](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/securityhub-cis-controls.html#securityhub-cis-controls-4.2) | **Config** で定期的に確認を行い、非準拠の場合は **SSM Automation** で自動修復を行います。 |
| 4.3 | [すべての VPC のデフォルトセキュリティグループがすべてのトラフィックを制限するようにします](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/securityhub-cis-controls.html#securityhub-cis-controls-4.3) | **Config** で定期的に確認を行い、非準拠の場合は **SSM Automation** で自動修復を行います。 |

### Payment Card Industry Data Security Standard (PCI DSS)

| No. | ルール | 実行内容 |
| --- | --- | --- |
| PCI.CloudTrail.1 | [CloudTrail ログは、AWS KMS CMK を使用して保存時に暗号化する必要があります](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/securityhub-pci-controls.html#pcidss-cloudtrail-1) | **CloudTrail** と関連サービスを有効化します。 |
| PCI.CloudTrail.2 | [CloudTrail を有効にする必要があります](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/securityhub-pci-controls.html#pcidss-cloudtrail-2) | **CloudTrail** と関連サービスを有効化します。 |
| PCI.CloudTrail.3 | [CloudTrail ログファイルの検証を有効にする必要があります](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/securityhub-pci-controls.html#pcidss-cloudtrail-3) | **CloudTrail** と関連サービスを有効化します。 |
| PCI.CloudTrail.4 | [CloudTrail 証跡は CloudWatch ログと統合する必要があります](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/securityhub-pci-controls.html#pcidss-cloudtrail-4) | **CloudTrail** と関連サービスを有効化します。 |
| PCI.Config.1 | [AWS Config を有効にする必要があります](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/securityhub-pci-controls.html#pcidss-config-1) | **Config** と関連サービスを有効化します。 |
| PCI.CW.1 | [「root」ユーザーの使用には、ログメトリクスフィルターとアラームが存在する必要があります](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/securityhub-pci-controls.html#pcidss-cw-1) | ログメトリクスフィルタとCloudWatchアラームを作成します。 |
| PCI.EC2.2 | [VPC のデフォルトのセキュリティグループでは、インバウンドトラフィックとアウトバウンドトラフィックが禁止されます](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/securityhub-pci-controls.html#pcidss-ec2-2) | **Config** で定期的に確認を行い、非準拠の場合は **SSM Automation** で自動修復を行います。 |
| PCI.IAM.1 | [IAM ルートユーザーアクセスキーが存在してはいけません](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/securityhub-pci-controls.html#pcidss-iam-1) | **Config** で定期的に確認を行い、非準拠の場合は **SSM Automation** で自動修復を行います。 |
| PCI.S3.4 | [S3 バケットでは、サーバー側の暗号化を有効にする必要があります](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/securityhub-pci-controls.html#pcidss-s3-4) | **Config** で定期的に確認を行い、非準拠の場合は **SSM Automation** で自動修復を行います。 |

## AWS Foundational Security Best Practices

| No. | ルール | 実行内容 |
| --- | --- | --- |
| CloudTrail.1 | [CloudTrail を有効にし、少なくとも 1 つのマルチリージョンの証跡で設定する必要があります](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/securityhub-standards-fsbp-controls.html#fsbp-cloudtrail-1) | **CloudTrail** と関連サービスを有効化します。 |
| CloudTrail.2 | [CloudTrail は保管時の暗号化を有効にする必要があります](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/securityhub-standards-fsbp-controls.html#fsbp-cloudtrail-2) | **CloudTrail** と関連サービスを有効化します。 |
| Config.1 | [AWS Config を有効にする必要があります](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/securityhub-standards-fsbp-controls.html#fsbp-config-1) | **Config** と関連サービスを有効化します。 |
| EC2.2 | [VPC のデフォルトのセキュリティグループでは、インバウンドトラフィックとアウトバウンドトラフィックが禁止されます](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/securityhub-standards-fsbp-controls.html#fsbp-ec2-2) | **Config** で定期的に確認を行い、非準拠の場合は **SSM Automation** で自動修復を行います。 |
| GuardDuty.1 | [GuardDuty を有効にする必要があります](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/securityhub-standards-fsbp-controls.html#fsbp-guardduty-1) | **GuardDuty** と関連サービスを有効化します。 |
| IAM.3 | [IAM ユーザーのアクセスキーは 90 日ごとに更新する必要があります](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/securityhub-standards-fsbp-controls.html#fsbp-iam-3) | **Config** で定期的に確認を行い、非準拠の場合は **SSM Automation** で自動修復を行います。 |
| IAM.4 | [IAM ルートユーザーアクセスキーが存在してはいけません](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/securityhub-standards-fsbp-controls.html#fsbp-iam-4) | **Config** で定期的に確認を行い、非準拠の場合は **SSM Automation** で自動修復を行います。 |
| S3.4 | [S3 バケットでは、サーバー側の暗号化を有効にする必要があります](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/securityhub-standards-fsbp-controls.html#fsbp-s3-4) | **Config** で定期的に確認を行い、非準拠の場合は **SSM Automation** で自動修復を行います。 |

# アーキテクチャ

このテンプレートの設定内容は以下の通りです。なお、以下のYAMLコードは、[aws-cloudformation-templates/security - GitHub](https://github.com/eijikominami/aws-cloudformation-templates/blob/master/security/README_JP.md)で公開しているCloudFormationテンプレートから、本記事用に一部抜粋したものです。本記事作成用に一部改変を行なっていること、またリポジトリの最新のコードを常に反映している訳ではないことをご了承ください。詳細は、GitHubの[当該リポジトリ](https://github.com/eijikominami/aws-cloudformation-templates/)をご覧ください。

+ [README(EN) - aws-cloudformation-templates/security](https://github.com/eijikominami/aws-cloudformation-templates/blob/master/security/README.md)
+ [README(JP) - aws-cloudformation-templates/security](https://github.com/eijikominami/aws-cloudformation-templates/blob/master/security/README_JP.md)

## IAM Access Analyzer
### サービスにリンクされたロールを作成

``IAM Access Analyzer`` で使用する ``Service-Linked Role`` を作成します。この Service-Linked Role は、 Amazon EC2, AWS IAM, AWS Key Management Service, AWS Lambda, AWS Organizations, Amazon S3 および Amazon SQS から **情報を取得する権限を IAM Access Analyzer に付与** します。

```yaml
Resources:
  ServiceLinkedRoleForAccessAnalyzer:
    Type: AWS::IAM::ServiceLinkedRole
    UpdateReplacePolicy: Retain
    DeletionPolicy: Retain
    Properties: 
      AWSServiceName: access-analyzer.amazonaws.com 
      Description: A service-linked role required for Access Analyzer to access your resources.
```

### IAM Access Analyzer を有効化

``IAM Access Analyzer``を有効化します。

```yaml
Resources:
  AccessAnalyzer:
    DependsOn:
      - ServiceLinkedRoleForAccessAnalyzer
    Type: AWS::AccessAnalyzer::Analyzer
    Properties: 
      Type: ACCOUNT
```

### EventBridge を設定

``IAM Access Analyzer`` から送られたイベントを受信して、 ``Amazon SNS`` に送信します。

```yaml
Resources:
  EventBridgeForAccessAnalyzer:    
    Type: AWS::Events::Rule
    Properties: 
      Description: Rule for AccessAnalyzer.
      EventPattern:
        source:
           - aws.access-analyzer
        detail-type:
           - Access Analyzer Finding
        detail:
          status:
            - ACTIVE
      Name: AccessAnalyzer
      State: ENABLED
      Targets: 
        - Arn: !Ref SnsTopicARN
          Id: SNS
```

## AWS Security Hub
### サービスにリンクされたロールを作成

``AWS Security Hub`` で使用する ``Service-Linked Role`` を作成します。この Service-Linked Role は、 AWS CloudTrail, AWS Config, Amazon CloudWatch Logs および Amazon SNS から **情報を取得する権限** と、 AWS Config に対して **新たなConfigルールを設定する権限** を **AWS Security Hub に付与** します。

```yaml
Resources:
  ServiceLinkedRoleForSecurityHub:
    Type: AWS::IAM::ServiceLinkedRole
    UpdateReplacePolicy: Retain
    DeletionPolicy: Retain
    Properties: 
      AWSServiceName: securityhub.amazonaws.com
      Description: A service-linked role required for AWS Security Hub to access your resources.
```

### AWS Security Hub を有効化

``AWS Security Hub``を有効化します。

```yaml
Resources:
  SecurityHub:
    DependsOn:
      - ServiceLinkedRoleForSecurityHub
    Type: AWS::SecurityHub::Hub
```

### EventBridge を設定

``Security Hub`` は、**すべての結果**をイベントとして自動的に ``EventBridge`` に送信します。標準では、準拠した項目も含めて全ての検出結果を ``EventBridge`` へと送信してしまい、重要な情報が埋もれてしまう可能性があるため、下記では、**MEDIUM 以上の深刻度の検出結果のみを Amazon SNS に送信する設定** にしています。

```yaml
Resources:
  CloudWatchEventsForSecurityHubFindings:
    Type: 'AWS::Events::Rule'
    Properties: 
      Description: Rule for SecurityHub Findings.
      EventPattern:
        source:
          - aws.securityhub
        detail-type: 
          - Security Hub Findings - Imported
        detail:
          findings:
            Compliance:
              Status:
                - FAILED
            Severity:
              Label:
                - CRITICAL
                - HIGH
                - MEDIUM
      Name: SecurityHub-Findings
      State: ENABLED
      Targets:
        - Arn: !Ref SnsTopicARN
          Id: CloudWatchEventsForSecurityHub
```
## Amazon Detective
### Amazon Detectiveの有効化

``Amazon Detective`` を有効化します。なお、 Amazon GuardDuty と Amazon Detective を **同時に有効化することはできません** 。なぜなら [**Amazon Detective は、 Amazon GuardDuty を有効化してから48時間が経過している場合のみ有効化できる**](https://aws.amazon.com/jp/detective/faqs/) ためです。

本テンプレートでは、 **Amazon Detective をデフォルトで無効化** しています。Amazon GuardDuty を有効化したあとに、Amazon Detective を有効化してください。

```yaml
Resources:
  Detective:
    Type: 'AWS::Detective::Graph'
```

## Amazon Inspector
### サービスにリンクされたロール と IAMロールの作成

``Amazon Inspector`` で使用する ``Service-Linked Role`` と ``IAM Role``を作成します。 ``IAM Role`` では、 ``EventBridge`` に ``inspector:StartAssessmentRun`` 権限を付与します。

```yaml
Resources:
  ServiceLinkedRoleForInspector:
    Type: AWS::IAM::ServiceLinkedRole
    UpdateReplacePolicy: Retain
    DeletionPolicy: Retain
    Properties: 
      AWSServiceName: inspector.amazonaws.com
      Description: A service-linked role required for Amazon Inspector to access your resources.   
  IAMRoleForInspectorEvents:
    Type: 'AWS::IAM::Role'
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service: events.amazonaws.com
            Action: 'sts:AssumeRole'
      Description: A role required for EventBridge to access Inspector.
      Policies:
        - PolicyName: !Sub 'DefaultSecuritySettings-AWSEventsInspectorPolicy-${AWS::Region}'
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Effect: Allow
                Action:
                  - 'inspector:StartAssessmentRun'
                Resource: '*'
      RoleName: !Sub 'DefaultSecuritySettings-InspectorEvents-${AWS::Region}'
```

### Amazon Inspectorの有効化

``Amazon Inspector`` の ``Assessment Target`` と ``Assessment Template`` を作成します。本テンプレートは、以下の4つの **ルールパッケージ** に対応します。

+ [Network Reachability](https://docs.aws.amazon.com/inspector/latest/userguide/inspector_network-reachability.html)
+ [Common Vulnerabilities and Exposures](https://docs.aws.amazon.com/inspector/latest/userguide/inspector_cves.html)
+ [Center for Internet Security (CIS) Benchmarks](https://docs.aws.amazon.com/inspector/latest/userguide/inspector_cis.html)
+ [Security Best Practices for Amazon Inspector](https://docs.aws.amazon.com/inspector/latest/userguide/inspector_security-best-practices.html)

なお、AWSが公開しているルールパッケージのURLがリージョンごとに異なることから、本テンプレートは、``Amazon Inspector`` に対応しているリージョンのうち、**[一部のリージョン](https://github.com/eijikominami/aws-cloudformation-templates/blob/master/security/README_JP.md)のみに対応**していることにご注意ください。

```yaml
Resources:
  InspectorAssessmentTarget:
    DependsOn:
      - ServiceLinkedRoleForInspector
    Type: AWS::Inspector::AssessmentTarget
    Properties:
      AssessmentTargetName: DefaultSecuritySettings-Assessment-Target-All-Instances-All-Rules
  InspectorAssessmentTemplate:
    Type: AWS::Inspector::AssessmentTemplate
    Properties:
      AssessmentTargetArn: !GetAtt InspectorAssessmentTarget.Arn
      DurationInSeconds: 3600
      AssessmentTemplateName: DefaultSecuritySettings-Assessment-Template-Default-All-Rules
      RulesPackageArns:
        # Asia Pacific (Tokyo)リージョンの場合
        - arn:aws:inspector:ap-northeast-1:406045910587:rulespackage/0-gHP9oWNT
        - arn:aws:inspector:ap-northeast-1:406045910587:rulespackage/0-7WNjqgGu
        - arn:aws:inspector:ap-northeast-1:406045910587:rulespackage/0-YI95DVd7
        - arn:aws:inspector:ap-northeast-1:406045910587:rulespackage/0-bBUQnxMq
```

### EventBridge を設定

``Amazon Inspector`` は、``EventBridge``を用いて``Assessment Template``を定期実行することができます。本テンプレートでは**毎週月曜日午前9時**になると、``EventBridge``が``Amazon Inspector``を定期実行します。

```yaml
Resources:
  CloudWatchEventsForInspector:
    Type: AWS::Events::Rule
    Properties: 
      Description: !Join
        - ''
        - - Scheduled Inspector Assessment for 
          - !GetAtt InspectorAssessmentTemplate.Arn
          - running every 7 day(s)
      Name: Amazon_Inspector_Assessment
      # Every Monday 9AM
      ScheduleExpression: cron(0 9 ? * 1 *)
      State: ENABLED
      Targets:
        - Arn: !GetAtt InspectorAssessmentTemplate.Arn
          Id: CloudWatchEventsForInspector
          RoleArn: !GetAtt IAMRoleForInspectorEvents.Arn
```

## Amazon GuardDuty
### サービスにリンクされたロール の作成

``Amazon GuardDuty`` で使用する ``Service-Linked Role`` を作成します。この Service-Linked Role は、 Amazon EC2 および AWS Organizations から **情報を取得する権限を GuardDuty に付与** します。

```yaml
Resources:
  # Service-linked Role
  ServiceLinkedRoleForGuardDuty:
    Type: AWS::IAM::ServiceLinkedRole
    UpdateReplacePolicy: Retain
    DeletionPolicy: Retain
    Properties: 
      AWSServiceName: guardduty.amazonaws.com
      Description: A service-linked role required for Amazon GuardDuty to access your resources.
```


### Amazon GuardDuty を有効化

``Amazon GuardDuty``を有効化します。

```yaml
Resources:
  GuardDutyDetector:
    DependsOn:
      - ServiceLinkedRoleForGuardDuty
    Type: AWS::GuardDuty::Detector
    Properties:
      Enable: true
```

### EventBridge を設定

``Amazon GuardDuty`` から送られたイベントを受信して、 ``Amazon SNS`` に送信します。標準では、全ての検出結果を ``EventBridge`` へと送信してしまい、重要な情報が埋もれてしまう可能性があるため、下記では、**MEDIUM 以上の深刻度の検出結果のみを Amazon SNS に送信する設定** にしています。なお、現時点では、[**YAML形式のテンプレートの場合に Event Bridge の Numeric Matching が正常に変換されない**](https://github.com/aws-cloudformation/aws-cloudformation-coverage-roadmap/issues/251) という問題があるため、**これを回避するために一部JSON形式にて記述** を行なっています。

```yaml
Resources:
  CloudWatchEventsForGuardDuty:
    Type: 'AWS::Events::Rule'
    Properties: 
      Description: Rule for GuardDuty.
      EventPattern: |
        {
           "source": [
              "aws.guardduty"
           ],
           "detail-type": [
              "GuardDuty Finding"
           ],
           "detail": {
              "severity": [
                 { "numeric": [ ">=", 4 ] }
              ]
           }
        }
      Name: GuardDuty
      State: ENABLED
      Targets:
        - Arn: !Ref SnsTopicARN
          Id: CloudWatchEventsForGuardDuty
```

## AWS CloudTrail

### IAMロールの作成

``AWS CloudTrail`` で使用する ``IAM Role``を作成します。この ``IAM Role`` は、 CloudWatch Logs へ **ログを出力する権限を CloudTrail に付与** します。

```yaml
Resources:
  IAMRoleForCloudTrail:
    Type: 'AWS::IAM::Role'
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service: cloudtrail.amazonaws.com
            Action: 'sts:AssumeRole'
      Description: A role required for CloudTrail to access CloudWatch Logs.
      Policies:
        - PolicyName: !Sub 'DefaultSecuritySettings-AWSCloudTrailCloudWatchLogsPolicy-${AWS::Region}'
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Effect: Allow
                Action:
                  - 'logs:PutLogEvents'
                  - 'logs:CreateLogStream'
                Resource:
                  - !GetAtt CloudWatchLogsGroupForCloudTrail.Arn
      RoleName: !Sub 'DefaultSecuritySettings-CloudTrail-${AWS::Region}'
```

### KMS CMKを作成

``CloudTrail Logs`` を保管する S3バケット を暗号化するための **カスタマーマスターキー (CMK)**を作成します。以下の例では、このバケットを **復号できるのは、root ユーザのみ** です。また、CloudTrail に [ログの暗号化の権限とCMK プロパティの記述権限を **キーポリシー** に記述](https://docs.aws.amazon.com/ja_jp/awscloudtrail/latest/userguide/create-kms-key-policy-for-cloudtrail.html) しています。

```yaml
Resources:
  KMSKey:
    Condition: CreateCentralizedResources
    Type: AWS::KMS::Key
    Properties: 
      Description: Encrypt CloudTrail Logs
      Enabled: true
      EnableKeyRotation: true
      KeyPolicy: 
        Version: 2012-10-17
        Id: DefaultKeyPolicy
        Statement:
          - Sid: Enable IAM User Permissions
            Effect: Allow
            Principal:
              AWS: !Sub arn:aws:iam::${AWS::AccountId}:root
            Action: 'kms:*'
            Resource: '*'
          - Effect: Allow
            Principal:
              Service: cloudtrail.amazonaws.com
            Action:
              - 'kms:GenerateDataKey*'
            Resource:
              - '*'
            Condition:
              StringLike:
                kms:EncryptionContext:aws:cloudtrail:arn:
                  - !Sub arn:aws:cloudtrail:*:${AWS::AccountId}:trail/*
          - Effect: Allow
            Principal:
              Service: cloudtrail.amazonaws.com
            Action:
              - 'kms:DescribeKey'
            Resource:
              - '*'
      KeyUsage: ENCRYPT_DECRYPT
      PendingWindowInDays: 30
      Tags: 
        - Key: !Ref TagKey
          Value: !Ref TagValue
```

### AWS CloudTrail を有効化

``AWS CloudTrail``を有効化します。``EventSelectors`` で ``S3`` と ``Lambda`` の **データイベントの取得設定** も行なっています。

```yaml
Resources:
  CloudTrail:
    DependsOn:
      - S3BucketPolicyForCloudTrail
    Condition: CreateCentralizedResources
    Type: AWS::CloudTrail::Trail
    Properties:
      CloudWatchLogsLogGroupArn: !GetAtt CloudWatchLogsGroupForCloudTrail.Arn
      CloudWatchLogsRoleArn: !GetAtt IAMRoleForCloudTrail.Arn
      EnableLogFileValidation: true
      EventSelectors:
        - DataResources: 
            # All S3 buckets
            - Type: AWS::S3::Object
              Values: 
                - arn:aws:s3
            # All Lambda functions.
            - Type: AWS::Lambda::Function
              Values: 
                - arn:aws:lambda
      IncludeGlobalServiceEvents: true
      IsLogging: true
      IsMultiRegionTrail: true
      KMSKeyId: !GetAtt KMSKey.Arn
      S3BucketName: !Ref S3ForCloudTrail
      TrailName: DefaultSecuritySettings
```

### Amazon S3 バケットを作成

**イベントログファイルを蓄積**するために使用する、``Amazon S3`` **バケット**と、それに紐づく**バケットポリシー**を作成します。


```yaml
Resources:
  S3ForCloudTrail:
    Type: 'AWS::S3::Bucket'
    UpdateReplacePolicy: Retain
    DeletionPolicy: Retain
    Properties:
      BucketEncryption:
        ServerSideEncryptionConfiguration: 
          - ServerSideEncryptionByDefault: 
              SSEAlgorithm: AES256
      BucketName: !Sub defaultsecuritysettings-cloudtrail-${AWS::Region}-${AWS::AccountId}
      LifecycleConfiguration:
        Rules:
          - Id: ExpirationInDays
            ExpirationInDays: 60
            Status: Enabled
      LoggingConfiguration:
        DestinationBucketName: !Ref LogBacketName
        LogFilePrefix: CloudTrail/
      PublicAccessBlockConfiguration: 
        BlockPublicAcls: true
        BlockPublicPolicy: true
        IgnorePublicAcls: true
        RestrictPublicBuckets: true
  S3BucketPolicyForCloudTrail:
    Type: AWS::S3::BucketPolicy
    Properties: 
      Bucket: !Ref S3ForCloudTrail
      PolicyDocument:
        Version: 2012-10-17
        Id: !Ref S3ForCloudTrail
        Statement:
          - Effect: Allow
            Principal:
              Service: cloudtrail.amazonaws.com
            Action:
              - 's3:GetBucketAcl'
            Resource:
              - !GetAtt S3ForCloudTrail.Arn
          - Effect: Allow
            Principal:
              Service: cloudtrail.amazonaws.com
            Action:
              - 's3:PutObject'
            Resource:
              - !Join
                - ''
                - - !GetAtt S3ForCloudTrail.Arn
                  - /AWSLogs/
                  - !Sub ${AWS::AccountId}
                  - /*
            Condition:
              StringEquals:
                s3:x-amz-acl: bucket-owner-full-control
          - Effect: Deny
            Principal: '*'
            Action: 's3:*'
            Resource: 
              - !GetAtt S3ForCloudTrail.Arn
              - !Join
                - ''
                - - !GetAtt S3ForCloudTrail.Arn
                  - /*
            Condition:
              Bool: 
                aws:SecureTransport: false
```

### CloudWatch Logs のロググループを作成

**イベントログファイルを蓄積**するために使用する、**ロググループ**を作成します。

```yaml
Resources:
  CloudWatchLogsGroupForCloudTrail:
    Type: 'AWS::Logs::LogGroup'
    Properties:
      LogGroupName: /aws/cloudtrail/DefaultSecuritySettings
      RetentionInDays: 365
```

## AWS Config

### サービスにリンクされたロールの作成

``AWS Config`` で使用する ``Service-Linked Role`` を作成します。この Service-Linked Role は、 **AWSリソースへの読み込み権限** と **S3への書き込み権限** を ``Config`` に、また、**IAMとSystemManagerへの書き込み権限** を ``Config Remediation`` にそれぞれ付与します。

```yaml
Resources:
  ServiceLinkedRoleForConfig:
    Type: AWS::IAM::ServiceLinkedRole
    UpdateReplacePolicy: Retain
    DeletionPolicy: Retain
    Properties: 
      AWSServiceName: config.amazonaws.com
      Description: A service-linked role required for AWS Config to access your resources.
  ServiceLinkedRoleForConfigRemediation:
    Type: AWS::IAM::ServiceLinkedRole
    UpdateReplacePolicy: Retain
    DeletionPolicy: Retain
    Properties: 
      AWSServiceName: remediation.config.amazonaws.com 
      Description: A service-linked role required for AWS Config Remediation to access your resources.
```

### AWS Configの有効化

``AWS Config`` の ``DeliveryChannel`` と ``ConfigurationRecorder`` を作成します。

```yaml
Resources:
  ConfigDeliveryChannel:
    Type: AWS::Config::DeliveryChannel
    Properties:
      Name: default
      S3BucketName: !Ref S3ForConfig
  ConfigConfigurationRecorder:
    Type: AWS::Config::ConfigurationRecorder
    Properties:
      Name: default
      RecordingGroup:
        AllSupported: true
        IncludeGlobalResourceTypes: true
      RoleARN: !Sub arn:aws:iam::DefaultSecuritySettings:role/aws-service-role/config.amazonaws.com/AWSServiceRoleForConfig
```

### Amazon S3 バケットを作成

**設定情報 （履歴ファイルやスナップショット）** を保存するために使用する、``Amazon S3`` **バケット**と、それに紐づく**バケットポリシー**を作成します。

```yaml
Resources:
  S3ForConfig:
    Type: 'AWS::S3::Bucket'
    UpdateReplacePolicy: Retain
    DeletionPolicy: Retain
    Properties:
      BucketEncryption:
        ServerSideEncryptionConfiguration: 
          - ServerSideEncryptionByDefault: 
              SSEAlgorithm: AES256
      BucketName: !Sub defaultsecuritysettings-config-${AWS::Region}-${AWS::AccountId}
      LifecycleConfiguration:
        Rules:
          - Id: ExpirationInDays
            ExpirationInDays: 60
            Status: Enabled
      PublicAccessBlockConfiguration: 
        BlockPublicAcls: true
        BlockPublicPolicy: true
        IgnorePublicAcls: true
        RestrictPublicBuckets: true
  S3BucketPolicyForConfig:
    Type: AWS::S3::BucketPolicy
    Properties: 
      Bucket: !Ref S3ForConfig
      PolicyDocument:
        Version: 2012-10-17
        Id: !Ref S3ForConfig
        Statement:
          - Effect: Allow
            Principal:
              Service: config.amazonaws.com
            Action:
              - 's3:GetBucketAcl'
              - 's3:ListBucket'
            Resource:
              - !GetAtt S3ForConfig.Arn
          - Effect: Allow
            Principal:
              Service: config.amazonaws.com
            Action:
              - 's3:PutObject'
            Resource:
              - !Join
                - ''
                - - !GetAtt S3ForConfig.Arn
                  - /AWSLogs/
                  - !Sub ${AWS::AccountId}
                  - /Config/*
            Condition:
              StringEquals:
                s3:x-amz-acl: bucket-owner-full-control
          - Effect: Deny
            Principal: '*'
            Action: 's3:*'
            Resource: 
              - !GetAtt S3ForConfig.Arn
              - !Join
                - ''
                - - !GetAtt S3ForConfig.Arn
                  - /*
            Condition:
              Bool: 
                aws:SecureTransport: false
```

以上で、**AWS Security Hub**, **Amazon Inspector**, **Amazon GuardDuty**, **AWS CloudTrail**, **AWS Config** の5つのサービスを有効化することができました。[**次回**](https://qiita.com/eijikominami/items/85acced082d0dc8d9901) 以降は、``CIS AWS Foundations Benchmark``の各項目へ準拠するための設定と、その設定を自動的に作成する ``CloudFormation`` テンプレートについて説明します。

## 関連リンク
1. **サービスの有効化** - 「セキュアで堅牢なAWSアカウント」を実現する CloudFormationテンプレート
2. [**パスワードポリシーの自動修復** - 「セキュアで堅牢なAWSアカウント」を実現する CloudFormationテンプレート](https://qiita.com/eijikominami/items/85acced082d0dc8d9901)
3. [**モニタリングと通知の設定** - セキュアで堅牢なAWSアカウント」を実現する CloudFormationテンプレート](https://qiita.com/eijikominami/items/1887d19ce3bb33f716ba)
4. [**アクセスキーのローテーションと削除** - 「セキュアで堅牢なAWSアカウント」を実現する CloudFormationテンプレート](https://qiita.com/eijikominami/items/eba16015e8e27e42fc36)
5. [**全てのVPCでフローログを有効化する** - 「セキュアで堅牢なAWSアカウント」を実現する CloudFormationテンプレート](https://qiita.com/eijikominami/items/e5f7fcc7fd91fc4355be)
6. [**SSHとRDPのアクセスを制限する** - 「セキュアで堅牢なAWSアカウント」を実現する CloudFormationテンプレート](https://qiita.com/eijikominami/items/936912ee715079606e55)
7. [**デフォルトセキュリティグループを無効化する** - 「セキュアで堅牢なAWSアカウント」を実現する CloudFormationテンプレート](https://qiita.com/eijikominami/items/2fa109f00b5c63686c42)
8. [**S3バケットのサーバサイド暗号化** - セキュアで堅牢なAWSアカウント」を実現する CloudFormationテンプレート](https://qiita.com/eijikominami/items/581a8e0e424117322125)