S3のGUIクライアントを利用するのに必要なIAM Policy

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

こんにちは。望月です。

今日はS3とIAM Policyについて、小ネタを書いておきます。

S3を利用するためのIAM Policy

S3にはManagement Consoleの他にもCyberduckやCloudBerry Explorer等、様々なGUIクライアントが存在します。
当社の標準では、「アカウントのrootユーザ(アカウントが発行された後すぐに利用できるユーザ)は絶対に使用せず、ユーザ毎にIAM Userを作成する」というのが標準になっているので、用途ごとにIAM User(or IAM Role)を発行して、必要な権限を割り当てていくことになります。

その中でよくお客様から上がる要望の中に、「S3の特定のバケットのみを操作できるユーザで、S3をGUIクライアントから操作したい」というものがあります。その時にまず最初に思いつくのは、以下のようなPolicyです。

{
  "Statement": [
    {
      "Sid": "Stmt1403253384062",
      "Action": "s3:*",
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::sample-bucket/*"
    }
  ]
}

上の例では、sample-bucketという名前のバケットに対して、全ての処理を実行できる権限を与えています。

では、この権現を設定したIAM Userのアクセスキーを利用して、CloudBerry Explorerで接続してみましょう。

cloudberry_1

画面右側にバケットが表示されるはずなのですが、表示されません。空白のままです。
同様にCyberduckからも接続してみます。

cyberduck_1

Cyberduckではエラーが表示されましたね。「ディレクトリ一覧取得に失敗しました」と表示されています。

原因と対策

CloudBerry ExplorerやCyberduckでは、アプリケーションを開始した時に「存在するS3のバケットの一覧を取得」しようとします。ですが、先ほど書いたIAM Policyでは、「特定のバケットに対する処理」のみが許可されているため、全バケットに対する処理が許可されていません。そのためバケット一覧を取得することができず、エラーとなっていました。

そのため、「存在するS3バケットの一覧を取得」するAPIを叩くための権限が必要になります。そのAPIは「ListAllMyBuckets」です。それに加えて、バケットの所属リージョンを取得する「GetBucketLocation」APIを叩く権限も必要になってきます。ですので、先ほどのIAM Policyを以下のようなIAM Policyに修正してあげましょう。

{
  "Statement": [
    {
      "Sid": "Stmt1403255679880",
      "Action": [
        "s3:GetBucketLocation",
        "s3:ListAllMyBuckets"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::*"
    },
    {
      "Sid": "Stmt1403255696694",
      "Action": "s3:*",
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::sample-bucket",
        "arn:aws:s3:::sample-bucket/*"
      ]
    }
  ]
}

S3全体に対して「ListAllMyBuckets」と「GetBucketLocation」を許可しました。これによりある特定のバケットだけではなく、全バケットの一覧を取得することができるようになるため、以下の様にCyberduckから閲覧することができるようになります。

cyberduck_2

また、2つ目のStatementに"arn:aws:s3:::sample-bucket""arn:aws:s3:::sample-bucket/*"の2つを記述してあります。この2つの違いに最初悩んだのですが、どうやら1つ目が「sample-bucketに対する処理(例: ListBucket)」で、2つ目が「sample-bucket内のObjectに対する処理(例: GetObject)」と考えればよいようです。

こういったGUIクライアントを利用する際に、「ユーザに全部のバケットを見せたくない!特定のバケットのみ表示させるようにしたい!」という要望も頂くのですが、それは現状できないようです。

まとめ

GUIクライアント用のIAM Userを作成する際には、最低限「ListAllMyBuckets」と「GetBucketLocation」を付与してあげましょう。このブログでは特定のバケットに対する全権限を与えましたが、当然ReadOnly権限などに調整することができるので、いろいろと試してみましょう。IAMのPolicyを作成する際には、AWS Policy Generatorが非常に便利です。

参考