【基本おさらい】Amazon S3バケットに読み取り専用のポリシーをつけたAWS IAMポリシーをサクッと作る方法

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

こんにちは、せーのです。恵方巻で顎が外れそうになり、病院一歩手前でしたが今月もブログ頑張りましょう。
最近基本操作についての記事が少ないので、今日はIAMポリシーの基本としてS3のアクセスをコントロールするポリシーの書き方をおさらいします。サクッと作れるように要点だけを押さえて細かい仕様を省いてみます。

基本を押さえる

IAMポリシーの基本

まずIAMポリシーの基本を押さえます。IAMポリシーはJSON形式で記述し、書く項目も決まっています。基本部分は覚えてしまえば簡単ですので覚えてしまいましょう。

  • Version : ポリシー言語のバージョン。[2012-10-17]が最新
  • Statement : 設定項目の大項目。この中に全てのポリシーが書かれる。
  • Sid : ステートメント識別子。ユーザーが識別の為につける文字列なのでポリシー内でかぶってなければなんでもいい。
  • Effect : この下に書く条件を「許可(Allow)」するのか「拒否(Deny)」するのか。
  • Action : 各サービスの操作内容。配列の形で書く。
  • Resource : 対象となるリソース。配列の形で書く。

他にもNotActionとかConditionとか色々ありますが、基本はこれを押さえておけば大丈夫です。つまり形としては

	{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "[その都度決めた識別子 - Stmt000001とか]",
      "Effect": "Allow",
      "Action": [
        "操作内容1",
        "操作内容2"
      ],
      "Resource": [
        "リソース"
      ]
    },
    {
      "Sid": "その都度決めた識別子(上の識別子とかぶらない)",
      "Effect": "Allow",
      "Action": [
        "操作内容"
      ],
      "Resource": [
        "リソース1",
        "リソース2"
      ]
    }
  ]
}

という感じで書いていきます。「AWSのリソース」というのはあまりAWSを使わない方にはピンと来ないかもしれませんね。AWSは全てのサービスリソースに対してAmazon Resource Name(ARN)という一意の識別子を持っています。こちらは特徴がありまして

arn:aws:[AWSサービス名]:[リージョン]:[アカウントID]:[リソース]
arn:aws:[AWSサービス名]:[リージョン]:[アカウントID]:[リソースタイプ]/[リソース]
arn:aws:[AWSサービス名]:[リージョン]:[アカウントID]:[リソースタイプ]:[リソース]

みたいな書き方に分かれます。3つの書き方のうちどれになるかはサービスによって異なります。例えばS3だと一番上、EC2だと真ん中の書き方になります。
「リソースタイプ」というのはEC2でいうと「image」とか「instance」とかリソースの種類が入る、というイメージです。また付けなくてもわかるものは省略が可能なので、IAMポリシーに同じアカウントのサービスの権限を設定するのであればリージョンやアカウントIDは同じものなので省略して

arn:aws:s3:::[S3のバケット名]

みたいに書きます。

S3操作ポリシーの基本

続いてS3バケットへの操作の基本です。S3の操作は一つ一つ数えるとものすごく多いのですが大きく分けて「Get系」「List系」「Put系」「Delete系」「その他(Abort,Create,Restore)」に分かれます。その他は置いといて、それぞれ「s3:Get◯◯(何かを取得する)」「s3:List◯◯(何かを参照する)」「s3:Put◯◯(何かをアップロード、作成する)」「s3:Delete◯◯(何かを削除する)」という書き方をします。例えばオブジェクトを取得するのは「s3:GetObject」バケットのバージョンを参照する権限は「s3:ListBucketVersions」と書きます。
ポリシーはワイルドカード文字(*)が使えるので「s3:Get*」と書けばS3の全ての「取得」に関する権限がつけられ、「s3:Delete*」と書けばバケットもディレクトリもファイルも全ての「削除」に関する権限が付けられます。
読み取り専用であればGet系とList系があればOKですね。

あとついつい忘れがちなこととして、Mangement Consoleを使ってS3の作業をする際には「s3:ListAllMyBuckets」という権限をつけておかないと最初の画面(全部のバケットが一覧で並んでいる画面)が権限不足で開けなくなるので、Management Consoleを使う方は忘れずにつけておきましょう。

やってみる

ではサクッとやってみましょう。Management ConsoleでIAMを開き、Userを選択した後[Permissions]の欄の[Attach User Policy]を開きます。

iampolicy1

IAMポリシーにはあらかじめ用意されている「Template」、画面を見ながらGUIで組み合わせていく「Policy Generator」、JSONを手で組み上げていく「Custom Policy」があります。今回は基本を学ぶ、という意味でCustom Policyを選択します。

iampolicy2

ポリシーの名前とJSONを直接書き込みます。今回は[chao2sukepolicytest]というバケットに対しての読み取り専用権限を付けたいと思います。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1422850958000",
      "Effect": "Allow",
      "Action": [
        "s3:Get*",
        "s3:List*"
     ],
      "Resource": [
        "arn:aws:s3:::chao2sukepolicytest",
        "arn:aws:s3:::chao2sukepolicytest/*"
      ]
    },
    {
      "Action": [
        "s3:ListAllMyBuckets"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::*"
    }
  ]
}

リソースに[chao2sukepolicytest]と[chao2sukepolicytest/*]と2つ書かれています。これは[バケットに対しての操作]と[バケットの中身(フォルダやオブジェクト)に対しての操作」という意味です。これが例えば[chao2sukepolicytest/*]しか設定してなかったりすると

iampolicy3

このようにバケットに対する操作で弾かれてしまいます。
あとは上に書いたように「s3:ListAllMyBuckets」を設定しておけばTOP画面で弾かれる、ということがなくなります。

まとめ

いかがでしたでしょうか。macのFinderやWindowsのExplolerに慣れている人は直感的にGUI操作しているような部分なので「簡単に出来るだろう」と思うのですが、意外とちょっとしたハマりどころが多かったりします。ちなみに今回はUserに直接ポリシーをつけましたが、本格的に運用する場合であればUserにつけるのではなく、Groupにポリシーをつけて、Userはそのポリシーをつけたグループに所属する、という風に運用すると効率が良いので覚えておきましょう。
ポリシーは一回覚えてしまえばとても簡単なことなので、これを機会にまとめて覚えてしまいましょう!