特定IAM Identity Center許可セットからのS3アクセスを許可するバケットポリシー
AWSのマルチアカウント管理で役立つノウハウ、 [マルチアカウントTIPS] をお届けします。
今回は「組織内のAWS利用者に対して特定ファイルを共有したい」ケースを考えます。
もう少し細かい要件は以下のとおりです。
- AWS利用者は IAM Identity Center から「利用者用AWSアカウント」にアクセスする
- AWS管理者は 共有ファイルを「管理者用AWSアカウント内のS3バケット」に格納する
- 利用者用AWSアカウントから共有ファイルを取得したい
共有できるようにS3バケットのバケットポリシーを設定します。
前提条件
以下環境は整備済みとします。
- IAM Identity Center によるアクセス環境
- S3バケット (バケットポリシー以外の基本的な設定)
- 共有したいファイル、つまりS3オブジェクト
S3バケットはマネジメントコンソールから作成する際のデフォルト設定でOKです。 ブロックパブリックアクセスは全て有効化しておきましょう。
準備するパラメータ
以下パラメータがバケットポリシーに必要です。
- 許可セット名 : 利用者がAWSアカウントへアクセスする際に利用する許可セットの名前
- S3バケット名 : 共有ファイルを格納しているS3バケットの名前
- S3オブジェクトキー : 共有ファイルのS3オブジェクトキー
- 組織ID : AWS Organizations の組織ID(
o-example
)
組織IDは管理アカウントのAWS Organizations コンソールから分かります。
設定するバケットポリシー
以下のようなバケットポリシーを設定します。 ハイライト部分を置き換えてください。
{ "Version": "2012-10-17", "Statement": [ { "Principal": { "AWS": "*" }, "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::${S3バケット名}/${S3オブジェクトキー}", "Condition": { "ArnLike": { "aws:PrincipalARN": "arn:aws:iam::*:role/aws-reserved/sso.amazonaws.com/*/AWSReservedSSO_${許可セット名}_*" }, "StringEquals": { "aws:PrincipalOrgID": [ "${組織ID}" ] } } } ] }
試してみる
以下のようなパラメータで各種設定をしました。
- 許可セット名 :
test-s3-access
- S3バケット名 : 適当に作成 (以降
DOC-EXAMPLE-BUCKET
) - S3オブジェクトキー :
hoge.txt
- 組織ID : 検証環境の組織ID (以降
o-example
)
バケットポリシーは以下のように設定しました。
{ "Version": "2012-10-17", "Statement": [ { "Principal": { "AWS": "*" }, "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/hoge.txt", "Condition": { "ArnLike": { "aws:PrincipalARN": "arn:aws:iam::*:role/aws-reserved/sso.amazonaws.com/*/AWSReservedSSO_test-s3-access_*" }, "StringEquals": { "aws:PrincipalOrgID": [ "o-example" ] } } } ] }
test-s3-access
許可セットでメンバーアカウントに入ります。
$ aws sts get-caller-identity --output yaml Account: '111111111111' # → 利用者用AWSアカウントID Arn: arn:aws:sts::111111111111:assumed-role/AWSReservedSSO_test-s3-access_example/kawahara.masahiro UserId: AROAEXAMPLE:kawahara.masahiro
s3api を使ってオブジェクトを取得してみます。
$ aws s3api get-object --bucket DOC-EXAMPLE-BUCKET --key hoge.txt ./hoge.txt --output yaml AcceptRanges: bytes ContentLength: 5 ContentType: text/plain ETag: '"c5954example"' LastModified: '2023-06-26T01:10:09+00:00' Metadata: {} ServerSideEncryption: AES256 $ cat ./hoge.txt hoge
管理者用AWSアカウント内のS3オブジェクトを取得できました。
おわりに
組織内でファイルを共有する1手段でした。 参考になれば幸いです。
ちなみにポリシー設計でハマったポイントは以下のとおりです。
- Principal 部分のワイルドカードは「すべて」を指す
"*"
しか使えない - Condition 部分で指定するIAM Identity Center ロールのARN