AWS Organizations の組織全体に CloudFormation Guard を利用した Config カスタムルールを展開してみる

2022.09.30

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

AWS Organizations の組織全体に AWS CloudFormation Guard を利用した AWS Config カスタムルールの展開を試してみました。

組織内のアカウントへの Config ルールのデプロイは次のブログで紹介されている機能を利用して AWS CLI で行いました。

試してみた

始めに AWS Organizations の信頼されたアクセスの設定を行ってから、Config ルールの作成と削除を試してみます。

信頼されたアクセスの設定

管理アカウントにおいてconfig-multiaccountsetup.amazonaws.comの信頼されたアクセスを有効化します。

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

$ aws organizations list-aws-service-access-for-organization --output text | grep config-multiaccountsetup
ENABLEDSERVICEPRINCIPALS        2022-09-28T14:28:59.817000+00:00        config-multiaccountsetup.amazonaws.com

管理アカウントにおいて AWS Config を管理するアカウントに委任する設定を行います。

$ aws organizations register-delegated-administrator --account-id 111122223333 --service-principal config-multiaccountsetup.amazonaws.com

$ aws organizations list-delegated-services-for-account --account-id 111122223333 --output text | grep config-multiaccountsetup
DELEGATEDSERVICES       2022-09-29T13:56:58.493000+00:00        config-multiaccountsetup.amazonaws.com

Config ルールの作成

作業は委任されたアカウントで作業を行います。委任を行わず、管理アカウントから設定することもできます。

今回は、AWS のブログで紹介されている次のルールを展開してみます。Elastic IP (EIP) がアタッチされており、runningステータスの EC2 インスタンスを準拠として評価します。

let eipresource = relationships.*[ resourceType  == 'AWS::EC2::EIP' ]

rule check_ec2_eip_compliance {
    when %eipresource !empty {
        configuration.state.name == "running"
    }
}

(引用元)Announcing AWS Config Custom Rules using Guard Custom policy | AWS Cloud Operations & Migrations Blog


Config ルールの展開はput-organization-config-ruleコマンドで行います。

put-organization-config-rule — AWS CLI 2.7.35 Command Reference

put-organization-config-rule — AWS CLI 1.25.83 Command Reference


AWS CloudFormation Guard のルールを指定する場合はorganization-custom-policy-rule-metadataオプションを利用します。今回は次の JSON ファイルを作成してコマンド実行時に指定します。冒頭で紹介したブログでは Shorthand Syntax で実行しています。

metadata.json

{
  "Description": "Evaluates if an Amazon EC2 instance has a public Elastic IP attached and running.",
  "OrganizationConfigRuleTriggerTypes": [
    "ConfigurationItemChangeNotification",
    "OversizedConfigurationItemChangeNotification"
  ],
  "ResourceTypesScope": ["AWS::EC2::Instance"],
  "PolicyRuntime": "guard-2.x.x",
  "PolicyText": "let eipresource = relationships.*[ resourceType  == 'AWS::EC2::EIP' ]\r\nrule check_ec2_eip_compliance { when %eipresource !empty {configuration.state.name == \"running\" } }",
  "DebugLogDeliveryAccounts": ["111122223333"]
}

PolicyTextに AWS CloudFormation Guard のルールを格納しています。改行コードの追加やダブルクオーテーションのエスケープ処理を行っています。

委任先アカウントにおいて、東京リージョンの AWS ClouShell で実行してみます。AWS Cloudshell で実行する場合は上記のmetadata.jsonを事前にアップロードしておく必要があります。

$ aws configservice put-organization-config-rule --organization-config-rule-name test-check-ec2-eip --organization-custom-policy-rule-metadata file://metadata.json
{
    "OrganizationConfigRuleArn": "arn:aws:config:ap-northeast-1:111122223333:organization-config-rule/test-check-ec2-eip-7v0fq3id"
}

AWS Config のマネジメントコンソールから追加されたカスタムルールを確認してみます。アクションは「再評価」のみ実施できます。ポリシールールを確認することはできないようです。

AWS CLI でも追加されたカスタムルールを確認してみます。マネジメントコンソールと同様にポリシールールであるPolicyTextは確認できないようです。

$ aws configservice describe-config-rules --config-rule-name OrgConfigRule-test-check-ec2-eip-7v0fq3id
{
    "ConfigRules": [
        {
            "ConfigRuleName": "OrgConfigRule-test-check-ec2-eip-7v0fq3id",
            "ConfigRuleArn": "arn:aws:config:ap-northeast-1:111122223333:config-rule/aws-service-rule/config-multiaccountsetup.amazonaws.com/config-rule-ddbgat",
            "ConfigRuleId": "config-rule-ddbgat",
            "Description": "Evaluates if an Amazon EC2 instance has a public Elastic IP attached and running.",
            "Scope": {
                "ComplianceResourceTypes": [
                    "AWS::EC2::Instance"
                ]
            },
            "Source": {
                "Owner": "CUSTOM_POLICY",
                "SourceDetails": [
                    {
                        "EventSource": "aws.config",
                        "MessageType": "ConfigurationItemChangeNotification"
                    },
                    {
                        "EventSource": "aws.config",
                        "MessageType": "OversizedConfigurationItemChangeNotification"
                    }
                ],
                "CustomPolicyDetails": {
                    "PolicyRuntime": "guard-2.x.x",
                    "PolicyText": "",
                    "EnableDebugLogDelivery": true
                }
            },
            "ConfigRuleState": "ACTIVE",
            "CreatedBy": "config-multiaccountsetup.amazonaws.com"
        }
    ]
}

Config アグリゲータから組織内のアカウントの集約結果を確認します。集約しているアカウントが 2 個の環境とはなりますが、複数アカウントに展開できていることを確認できました。

なお、今回は東京リージョンのみの設定となります。他のリージョンでもルールを展開したい場合は、他のリージョン向けに設定する必要があります。

例えば、バージニア北部リージョンに展開する場合は次のコマンドが展開例となります。

aws configservice put-organization-config-rule \
  --organization-config-rule-name test-check-ec2-eip \
  --organization-custom-policy-rule-metadata file://metadata.json \
  --region us-east-1

Config ルールの削除

最後に、ルールを削除してみます。

削除するコマンドはdelete-organization-config-ruleです。

delete-organization-config-rule — AWS CLI 2.7.35 Command Reference

delete-organization-config-rule — AWS CLI 1.25.83 Command Reference


削除する際に指定するカスタムルール名はルール作成時にorganization-config-rule-nameオプションで指定した値です。OrgConfigRule-から始まるルール名ではない点に注意が必要です。

$ aws configservice delete-organization-config-rule --organization-config-rule-name test-check-ec2-eip

以上で終わりです。

さいごに

AWS CloudFormation Guard を利用した AWS Config カスタムルールの展開を試してみました。AWS CloudFormation でも試してみたかったのですが、まだ対応していなかったため、またの機会にしたいと思います。

以上、このブログがどなたかのご参考になれば幸いです。