[AWS] S3を操作するIAM JSON ポリシーのサンプル

AWSのIAMユーザーごとに権限を設定する場合、最初から用意されているポリシーだけでは十分な制限がかけられません。例えば特定のバケット以外は触らせたくないと言った場合ですね。こういう細かい制御がしたくなったらJSONで定義することになります。

今回はIAM作成時によく利用するJSONのサンプルをメモします。しばらく設定しない期間が続くとよく忘れるので自分用ですw

基本的な流れとサンプル

設定するまでの道のり

AWSのマネジメントコンソールへログインし、IAMの画面に移動したら「ユーザーを追加」ボタンを押下、ユーザー名を入力したら以下の権限を設定する画面で「既存のポリシーをアタッチ」を選択すると「ポリシーの作成」ボタンが登場するのでこれを押します。

すると新規にウィンドウ(タブ)が立ち上がります。あとは「JSON」タブをクリックすると入力用のテキストエリアが表示されるのでここに入力するだけです。

JSONを入力してポリシーを無事に作成できたら先程のウィンドウ(タブ)は閉じて、元の画面の再読み込みみたいなボタンをクリックして新しいポリシーを読み込むのをお忘れなく(よく忘れますw)

サンプル

ここでは bucket.example.com という名前のバケットに対して設定する例です。//で始まるコメント部分は削除して利用してください。

基本的にはActionで付与する権限を指定し、Resourceで対象とするバケット等を設定できます。

{
    "Version": "2012-10-17",
    "Statement": [
        // バケット一覧を取得
        {
            "Effect": "Allow",
            "Action": "s3:ListAllMyBuckets",
            "Resource": "arn:aws:s3:::*"
        },

        // バケット内のオブジェクト一覧を取得
        {
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": [
                "arn:aws:s3:::bucket.example.com"  // このバケットのみ有効
            ]
        },

        // オブジェクトの操作用に特定の権限(Action)を付与する
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:DeleteObject"
             ],
            "Resource": [
                "arn:aws:s3:::bucket.example.com/*"  // このバケットのみ有効("/*"を忘れずに)
            ]
        }
    ]
}

よく利用するAction一覧

一部だけメモしておきます。すべてのActionはAWSのドキュメントでご確認ください。

バケット

# Action 内容
1 s3:ListAllMyBuckets バケット一覧を取得
2 s3:CreateBucket バケットを作成
3 s3:DeleteBucket バケットを削除
4 s3:ListBucket バケット内のオブジェクト一覧を取得
5 s3:GetBucketAcl バケットACL情報を取得
6 s3:PutBucketAcl バケットACLを設定
7 s3:GetBucketPolicy バケットポリシーを取得
8 s3:PutBucketPolicy バケットポリシーを設定
9 s3:DeleteBucketPolicy バケットポリシーを削除
10 s3:GetBucketTagging バケットのタグを取得
11 s3:PutBucketTagging バケットのタグを設定

オブジェクト

# Action 内容
1 s3:GetObject オブジェクトを取得
2 s3:PutObject オブジェクトを作成
3 s3:DeleteObject オブジェクトを削除
4 s3:GetObjectAcl オブジェクトのACL情報を取得
5 s3:PutObjectAcl オブジェクトのACLを設定
6 s3:GetObjectVersion 特定バージョンのオブジェクトを取得
7 s3:DeleteObjectVersion 特定バージョンのオブジェクトを削除
8 s3:GetObjectVersionAcl 特定バージョンのオブジェクトのACLを取得
9 s3:PutObjectVersionAcl 特定バージョンのオブジェクトのACLを設定
10 s3:GetObjectTagging オブジェクトのタグを取得
11 s3:PutObjectTagging オブジェクトのタグを設定
12 s3:DeleteObjectTagging オブジェクトのタグを削除
13 s3:GetObjectVersionTagging 特定バージョンのオブジェクトのタグを取得
14 s3:PutObjectVersionTagging 特定バージョンのオブジェクトのタグを設定
15 s3:DeleteObjectVersionTagging 特定バージョンのオブジェクトのタグを削除

その他

すべての権限を付与する

細かくActionを設定するのではなく、全権限を付与する場合はワイルドカードを用います。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::bucket.example.com",
                "arn:aws:s3:::bucket.example.com/*"
            ]
        }
    ]
}

特定のIPアドレスのみ許可する

例えばオフィス内のネットワークからだけ利用したいといった場合ですね。

Conditionで条件指定が出来るのでこれを利用します。以下では「198.51.100.0」と「203.0.113.0/24」に対して許可を与えています。IPv4だけではなくIPv6も指定可能です。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::bucket.example.com",
                "arn:aws:s3:::bucket.example.com/*"
            ],
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": [
                        "198.51.100.0",
                        "203.0.113.0/24"
                    ]
                }
            }
        }
    ]
}

実際に試してみます。設定済みのIPアドレスでは期待通り動きました。

$ aws s3 ls s3://backet.example.com
                           PRE 2021A/

今度はIPアドレスを変更した上で同じコマンドを実行すると、こちらも期待通り Access Denied となりました。

$ aws s3 ls s3://backet.example.com
An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied

参考ページ