この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。
S3バケットへのアクセスを制御するために、皆さんもよくDenyポリシーを利用しているかと思います。ただ、Denyポリシーを誤って設定した場合、S3バケットがどこからもアクセスできない恐れがあります。
発生事象
今回は、特定なIAMロールしかS3バケットにアックスできないポリシーを検証したいので、以下のポリシーをS3バケットに設定しました。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Principal": "*",
"Action": [
"s3:*"
],
"Resource": [
"arn:aws:s3:::S3バケット名",
"arn:aws:s3:::S3バケット名/*"
],
"Condition": {
"StringNotLike": {
"aws:userId": [
"AROAXO2RZRXXXXXX:*" -- IAMロール一意の識別子
]
}
}
}
]
}
ただし、aws:userIdのところで記載するIAMロール一意IDが誤って設定しており、以下のようにどこからもアクセスできないようになってしまいました。
調べたところ、AWSアカウントのルートアカウントでログインして誤って設定したバケットポリシーを削除するしかなさそうです。
S3復旧
ルートアカウントでログインして誤って設定したS3バケットを見れるようになりました。誤ったS3バケットポリシーを削除した後に、普通のIAMユーザでもアクセスできるようになりました。
AWSのブログにも警告として記載しているが、ルートアカウントは必須ではない限り、使わないでください。
警告: 通常のタスクにはルートユーザーを使用しないでください。これらの認証情報の使用は、ルートユーザーとしてサインインする必要があるタスクのみに限定してください。ルート認証情報は、完全な管理者アクセス権を持つ AWS Identity Access Management (IAM) ユーザーまたはロールと同じではないことに注意してください。また、許可または拒否の許可を持つ IAM ポリシーは、ルートアカウントにアタッチできません。
おまけ
今回は誤ってIAMロール一意IDを設定してしまったため、S3バケットにアクセスできなくなりました。IAMロール一意IDの取得する方法についてはご紹介します。
以下のコマンドaws sts get-caller-identity
でコマンド発行時に利用するIAMロール一意IDを取得できます。
また、以下のコマンドaws iam get-role --role-name IAMロール名
で任意のIAMロールの一意IDを取得することが可能です。
最後に
最初この事象が発生した時に、どう対応するかは焦りました。対処方法がありまして良かったですが、ルートユーザの使用は極力避けることなのでS3バケットポリシーの設定は十分設計・検証したうえで設計しましょう。