ポリシーのプリンシパルが勝手に書き変わる現象について。
はじめに
皆様こんにちは、あかいけです。
最近IAMポリシーのプリンシパルに関連して困ったことがあったため、その原因と答えを記事にまとめました。
問題の概要
発生した事象
IAM Access Analyzerで外部アクセスを監視しているIAMロールがありました。
このIAM Access AnalyzerはSecurity Hub CSPMと連携されており、検出結果が集約されています。
ある日、このIAMロールでSecurity Hub CSPMの検知が発生しました。
しかし、直近で以下の確認を行っても、誰もIAMロールを編集した形跡がありませんでした。
- IAMロールの最後のアクティビティ
- IAMポリシーの編集履歴
- CloudTrailログ
なぜ検知が発生したのでしょうか…?
原因と答え
結論
この現象は、AWS側の仕様によってIAMロールの信頼ポリシーが自動更新された ことが原因でした。
AWSの自動更新仕様について
ポリシー内のプリンシパルでIAMユーザーやIAMロールなどのARNを指定している場合、ARNで指定しているリソースが削除されると、リソース固有のIDプレフィックスに自動的に置き換わる 仕様があります。
これはセキュリティ上の理由から、AWSが自動的に実施しています。
リソースベースのポリシーの一意のプリンシパルIDは、IAMユーザーまたはロールが削除されたことを示します。
AWSでは有効なARNにマッピングできないため、プリンシパルIDが表示されます。
今回のケース
検出されたIAMロールの信頼ポリシーでは、ARN形式でリソースを指定していました。
そのリソースが削除されたことにより、ARNが固有のIDプレフィックスに置き換わり、信頼ポリシーが更新されたのです。
なおIAMユーザーやIAMロール以外にもIDプレフィックスは存在し、その一覧は以下のドキュメントで確認できます。
検証
この挙動を実際に検証してみました。
プリンシパルが指定できるポリシーであれば、同様の事象が発生するため、以下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が自動的に実行するセキュリティ仕様によるものであり、
一見すると不可解な変更に見えますが、実際には正常な動作です。
人によっては常識的な内容かもしれませんが、私は知らない仕様だったのでちょっと困りました…。
同様の事象で困っている方の参考になれば幸いです。