特定のS3バケットへのみアクセス可能なIAMポリシーが作成できるかやってみた
はじめに
特定のS3へのみアクセス可能なIAMユーザーでS3バケットの閲覧を制御したい。そんなケースよくありませんか?
簡単にできそうと思いきや、少しクセがあったので実際にやってみた内容を記載します。
今回必要だった要件としてはこんな感じです。
- 特定のS3バケットのみアクセスできる
- 他のS3バケットはバケット名も見せたくない
- できればマネジメントコンソールからアクセスしたい
S3
まずはS3バケットを作成します。
バケットの名前は demo-s3-policy-check-bucket-test
とします。
アクセスの確認を行うために適当なファイルを入れておきます。
S3バケットのバケットポリシーは設定していません。
IAMユーザー
まずはマネジメントコンソールにログイン可能なIAMユーザーを作成します。
作成したIAMユーザーに以下のポリシーをアタッチします。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:Get*",
"s3:List*",
"s3:Describe*",
"s3-object-lambda:Get*",
"s3-object-lambda:List*"
],
"Resource": [
"arn:aws:s3:::demo-s3-policy-check-bucket-test",
"arn:aws:s3:::demo-s3-policy-check-bucket-test/*"
]
}
]
}
ポリシーの内容はS3ReadOnlyPolicyを対象のバケットに制限したポリシーとします。
やってみる
失敗するパターン
では作成したIAMポリシーでS3バケットのコンソール画面にアクセスします。
あれ?バケット一覧が表示されませんね。
以下はエラー内容です。
バケットを一覧表示するアクセス許可がありません
お客様または AWS 管理者が s3:ListAllMyBuckets アクションを許可するようにアクセス許可を更新してから、このページを更新します。
バケット一覧を表示する権限がないと言われていますね。
こちらの記事でも紹介されていますが、
S3バケットのコンソール画面では 「全てのバケットを表示する」 or 「全てのバケットが表示しない」 の2択になるようです。
S3バケット一覧画面の検索欄でバケット名を検索してみましたが、これも表示できませんでした。
成功するパターン
そこで別の方法を試します。
手順は以下の流れです。
- 権限を持っているユーザーでアクセスしたいオブジェクトのURLをコピー
- 制限したIAMユーザーにログインして、コピーしたURLへアクセス
(もしくはhttps://<region>.console.aws.amazon.com/s3/buckets/<bucket-name>
に直接アクセスでも可)
それでは権限を持ったユーザーで閲覧したいバケットのURLを取得します。
URLが取得できたので、ログアウトして今回作成したIAMユーザーに切り替えます。
取得したURLを貼り付けます。
今度はアクセスできました。
リソースに直接アクセスするとエラーにはならないようです。
画像は載せていませんが、直接オブジェクトのURLへアクセスしても問題なくアクセスできました。
今回のポリシーではGETを許可しているので、オブジェクトのダウンロードも試してみました。
こちらも問題なくダウンロードできました。
少しクセがありましたが、バケット or オブジェクトのURLへ直接アクセスすることで特定のS3バケットのみにアクセスすることができました。
ここまではバケット内に1つのオブジェクトのみが存在する状態で検証しました。
次はフォルダやファイルを追加して、さらにポリシーの制限を絞って試してみます。
ファイルとフォルダ追加
まずはポリシーは同じ状態でファイルとフォルダを追加してみます。
S3の構造は以下の状態です。
demo-s3-policy-check-bucket-test/
|── home/
| └── home.html
|── index.html
└── style.css
こちらでバケットのURLに直接アクセスしてみます。
アクセスできました。
ファイルとフォルダを追加しても問題なく閲覧できました。
AWS CLIで一括ダウンロード
ではS3からオブジェクトを一括ダウンロードできるか試してみます。
$ aws s3 cp s3://demo-s3-policy-check-bucket-test/ ./ --recursive
download: s3://demo-s3-policy-check-bucket-test/index.html to ./index.html
download: s3://demo-s3-policy-check-bucket-test/home/home.html to home/home.html
download: s3://demo-s3-policy-check-bucket-test/style.css to ./style.css
AWS CLIで一括ダウンロードする方法も問題なくできました。
S3のコンソール画面からはまとめてダウンロードができないため、AWS CLIを使ってダウンロードできたのでよかったです。
ポリシーでプレフィックス指定
次にIAMポリシーのResource制限をプレフィックスレベルで絞ったケースも試してみます。
IAMポリシーを以下のように変更します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:Get*",
"s3:List*",
"s3:Describe*",
"s3-object-lambda:Get*",
"s3-object-lambda:List*"
],
"Resource": [
+ "arn:aws:s3:::demo-s3-policy-check-bucket-test/home/*"
]
}
]
}
これでhome/に直接アクセスしてみます。
アクセスできませんでした。
どうやらプレフィックスを指定すると、コンソール画面からは表示できないようです。
AWS CLIでも試してみます。
まずは一覧を表示します。
$ aws s3 ls s3://demo-s3-policy-check-bucket-test/home/
An error occurred (AccessDenied) when calling the ListObjectsV2 operation: User: arn:aws:iam::123782675824:user/demo-user is not authorized to perform: s3:ListBucket on resource: "arn:aws:s3:::demo-s3-policy-check-bucket-test" because no identity-based policy allows the s3:ListBucket action
アクセスできません。
これはコンソール画面と同じ挙動ですね。
次に特定のオブジェクトを指定してダウンロードしてみます。
$ aws s3 cp s3://demo-s3-policy-check-bucket-test/home/index.html ./
download: s3://demo-s3-policy-check-bucket-test/home/index.html to ./index.html
$ ls
index.html
オブジェクトを指定すれば問題なくダウンロードできました。
つまり制限はポリシー通り設定されているため、AWS CLIを使って制限内でアクセスすることはできるということが分かりました。
まとめ
特定のS3へのみアクセス可能なIAMポリシーを使って動作を検証してみました。
今回私が検証した限りでは
コンソール画面では、バケットレベルでアクセス制限であれば、直接バケットのURLを叩けばアクセスできる。
AWS CLIで特定のオブジェクトにのみアクセスする場合はポリシーで制限した通りのアクセス制限が可能ということが分かりました。