特定IAM Identity Center許可セットからのS3アクセスを許可するバケットポリシー

2023.06.26

AWSのマルチアカウント管理で役立つノウハウ、 [マルチアカウントTIPS] をお届けします。

今回は「組織内のAWS利用者に対して特定ファイルを共有したい」ケースを考えます。

もう少し細かい要件は以下のとおりです。

  • AWS利用者は IAM Identity Center から「利用者用AWSアカウント」にアクセスする
  • AWS管理者は 共有ファイルを「管理者用AWSアカウント内のS3バケット」に格納する
  • 利用者用AWSアカウントから共有ファイルを取得したい

img

共有できるようにS3バケットのバケットポリシーを設定します。

前提条件

以下環境は整備済みとします。

  • IAM Identity Center によるアクセス環境
  • S3バケット (バケットポリシー以外の基本的な設定)
  • 共有したいファイル、つまりS3オブジェクト

S3バケットはマネジメントコンソールから作成する際のデフォルト設定でOKです。 ブロックパブリックアクセスは全て有効化しておきましょう。

準備するパラメータ

以下パラメータがバケットポリシーに必要です。

  • 許可セット名 : 利用者がAWSアカウントへアクセスする際に利用する許可セットの名前
  • S3バケット名 : 共有ファイルを格納しているS3バケットの名前
  • S3オブジェクトキー : 共有ファイルのS3オブジェクトキー
  • 組織ID : AWS Organizations の組織ID( o-example )

組織IDは管理アカウントのAWS Organizations コンソールから分かります。

img

設定するバケットポリシー

以下のようなバケットポリシーを設定します。 ハイライト部分を置き換えてください。

{
  "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

参考