AWS STS でのセッションタグの受け渡し - AWS Identity and Access Management

AWS STS でのセッションタグの受け渡し

セッションタグは、AWS STS で IAM ロールを引き受けるとき、またはユーザーをフェデレートするときに渡すキーと値のペアの属性です。これを行うには、STS または ID プロバイダー (IdP) を介して AWS CLI または AWS API リクエストを実行します。AWS STS を使用して一時的なセキュリティ認証情報をリクエストすると、セッションが生成されます。セッションは有効期限があり、アクセスキーペアやセッショントークンなどの 認証情報 があります。セッション認証情報を使用して後続のリクエストを行う場合、リクエストコンテキストには、aws:PrincipalTag コンテキストキーが含まれます。ポリシーの Condition 要素で aws:PrincipalTag キーを使用して、それらのタグに基づいてアクセスを許可または拒否できます。

一時的な認証情報を使用してリクエストを行う場合、プリンシパルに一連のタグが含まれる場合があります。これらのタグは、次のソースから取得されます。

  1. セッションタグ – これらのタグは、ロールを引き受けるか、AWS CLI または AWS API を使用してユーザーをフェデレーションしたときに渡されました。これらのオペレーションの詳細については、「セッションのタグ付けオペレーション」を参照してください。

  2. 受信推移的セッションタグ – これらのタグは、ロールチェーン内の前のセッションから継承されました。詳細については、このトピックで後述する「セッションタグを使用したロールの連鎖」を参照してください。

  3. IAM タグ – これらのタグは、IAM を引き受けるロールにアタッチされています。

セッションのタグ付けオペレーション

セッションタグを渡すには、AWS STS の次の AWS CLI または AWS API オペレーションを使用します。AWS マネジメントコンソール [Switch Role] 機能では、セッションタグを渡すことはできません。

セッションタグを推移的に設定することもできます。推移的なタグは、ロールの連鎖中も保持されます。詳細については、「セッションタグを使用したロールの連鎖」を参照してください。

セッションタグを渡すための方法の比較
方法 だれがロールを引き受けるか タグを渡す方法 推移的なタグを設定する方法
assume-role CLI または AssumeRole API オペレーション IAM ユーザーまたはセッション Tags API パラメータまたは --tags CLI オプション TransitiveTagKeys API パラメータまたは --transitive-tag-keys CLI オプション
assume-role-with-saml CLI または AssumeRoleWithSAML API オペレーション SAML ID プロバイダーを使用して認証されたユーザー PrincipalTag SAML 属性 TransitiveTagKeys SAML 属性
assume-role-with-web-identity CLI または AssumeRoleWithWebIdentity API オペレーション ウェブ ID プロバイダーを使用して認証されたユーザー PrincipalTag ウェブ ID トークン TransitiveTagKeys ウェブ ID トークン
get-federation-token CLI または GetFederationToken API オペレーション IAM ユーザーまたは ルートユーザー Tags API パラメータまたは --tags CLI オプション サポート外

セッションのタグ付けをサポートするオペレーションは、次の条件のいずれかに該当する場合に失敗する可能性があります。

  • 50 を超えるセッションタグを渡している。

  • セッションタグキーのプレーンテキストが 128 文字を超えている。

  • セッションタグ値のプレーンテキストが 256 文字を超えている。

  • セッションポリシーのプレーンテキストの合計サイズが 2048 文字を超えている。

  • セッションポリシーとセッションタグを組み合わせた合計パックサイズが大きすぎる。オペレーションが失敗した場合、エラーメッセージは、ポリシーとタグの組み合わせが上限サイズにどれだけ近いかをパーセントで示します。

セッションタグについて知っておくべきこと

セッションタグを使用する前に、セッションとタグに関する次の詳細を確認してください。

  • セッションタグは、セッションのリクエスト時に指定するプリンシパルタグです。タグは、セッションの認証情報を使用して行うリクエストに適用されます。

  • セッションタグはキーと値のペアです。たとえば、セッションに連絡先情報を追加するには、セッションタグキー email とタグ値 johndoe@example.com を追加します。

  • セッションタグは、IAM および AWS STS のタグ命名規則に従う必要があります。このトピックでは、セッションタグに適用される大文字と小文字の区別と制限付きプレフィックスについて説明します。

  • 新しいセッションタグは、大文字と小文字を問わず、同じタグキーを使用して既存の引き継がれたロールまたはフェデレーティッドユーザーのタグを上書きします。

  • AWS マネジメントコンソール を使用してセッションタグを渡すことはできません。

  • セッションタグは、現在のセッションに対してのみ有効です。

  • セッションタグは ロールの連鎖をサポートします。デフォルトでは、タグは後続のロールセッションに渡されません。ただし、セッションタグを推移的に設定することはできます。推移的なタグは、ロールの連鎖中も保持されます。詳細については、「セッションタグを使用したロールの連鎖」を参照してください。

  • セッションタグを使用して、リソースへのアクセスを制御したり、後続のセッションに渡すことができるタグを制御できます。詳細については、「IAM チュートリアル: ABAC で SAML セッションタグを使用する」を参照してください。

  • セッションのプリンシパルタグ(セッションタグを含む)を AWS CloudTrail ログに表示できます。詳細については、「CloudTrail でのセッションタグの表示」を参照してください。

  • セッションタグごとに 1 つの値を渡す必要があります。複数値セッションタグはサポートされていません。

  • 最大 50 個のセッションタグを渡すことができます。AWS アカウントの IAM リソースの数とサイズは制限されています。詳細については、「IAM および STS クォータ」を参照してください。

  • AWS 変換は、渡されたセッションポリシーとセッションタグを結合して、個別の制限を持つひとまとめのバイナリ形式に圧縮します。この制限を超えた場合、AWS CLI または AWS API エラーメッセージは、ポリシーとタグの組み合わせが上限サイズにどれだけ近いかをパーセントで示します。

セッションタグの追加に必要なアクセス許可

API オペレーションに一致するアクションに加えて、ポリシーには次のアクセス許可のみのアクションが必要です。

sts:TagSession

このアクションは、次の条件キーで使用できます。

  • aws:PrincipalTag – このキーを使用して、リクエストを行うプリンシパルにアタッチされたタグと、ポリシーで指定したタグを比較します。たとえば、リクエストを行うプリンシパルに指定されたタグがある場合にのみ、プリンシパルがセッションタグを渡すことを許可できます。

  • aws:RequestTag – このキーを使用して、リクエストで渡されたタグキーと値のペアと、ポリシーで指定したタグペアを比較します。たとえば、プリンシパルが指定したセッションタグを渡すことを許可し、指定した値のみを渡すことができます。

  • aws:ResourceTag – このキーを使用して、ポリシーで指定したタグキーと値のペアと、リソースにアタッチされているキーと値のペアを比較します。たとえば、プリンシパルが引き受けるロールに指定されたタグが含まれている場合にのみ、セッションタグを渡すことを許可できます。

  • aws:TagKeys – このキーを使用して、リクエスト内のタグキーとポリシーで指定したキーを比較します。たとえば、プリンシパルが指定したタグキーを持つセッションタグのみを渡すことを許可できます。この条件キーは、渡すことができるセッションタグの最大セットを制限します。

  • sts:TransitiveTagKeysこのキーを使用して、リクエスト内の推移的なセッションタグキーとポリシーで指定されたセッションタグキーを比較します。たとえば、プリンシパルが特定のタグのみを推移的に設定することを許可するポリシーを記述できます。推移的なタグは、ロールの連鎖中も保持されます。詳細については、「セッションタグを使用したロールの連鎖」を参照してください。

たとえば、次のロール信頼ポリシーでは、test-session-tags ユーザーはポリシーがアタッチされているロールを引き受けることができます。そのユーザーがロールを引き受けるときは、AWS CLI または AWS API を使用して、3 つの必須セッションタグと必要な外部 ID を渡す必要があります。さらに、ユーザーは Project および Department タグを推移的に設定することもできます。

例 セッションタグのロール信頼ポリシーの例

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowIamUserAssumeRole", "Effect": "Allow", "Action": "sts:AssumeRole", "Principal": {"AWS": "arn:aws:iam::123456789012:user/test-session-tags"}, "Condition": { "StringLike": { "aws:RequestTag/Project": "*", "aws:RequestTag/CostCenter": "*", "aws:RequestTag/Department": "*" }, "StringEquals": {"sts:ExternalId": "Example987"} } }, { "Sid": "AllowPassSessionTagsAndTransitive", "Effect": "Allow", "Action": "sts:TagSession", "Principal": {"AWS": "arn:aws:iam::123456789012:user/test-session-tags"}, "Condition": { "StringLike": { "aws:RequestTag/Project": "*", "aws:RequestTag/CostCenter": "*" }, "StringEquals": { "aws:RequestTag/Department": [ "Engineering", "Marketing" ] }, "ForAllValues:StringEquals": { "sts:TransitiveTagKeys": [ "Project", "Department" ] } } } ] }

このポリシーで行うこと

  • AllowIamUserAssumeRole ステートメントは、ポリシーがアタッチされているロールを引き受けることを test-session-tags ユーザーに許可します。そのユーザーがロールを引き受けるときは、必要なセッションタグと外部 ID を渡す必要があります。

    • このステートメントの最初の条件ブロックでは、ユーザーは、ProjectCostCenter、および Department セッションタグを渡す必要があります。このステートメントではタグの値は重要ではないため、タグ値にはワイルドカード (*) を使用しました。このブロックでは、ユーザーは少なくともこれら 3 つのセッションタグを渡します。そうしないと、オペレーションは失敗します。ユーザーは追加のタグを渡すことができます。

    • 2 番目の条件ブロックでは、ユーザーは値 Example987 とともに外部 ID を渡す必要があります。

  • AllowPassSessionTagsAndTransitive ステートメントは、sts:TagSession アクセス許可のみのアクションを許可します。このアクションは、ユーザーがセッションタグを渡す前に許可する必要があります。ポリシーに 2 番目のステートメントを含まない最初のステートメントが含まれている場合、ユーザーはロールを引き受けることができません。

    • このステートメントの最初の条件ブロックでは、ユーザーは CostCenter および Project セッションタグに任意の値を渡すことができます。これを行うには、ポリシーのタグ値にワイルドカード (*) を使用します。この場合、StringLike 条件演算子を使用する必要があります。

    • 2 番目の条件ブロックでは、ユーザーは、Department セッションタグの Engineering または Marketing 値のみを渡すことができます。

    • 3 番目の条件ブロックは、推移的として設定できるタグの最大セットを一覧表示します。ユーザーは、サブセットを設定するか、タグを推移的として設定しないかを選択できます。ただし、追加のタグを推移的として設定することはできません。"Null":{"sts:TransitiveTagKeys":"false"} を含む別の条件ブロックを追加することで、タグの少なくとも 1 つを推移的として設定するよう要求できます。

AssumeRole を使用したセッションタグの受け渡し

AssumeRole オペレーションは、AWS リソースへのアクセスに使用できる一時的な認証情報のセットを返します。IAM ユーザーまたはロールの認証情報を使用して AssumeRole を呼び出すことができます。ロールを引き受けるときにセッションタグを渡すには、--tags AWS CLI オプションまたは Tags AWS API パラメータを使用します。

タグを推移的として設定するには、--transitive-tag-keys AWS CLI オプションまたは TransitiveTagKeys AWS API パラメータを使用します。推移的なタグは、ロールの連鎖中も保持されます。詳細については、「セッションタグを使用したロールの連鎖」を参照してください。

次の例は、AssumeRole を使用するリクエストの例を示しています。この例では、my-role-example ロールを引き受けるときに my-session という名前のセッションを作成します。セッションタグのキーと値のペア Project = AutomationCostCenter = 12345、および Department = Engineering を追加します。また、Project タグと Department のタグのキーを指定して、推移的タグとして設定します。

例 AssumeRole CLI リクエストの例

aws sts assume-role \ --role-arn arn:aws:iam::123456789012:role/my-role-example \ --role-session-name my-session \ --tags Key=Project,Value=Automation Key=CostCenter,Value=12345 Key=Department,Value=Engineering \ --transitive-tag-keys Project Department \ --external-id Example987

AssumeRoleWithSAML を使用したセッションタグの受け渡し

AssumeRoleWithSAML オペレーションは、SAML ベースのフェデレーションを使用して認証されます。このオペレーションは、AWS リソースへのアクセスに使用できる一時的な認証情報のセットを返します。SAML ベースのフェデレーションを使用して AWS マネジメントコンソール にアクセスする方法の詳細については、「SAML 2.0 フェデレーティッドユーザーが AWS マネジメントコンソール にアクセス可能にする」を参照してください。AWS CLI または AWS API アクセスの詳細については、「SAML 2.0 ベースのフェデレーションについて」を参照してください。Active Directory ユーザーの SAML フェデレーションを設定するチュートリアルについては、AWS セキュリティブログの「Active Directory フェデレーションサービスを使用した AWS フェデレーション認証 (ADFS)」を参照してください。

管理者は、企業ディレクトリのメンバーに AWS STS AssumeRoleWithSAML オペレーションを使用しての AWS フェデレーションを許可できます。これを行うには、以下のタスクを完了する必要があります。

AWS には、ID ソリューションを使用したセッションタグのエンドツーエンドのエクスペリエンスを認定したパートナーが含まれます。これらの ID プロバイダーを使用してセッションタグを設定する方法については、「サードパーティーの SAML ソリューションプロバイダーと AWS の統合」を参照してください。

SAML 属性をセッションタグとして渡すには、Name 属性を https://aws.amazon.com/SAML/Attributes/PrincipalTag:{TagKey} に設定した Attribute エレメントを含めます。AttributeValue 要素を使用して、タグの値を指定します。セッションタグごとに個別の Attribute 要素を含めます。

たとえば、次の ID 属性をセッションタグとして渡すとします。

  • Project:Automation

  • CostCenter:12345

  • Department:Engineering

これらの属性を渡すには、SAML アサーションに以下の要素を含めます。

例 SAML アサーションのスニペットの例

<Attribute Name="https://aws.amazon.com/SAML/Attributes/PrincipalTag:Project"> <AttributeValue>Automation</AttributeValue> </Attribute> <Attribute Name="https://aws.amazon.com/SAML/Attributes/PrincipalTag:CostCenter"> <AttributeValue>12345</AttributeValue> </Attribute> <Attribute Name="https://aws.amazon.com/SAML/Attributes/PrincipalTag:Department"> <AttributeValue>Engineering</AttributeValue> </Attribute>

上記のタグを推移的として設定するには、Name 属性を https://aws.amazon.com/SAML/Attributes/TransitiveTagKeys に設定した別の Attribute エレメントを含めます。推移的なタグは、ロールの連鎖中も保持されます。詳細については、「セッションタグを使用したロールの連鎖」を参照してください。

Project タグと Department タグを推移的として設定するには、次の多値属性を使用します。

例 SAML アサーションのスニペットの例

<Attribute Name="https://aws.amazon.com/SAML/Attributes/TransitiveTagKeys"> <AttributeValue>Project</AttributeValue> <AttributeValue>Department</AttributeValue> </Attribute>

AssumeRoleWithWebIdentity を使用したセッションタグの受け渡し

AssumeRoleWithWebIdentity オペレーションは、OpenID Connect (OIDC) 準拠のウェブ ID フェデレーションを使用して認証されます。このオペレーションは、AWS リソースへのアクセスに使用できる一時的な認証情報のセットを返します。AWS マネジメントコンソール アクセスにウェブ ID フェデレーションを使用する方法の詳細については、「ウェブ ID フェデレーションについて」を参照してください。

OpenID Connect (OIDC) からセッションタグを渡すには、JSON ウェブトークン (JWT) にセッションタグを含める必要があります。AssumeRoleWithWebIdentity リクエストを送信するときに、トークンの https://aws.amazon.com/tags 名前空間にセッションタグを含めます。OIDC トークンとクレームの詳細については、Amazon Cognito 開発者ガイドの「ユーザープールでのトークンの使用」を参照してください。

たとえば、次のデコードされた JWT は、ProjectCostCenter、および Department セッションタグを使用して AssumeRoleWithWebIdentity を呼び出すために使用されるトークンです。トークンはまた、CostCenter タグと Project タグを推移的に設定します。推移的なタグは、ロールの連鎖中も保持されます。詳細については、「セッションタグを使用したロールの連鎖」を参照してください。

例 デコードされた JSON ウェブトークンの例

{ "sub": "johndoe", "aud": "ac_oic_client", "jti": "ZYUCeRMQVtqHypVPWAN3VB", "iss": "https://xyz.com", "iat": 1566583294, "exp": 1566583354, "auth_time": 1566583292, "https://aws.amazon.com/tags": { "principal_tags": { "Project": ["Automation"], "CostCenter": ["987654"], "Department": ["Engineering"] }, "transitive_tag_keys": [ "Project", "CostCenter" ] } }

GetFederationToken を使用したセッションタグの受け渡し

GetFederationToken では、ユーザーをフェデレートできます。このオペレーションは、AWS リソースへのアクセスに使用できる一時的な認証情報のセットを返します。フェデレーティッドユーザーセッションにタグを追加するには、--tags AWS CLI オプションまたは Tags AWS API パラメータを使用します。GetFederationToken を使用する場合、セッションタグを推移的として設定することはできません。これは、一時的な認証情報を使用してロールを引き受けることができないためです。つまり、ロールの連鎖が不可能なためです。

次の例は、GetFederationToken を使用したレスポンスのサンプルです。この例では、トークンをリクエストするときに、my-fed-user という名前のセッションを作成します。セッションタグのキーと値のペア Project = AutomationDepartment = Engineering を追加します。

例 GetFederationToken の CLI リクエストの例

aws sts get-federation-token \ --name my-fed-user \ --tags key=Project,value=Automation key=Department,value=Engineering

GetFederationToken オペレーションによって返される一時的な認証情報を使用すると、セッションのプリンシパルタグには、ユーザーのタグと渡されたセッションタグが含まれます。

セッションタグを使用したロールの連鎖

1 つのロールを引き受け、一時的な認証情報を使用して別のロールを引き受けることができます。セッション間で続行できます。これをロールの連鎖と呼びます。ロールを引き受けるときにセッションタグを渡すと、キーを推移的に設定できます。これにより、これらのセッションタグがロールチェーン内の後続のセッションに渡されるようになります。ロールタグを推移的として設定することはできません。これらのタグを後続のセッションに渡すには、セッションタグとして指定します。

次の例は、セッションタグ、推移タグ、およびロールタグがロールチェーン内の後続のセッションに渡される方法を理解するのに役立ちます。

次のロールの連鎖シナリオ例では、AWS CLI で IAM ユーザーのアクセスキーを使用して Role1 という名前のロールを引き受けます。次に、結果のセッション認証情報を使用して、Role2 という名前の 2 番目のロールを引き受けます。次に、2 番目のセッション認証情報を使用して、Role3 という 3 番目のロールを引き受けることができます。これらのリクエストは、3 つの個別のオペレーションとして発生します。各ロールはすでに IAM でタグ付けされています。また、リクエストごとに、追加のセッションタグを渡します。


        ロールの連鎖

ロールをチェーン化すると、以前のセッションのタグが後のセッションにも確実に保持されるようにできます。assume-role CLI コマンドを使用してこれを行うには、タグをセッションタグとして渡し、タグを推移的に設定する必要があります。タグ Star = 1 をセッションタグとして渡します。タグ Heart = 1 はロールにアタッチされ、セッションの使用時にプリンシパルタグとして適用されます。ただし、Heart = 1 タグを自動的に 2 番目または 3 番目のセッションに渡すこともできます。これを行うには、セッションタグとして手動で含めます。このようにして、結果のセッションのプリンシパルタグにはこれら 2 つのタグが含まれており、推移的として設定されます。


        ロールチェーン内の最初のロールを仮定する

このリクエストは、次の AWS CLI コマンドを使用して実行します。

例 AssumeRole CLI リクエストの例

aws sts assume-role \ --role-arn arn:aws:iam::123456789012:role/Role1 \ --role-session-name Session1 \ --tags Key=Star,Value=1 Key=Heart,Value=1 \ --transitive-tag-keys Star Heart

次に、そのセッションの認証情報を使用して、Role2 を引き受けます。タグ Sun = 2 は 2 番目のロールにアタッチされ、2 番目のセッションを使用するときにプリンシパルタグとして適用されます。Star タグと Heart タグは、最初のセッションで推移的なセッションタグから継承されます。2 番目のセッションの結果となるプリンシパルタグは、Heart = 1Star = 1、および Sun = 2 です。Heart および Star は引き続き推移的です。Role2 にアタッチされた Sun タグは、セッションタグではないため、推移的としてマークされていません。このタグは、以降のセッションでは継承されません。


        ロールチェーンの 2 番目のロールを引き受ける

この 2 番目のリクエストは、次の AWS CLI コマンドを使用して実行します。

例 AssumeRole CLI リクエストの例

aws sts assume-role \ --role-arn arn:aws:iam::123456789012:role/Role2 \ --role-session-name Session2

次に、2 番目のセッション認証情報を使用して、Role3 を引き受けます。3 番目のセッションのプリンシパルタグは、新しいセッションタグ、継承された推移的セッションタグ、およびロールタグから取得されます。2 番目のセッションの Heart = 1 タグと Star = 1 タグは最初のセッションでの推移的なタグから継承されました。Heart = 3 セッションタグを渡そうとすると、オペレーションは失敗します。継承された Star = 1 セッションタグは、ロールの Star = 3 タグを上書きします。ロールの Lightning タグは 3 番目のセッションにも適用され、推移的として設定されません。


        ロールチェーンの 3 番目のロールを引き受ける

3 番目のリクエストを実行するには、次の AWS CLI コマンドを使用します。

例 AssumeRole CLI リクエストの例

aws sts assume-role \ --role-arn arn:aws:iam::123456789012:role/Role3 \ --role-session-name Session3

ABAC でのセッションタグの使用

属性ベースのアクセスコントロール (ABAC) は、タグ属性に基づいてアクセス許可を定義する認可戦略です。

企業ユーザー ID に SAML ベースの ID プロバイダー (IdP) を使用している場合は、セッションタグを AWS に渡すように SAML アサーションを設定できます。従業員が AWS にフェデレートすると、その属性が AWS で結果のプリンシパルに適用されます。その後、ABAC を使用して、これらの属性に基づいてアクセス許可を許可または拒否できます。詳細については、「IAM チュートリアル: ABAC で SAML セッションタグを使用する」を参照してください。

CloudTrail でのセッションタグの表示

AWS CloudTrail を使用して、ロールを引き受けるか、ユーザーをフェデレートするために行われたリクエストを表示できます。CloudTrail ログファイルには、引き受けたロールまたはフェデレーティッドユーザーセッションのプリンシパルタグに関する情報が含まれます。詳細については、「AWS CloudTrail による IAM および AWS STS の API コールのログ記録」を参照してください。

たとえば、AWS STS AssumeRoleWithSAML リクエストを行い、セッションタグを渡し、これらのタグを推移的として設定するとします。CloudTrail ログには、次の情報があります。

例 AssumeRoleWithSAML CloudTrail ログの例

"requestParameters": { "sAMLAssertionID": "_c0046cEXAMPLEb9d4b8eEXAMPLE2619aEXAMPLE", "roleSessionName": "MyRoleSessionName", "principalTags": { "CostCenter": "987654", "Project": "Unicorn" }, "transitiveTagKeys": [ "CostCenter", "Project" ], "durationSeconds": 3600, "roleArn": "arn:aws:iam::123456789012:role/SAMLTestRoleShibboleth", "principalArn": "arn:aws:iam::123456789012:saml-provider/Shibboleth" },

次の CloudTrail ログ例を参照して、セッションタグを使用するイベントを表示できます。