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