バケットポリシー全然わからん
S3のバケットにアクセスする際の権限設定をIAM、S3のバケットポリシーで設定するのはわかるのだが、どのように設定すれば良いのか全然わかっていませんでした。
許可または拒否の決定の仕方
あるユーザーがあるバケットにアクセスしようとした際に許可されるか拒否されるかは以下のように決まっています。
1. 拒否設定があるか(ある場合必ず拒否)
2. 1がない場合許可設定があるか(ある場合許可)
3. 記述がないか(デフォルト拒否)
初期状態のバケットを作り、ユーザーを作成しただけの状態では当然そのユーザーはどのバケットにもアクセスできません。これは3のデフォルト拒否が働いているからです。
アクセスするために許可設定を行って、IAMユーザーにAmazonS3FullAccess
のような権限を与えるとこれでS3のどのバケットにもアクセスできます。
ただ、このあと拒否設定をバケットポリシーなどで設定するとS3にアクセスできなくなります。拒否設定があると他で許可を取っていても必ず拒否となります。
実際はもっと細かい話がありますが、最初はこの程度わかっていればOKだと思います
参考:ポリシーの評価論理
許可設定で勘違いしていたこと
S3にアクセスする際に勘違いしていたのはIAMユーザーにS3へのアクセス権限を与えることが必須
ということでした。
実際にはIAMユーザー自体にポリシーを与えなくてもバケットポリシーで権限を付与することが可能です。むしろIAMに必ずアクセス権限を与えると設定に困ることが必ず出てくると思います。
単純に特定のバケットのみアクセスさせたい場合はIAMユーザーにポリシーを与えず、バケットポリシーに許可設定を与えればOKです。
S3バケットポリシーであるユーザーを特定のバケットにしかアクセスできないように設定する
ようやくタイトルの回答になるのですが、以下のようなバケットポリシーを設定します。バケット名・ユーザー名は適宜変更が必要です。
ActionにS3:*
としているのでS3へのフル権限が与えられます。必要に応じて変更が必要です。ワイルドカードが使えるのでS3:Put*
などで特定の権限を一括設定も可能です。
このバケットポリシーだけ設定して、このexample-user
には他のポリシーを設定しなければこのバケットのみアクセスできるユーザーとなります。
{
"Version": "2012-10-17",
"Id": "123",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789:user/example-user"
},
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::examplebucket/*",
"arn:aws:s3:::examplebucket"
]
}
]
}
json形式での記入なのでユーザーや権限を増やしたい場合は配列に値を増やしていけばOKです。
また今回はAllowの記述ですがDenyで拒否設定もできます。上述しましたが、Denyが一番優先となるので絶対にアクセスさせたくない部分に関しては記述をしないのではなく、Deny設定をしておくことが安心です。