TransitiveTagKeys を使ったセッションタグのロール連鎖挙動を検証してみた

TransitiveTagKeys を使ったセッションタグのロール連鎖挙動を検証してみた

2026.02.12

はじめに

やかめです。

AssumeRole 時にセッションタグを付与できることはご存知の方も多いかと思います。しかし、ロール連鎖した場合にそのタグがどうなるかはあまり知られていません。
本記事では、セッションタグをロール連鎖先に引き継ぐための TransitiveTagKeys について、実際にクロスアカウント環境で検証してみました。

TransitiveTagKeys とは

AssumeRole 時に --tags で付与したセッションタグは、そのロールセッション内でのみ有効です。 ロール連鎖(あるロールから別のロールを AssumeRole)した場合、タグは自動では引き継がれません。

TransitiveTagKeys は、「このタグキーはロール連鎖先にも引き継ぐ」と明示的に指定するためのパラメータです。以下のように指定します。

aws sts assume-role \
  --role-arn arn:aws:iam::123456789012:role/example-role \
  --role-session-name example \
  --tags Key=test,Value=true \
  --transitive-tag-keys test

やってみた

検証環境

本検証では、3 つの AWS アカウントにまたがるロール連鎖構成を用意しました。

Account A の IAM ユーザー(chain-test-user)から Account B の IAM ロール(chain-test-role1)を AssumeRole し、さらに Account C の IAM ロール(chain-test-role2)へロール連鎖する構成です。

chain-test-role2 には、セッションタグ test=true が存在する場合のみ s3:ListAllMyBuckets を許可する ABAC 条件を設定しています。これにより、セッションタグが伝播しているかどうかを S3 操作の成否で確認できます。

img91.png


IAM ユーザー:chain-test-user(Account A)
chain-test-role1 を AssumeRole するための権限を付与しています。

権限ポリシー
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "sts:AssumeRole",
      "Resource": "arn:aws:iam::[アカウントB]:role/chain-test-role1"
    }
  ]
}

IAM ロール:chain-test-role1(Account B)
セッションタグ付きで AssumeRole される中継用ロールです。

権限ポリシー
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "sts:AssumeRole",
        "sts:TagSession"
      ],
      "Resource": "arn:aws:iam::[アカウントC]:role/chain-test-role2"
    }
  ]
}
信頼ポリシー
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::[アカウントA]:user/chain-test-user"
      },
      "Action": [
        "sts:AssumeRole",
        "sts:TagSession"
      ]
    }
  ]
}

IAM ロール:chain-test-role2(Account C)
セッションタグの有無で操作可否が変わる ABAC 対象ロールです。
セッションタグ test=true が存在する場合のみ s3:ListAllMyBuckets を許可する ABAC 条件を設定しています。

権限ポリシー
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:ListAllMyBuckets",
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "aws:PrincipalTag/test": "true"
        }
      }
    }
  ]
}
信頼ポリシー
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::[アカウントB]:role/chain-test-role1"
      },
      "Action": [
        "sts:AssumeRole",
        "sts:TagSession"
      ]
    }
  ]
}

また、本検証では結果確認のために適当な S3 バケットを用意しています。
なお、バケットが存在しない場合でも s3:ListAllMyBuckets は正常終了し、単に出力が空となるだけです。

検証 1. TransitiveTagKeys なし

セッションタグを付与するが、TransitiveTagKeys を指定しない場合の挙動を確認します。

# IAMユーザー → role1(タグあり / TransitiveTagKeys なし)
aws sts assume-role \
  --role-arn arn:aws:iam::[アカウントB]:role/chain-test-role1 \
  --role-session-name role1-session \
  --tags Key=test,Value=true

# role1 の認証情報を環境変数にセット
export AWS_ACCESS_KEY_ID=<AccessKeyId>
export AWS_SECRET_ACCESS_KEY=<SecretAccessKey>
export AWS_SESSION_TOKEN=<SessionToken>

# role1 → role2(タグ指定なし)
aws sts assume-role \
  --role-arn arn:aws:iam::[アカウントC]:role/chain-test-role2 \
  --role-session-name role2-session

# role2 の認証情報を環境変数にセット
export AWS_ACCESS_KEY_ID=<AccessKeyId>
export AWS_SECRET_ACCESS_KEY=<SecretAccessKey>
export AWS_SESSION_TOKEN=<SessionToken>

# S3 操作
aws s3 ls

結果

An error occurred (AccessDenied) when calling the ListBuckets operation: User: arn:aws:sts::[アカウントC]:assumed-role/chain-test-role2/role2-session is not authorized to perform: s3:ListAllMyBuckets because no identity-based policy allows the s3:ListAllMyBuckets action

role1 で付与したセッションタグ test=true は、role2 には伝播せず、ABAC の条件を満たさないため AccessDenied となりました。

検証 2. TransitiveTagKeys あり

セッションタグに加えて、TransitiveTagKeys を指定した場合の挙動を確認します。

# IAMユーザー → role1(タグあり / TransitiveTagKeys あり)
aws sts assume-role \
  --role-arn arn:aws:iam::[アカウントB]:role/chain-test-role1 \
  --role-session-name role1-session \
  --tags Key=test,Value=true \
  --transitive-tag-keys test

# role1 の認証情報を環境変数にセット
export AWS_ACCESS_KEY_ID=<AccessKeyId>
export AWS_SECRET_ACCESS_KEY=<SecretAccessKey>
export AWS_SESSION_TOKEN=<SessionToken>

# role1 → role2(タグ指定なし)
aws sts assume-role \
  --role-arn arn:aws:iam::[アカウントC]:role/chain-test-role2 \
  --role-session-name role2-session

# role2 の認証情報を環境変数にセット
export AWS_ACCESS_KEY_ID=<AccessKeyId>
export AWS_SECRET_ACCESS_KEY=<SecretAccessKey>
export AWS_SESSION_TOKEN=<SessionToken>

# S3 操作
aws s3 ls

結果

XXXX-XX-XX XX:XX:XX test-transitive-tag-bucket-c

TransitiveTagKeys を指定したことで、role1 で付与したセッションタグ test=true が role2 まで伝播し、ABAC の条件を満たしたため S3 操作が成功しました。

おまけ: さらにロール連鎖した場合

TransitiveTagKeys で指定したタグが、2 段先のロールまで伝播するかを確認します。

検証環境に chain-test-role3(Account B)を追加しました。chain-test-role2 からさらに Account B の chain-test-role3 へロール連鎖する構成です。

chain-test-role3 の権限設定は chain-test-role2 と同様に、セッションタグ test=true が存在する場合のみ s3:ListAllMyBuckets を許可する ABAC 条件を設定しています。

img02.png

# IAMユーザー → role1(タグあり / TransitiveTagKeys あり)
aws sts assume-role \
  --role-arn arn:aws:iam::[アカウントB]:role/chain-test-role1 \
  --role-session-name role1-session \
  --tags Key=test,Value=true \
  --transitive-tag-keys test

# role1 の認証情報を環境変数にセット
export AWS_ACCESS_KEY_ID=<AccessKeyId>
export AWS_SECRET_ACCESS_KEY=<SecretAccessKey>
export AWS_SESSION_TOKEN=<SessionToken>

# role1 → role2(タグ指定なし)
aws sts assume-role \
  --role-arn arn:aws:iam::[アカウントC]:role/chain-test-role2 \
  --role-session-name role2-session

# role2 の認証情報を環境変数にセット
export AWS_ACCESS_KEY_ID=<AccessKeyId>
export AWS_SECRET_ACCESS_KEY=<SecretAccessKey>
export AWS_SESSION_TOKEN=<SessionToken>

# role2 → role3(タグ指定なし)
aws sts assume-role \
  --role-arn arn:aws:iam::[アカウントB]:role/chain-test-role3 \
  --role-session-name role3-session

# role3 の認証情報を環境変数にセット
export AWS_ACCESS_KEY_ID=<AccessKeyId>
export AWS_SECRET_ACCESS_KEY=<SecretAccessKey>
export AWS_SESSION_TOKEN=<SessionToken>

# S3 操作
aws s3 ls

結果

XXXX-XX-XX XX:XX:XX test-transitive-tag-bucket-b

最初の AssumeRole 時に TransitiveTagKeys を指定しておけば、さらにロール連鎖しても セッションタグは伝播し続けることが確認できました。

おわりに

今回は TransitiveTagKeys を使ったセッションタグのロール連鎖時の伝播について検証しました。

ポイントをまとめると以下の通りです。

  • セッションタグは --tags で付与しただけでは、ロール連鎖先には引き継がれない
  • --transitive-tag-keys を指定することで、ロール連鎖先にもタグが伝播する
  • 一度指定すれば、2 連鎖目以降にも伝播する[1][2]

参考になれば幸いです。

参考情報

[1] IAM and AWS STS condition context keys - AWS Identity and Access Management

[2] AWS STS でセッションタグを渡します - AWS Identity and Access Management

クラスメソッドオペレーションズ株式会社について

クラスメソッドグループのオペレーション企業です。

運用・保守開発・サポート・情シス・バックオフィスの専門チームが、IT・AIをフル活用した「しくみ」を通じて、お客様の業務代行から課題解決や高付加価値サービスまでを提供するエキスパート集団です。

当社は様々な職種でメンバーを募集しています。

「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、クラスメソッドオペレーションズ株式会社 コーポレートサイト をぜひご覧ください。※2026年1月 アノテーション㈱から社名変更しました

この記事をシェアする

FacebookHatena blogX

関連記事