IAM Access Analyzerで特定のアカウントからのクロスアカウントアクセスだけ検出対象外にしたい。

IAM Access Analyzerで特定のアカウントからのクロスアカウントアクセスだけ検出対象外にしたい。

2025.07.31

はじめに

皆様こんにちは、あかいけです。

IAM Access Analyzer で特定のアカウントからのクロスアカウントアクセスだけ検出対象外にしたいと思ったことはありますか?
私はあります。

今回はアーカイブルールを活用して、
簡単に特定のアカウントからのクロスアカウントアクセスだけ検出対象外にする方法をまとめます。

IAM Access Analyzer とは?

IAM Access Analyzerは、AWSリソースが意図せず外部と共有されていないかを分析するサービスです。
IAMロール、S3バケット、Lambda関数などのリソースに対する外部からのアクセス権限を自動的に検出し、セキュリティリスクを可視化します。

大きく分けて外部アクセスと内部アクセスの二種類があり、今回は外部アクセスの リソースタイプ:IAMロール が対象となります。
サポートされているリソースタイプの一覧と検出される条件は、以下ドキュメントで確認できます。

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/access-analyzer-resources.html

アーカイブルール とは?

アーカイブルールは、IAM Access Analyzerで検出された結果のうち、意図的で問題ないアクセス権限を自動的にアーカイブ(検出対象外)にする機能です。
特定の条件を満たす検出結果を自動的にアーカイブすることで、本当に注意すべき検出に集中できます。

例えばJumpアカウントでの運用で、かつJump先のアカウントでIAM Access Analyzerを利用している場合に、
Jumpアカウントからのクロスアカウントアクセスは検知しないようにする、などです。

アーカイブルールの各設定値の意味は以下ドキュメントに記載されています。

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/access-analyzer-archive-rules.html

設定方法

今回はTerraformで設定してみます。
作成するリソースはIAM Access Analyzerとアーカイブルールのみです。

main.tf
terraform {
  required_version = ">= 1.0.0"
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = ">= 6.0"
    }
  }
}

provider "aws" {
  region  = var.aws_region
}

variable "aws_region" {
  type    = string
  default = "ap-northeast-1"
}

variable "archive_account_id" {
  type    = string
}

resource "aws_accessanalyzer_analyzer" "main" {
  analyzer_name = "test-analyzer"
  type          = "ACCOUNT"
}

resource "aws_accessanalyzer_archive_rule" "main" {
  analyzer_name = aws_accessanalyzer_analyzer.main.analyzer_name
  rule_name     = "test-rule"

  filter {
    criteria = "principal.AWS"
    eq       = [var.archive_account_id]
  }

  filter {
    criteria = "resourceType"
    eq       = ["AWS::IAM::Role"]
  }
}

重要なのは aws_accessanalyzer_archive_rulefilter の設定です。
このフィルター設定でマッチした検出は、アーカイブの対象となります。

なお具体的に指定する値はTerraformのドキュメントには記載がなかったので、

https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/accessanalyzer_archive_rule

以下のAWSのドキュメントを参考にしています。

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/access-analyzer-reference-filter-keys.html

また一見類似しているフィルターキーとしてresourceOwnerAccountがありますが、
今回はアクセス権限が付与されているクロスアクセス元のアカウントを指定したかったため、principal.AWSを指定しています。

テスト

テストとして実際に検出がアーカイブされるか確認します。

IAM Access Analyzerを作成したAWSアカウントにて、以下の信頼ポリシーを設定したIAMロールを作成します。
アーカイブルールで指定したアカウントID、また指定していないアカウントIDを指定したIAMロールをそれぞれ作成します。

信頼ポリシー
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::<アカウントID>:root"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

IAM Access Analyzer での検出結果

アーカイブルールにマッチする検出はアーカイブ、
マッチしない検出はアクティブのステータスとなります。

iam-access-analyzer-02

Security Hub での検出結果

IAM Access Analyzer での検出結果と同様に、
アーカイブルールにマッチする検出はアーカイブ、マッチしない検出はアクティブのステータスとなります。

iam-access-analyzer-01

もしSecurity HubからEventBridgeルールを経由して通知したい場合は、
EventBridgeルールのイベントパターンにて RecordState を指定をしてあげれば、アーカイブされている検出(アーカイブルールの対象となっているもの)を通知しないようにすることができます。

イベントパターンの例
{
  "detail-type": ["Security Hub Findings - Imported"],
  "source": ["aws.securityhub"],
  "detail": {
    "findings": {
      "ProductName": ["IAM Access Analyzer"],
      "RecordState": ["ACTIVE"]
    }
  }
}

余談:IAM Access Analyzer の「リソースアクセスの検出結果」が出力されるまでかかった時間について

IAM Access Analyzerのトップページから確認できる「リソースアクセスの検出結果」ですが、
私の環境ではアナライザー作成から1日経っても表示されませんでした。 (追記:作成から36時間後ぐらいに表示されました)
また「アクティブな検出結果を表示」では文字通りアクティブな検出結果だけ表示されるため、アーカイブされている検出は確認ができません。

iam-access-analyzer-03

取り急ぎ確認したい場合はアナライザーの詳細ページの「検出結果を表示」から確認できるため、
こちらから確認してみて下さい。

iam-access-analyzer-04

さいごに

以上、IAM Access Analyzer で特定のアカウントからのクロスアカウントアクセスだけ検出対象外にする方法でした。
今回は特定のアカウントからのクロスアカウントアクセスだけをアーカイブ対象にしていましたが、
フィルターキーの条件次第で様々なルールを設定できます。

ただ個人的にはアーカイブルールの話は意外と記事がなく設定に困ったので(特にフィルターキーの設定の部分)、
この記事が誰かのお役に立てば幸いです。

この記事をシェアする

facebookのロゴhatenaのロゴtwitterのロゴ

© Classmethod, Inc. All rights reserved.