ポリシーのプリンシパルが勝手に書き変わる現象について。

ポリシーのプリンシパルが勝手に書き変わる現象について。

2025.09.22

はじめに

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

最近IAMポリシーのプリンシパルに関連して困ったことがあったため、その原因と答えを記事にまとめました。

問題の概要

発生した事象

IAM Access Analyzerで外部アクセスを監視しているIAMロールがありました。
このIAM Access AnalyzerはSecurity Hub CSPMと連携されており、検出結果が集約されています。

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

ある日、このIAMロールでSecurity Hub CSPMの検知が発生しました。
しかし、直近で以下の確認を行っても、誰もIAMロールを編集した形跡がありませんでした。

  • IAMロールの最後のアクティビティ
  • IAMポリシーの編集履歴
  • CloudTrailログ

なぜ検知が発生したのでしょうか…?

原因と答え

結論

この現象は、AWS側の仕様によってIAMロールの信頼ポリシーが自動更新された ことが原因でした。

AWSの自動更新仕様について

ポリシー内のプリンシパルでIAMユーザーやIAMロールなどのARNを指定している場合、ARNで指定しているリソースが削除されると、リソース固有のIDプレフィックスに自動的に置き換わる 仕様があります。

これはセキュリティ上の理由から、AWSが自動的に実施しています。

リソースベースのポリシーの一意のプリンシパルIDは、IAMユーザーまたはロールが削除されたことを示します。
AWSでは有効なARNにマッピングできないため、プリンシパルIDが表示されます。

https://repost.aws/ja/knowledge-center/iam-resource-policy-format

今回のケース

検出されたIAMロールの信頼ポリシーでは、ARN形式でリソースを指定していました。
そのリソースが削除されたことにより、ARNが固有のIDプレフィックスに置き換わり、信頼ポリシーが更新されたのです。

なおIAMユーザーやIAMロール以外にもIDプレフィックスは存在し、その一覧は以下のドキュメントで確認できます。

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_identifiers.html#identifiers-prefixes

検証

この挙動を実際に検証してみました。
プリンシパルが指定できるポリシーであれば、同様の事象が発生するため、以下2種類のポリシーで検証しました。

  • アイデンティティベースポリシー(今回はIAMロール)
  • リソースベースポリシー(今回はS3バケットポリシー)

1. アイデンティティベースポリシー(IAMロール)

検証環境

  • アカウントA:IAMユーザー
  • アカウントB:IAMロール(信頼ポリシーで「アカウントA IAMユーザー」を指定)

IAMユーザー削除前の信頼ポリシー

			
			{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::XXXXXXXXXXXX:user/account-a-user"
            },
            "Action": "sts:AssumeRole",
            "Condition": {}
        }
    ]
}

		

IAMユーザー削除後の信頼ポリシー

IAMユーザーのARNが AIDA から始まる文字列に置き換わりました。

			
			{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "AIDAXXXXXXXXXXXXXXXXX"
            },
            "Action": "sts:AssumeRole",
            "Condition": {}
        }
    ]
}

		

2. リソースベースポリシー(S3バケットポリシー)

検証環境

  • アカウントA:IAMロール
  • アカウントB:IAMロール、S3バケット(バケットポリシーでアカウントA/BのIAMロールを指定)

IAMロール削除前のS3バケットポリシー

			
			{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::XXXXXXXXXXXX:role/account-b-role",
                    "arn:aws:iam::YYYYYYYYYYYY:role/account-a-role"
                ]
            },
            "Action": [
                "s3:ListBucket",
                "s3:GetObject",
                "s3:PutObject",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::account-b-s3-XXXXXXXXXXXX/*",
                "arn:aws:s3:::account-b-s3-XXXXXXXXXXXX"
            ]
        }
    ]
}

		

IAMロール削除後のS3バケットポリシー

両方のIAMロールのARNが AROA から始まる文字列に置き換わりました。

			
			{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "AROAXXXXXXXXXXXXXXXXX",
                    "AROAYYYYYYYYYYYYYYYYY"
                ]
            },
            "Action": [
                "s3:ListBucket",
                "s3:GetObject",
                "s3:PutObject",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::account-b-s3-XXXXXXXXXXXX/*",
                "arn:aws:s3:::account-b-s3-XXXXXXXXXXXX"
            ]
        }
    ]
}

		

まとめ

以上、ポリシーのプリンシパルが勝手に書き変わる現象についてでした。
結論としてこの現象は、プリンシパルの参照先リソースが削除された際にAWSが自動的に実行するセキュリティ仕様によるものであり、
一見すると不可解な変更に見えますが、実際には正常な動作です。

人によっては常識的な内容かもしれませんが、私は知らない仕様だったのでちょっと困りました…。
同様の事象で困っている方の参考になれば幸いです。

この記事をシェアする

FacebookHatena blogX

関連記事