AWS Config 適合パックの検討から導入までの紹介

Manami Taira
Apr 27 · 21 min read

第三子の出産のため、1年間の産休育休を経て2020年9月より職場復帰しましたインフラチームの平と申します。久しぶりのエンジニアブログエントリーになります。

今回のエントリーでは、Japan Digital Design (以下、JDD)で行った、AWS Configの適合パック導入について紹介いたします。

本ページではAWSリソースの設定を評価、監査、審査できるサービス「AWS Config」のマネージドルールのセットである「適合パック」の導入と、組織単位のアグリゲーター設定について解説します。

読者対象

  • 管理対象のAWSアカウントが複数ありAWS Organizations導入済で、AWS Config の運用について検討中の方
  • AWSの運用管理が好きな方
  • セキュリティ担当の方

AWS Configマネージドルールの選定および導入

AWS Configの運用ついては、AWS公式ドキュメントのベストプラクティスを参考にして運用するのはもちろんですが、JDDでは社内のインフラチームとセキュリティチームが連携して取り組んでいます。また、JDD社内のセキュリティガイドラインに準拠させるため、複数のマネージドルールを設定しています。

AWS Config のマネージドルールの定期的な見直しで発生する工数についても最小限になるように設計しています。例えば、社内で管理している多数のAWSアカウントにAWS Configマネージドルールをアカウントそれぞれに設定した場合、その後もメンテナンスをしていくのは手間がかかります。そのため、JDDではAWS Organizations の参加アカウントに対して AWS Config ルールを組織単位で設定する運用で、適合パック(ConformancePack)を導入しています。

また、組織単位で適合パックを設定すると、メンバーアカウントの権限では適合パックを変更・削除することができません。コンプライアンス管理の観点からも適合パックの導入はメリットがあります。
今回は、下記の手順にて実際に設定するまでの手順をご紹介いたします。

  1. 適合パックの検討
  2. 適合パックの設定
  3. アグリゲーターの設定および認証
  4. 新規AWSアカウントのAWS Config 有効化

1) 適合パックの検討

JDDでは、AWS Config運用のため、JDD社内のセキュリティガイドラインに準拠したAWS Configの適合パック(ConformancePack)をカスタム作成しました。適合パックのカスタム作成にあたっては、JDDセキュリティエンジニア連携の元、下記のベストプラクティスを参考にし作成しています。

Operational Best Practices for CIS AWS Foundations Benchmark v1.3 Level 1
Operational Best Practices for CIS AWS Foundations Benchmark v1.3 Level 2
Operational Best Practices for CIS Top 20
AWS Control Tower Detective Guardrails Conformance Pack

なお、AWSアカウントの役割を分離させるため、AWS Configの管理についてはAWS Organizationsの管理アカウント(旧マスターアカウント)ではなく、管理用メンバーアカウントに対してAWS Configを管理委任する運用をしています。
今回は、委任先のAWSアカウントでAWS Configの運用を開始するまでの手順を紹介します。

2) 適合パックの設定

まず、AWS Organizationsの全参加アカウントに適合パックを設定する方法について手順を紹介します。

  • 2–1. 管理アカウントからメンバーアカウントに対しAWS Configの管理委任、およびアグリゲーターの管理委任を行う
  • 2–2. AWS 適合パックをS3バケットに配置
  • 2–3. AWS Config データ集約用S3バケットを作成
  • 2–4. 適合パックを設定

AWS Organizations の管理アカウント(旧:マスターアカウント)から、委任先のアカウントに対し、AWS Configの管理委任、およびアグリゲーターの管理委任を行います。
(※ 2021年4月現在、委任設定についてマネジメントコンソールでは設定できないため、AWS CLIを利用しています。AWS CLIはAWS CloudShell 上でも実行可能です)

AWS Configの適合パック(ConformancePack)をAWS Organizations 参加アカウントに配信するための管理委任と、アグリゲーターの管理委任の設定を行うため、AWS管理アカウントで下記を実行します。

$ aws organizations enable-aws-service-access --service-principal config-multiaccountsetup.amazonaws.com 
$ aws organizations enable-aws-service-access --service-principal config.amazonaws.com

実行後に確認します。

$ aws organizations list-aws-service-access-for-organization --output text
ENABLEDSERVICEPRINCIPALS 2021–02–19T04:29:41.400000+00:00 config-multiaccountsetup.amazonaws.com
ENABLEDSERVICEPRINCIPALS 2021–02–18T07:35:08.647000+00:00 config.amazonaws.com

AWS Organizations の管理アカウントで “register-delegated-administrator”コマンドを実行し、AWS Organizations の適合パックと AWS Config ルールをデプロイするためのAWS アカウントを指定し、委任設定します。” — account-id”には委任先のAWSアカウントIDを指定します。

$ aws organizations register-delegated-administrator --service-principal config-multiaccountsetup.amazonaws.com --account-id "委任先AWSアカウントID"
$ aws organizations list-delegated-services-for-account --account-id "委任先AWSアカウントID"

最後に、委任設定ができたか管理アカウントで確認します。

$  aws organizations list-delegated-services-for-account --account-id "委任先AWSアカウントID" --output text
DELEGATEDSERVICES 2021-02-19T04:33:22.963000+00:00 config-multiaccountsetup.amazonaws.com
DELEGATEDSERVICES 2021-02-25T00:37:27.526000+00:00 config.amazonaws.com

AWS Configでマルチアカウント、マルチリージョンのデータ集約についての詳細はAWS公式ドキュメントをご確認ください。

適合パックのyamlファイルをS3バケットに配置します。

適合パックのテンプレート構文はCloudFormationテンプレートと同様の記述が可能です。

また、適合パックのサンプルテンプレートが公式でも紹介されているので参考になるかと思います。

注意点としては、適合パックのテンプレートは自動化実行ロールのCloudFormation組み込み関数をサポートしていません。オートメーション実行ロールで正確なARNを文字列として指定する必要があります。

AWS Config配信データの保存先については、Amazon S3バケットによる分散を防ぐ目的で、委任先のメンバーアカウントの S3バケットに各AWSアカウントのAWS Config配信データを集約させ、管理をしています。

AWS公式ドキュメントの「AWS Config — Amazon S3 バケットへのアクセス許可」を参考に、AWS Configデータ集約用のS3バケットを作成します。

※ S3バケット作成時はAWS公式ドキュメントの注記まで確認することをおすすめします。

AWS CLI “put-organization-conformance-pack” は、AWS Config委任先のAWSアカウントのAWS CLIで実施します(マネジメントコンソールでは設定できません)。
カスタムで作成した適合パックをAmazon S3 バケットに保存し、” — template-s3-uri”で指定します。これで、 AWS Organizationsの参加アカウントに対して適合パックが 設定されます。
※ メンバーアカウントだけではなく、管理アカウントにも適用されます。

$ aws configservice put-organization-conformance-pack --organization-conformance-pack-name "conformance-pack-name" --template-s3-uri s3://BucketName/Template/conformance-pack.yaml

“put-organization-conformance-pack”コマンドによる適合パック設定は即時反映されません。各AWSアカウントに反映されるまで、20~30分程度かかる場合があります。

適合パックを AWS CLI “put-organization-conformance-pack”コマンドで設定する際、既存のAWSアカウントでAWS Configを事前に有効化しておく必要があります。正しい順序としては以下になります。

  1. AWS Config 配信データ保存用 S3バケットの作成
  2. AWS Organizations参加の全AWSアカウントでAWS Configを有効化
  3. “put-organization-conformance-pack” による 適合パックの設定

既存AWSアカウントの場合、(2)と(3)の手順を逆にすると、適合パックの反映が失敗します。

もし適合パックの反映が失敗した場合は、(2–3.適合パックの設定)で紹介した“put-organization-conformance-pack”コマンドを再実行します。同一の適合パックを設定した場合、重複する事無く反映されます。

なお、AWS Organizationsを利用して新規AWSアカウントを作成する場合、適合パックがAWS Organizationsに対して有効になっている状態でAWS Configを有効化すると、適合パックの反映は問題無く成功する仕様になっています。

3) アグリゲーターの設定および認証

AWS Configを有効化し適合パックを設定したら、次はアグリゲーターを設定します。AWS Configに記録されたコンプライアンスデータを組織単位で集約することができます。

まずは組織単位のアグリゲーターを有効にするためIAMロールを作成します。IAMを開き、ユースケースでConfig Organizationsを選択します。

ロール名”AWSConfigRoleForOrganizations”を作成します。

AWS Config委任先のAWSアカウントでアグリゲーターを設定します。全リージョンを指定することもできますが、今回はリージョンに “ap-northeast-1”(東京リージョン)を指定した例を紹介します。

  1. AWSConfig→アグリゲータ→アグリゲータを作成
  2. 「AWSConfigがソースアカウントからアグリゲータアカウントにソースをレプリケートすることを許可する」にチェックを入れる
  3. アグリゲータ名を入力
  4. ソースアカウント「組織を追加する」
  5. IAMロールの選択「アカウントからロールを選択する」AWSConfigRoleForOrganizations
  6. リージョン「ap-northeast-1」
  7. アグリゲータを作成

各AWSアカウントで、アグリゲーターアカウントの承認を行います。マネジメントコンソールでAWS Config→「認証」→「承認の追加」を選択します。(承認はリージョン単位になっているため、必要リージョン分を承認します)

AWS OrganizationsでAWS Config が有効になっている場合、AWS Organizations参加アカウントの設定でアグリゲーターアカウントIDを追加するだけで自動的に承認されるようになっています。

アグリゲーターアカウントIDを承認後、アグリゲーター管理アカウントに対してAWSアカウントのコンプライアンスデータが反映されるまで2時間程度かかる場合があります。

委任先のAWSアカウントでアグリゲーターのステータスを確認できます。適合パックによるマネージドルールがコンプライアンスに準拠しているか確認できます。

マルチアカウント・マルチリージョンのデータ集約についての詳細は、AWS公式ドキュメントをご確認ください。

4) 新規AWSアカウントのAWS Config 有効化

AWS Organizations に参加する新規メンバーアカウントに対して、AWS Configの設定を有効化する方法を検討し、下記の3通りを考えました。

  1. 手動でAWS Configを有効化
  2. 管理アカウントから AWS Organizationsメンバーアカウントに対し、CloudFormation StackSetsでAWS Config有効化を自動デプロイ
  3. AWS Step Functions と AWS Lambda(PowerShell)でAWS Config有効化を自動デプロイ

JDDではAWSアカウント数について今後も増加する見込みがあり、上記(1)の手作業による有効化は手間がかかると判断しました。残り(2)か(3)で検討しましたが、最終的には(3)で運用する事となりました。社内で新規AWSアカウント発行後、一連の初期設定をLambda で設定しており、その処理の一つとしてAWS Config有効化を行っています。

AWS Config 有効化についてはPowerShellスクリプトをAWS Lambdaで実行し、AWS Step Functionsで自動的に処理を行っています。

今回はPowerShellコマンドによるAWS Config有効化の紹介を行います。

PowerShellによるAWS Configの管理については、PowerShell 7にモジュール”AWS.Tools.Common”、”AWS.Tools.ConfigService”をインストールすれば利用できます。

> Install-Module -Name AWS.Tools.Common
> Install-Module -Name AWS.Tools.ConfigService

認証情報の設定についてはAWS公式ドキュメントをご確認ください。

AWS Config の記録設定を行うため、下記の”Write-CFGConfigurationRecorder”コマンドを実行します。
”-ConfigurationRecorder_RoleARN”の”(AccountID)”にはAWSアカウントIDを入力します。

> Write-CFGConfigurationRecorder -ConfigurationRecorderName "default" -RecordingGroup_AllSupported $true -RecordingGroup_IncludeGlobalResourceType $true -ConfigurationRecorder_RoleARN "arn:aws:iam::(AccountID):role/aws-service-role/config.amazonaws.com/AWSServiceRoleForConfig"

次に、配信チャネルの設定を”Write-CFGDeliveryChannel”コマンドで行います。“-DeliveryChannel_S3BucketName” に(2–3)で作成したS3バケット名を指定します。”-Region” ではAWS Configの記録対象リージョンを指定します。(今回は東京リージョン”ap-northeast-1”を指定する例になります。)

> Write-CFGDeliveryChannel -DeliveryChannelName "default" -ConfigSnapshotDeliveryProperties_DeliveryFrequency One_Hour -DeliveryChannel_S3BucketName "S3バケット名" -Region ap-northeast-1

AWS Configの記録を開始するには、下記の”Start-CFGConfigurationRecorder”コマンドを実行します。

> Start-CFGConfigurationRecorder -ConfigurationRecorderName "default"

AWS Configのステータスを確認したい時は ”Get-CFGConfigurationRecorderStatus”コマンドを実行します。
今回はAWS Configデータの取得間隔を”One_Hour”(1時間)で設定しているので、”LastStatus”が PendingからSuccessに変わるタイミングはAWS Configを有効にしてから1時間後になりますのでご注意ください。

> Get-CFGConfigurationRecorderStatusLastErrorCode        :
LastErrorMessage :
LastStartTime : 2021/03/08 4:57:07
LastStatus : Success
LastStatusChangeTime : 2021/03/08 5:57:24
LastStopTime : 0001/01/01 0:00:00
Name : default
Recording : True

(3–3. アグリゲーターの承認をする) をPowerShellコマンドで行う場合は”Write-CFGAggregationAuthorization”コマンドを実行します。
”-AuthorizedAccountId”にはアグリゲーターアカウントIDを入力します。今回は東京リージョン”ap-northeast-1”を指定する例になります。

> Write-CFGAggregationAuthorization -AuthorizedAccountId "AccountID"  -AuthorizedAwsRegion ap-northeast-1

以上でAWS Configの設定とアグリゲーターの設定が完了し、AWS Configの運用が開始できる状態になります。

今回の適合パック導入にあたり、下記のAWS公式ブログが非常に参考になりました。是非こちらもご確認ください。

最後に

今回紹介した手順で組織単位の AWS Config運用が可能になります。興味のある方はぜひお試しください。

今回は修復アクションについての解説は行いませんでしたが、また別の機会にブログで紹介いたします。

今後も定期的にブログを更新していきたいと思いますので、今後ともよろしくお願いします。(リクエストもお待ちしております)

Japan Digital Design Blog

金融の新しいあたりまえを創る

Japan Digital Design Blog

金融の新しいあたりまえを創る

Manami Taira

Written by

Infrastructure Engineer / Japan Digital Design

Japan Digital Design Blog

金融の新しいあたりまえを創る