AWS Configとは
AWS Configは、リソースごとの設定項目を生成 し、履歴としてこれを保持 するため、全ての変更を追跡することが可能で、AWSリソース間の関係と設定の履歴などを確認することができる。
リソースの設定が最適であるか
現在のスナップショットの取得
リソース設定の取得
設定履歴の取得
リソース間の関係の表示
通知
これらの機能を用いて、リソースの管理 、監査とコンプライアンス 、設定変更の確認とトラブルシューティング 、セキュリティ分析 などを行うことができる。
設定項目は、S3バケットに蓄積することが可能で、データはJSON形式で、S3に6時間ごとに送信 される。また、リソースが変更されたタイミング等で、Amazon SNSを用いてEメール等で通知することも可能である。
AWS Configは、マルチアカウントマルチリージョンの データ集約 に対応しており、複数のアカウントやリージョンの設定、コンプライアンスデータを1つのアカウントに集約することができる。
https://www.slideshare.net/AmazonWebServicesJapan/aws-black-belt-online-seminar-2016-aws-cloudtrail-aws-config?ref=https://tech.blog.surbiton.jp/
AWS Configの概念
設定履歴と設定項目、スナップショット、レコーダ
設定履歴 は、特定期間の特定リソースに関する設定項目のコレクションである。また、設定項目 は、アカウント内のサポートされているAWSリソースの属性(メタデータ、関係、設定、関連イベントなど)を記録したものである。設定スナップショット は、設定項目のコレクションで、記録対象のリソースの全体像を示す。スナップショットは、S3 Bucket
に配信が可能。
設定レコーダ は、(標準設定では)Configがサポートしている全てのリソースの設定項目の評価と保存を行う。設定レコーダをオフにすると設定変更トリガによる評価は実行されない。一方で、定期実行トリガは引き続き指定した間隔で実行される 。
設定ストリーム
設定ストリームは、設定項目の自動更新リストで、リソースの作成や変更、削除が行われる度に、Amazon SNS
を使用して通知を行うことができる。
ルール
AWS Configでは、望ましい設定をルールとして定めることができ、これに違反しているリソースに対しては、非準拠 のフラグを立てる。ルールは、事前に用意されたマネージドルール のほかに、ユーザが自ら作成したカスタムルール を適用することもできる。これらのルールは、リソースの設定変更時 に評価されるのか、それとも定期的 に評価されるのかを定義することができる。
AWS Configの仕組み
AWS Configは、サポートされているAWSリソースを検出し、リソースごとに設定項目を生成し、その記録を履歴として保持する。Configはリソースごとに、DescribeもしくはListのAPIコールによって、リソースの全ての変更を追跡する。Configルールを利用することで、定期的にこのルールに照らして、リソースの設定の評価を行うことができる。
また、この設定項目は、S3バケット もしくは Amazon SNS に配信することができる。SNSへ配信時のメッセージタイプは以下の通り。
メッセージタイプ
内容
ComplianceChangeNotification
コンプライアンスタイプの変更時
ConfigRulesEvaluationStarted
リソースの評価開始時
ConfigurationSnapshotDeliveryStarted
スナップショット配信開始時
ConfigurationSnapshotDeliveryCompleted
スナップショット配信完了時
ConfigurationSnapshotDeliveryFailed
スナップショット配信失敗時
ConfigurationHistoryDeliveryCompleted
設定履歴配信完了時
ConfigurationItemChangeNotification
リソース変更時
OversizedConfigurationItemChangeNotification
SNSの最大サイズ超過時
AWS Configのセットアップ
AWS ConfigはCloudFormationに対応しているため、CloudFormation経由でConfigをセットアップすることができる。
サービスロールの有効化
以下のサービスロールを有効化することで、AWSリソースの読み込み権限 および S3への書き込み権限 を Config
に、IAMとSystemManagerへの書き込み権限 を Config Remediation
にそれぞれ付与する。
Resources:
ServiceLinkedRoleForConfig:
Type: AWS::IAM::ServiceLinkedRole
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
DeletionPolicy: Retain
Properties:
AWSServiceName: remediation.config.amazonaws.com
Description: A service-linked role required for AWS Config Remediation to access your resources.
Configの有効化
DeliveryChannel
と ConfigurationRecorder
を作成する。
Resources:
ConfigDeliveryChannel:
Type: AWS::Config::DeliveryChannel
Properties:
Name: default
S3BucketName: !Ref S3ForConfig
SnsTopicARN: !Ref SnsTopicARN
ConfigConfigurationRecorder:
Type: AWS::Config::ConfigurationRecorder
Properties:
Name: default
RecordingGroup:
AllSupported: true
IncludeGlobalResourceTypes: true
RoleARN: !Sub arn:aws:iam::${AWS::AccountId}:role/aws-service-role/config.amazonaws.com/AWSServiceRoleForConfig
すでにAWS Configをセットアップ済みの状態で上記テンプレートを実行すると、 the maximum number of delivery channels
エラーが発生する。その場合は既存の DeliveryChannel
を削除した上で、上記テンプレートを再度実行する。
aws configservice delete-delivery-channel --delivery-channel-name default
aws configservice delete-configuration-recorder --configuration-recorder-name default
S3バケットの作成
設定情報 (履歴ファイルやスナップショット)を保存するために使用する、Amazon S3 バケット と、それに紐づくバケットポリシー を作成する。
Resources:
S3ForConfig:
Type: 'AWS::S3::Bucket'
DeletionPolicy: Retain
Properties:
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