一時的なセキュリティ認証情報をリクエストする - AWS Identity and Access Management

一時的なセキュリティ認証情報をリクエストする

一時的なセキュリティ認証情報をリクエストするには、AWS API で AWS Security Token Service (AWS STS) を使用できます。これには、AWS リソースへのアクセスを制御できる一時的セキュリティ認証情報を持つ、信頼されたユーザーを作成および提供するオペレーションが含まれます。AWS STS の詳細については、「IAM の一時的な認証情報」を参照してください。ロールを引き受けることで一時的なセキュリティ認証情報をリクエストするための別の方法については、「ロールを引き受けるための各種方法」を参照してください。

API オペレーションを呼び出すには、いずれかの AWS SDK を使用することができます。SDK は、Java、.NET、Python、Ruby、Android、iOS など、さまざまなプログラミング言語や環境で使用できます。SDK は、リクエストへの暗号を使用した署名、必要に応じてリクエストの再試行、エラーレスポンスの処理などのタスクを処理します。また、AWS Security Token Service API リファレンス で説明されている AWS STS Query API を使用することもできます。最後に、AWS STS コマンドは AWS Command Line Interface および AWS Tools for Windows PowerShell という 2 つのコマンドラインツールでサポートされています。

AWS STS API オペレーションは、アクセスキーペアやセキュリティトークンを含む一時的セキュリティ認証情報で新しいセッションを作成します。アクセスキーペアは、アクセスキー ID とシークレットキーで構成されます。ユーザー(またはユーザーが実行しているアプリケーション)はこれらの認証情報を使用して、リソースにアクセスできます。AWS STS API オペレーションを使用して、ロールセッションを作成し、プログラムでセッションポリシーとセッションタグを渡すことができます。結果として得られるセッションのアクセス許可は、ロールの ID ベースのポリシーとセッションポリシーの共通部分です。セッションポリシーの詳細については、「セッションポリシー」を参照してください。セッションタグの詳細については、「AWS STS でセッションタグを渡します」を参照してください。

注記

AWS STS API オペレーションから返されるセッショントークンのサイズは固定ではありません。最大サイズを仮定しないことを強くお勧めします。一般的なトークンのサイズは 4096 バイト未満ですが、変化する可能性があります。

AWS リージョンでの AWS STS の使用

AWS STS API 呼び出しは、グローバルエンドポイントにも、リージョンのエンドポイントの 1 つに対しても送信できます。より近くのエンドポイントを選択した場合、レイテンシーを軽減し、API 呼び出しのパフォーマンスが向上します。また、元のエンドポイントとの通信ができなくなった場合は、代替リージョンのエンドポイントに呼び出しを送信することもできます。各種 AWS SDK の 1 つを使用している場合、API コールを行う前に SDK メソッドを使用してリージョンを選択します。手動で HTTP API リクエストを組み立てる場合、独自で正しいエンドポイントにリクエストを送信する必要があります。詳細については、リージョンとエンドポイントの「AWS STS 」セクションおよび「AWS リージョン で AWS STS を管理する」 を参照してください。

AWS 環境およびアプリケーションで使用する一時的な認証情報の取得に使用できる API オペレーションを、次に示します。

カスタム ID ブローカーを介したクロスアカウントの委任とフェデレーションの認証情報のリクエスト

この AssumeRole API オペレーションは、既存の IAM ユーザーに、まだアクセスできない AWS リソースへのアクセスを許可する際に役立ちます。例えば、ユーザーが別の AWS アカウント のリソースにアクセスする必要がある場合があります。また、特権アクセスを一時的に得るための方法 ( 多要素認証 (MFA) など) としても役立ちます。アクティブなユーザーの認証情報を使用してこの API を呼び出す必要があります。誰がこの操作を呼び出すことができるのかについては、AWS STS 認証情報を比較する を参照してください。詳細については、IAM ユーザーにアクセス許可を委任するロールを作成するおよびMFA を使用した安全な API アクセスを参照してください。

カスタム ID ブローカーを通じてクロスアカウント委任とフェデレーションの一時的なセキュリティ認証情報をリクエストするには
  1. AWS セキュリティ認証情報を使用して認証します。この呼び出しは、有効な AWS セキュリティ認証情報を使用して実行される必要があります。

  2. AssumeRole 操作を呼び出します。

以下の例は、AssumeRole を使用したリクエストと応答のサンプルを示します。このサンプルリクエストは、含まれているセッションポリシーセッションタグ外部 ID、およびソース ID を使用して、指定された期間の demo ロールを引き受けます。結果のセッションには John-session という名前が付けられます。

例 リクエストの例
https://sts.amazonaws.com/ ?Version=2011-06-15 &Action=AssumeRole &RoleSessionName=John-session &RoleArn=arn:aws::iam::123456789012:role/demo &Policy=%7B%22Version%22%3A%222012-10-17%22%2C%22Statement%22%3A%5B%7B%22Sid%22%3A%20%22Stmt1%22%2C%22Effect%22%3A%20%22Allow%22%2C%22Action%22%3A%20%22s3%3A*%22%2C%22Resource%22%3A%20%22*%22%7D%5D%7D &DurationSeconds=1800 &Tags.member.1.Key=Project &Tags.member.1.Value=Pegasus &Tags.member.2.Key=Cost-Center &Tags.member.2.Value=12345 &ExternalId=123ABC &SourceIdentity=DevUser123 &AUTHPARAMS

上記の例に示すポリシーの値は、次のポリシーの URL エンコードされたバージョンです。

{"Version":"2012-10-17","Statement":[{"Sid":"Stmt1","Effect":"Allow","Action":"s3:*","Resource":"*"}]}

この例の AUTHPARAMS パラメータは 署名のプレースホルダーです。署名は AWS HTTP API リクエストに含める必要がある認証情報です。AWS SDK を使用して API リクエストを作成することをお勧めします。その利点の 1 つは、SDK がリクエストの署名を処理することです。API リクエストを手動で作成し、署名する必要がある場合は、[Amazon Web Services 全般のリファレンス] の「署名バージョン 4 を使用して AWS リクエストに署名する」を参照してリクエストに署名する方法を確認してください。

一時的セキュリティ認証情報に加えて、レスポンスにはフェデレーティッドユーザーの Amazon リソースネーム(ARN)、および認証情報の有効期限が含まれています。

例 レスポンスの例
<AssumeRoleResponse xmlns="https://sts.amazonaws.com/doc/2011-06-15/"> <AssumeRoleResult> <SourceIdentity>DevUser123</SourceIdentity> <Credentials> <SessionToken> AQoDYXdzEPT//////////wEXAMPLEtc764bNrC9SAPBSM22wDOk4x4HIZ8j4FZTwdQW LWsKWHGBuFqwAeMicRXmxfpSPfIeoIYRqTflfKD8YUuwthAx7mSEI/qkPpKPi/kMcGd QrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU 9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d+xo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz +scqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCR/oLxBA== </SessionToken> <SecretAccessKey> wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY </SecretAccessKey> <Expiration>2019-07-15T23:28:33.359Z</Expiration> <AccessKeyId>AKIAIOSFODNN7EXAMPLE</AccessKeyId> </Credentials> <AssumedRoleUser> <Arn>arn:aws:sts::123456789012:assumed-role/demo/John</Arn> <AssumedRoleId>ARO123EXAMPLE123:John</AssumedRoleId> </AssumedRoleUser> <PackedPolicySize>8</PackedPolicySize> </AssumeRoleResult> <ResponseMetadata> <RequestId>c6104cbe-af31-11e0-8154-cbc7ccf896c7</RequestId> </ResponseMetadata> </AssumeRoleResponse>
注記

AWS 変換では、渡されたセッションポリシーとセッションタグが、個別の制限を持つひとまとめのバイナリ形式に圧縮されます。プレーンテキストが他の要件を満たしていても、この制限ではリクエストが失敗する可能性があります。PackedPolicySize レスポンス要素は、リクエストのポリシーとタグがサイズ制限にどの程度近づいているかをパーセントで示します。

OIDC プロバイダーを通じた認証情報のリクエスト

AssumeRoleWithWebIdentity API オペレーションでは、パブリック ID プロバイダーを経由して認証されたフェデレーティッドユーザーの一時的なセキュリティ認証情報のセットが返ります。パブリック ID プロバイダーの例としては、Login with Amazon、Facebook、Google、または OpenID Connect (OIDC) に対応している任意の ID プロバイダーがあります。このオペレーションを使用すると、ユーザーには自分の AWS または IAM アイデンティティは必要ありません。詳細については、「OIDC フェデレーション」を参照してください。

注記

AssumeRoleWithWebIdentity を直接呼び出すのではなく、モバイル開発用の AWS SDK で Amazon Cognito および Amazon Cognito 認証情報プロバイダーを使用することをお勧めします。詳細については、Amplify ドキュメントの「Amplify による認証」を参照してください。

Amazon Cognito を使用していない場合は、AWS STS の AssumeRoleWithWebIdentity アクションを呼び出します。

  1. AssumeRoleWithWebIdentity 操作を呼び出します。

    これは署名なしの呼び出しです。つまり、リクエストを実行する前に AWS セキュリティ認証情報を認証する必要はありません。

    注記

    AssumeRoleWithWebIdentity に対する呼び出しは署名 (暗号化) されていません。そのため、信頼されている経路を通じてリクエストが送信される場合のみ、オプションのセッションポリシーを含める必要があります。そうでない場合、他のユーザーが制限を削除するようにポリシーを変更できます。

  2. AssumeRoleWithWebIdentity を呼び出すとき、AWS はトークンの信頼性を確認します。たとえば、プロバイダーに応じて、AWS はプロバイダーを呼び出して、アプリが渡したトークンを含める場合があります。ID プロバイダーがトークンを確認した場合、AWS は次の情報を返します。

    • 一時的なセキュリティ認証情報一式。一時的なセキュリティ認証情報は、アクセスキー ID、シークレットアクセスキー、およびセッショントークンで構成されています。

    • 引き受けたロールのロール ID と ARN。

    • 一意のユーザー ID を含む SubjectFromWebIdentityToken 値。

  3. レスポンスで返された一時的なセキュリティ認証情報を使用して AWS API コールを実行します。これは、長期的なセキュリティ認証情報を使用して AWS API 呼び出しを行うのと同じ処理です。異なる点は、AWS で一時的なセキュリティ認証情報が有効であることを確認できる、セッショントークンを含める必要があることです。

アプリで認証情報をキャッシュする必要があります。先述したように、認証情報はデフォルトで 1 時間後に無効になります。 SDK の AmazonSTSCredentialsProviderAWS オペレーションを使用しない場合、再度 AssumeRoleWithWebIdentity を呼び出すかどうかはお客様およびお客様のアプリによります。古い認証情報が失効する前に、このオペレーションを呼び出して新しい一時的なセキュリティ認証情報を取得します。

SAML 2.0 ID プロバイダーを通じた認証情報のリクエスト

AssumeRoleWithSAML API オペレーションでは、組織の既存の ID システムによって認証されたフェデレーティッドユーザーの一時的なセキュリティ認証情報のセットが返ります。また、ユーザーは SAML2.0 (Security Assertion Markup Language) を使用して AWS に認証および認可情報を渡す必要があります。この API オペレーションは、SAML アサーションを生成できるソフトウェアに認証システム (Windows Active Directory、OpenLDAP など) を統合している組織で役立ちます。このような統合はユーザー ID とアクセス許可に関する情報を提供します (Active Directory Federation Services や Shibboleth など)。詳細については、「SAML 2.0 フェデレーション」を参照してください。

  1. AssumeRoleWithSAML 操作を呼び出します。

    これは署名なしの呼び出しです。つまり、リクエストを実行する前に AWS セキュリティ認証情報を認証する必要はありません。

    注記

    AssumeRoleWithSAML に対する呼び出しは署名 (暗号化) されていません。そのため、信頼されている経路を通じてリクエストが送信される場合のみ、オプションのセッションポリシーを含める必要があります。そうでない場合、他のユーザーが制限を削除するようにポリシーを変更できます。

  2. AssumeRoleWithSAML を呼び出すときに、AWS は SAML アサーションの信頼性を確認します。ID プロバイダーがアサーションを確認した場合、AWS は次の情報を返します。

    • 一時的なセキュリティ認証情報一式。一時的なセキュリティ認証情報は、アクセスキー ID、シークレットアクセスキー、およびセッショントークンで構成されています。

    • 引き受けたロールのロール ID と ARN。

    • SAML アサーションの Audience 要素の Recipient 属性値を含む SubjectConfirmationData 値。

    • SAML アサーションの Issuer 要素の値を含む Issuer 値。

    • Issuer 値、AWS アカウント ID、SAML プロバイダーのフレンドリ名から構築されたハッシュ値を含む NameQualifier 要素。Subject 要素と結合する場合、フェデレーティッドユーザーを一意に識別できます。

    • SAML アサーションの Subject 要素内の NameID 要素の値を含む Subject 要素。

    • SubjectType 要素の形式を示す Subject 要素。値は、persistenttransient、または SAML アサーションで使用されている Format および Subject 要素の完全な NameID URI とすることができます。NameID 要素の Format 属性の詳細については、「認証レスポンス用の SAML アサーションを設定する」を参照してください。

  3. レスポンスで返された一時的なセキュリティ認証情報を使用して AWS API コールを実行します。これは、長期的なセキュリティ認証情報を使用して AWS API 呼び出しを行うのと同じ処理です。異なる点は、AWS で一時的なセキュリティ認証情報が有効であることを確認できる、セッショントークンを含める必要があることです。

アプリで認証情報をキャッシュする必要があります。認証情報はデフォルトで 1 時間後に無効になります。 SDK の AmazonSTSCredentialsProviderAWS アクションを使用していない場合、再度 AssumeRoleWithSAML を呼び出すかどうかはお客様およびお客様のアプリによります。古い認証情報が失効する前に、このオペレーションを呼び出して新しい一時的なセキュリティ認証情報を取得します。

カスタム ID ブローカーを通じた認証情報のリクエスト

GetFederationToken API オペレーションでは、フェデレーティッドユーザー用の一時的セキュリティ認証情報が返ります。この API は、デフォルトの有効期限が大幅に長い (1 時間ではなく 12 時間) という点で AssumeRole とは異なります。また、DurationSeconds パラメータを使用して、一時的なセキュリティ認証情報が有効である期間を選択することもできます。結果として得られる認証情報は、900 秒 (15 分) から 129,600 秒 (36 時間) までの指定された期間内で有効です。有効期限を長くすると、新しい認証情報を頻繁に取得する必要がなくなるため、AWS への呼び出し回数を減少させることができます。

  1. 特定の IAM ユーザーの AWS セキュリティ認証情報を使用して認証します。この呼び出しは、有効な AWS セキュリティ認証情報を使用して実行される必要があります。

  2. GetFederationToken 操作を呼び出します。

GetFederationToken 呼び出しは、セッショントークン、アクセスキー、シークレットキー、失効情報で構成される一時的セキュリティ認証情報を返します。組織内でアクセス権限を管理する (たとえば、プロキシアプリケーションを使用してアクセス権限を割り当てる) 場合、GetFederationToken を使用できます。

以下の例に、GetFederationToken を使用したリクエストと応答のサンプルを示します。このリクエスト例では、指定された期間の呼び出し元ユーザーをセッションポリシー ARN およびセッションタグとフェデレートします。結果のセッションには Jane-session という名前が付けられます。

例 リクエストの例
https://sts.amazonaws.com/ ?Version=2011-06-15 &Action=GetFederationToken &Name=Jane-session &PolicyArns.member.1.arn==arn%3Aaws%3Aiam%3A%3A123456789012%3Apolicy%2FRole1policy &DurationSeconds=1800 &Tags.member.1.Key=Project &Tags.member.1.Value=Pegasus &Tags.member.2.Key=Cost-Center &Tags.member.2.Value=12345 &AUTHPARAMS

前述の例に示すポリシー ARN には、次の URL エンコードされた ARN が含まれています。

arn:aws:iam::123456789012:policy/Role1policy

また、例の &AUTHPARAMS パラメータは、認証情報のプレースホルダーとして使用されることに注意してください。これは、署名であり、AWS HTTP API リクエストに含める必要があります。AWS SDK を使用して API リクエストを作成することをお勧めします。その利点の 1 つは、SDK がリクエストの署名を処理することです。API リクエストを手動で作成し、署名する必要がある場合は、「Amazon Web Services 全般のリファレンス」の「署名バージョン 4 を使用して AWS リクエストに署名する」を参照してリクエストに署名する方法を確認してください。

一時的セキュリティ認証情報に加えて、レスポンスにはフェデレーティッドユーザーの Amazon リソースネーム(ARN)、および認証情報の有効期限が含まれています。

例 レスポンスの例
<GetFederationTokenResponse xmlns="https://sts.amazonaws.com/doc/2011-06-15/"> <GetFederationTokenResult> <Credentials> <SessionToken> AQoDYXdzEPT//////////wEXAMPLEtc764bNrC9SAPBSM22wDOk4x4HIZ8j4FZTwdQW LWsKWHGBuFqwAeMicRXmxfpSPfIeoIYRqTflfKD8YUuwthAx7mSEI/qkPpKPi/kMcGd QrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU 9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d+xo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz +scqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCEXAMPLE== </SessionToken> <SecretAccessKey> wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY </SecretAccessKey> <Expiration>2019-04-15T23:28:33.359Z</Expiration> <AccessKeyId>AKIAIOSFODNN7EXAMPLE;</AccessKeyId> </Credentials> <FederatedUser> <Arn>arn:aws:sts::123456789012:federated-user/Jean</Arn> <FederatedUserId>123456789012:Jean</FederatedUserId> </FederatedUser> <PackedPolicySize>4</PackedPolicySize> </GetFederationTokenResult> <ResponseMetadata> <RequestId>c6104cbe-af31-11e0-8154-cbc7ccf896c7</RequestId> </ResponseMetadata> </GetFederationTokenResponse>
注記

AWS 変換では、渡されたセッションポリシーとセッションタグが、個別の制限を持つひとまとめのバイナリ形式に圧縮されます。プレーンテキストが他の要件を満たしていても、この制限ではリクエストが失敗する可能性があります。PackedPolicySize レスポンス要素は、リクエストのポリシーとタグがサイズ制限にどの程度近づいているかをパーセントで示します。

AWS ではリソースレベルでアクセス許可を付与する(たとえば、Amazon S3 バケットにリソースベースのポリシーをアタッチする)ことを推奨しています。Policy パラメータは省略できます。ただし、フェデレーティッドユーザーのポリシーを含まない場合、一時的セキュリティ認証情報ではアクセス権限が付与されません。この場合、リソースポリシーを使用してフェデレーティッドユーザーに AWS リソースへのアクセスを許可する必要があります

例えば、AWS アカウント 番号が 111122223333 であり、Susan にアクセスを許可しようとしている Amazon S3 バケットがあるとします。Susan の一時的セキュリティ認証情報にはバケットのポリシーが含まれていません。この場合、Susan の ARN (arn:aws:sts::111122223333:federated-user/Susan など) と一致する ARN があるポリシーがバケットにあるようにする必要があります。

信頼されていない環境でのユーザーの認証情報のリクエスト

この GetSessionToken API オペレーションでは、既存の IAM ユーザーに一時的セキュリティ認証情報のセットが返ります。この API は、MFA が IAM ユーザーに対して有効なときに AWS リクエストを作成するなど、セキュリティを強化するために役立ちます。認証情報は一時的なものであるため、安全性の低い環境からリソースにアクセスする IAM ユーザーがいる場合、これによりセキュリティが強化されます。安全性の低い環境の例には、モバイルデバイスやウェブブラウザが含まれます。

  1. 特定の IAM ユーザーの AWS セキュリティ認証情報を使用して認証します。この呼び出しは、有効な AWS セキュリティ認証情報を使用して実行される必要があります。

  2. GetSessionToken 操作を呼び出します。

  3. GetSessionToken は、セッショントークン、アクセスキー ID、およびシークレットアクセスキーから構成される一時的なセキュリティ認証情報を返します。

デフォルトでは、IAM ユーザーの一時的なセキュリティ認証情報は、最大 12 時間有効です。ただし、DurationSeconds パラメータを使用して最短 15 分、最長 36 時間の有効期間をリクエストできます。セキュリティ上の理由から、AWS アカウントのルートユーザー のトークンは有効期間が 1 時間に制限されます。

以下の例は、GetSessionToken を使用したリクエストと応答のサンプルを示します。レスポンスには、一時的なセキュリティ認証情報の有効期限も含んでいます。

例 リクエストの例
https://sts.amazonaws.com/ ?Version=2011-06-15 &Action=GetSessionToken &DurationSeconds=1800 &AUTHPARAMS

この例の AUTHPARAMS パラメータは 署名のプレースホルダーです。署名は AWS HTTP API リクエストに含める必要がある認証情報です。AWS SDK を使用して API リクエストを作成することをお勧めします。その利点の 1 つは、SDK がリクエストの署名を処理することです。API リクエストを手動で作成し、署名する必要がある場合は、「Amazon Web Services 全般のリファレンス」の「署名バージョン 4 を使用して AWS リクエストに署名する」を参照してリクエストに署名する方法を確認してください。

例 レスポンスの例
<GetSessionTokenResponse xmlns="https://sts.amazonaws.com/doc/2011-06-15/"> <GetSessionTokenResult> <Credentials> <SessionToken> AQoEXAMPLEH4aoAH0gNCAPyJxz4BlCFFxWNE1OPTgk5TthT+FvwqnKwRcOIfrRh3c/L To6UDdyJwOOvEVPvLXCrrrUtdnniCEXAMPLE/IvU1dYUg2RVAJBanLiHb4IgRmpRV3z rkuWJOgQs8IZZaIv2BXIa2R4OlgkBN9bkUDNCJiBeb/AXlzBBko7b15fjrBs2+cTQtp Z3CYWFXG8C5zqx37wnOE49mRl/+OtkIKGO7fAE </SessionToken> <SecretAccessKey> wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY </SecretAccessKey> <Expiration>2011-07-11T19:55:29.611Z</Expiration> <AccessKeyId>AKIAIOSFODNN7EXAMPLE</AccessKeyId> </Credentials> </GetSessionTokenResult> <ResponseMetadata> <RequestId>58c5dbae-abef-11e0-8cfe-09039844ac7d</RequestId> </ResponseMetadata> </GetSessionTokenResponse>

オプションで、GetSessionToken リクエストに、AWS の多要素認証 (MFA) で確認する SerialNumber および TokenCode 値を含めることができます。指定された値が有効であれば、AWS STS は、MFA 認証の状態を含む一時的なセキュリティ認証情報を提供します。この一時的セキュリティ認証情報を使用して、MFA で保護された API オペレーションまたは AWS ウェブサイトに、MFA 認証が有効である限りアクセスできます。

以下の例は、MFA 認証コードとデバイスのシリアルナンバーを含む GetSessionToken リクエストを示しています。

https://sts.amazonaws.com/ ?Version=2011-06-15 &Action=GetSessionToken &DurationSeconds=7200 &SerialNumber=YourMFADeviceSerialNumber &TokenCode=123456 &AUTHPARAMS
注記

AWS STS の呼び出しは、グローバルエンドポイントまたは AWS アカウント をアクティブ化しているリージョンのエンドポイントに対して行えます。詳細については、リージョンとエンドポイントの「AWS STS」セクションを参照してください。

この例の AUTHPARAMS パラメータは 署名のプレースホルダーです。署名は AWS HTTP API リクエストに含める必要がある認証情報です。AWS SDK を使用して API リクエストを作成することをお勧めします。その利点の 1 つは、SDK がリクエストの署名を処理することです。API リクエストを手動で作成し、署名する必要がある場合は、[Amazon Web Services 全般のリファレンス] の「署名バージョン 4 を使用して AWS リクエストに署名する」を参照してリクエストに署名する方法を確認してください。