AWS Config マネージドルールを使ったリソースの設定管理

# AWS Config マネージドルールを使ったリソースの設定管理
本記事では、AWS Configを使用する際に必要な設定内容と、マネージドルールを利用する際によく使用されそうなルールの一覧と説明について記載しています。

## 1. AWS Configとは
### 1.1 AWS Configの概要
AWS Config(以下Config)は、サポートしているAWSリソースに対して設定変更の記録を行うサービスである。
設定に対して問題がないかを確認し、メール通知や修正対応をすることができる。
ConfigがサポートするAWSリソースの詳細は、[AWS Configデベロッパーガイド-サポートされているリソースタイプ](https://docs.aws.amazon.com/ja_jp/config/latest/developerguide/resource-config-reference.html)を参照。

### 1.2 ルール
Configルールとは、AWSリソースが一般的なベストプラクティスに準拠しているかどうかを評価する機能である。
リソースの設定に変更があった際に評価を実行し、ルールに準拠しているか非準拠かを評価する。
設定したいルールがマネージドルールにない場合は、Lambdaを用いて[カスタムルール](https://docs.aws.amazon.com/ja_jp/config/latest/developerguide/evaluate-config_develop-rules.html)を作成することができる。
マネージドルールの一覧は[AWS Config デベロッパーガイド-AWS Configルール-マネージドルールのリスト](https://docs.aws.amazon.com/ja_jp/config/latest/developerguide/managed-rules-by-aws-config.html)に記載されており、設定時もこちらを参照した。

### 1.3 適合パック
適合パックは、ルールと修復アクションの集まりである。
修復アクションとは、ルール非準拠となっているリソースを[AWS Systems Manager Automation](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/systems-manager-automation.html)を使用して修復する機能である。
適合パックはルールおよび修復アクションを含むYAML形式のテンプレートである。<br>

## 2. ルールの設定検討
### 2.1 検討内容
Configでリソースの設定内容を評価するには、Configルールを作成して正しい設定内容を定義する必要がある。
本章では、ルールの設定にあたって、適合パック使用するか否か、どのようなルールを設定するか検討した内容について記載する。
ルールの設定方法として以下の3つが候補がある。

1. マネージドルールで設定可能な範囲で必要なルールを個別に設定する
2. マネージドルールで補えない場合はカスタムルールも使用し必要なルールを個別に設定する
3. 適合パックを作成して設定する

本記事では、１のマネージドルールで必要なルールを個別に設定する際に、どんなルールがああるのか紹介する。

### 2.2 ルールの一覧および説明
利用頻度の高いサービスに関するルールや重要度の高いルールに絞って一覧化した。

**ルール一覧**
|  ルール名  |  説明  |
| ---- | ---- |
|  cloudtrail-enabled  |  AWS アカウントで AWS CloudTrail が有効になっているかどうかを確認します。オプションで、どの S3 バケットの ARN、SNS トピックのARN、および Amazon CloudWatch Logs の ARN を使用するかを指定できます。 |
|  cloudtrail-security-trail-enabled  |  セキュリティのベストプラクティスで定義されたAWSCloudTrailトレイルが少なくとも1つあることを確認します。次のすべてを満たす証跡が少なくとも1つある場合、このルールは準拠しています。<br>・グローバルサービスイベントを記録します<br>・マルチリージョントレイルです<br>・ログファイルの検証が有効になっています<br>・KMSキーで暗号<br>・読み取りと書き込みのイベントを記録します<br>・管理イベントを記録します<br>・管理イベントを除外しません。上記のすべての基準を満たすトレイルがない場合、このルールはNON_COMPLIANTです。  |
|  db-instance-backup-enabled  |  RDSDBインスタンスでバックアップが有効になっているかどうかを確認します。オプションで、ルールはバックアップの保持期間とバックアップウィンドウをチェックします。 |
|  ec2-ebs-encryption-by-default  |  Amazon Elastic Block Store（EBS）暗号化がデフォルトで有効になっていることを確認します。暗号化が有効になっていない場合、ルールはNON_COMPLIANTです。 |
|  guardduty-enabled-centralized  |  AWS アカウントおよびリージョンで Amazon GuardDuty が有効になっているかどうかを確認します。一元管理を目的として AWS アカウントを指定すると、このルールによって、一元管理されたアカウントの Amazon GuardDuty 結果が評価されます。Amazon GuardDuty が有効になると、このルールは COMPLIANT です。  |
|  iam-password-policy  |  アカウントのパスワードポリシーが IAM ユーザは、 パラメータで指定された指定要件を満たしています。このルールは、アカウント・パスワード・ポリシーが指定された要件を満たさない場合、NON_COMPLIANT です。  |
|  mfa-enabled-for-iam-console-access  |  コンソールパスワードを使用するすべての AWS Identity and Access Management (IAM) ユーザーについて AWS Multi-Factor Authentication (MFA) が有効になっているかどうかを確認します。MFA が有効の場合、このルールは COMPLIANT です。|
| rds-snapshot-encrypted | Amazon Relational Database Service（Amazon RDS）DBスナップショットが暗号化されているかどうかを確認します。Amazon RDS DBスナップショットが暗号化されていない場合、ルールはNON_COMPLIANTです。|
| rds-instance-public-access-check | Amazon Relational DatabaseServiceインスタンスがパブリックにアクセスできないかどうかを確認します。|
| publiclyAccessible | インスタンス構成アイテムのフィールドがtrueの場合、ルールはNON_COMPLIANTです。|
| rds-snapshots-public-prohibited | Amazon Relational Database Service (Amazon RDS) スナップショットがパブリックかどうかを確認します。既存および新規の Amazon RDS スナップショットがパブリックの場合、このルールは NON_COMPLIANT です。|
| rds-storage-encrypted | RDS DB インスタンスに対してストレージの暗号化が有効になっているかどうかを確認します。|
| s3-bucket-public-read-prohibited | Amazon S3 バケットでパブリック読み取りアクセスが許可されないことを確認します。このルールは、Block Public Access 設定、バケットポリシー、およびバケットアクセスコントロールリスト (ACL) を確認します。次の両方に該当するときはこのルールに準拠しています。<br> ・パブリックアクセスのブロック設定は、パブリックポリシーを制限するか、バケットポリシーがパブリック読み取りアクセスを許可しません。<br>・パブリックアクセスのブロック設定は、パブリックACLを制限するか、バケットACLがパブリック読み取りアクセスを許可しません。このルールは次の場合に準拠されません。<br>・[パブリックアクセスのブロック]<br>設定でパブリックポリシーが制限されていない場合、AWSConfigはポリシーがパブリック読み取りアクセスを許可しているかどうかを評価します。ポリシーでパブリック読み取りアクセスが許可されている場合、ルールは非準拠です。<br>・[パブリックアクセスのブロック]<br>設定でパブリックバケットACLが制限されていない場合、AWSConfigはバケットACLがパブリック読み取りアクセスを許可するかどうかを評価します。バケットACLがパブリック読み取りアクセスを許可している場合、ルールは非準拠です。|
| s3-bucket-public-write-prohibited| AmazonS3バケットがパブリック書き込みアクセスを許可していないことを確認します。このルールは、パブリックアクセスブロック設定、バケットポリシー、およびバケットアクセス制御リスト（ACL）をチェックします。次の両方が当てはまる場合、ルールは準拠しています。<br>・パブリックアクセスのブロック設定は、パブリックポリシーを制限するか、バケットポリシーがパブリック書き込みアクセスを許可しません。次の場合、ルールは非準拠です。<br>・[パブリックアクセスのブロック]<br>設定でパブリックポリシーが制限されていない場合、AWSConfigはポリシーがパブリック書き込みアクセスを許可しているかどうかを評価します 。ポリシーでパブリック書き込みアクセスが許可されている場合、ルールは非準拠です。<br>・[パブリックアクセスのブロック]<br>設定でパブリックバケットACLが制限されていない場合、AWSConfigはバケットACLがパブリック書き込みアクセスを許可するかどうかを評価します。バケットACLがパブリック書き込みアクセスを許可している場合、ルールは非準拠です。|
| s3-bucket-server-side-encryption-enabled | AmazonS3バケットでAmazonS3のデフォルトの暗号化が有効になっていること、またはS3バケットポリシーがAES-256またはAWS Key ManagementServiceを使用するサーバー側の暗号化なしでput-objectリクエストを明示的に拒否していることを確認します。|
| s3-bucket-versioning-enabled | S3バケットでバージョン管理が有効になっているかどうかを確認します。オプションで、ルールはS3バケットでMFA削除が有効になっているかどうかを確認します。|
| vpc-flow-logs-enabled | Amazon Virtual Private Cloudフローログが検出され、AmazonVPCで有効になっているかどうかを確認します。
| vpc-sg-open-only-to-authorized-ports | いずれかの 0.0.0.0/0 Amazon Virtual Private Cloud (Amazon VPC) を持つセキュリティグループで、特定のインバウンド TCP または UDP トラフィックのみが許可されるかどうかを確認します。インバウンド 0.0.0.0/0. のセキュリティグループがあり、パラメータにポートが指定されていない場合、ルールは NON_COMPLIANT です。|

## 3. Configに対するユーザー権限
Configでは、マネージドポリシーの利用、最小権限の適用を推奨しており、マネージドポリシーではConfigのフルアクセス権限を付与することができない。
IAMユーザーにフルアクセス権限を与えるには、カスタムポリシーを作成する必要がある。
詳細は、[AWS Config デベロッパーガイド-アイデンティティベースポリシーの例](https://docs.aws.amazon.com/ja_jp/config/latest/developerguide/security_iam_id-based-policy-examples.html)に記載されている。<br>

## 4. S3へのログ設定
Config有効化時に、リソース設定履歴をS3バケットに保管する設定を行う必要がある。
ここで、既存のS3バケットを保管先に指定する場合、バケットポリシーでConfigからのアクセスを許可する必要がある。
Configの初期設定時にConfigからのアクセスを許可するバケットポリシーが設定されていないとエラーとなり設定が行えないため、既存のS3バケットには事前にポリシーを設定しておく必要がある。

バケットポリシーの例
```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AWSConfigBucketPermissionsCheck",
            "Effect": "Allow",
            "Principal": {
                "Service": "config.amazonaws.com"
            },
            "Action": "s3:GetBucketAcl",
            "Resource": "<バケットのARN>",
            "Condition": {
                "StringEquals": {
                    "AWS:SourceAccount": "<アカウントID>"
                }
            }
        },
        {
            "Sid": "AWSConfigBucketExistenceCheck",
            "Effect": "Allow",
            "Principal": {
                "Service": "config.amazonaws.com"
            },
            "Action": "s3:ListBucket",
            "Resource": "<バケットのARN>",
            "Condition": {
                "StringEquals": {
                    "AWS:SourceAccount": "<アカウントID>"
                }
            }
        },
        {
            "Sid": "AWSConfigBucketDelivery",
            "Effect": "Allow",
            "Principal": {
                "Service": "config.amazonaws.com"
            },
            "Action": "s3:PutObject",
            "Resource": "<バケットのARN>/AWSLogs/<アカウントID>/Config/*",
            "Condition": {
                "StringEquals": {
                    "AWS:SourceAccount": "<アカウントID>",
                    "s3:x-amz-acl": "bucket-owner-full-control"
                }
            }
        }
    ]
}
```
## 5. 非準拠ルール検出時のメール通知設定
Configには、AWSリソースの変更をSNSトピックを利用して通知する設定を行うことができる。
しかし、Configのコンソールから設定できるのは設定変更時の通知のみで、設定変更がされるごとに通知する設定を行うと通知の量が多く、重要な設定変更を見逃してしまうことにもつながってしまう。そのため、EventBridgeルールとSNSトピックを使用して非準拠ルールを検出した時にだけ通知がされるようにする設定を紹介する。
![config_notification_flow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981404/4b3228ad-527c-c757-5818-ccd4321c2be7.png)
設定は以下の手順に従って行うことができる。
[AWS リソースが準拠していない場合に AWS Config を使用して通知を受けるにはどうすればよいですか?](https://repost.aws/ja/knowledge-center/config-resource-non-compliant)

## 6. まとめ
AWS Configを使用する際に必要な設定内容と、マネージドルールを利用する際によく使用されそうなルールの一覧と説明について記載しました。少しでも参考になれば幸いです。