奇妙なバケットポリシーからチラ見するIAMの裏側

なんだこのバケットポリシー...? ということからIAMの裏側が少しだけ見えました。
2021.04.28

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

こんにちは。AWS事業本部のKyoです。

何をやっているのかよくわからないバケットポリシーってモヤっとしますよね。

不要ならば削除してしまいたいと思いつつ、アクセス制御に関わる部分なので触る際にはちょっと慎重になってしまうものだと思います。

最近CloudFrontのオリジンとなっていたS3バケットから奇妙なバケットポリシーを見つけました。

一見、よくあるOrigin Access Identity(以下、OAI)のアクセス許可を行ったバケットポリシーかと思いきやハイライトしてあるPrincipalの部分が見慣れてない形になっています。

復習をしておくと、OAIとは特別なCloudFrontのユーザーで、これを利用することでS3 バケットから直接ではなく、CloudFront 経由でのみファイルにアクセスできるようになります。

オリジンアクセスアイデンティティを使用して Amazon S3 コンテンツへのアクセスを制限する

{
    "Version": "2012-10-17",
    "Id": "PolicyForCloudFrontPrivateContent",
    "Statement": [
        {
            "Sid": "1",
            "Effect": "Allow",
            "Principal": {
                "AWS": "AIDAJSKDRCEG5MQUMGWGU"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::【mybucket】/*"
        }
    ]
}

調査してみると実はこれは元々以下の様なOAI用のポリシーだったようです。

{
    "Version": "2012-10-17",
    "Id": "PolicyForCloudFrontPrivateContent",
    "Statement": [
        {
            "Sid": "1",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity E3FJI7POW7CR3E"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::【mybucket】/*"
        }
    ]
}

OAIを許可したバケットポリシーがどうしてこんな状態になるのか。その答えはIAMの公式ドキュメントにありました。

ロールの信頼ポリシーの Principal 要素に、特定の IAM ユーザーを指し示す ARN が含まれている場合、その ARN はポリシーを保存するときにユーザーの一意のプリンシパル ID に変換されます。これにより、ユーザーを削除して再作成することにより、誰かがそのユーザーの特権をエスカレートするリスクを緩和できます。通常、この ID はコンソールには表示されません。これは、信頼ポリシーが表示されるときに、ユーザーの ARN への逆変換が行われるためです。ただし、ユーザーを削除すると、関係が壊れます。ユーザーを再作成しても、ポリシーが適用されることはありません。(略)

AWS JSON ポリシーの要素: Principal ※ ページ中盤の「重要」の部分

CloudFrontのドキュメントにおいて、OAIは特別なCloudFrontのユーザーという書かれ方をしていますが、扱いはIAMユーザと同じであり、バケットポリシーに対しても通常のIAMユーザと同じ様に「ユーザーの一意のプリンシパル ID 」という形で保存されているようです。

今回の事象はOAIが削除された、つまり「ユーザーを削除すると、関係が壊れます」という状態になっており、「ユーザーの一意のプリンシパル ID」という形のみがバケットポリシーに残っていたようです。

再現してみる

ドキュメントに書かれている仕組みで事象が再現できるのか、OAI用のバケットポリシーをもったS3バケットが存在する状態で、対象となるOAIを削除してみます。

まず、OAIを作成します。IDはE3FJI7POW7CR3Eです。

テスト用のバケットを作成し、バケットポリシーにはOAI ID E3FJI7POW7CR3Eに対するアクセス許可を設定します。

CloudFrontのコンソールからOAIを削除し、S3のコンソールでリロードするとPrincipalの部分が上記の様に変化しました。

想定どおりでした。

なお、 今回の対象OAIであり、同じIDを狙って出すことが難しいので、以下の部分に関しては確認できていません。気になる方はIAMユーザを使って試してみてください。

ユーザーを再作成しても、ポリシーが適用されることはありません。

おわりに

本ブログでは奇妙なバケットポリシーからIAMというサービスの裏側を垣間見ることができました。

また、この奇妙状態になっている = バケットポリシーとして機能していないということもわかりました。

不要なので削除し、必要な場合は新たなポリシーを付与しましょう。なお、削除の際はくれぐれも必要なポリシーまで一緒に消してしまわないこと、また削除した後も想定通りの挙動を示すことの確認をおこなってください。

以上、何かのお役に立てれば幸いです。