IAMでS3のbucketにアクセスできるユーザーを制限する
AWS ConsoleでAWS Identity and Access Management (IAM)が操作できるようになったので試してみました。しかし、APIを直接叩かなくなくてよくなったから簡単、ではなかったです。
いずれの方法にしろJSON形式のPolicyを定義する必要があります。AWS Policy Generatorもあるのですが、S3のAPIを使ったことがないと対象のリソースと操作(Action)をどう組み合わせると、どうなるかイメージしづらいです。
IAMでユーザーかグループを作成し、それに対してパーミッションを追加します。まずは、特定のbucketにアクセスできるパーミッションとして以下のようなPolicyを作りました。
{ "Statement": [ { // (1) "Action": "s3:ListAllMyBuckets", "Effect": "Allow", "Resource": "*" }, { // (2) "Action": [ "s3:ListBuckets" ], "Effect": "Allow", "Resource": "arn:aws:s3:::<bucket_name>" }, { // (3) "Action": "s3:*", "Effect": "Allow", "Resource": "arn:aws:s3:::<bucket_name>/*" } ] }
基本はすべてDenyです。そこに必要な権限を付加していきます。
(1)で自分がアクセスできるBucketの一覧を取得できます。これは、bucket内での操作には直接必要ではないですが、AWS ConsoleやクライアントアプリケーションでBucketの一覧を取得するのに必要なようです。
(2)(3)でbucketの操作権限を付加しています。(2)のActionで"s3:*"とするだけでも良いように思えるのですが、、(3)のようにkey_nameとして*を指定しないとファイルの追加ができませんでした。(3)のActionはもう少し厳しくしたほうがよいと思います(PutObject/GetObject/DeleteObjectのみでもOKかも)。