IAM Access AnalyzerをSlackに通知する(Security Hubを添えて)

2022.11.28

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

こんにちは。たかやまです。

IAM Access AnalyzerをSlackに通知する方法をご紹介したいと思います。

IAM Access Analyzerの内容を直接Chatbotで通知することはできますが、Security Hubを使うとより快適に通知ができるので今回はSecurity Hub経由の設定をご紹介します。

また、IAM Access AnalyzerはIAM Roleとその他リソースで検知の仕方が少し異なります。このあたりはEventBridgeの設定でご説明していきます。

このブログではEventBridgeでIAM Roleのフィルタリングをしますが、以下のブログで紹介するアーカイブルールを使ったほうがSecurity Hubでのイベント管理もしやすくなりおすすめです。

構成図

Security Hubを経由するメリット

  1. Security Hubを経由することで通知設定を集約リージョンのみで済む

    Security Hubがない場合、各リージョンで通知設定をする必要がありますがSecurity Hubのリージョン集約機能を利用することで1つのリージョンに通知設定をするだけで済みます。詳しくはこちらのブログを御覧ください。

  2. Security Hubを経由のほうが通知内容がいい感じになる

    IAM Access Analyzerから直接Slackに通知した場合、以下のような感じで検知したリージョンぐらいしか情報がありません。

    これがSecurity Hubを経由することでリソース情報や検出内容も確認できるようになります。
    個人的にはSecurity Hubリンクが付与されることで、直接AWSコンソールにジャンプできるのが助かります。

    IAM Access Analyzerに限らず、AWSのセキュリティサービスはSecurity Hubを経由することで通知がリッチになるものがあるのでぜひご活用ください。

やってみた

CDKのサンプルコードはこちら

IAM Access Analyzer

監視をしたい各リージョンでIAM Access Analyzerを有効にしてください。
全リージョンで有効化する場合はこちらのブログの方法をご利用ください。

SNS

Slackチャンネルに連携するために、スタンダードのSNS トピックを用意します。
サブスクリプションはチャットボットとの紐付けで設定されるので、この段階では設定不要です。

Chatbot

Slackの設定がなければ、手動で設定していきます。

slackを利用している場合リダイレクトされるので許可します。

ワークスペースが作成されます。
Cfn/CDKで作成する場合、ここで表示されるワークスペースIDを利用する形になります。

あとは、チャンネルIDと先程作成したSNSトピックを紐付けます。
Slack通知をするだけであれば、チャネルロール/ガードレールのポリシーに特別な権限は不要です。

EventBridge

IAM Access Analyzerで発生するイベントをEventBridgeフィルターしていきます。
ここでは、IAM Role検知用とその他リソース用にEventBridgeを設定していきます。

IAM Role用に個別のEventBridgeを設定する理由は、IAM Roleがグローバルリソースのためです。IAM Roleは検知のたびにすべてのリージョンでイベントを発生させるのでEventBridgeを使って一つのリージョンの通知のみ有効にします。

もし、リージョン指定しないで通知を実装するとこんな感じの大量の通知が来てノイズになってしまいます。

IAM Role検知用

IAM Role検知用のEventBridgeのイベントパターン設定はこちらになります。
ポイントとしては、検知リソースタイプをAwsIamRole、リージョンをap-northeast-1(リージョンは好みで)を指定することです。

{
  "detail-type": ["Security Hub Findings - Imported"],
  "source": ["aws.securityhub"],
  "detail": {
    "findings": {
      "ProductName": ["IAM Access Analyzer"],
      "RecordState": ["ACTIVE"],
      "Region": ["ap-northeast-1"],
      "Severity": {
        "Label": ["LOW", "MEDIUM", "HIGH", "CRITICAL"]
      },
      "Resources": {
        "Type": ["AwsIamRole"]
      }
    }
  }
}

ターゲットは作成したSNSトピックを指定します。

その他のリソース

その他のリソースはリージョンごとに検知されるので、リージョン指定は行わずAwsIamRole以外を抽出するイベントパターンを設定します。

{
  "detail-type": ["Security Hub Findings - Imported"],
  "source": ["aws.securityhub"],
  "detail": {
    "findings": {
      "ProductName": ["IAM Access Analyzer"],
      "RecordState": ["ACTIVE"],
      "Severity": {
        "Label": ["LOW", "MEDIUM", "HIGH", "CRITICAL"]
      },
      "Resources": {
        "Type": [{
          "anything-but": "AwsIamRole"
        }]
      }
    }
  }
}

ターゲットは同じく作成したSNSトピックを指定しておきます。

テスト

いくつかのリソースをテストをしてみたいと思います。

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つだけ通知が来ていればEventBridgeのフィルタリングがうまくできています。

テストRoleの削除コマンドこちら

aws iam delete-role --role-name accessanalyzer-test-role

S3

バケット作成とバケットポリシー作成のコマンドはこちら YOUR_ACCOUNTIDはご自身のアカウントIDを設定してください。

aws s3api create-bucket --bucket accessanalyzer-test-bucket-YOUR_ACOUNTID \
--create-bucket-configuration LocationConstraint=ap-northeast-1 \
--region ap-northeast-1

aws s3api put-bucket-policy --bucket accessanalyzer-test-bucket-YOUR_ACOUNTID \
--policy '{"Version":"2012-10-17","Statement":[{"Sid":"Statement1","Effect":"Allow","Principal":"*","Action":["s3:GetObject"],"Resource":["arn:aws:s3:::accessanalyzer-test-bucket-YOUR_ACOUNTID/*"]}]}' \
--region ap-northeast-1

テストBucketの削除コマンドはこちら

aws s3api delete-bucket --bucket accessanalyzer-test-bucket-YOUR_ACOUNTID \
--region ap-northeast-1

SQS

SQSはus-east-1(バージニア北部)で作成してみたいと思います。
SQSの作成コマンドはこちら。
YOUR_ACCOUNTID/YOUR_CROSSACCOUNTIDをご自身の環境に合わせてを設定してください。

aws sqs create-queue --queue-name accessanalyzer-test-queue \
--attributes '{"Policy": "{\"Version\":\"2008-10-17\",\"Id\":\"__default_policy_ID\",\"Statement\":[{\"Sid\":\"__owner_statement\",\"Effect\":\"Allow\",\"Principal\":{\"AWS\":\"YOUR_CROSSACCOUNTID\"},\"Action\":[\"SQS:*\"],\"Resource\":\"arn:aws:sqs:us-east-1:YOUR_ACCOUNTID:\"}]}"}' \
--region us-east-1

us-east-1でも問題なく検知されていることが確認できます!

テストQueueの削除コマンドはこちら YOUR_QUEUE_URLはテスト用に作成されたqueueを設定してください。

aws sqs delete-queue --queue-url YOUR_QUEUE_URL \
--region us-east-1

最後に

IAM Access Analyzerの通知をSlackに通知する方法をご紹介しました。IAM Access Analyzerを複数リージョンで有効にしている場合のIAM Roleの通知が重複するので、今回のようなEventBridgeのフィルタリングをご活用ください。

以上、たかやま(@nyan_kotaroo)でした。