IAM Access AnalyzerのIAM Roleをアーカイブするルールを複数リージョンで作成するスクリプト
こんにちは。たかやまです。
こちらのブログで紹介したとおりIAM Access AnalyzerのIAM Role検知はすべてのリージョンで行われてしまうため通知する場合にノイズになります。ブログではEventBridgeを使い、IAM Roleの通知を抑制する方法をご紹介しました。
このブログを書いたあとアーカイブルールでIAM Roleを抑制すれば同様のことができるなと思い、今回はマルチリージョンにIAM Roleの検知を抑制するアーカイブルールの作成スクリプトをご紹介したいと思います。
後述しますが、こちらのほうがSecurity Hubの情報もすっきりするのでおすすめです。
1つのリージョンを除いてアーカイブルールを作成する
複数リージョンでIAM Role検知のアーカイブルールを作成するスクリプトはこちらになります。各変数には環境に合わせて以下の値を設定してCloudShellなどで実行してください。
- analyzer_name : 作成済みIAM Access Analyzerの名前
- rule_name : 作成するアーカイブルールの名前
- exc_region : アーカイブルールを作成しないリージョン
analyzer_name="cm-access-analyzer" rule_name="ArchiveRule-Iam-Role" exc_region="ap-northeast-1" aws ec2 describe-regions --query Regions[].[RegionName] --output text \ | while read region; do if [[ ${region} != ${exc_region} ]]; then aws accessanalyzer create-archive-rule --analyzer-name ${analyzer_name} \ --rule-name ${rule_name} \ --filter '{"resourceType":{"eq":["AWS::IAM::Role"]}}' \ --region ${region} echo "Created in ${region}"; fi done
実行結果
ap-northeast-1(東京リージョン)で作成しないパターン
[cloudshell-user@ip-10-1-94-139 ~]$ analyzer_name="cm-access-analyzer" [cloudshell-user@ip-10-1-94-139 ~]$ rule_name="ArchiveRule-Iam-Role" [cloudshell-user@ip-10-1-94-139 ~]$ exc_region="ap-northeast-1" [cloudshell-user@ip-10-1-94-139 ~]$ aws ec2 describe-regions --query Regions[].[RegionName] --output text \ > | while read region; do > if [[ ${region} != ${exc_region} ]]; then > aws accessanalyzer create-archive-rule --analyzer-name ${analyzer_name} \ > --rule-name ${rule_name} \ > --filter '{"resourceType":{"eq":["AWS::IAM::Role"]}}' \ > --region ${region} > echo "Created in ${region}"; > fi > done Created in ap-south-1 Created in eu-north-1 Created in eu-west-3 Created in eu-west-2 Created in eu-west-1 Created in ap-northeast-3 Created in ap-northeast-2 Created in ca-central-1 Created in sa-east-1 Created in ap-southeast-1 Created in ap-southeast-2 Created in eu-central-1 Created in us-east-1 Created in us-east-2 Created in us-west-1 Created in us-west-2
作成後の確認コマンドはこちらになります。
analyzer_name="cm-access-analyzer" rule_name="ArchiveRule-Iam-Role" aws ec2 describe-regions --query Regions[].[RegionName] --output text \ | while read region; do echo "### ${region} ###"; aws accessanalyzer get-archive-rule --analyzer-name ${analyzer_name} \ --rule-name ${rule_name} \ --query archiveRule.[ruleName,createdAt] \ --region ${region} \ --output text ; done
作成しないap-northeasst-1(東京リージョン)ではArchive rule not found
のエラーメッセージが出ます。
[cloudshell-user@ip-10-0-8-183 ~]$ analyzer_name="cm-access-analyzer" [cloudshell-user@ip-10-0-8-183 ~]$ rule_name="ArchiveRule-Iam-Role" [cloudshell-user@ip-10-0-8-183 ~]$ aws ec2 describe-regions --query Regions[].[RegionName] --output text \ > | while read region; do > echo "### ${region} ###"; > aws accessanalyzer get-archive-rule --analyzer-name ${analyzer_name} \ > --rule-name ${rule_name} \ > --query archiveRule.[ruleName,createdAt] \ > --region ${region} \ > --output text ; > done ### ap-south-1 ### ArchiveRule-Iam-Role 2022-11-29T15:27:43+00:00 ### eu-north-1 ### ArchiveRule-Iam-Role 2022-11-29T15:27:44+00:00 ### eu-west-3 ### ArchiveRule-Iam-Role 2022-11-29T15:27:45+00:00 ### eu-west-2 ### ArchiveRule-Iam-Role 2022-11-29T15:27:46+00:00 ### eu-west-1 ### ArchiveRule-Iam-Role 2022-11-29T15:27:47+00:00 ### ap-northeast-3 ### ArchiveRule-Iam-Role 2022-11-29T15:27:49+00:00 ### ap-northeast-2 ### ArchiveRule-Iam-Role 2022-11-29T15:27:50+00:00 ### ap-northeast-1 ### An error occurred (ResourceNotFoundException) when calling the GetArchiveRule operation: Archive rule not found ### ca-central-1 ### ArchiveRule-Iam-Role 2022-11-29T15:27:52+00:00 ### sa-east-1 ### ArchiveRule-Iam-Role 2022-11-29T15:27:53+00:00 ### ap-southeast-1 ### ArchiveRule-Iam-Role 2022-11-29T15:27:54+00:00 ### ap-southeast-2 ### ArchiveRule-Iam-Role 2022-11-29T15:27:56+00:00 ### eu-central-1 ### ArchiveRule-Iam-Role 2022-11-29T15:27:57+00:00 ### us-east-1 ### ArchiveRule-Iam-Role 2022-11-29T15:27:58+00:00 ### us-east-2 ### ArchiveRule-Iam-Role 2022-11-29T15:27:59+00:00 ### us-west-1 ### ArchiveRule-Iam-Role 2022-11-29T15:28:00+00:00 ### us-west-2 ### ArchiveRule-Iam-Role 2022-11-29T15:28:01+00:00
アーカイブルールが不要になったときに削除する場合はこちら
analyzer_name="cm-access-analyzer" rule_name="ArchiveRule-Iam-Role" aws ec2 describe-regions --query Regions[].[RegionName] --output text \ | while read region; do echo "### ${region} ###"; aws accessanalyzer delete-archive-rule --analyzer-name ${analyzer_name} \ --rule-name ${rule_name} \ --region ${region} echo "Deleted in ${region}" done
実行結果
ap-northeast-1(東京リージョン)で作成しないパターン
[cloudshell-user@ip-10-0-15-236 ~]$ analyzer_name="cm-access-analyzer" [cloudshell-user@ip-10-0-15-236 ~]$ rule_name="ArchiveRule-Iam-Role" [cloudshell-user@ip-10-0-15-236 ~]$ aws ec2 describe-regions --query Regions[].[RegionName] --output text \ > | while read region; do > echo "### ${region} ###"; > aws accessanalyzer delete-archive-rule --analyzer-name ${analyzer_name} \ > --rule-name ${rule_name} \ > --region ${region} > echo "Deleted in ${region}" > done ### ap-south-1 ### Deleted in ap-south-1 ### eu-north-1 ### Deleted in eu-north-1 ### eu-west-3 ### Deleted in eu-west-3 ### eu-west-2 ### Deleted in eu-west-2 ### eu-west-1 ### Deleted in eu-west-1 ### ap-northeast-3 ### Deleted in ap-northeast-3 ### ap-northeast-2 ### Deleted in ap-northeast-2 ### ap-northeast-1 ### Deleted in ap-northeast-1 ### ca-central-1 ### Deleted in ca-central-1 ### sa-east-1 ### Deleted in sa-east-1 ### ap-southeast-1 ### Deleted in ap-southeast-1 ### ap-southeast-2 ### Deleted in ap-southeast-2 ### eu-central-1 ### Deleted in eu-central-1 ### us-east-1 ### Deleted in us-east-1 ### us-east-2 ### Deleted in us-east-2 ### us-west-1 ### Deleted in us-west-1 ### us-west-2 ### Deleted in us-west-2
検証
SNS/Chatbotの設定はこちらのブログを参考にしてください。
EventBridgeの設定
EventBridgeでリージョンによるフィルタリングは行わず、すべてのIAM Access Analyzerのイベント検知するイベントパターンを用意します。
{ "detail-type": ["Security Hub Findings - Imported"], "source": ["aws.securityhub"], "detail": { "findings": { "ProductName": ["IAM Access Analyzer"], "RecordState": ["ACTIVE"], "Severity": { "Label": ["LOW", "MEDIUM", "HIGH", "CRITICAL"] } } } }
用意される構成はこんな感じ
ap-northeast-1(東京リージョン)以外はアーカイブされているため、IAM Roleのイベントはap-northeast-1のもののみ通知されます。
IAM Roleの作成
以下のAWS CLIでクロスアカウントなRoleを作成していきます。
YOUR_CROSSACCOUNTID
はご自身の対象のクロスアカウントIDを設定してください。
aws iam create-role --role-name accessanalyzer-test-role \ --assume-role-policy-document '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Action":"sts:AssumeRole","Principal":{"AWS":"YOUR_CROSSACCOUNTID"},"Condition":{}}]}'
クロスアカウントなRoleが作成されるとIAM Access Analyzerで検知されます。
このとき、複数通知ではなく1つだけ通知が来ていればアーカイブがうまくできています。
このときSecurity Hubの情報も一つのみ記録され、すっきりします。
ちなみにアーカイブルールを作成しないですべてのリージョンでIAM Roleを検知したときのSecurity Hub上の画面こちらになります。
EventBridgeでフィルタリングする場合、通知は1つにできますがSecurity Hub上では複数イベントが記録される状態になるのでアーカイブルール側で制御するほうが管理上よいかと思います。
検証後のテストRoleの削除コマンドこちら
aws iam delete-role --role-name accessanalyzer-test-role
最後に
Security Hubでの管理を考慮したとき、アーカイブルールを使うことでSecurity Hubでの管理も楽にすることができます。
アーカイブルールの展開方法はAWS CLIを使った方法をご紹介しましたが、CloudFormationでも展開可能なのでお好きな方法で管理いただければと思います。
AWS::AccessAnalyzer::Analyzer - AWS CloudFormation
アーカイブルールを活用してIAM Access Analyzerを効率よく管理しましょう!
以上、たかやま(@nyan_kotaroo)でした。