S3 Access Grants と社内ディレクトリのアイデンティティ - Amazon Simple Storage Service

S3 Access Grants と社内ディレクトリのアイデンティティ

Amazon S3 Access Grants を使用すると、同じ AWS アカウント 内と他のアカウントの両方で、AWS Identity and Access Management (IAM) プリンシパル (ユーザーまたはロール) へのアクセスを許可できます。ただし、多くの場合、データにアクセスするエンティティは社内ディレクトリのエンドユーザーです。IAM プリンシパルにアクセスを付与する代わりに、S3 Access Grants を使用して社内のユーザーやグループに直接アクセスを許可できます。S3 Access Grants を使用すると、社内アプリケーションを介して S3 データにアクセスするために、社内アイデンティティを中間となる IAM プリンシパルにマッピングする必要がなくなります。

エンドユーザーのアイデンティティの使用したデータへのアクセスをサポートするこの新機能は、S3 Access Grants インスタンスを AWS IAM Identity Center インスタンスに関連付けることで実現します。IAM アイデンティティセンターは、標準ベースのアイデンティティプロバイダーをサポートし、S3 Access Grants を含め、エンドユーザーアイデンティティをサポートするあらゆるサービスや機能の AWS のハブとなります。IAM アイデンティティセンターは、信頼されているアイデンティティプロパゲーション機能を介して社内アイデンティティの認証をサポートします。詳細については、「アプリケーション間での信頼されたアイデンティティのプロパゲーション」を参照してください。

S3 Access Grants でワークフォースアイデンティティサポートの使用を開始するには、前提条件として、まず IAM アイデンティティセンターで、社内アイデンティティプロバイダーと IAM アイデンティティセンターの間のアイデンティティのプロビジョニングを設定します。IAM アイデンティティセンターは、Okta、Microsoft Entra ID (旧称 Azure Active Directory) などの社内アイデンティティプロバイダー、またはクロスドメインアイデンティティ管理システム (SCIM) プロトコルをサポートするその他の外部アイデンティティプロバイダー (IdP) をサポートしています。IAM アイデンティティセンターを IdP に接続して自動プロビジョニングを有効にすると、IdP のユーザーとグループが IAM アイデンティティセンターのアイデンティティストアに同期されます。このステップが完了すると、IAM アイデンティティセンターにはユーザーとグループに関する独自のビューが表示されるため、S3 Access Grants などのその他の AWS のサービス と機能を使用してユーザーやグループを参照できます。IAM アイデンティティセンターの自動プロビジョニングの設定に関する詳細は、「AWS IAM Identity Center ユーザーガイド」の「自動プロビジョニング」を参照してください。

IAM アイデンティティセンターは、AWS Organizations と統合されているため、各アカウントを手動で設定する必要なく、複数の AWS アカウント にわたるアクセス許可を一元管理できます。通常、組織では、アイデンティティ管理者が組織全体で単一の IAM アイデンティティセンターのインスタンスをアイデンティティ同期の単一ポイントとして、設定します。この IAM アイデンティティセンターのインスタンスは通常、組織内の専用 AWS アカウント インスタンスで実行されます。このような一般的な設定では、組織内のどの AWS アカウント からでも S3 Access Grants のユーザーアイデンティティとグループアイデンティティを参照できます。

ただし、AWS Organizations 管理者が中央の IAM アイデンティティセンターのインスタンスをまだ設定していない場合は、S3 Access Grants インスタンスと同じアカウントにローカルの IAM アイデンティティセンターインスタンスを作成できます。このような設定は、概念実証やローカルの開発環境でのユースケースで一般的です。いずれの場合も、IAM アイデンティティセンターのインスタンスは、関連付けられる S3 Access Grants インスタンスと同じ AWS リージョン に配置する必要があります。

次の図の外部 IdP を使用する IAM アイデンティティセンター設定では、IdP は SCIM で設定され、IdP のアイデンティティストアを IAM アイデンティティセンターのアイデンティティストアと同期します。

自動プロビジョニングによる IAM アイデンティティセンターと外部アイデンティティストアの統合

社内ディレクトリのアイデンティティを S3 Access Grants で使用するには、次を実行します。

ディレクトリのアイデンティティが S3 データにアクセスする方法

S3 データに社内アプリケーションを介してアクセスする必要がある社内ディレクトリのユーザーがいるとします。例えば、このアプリケーションは、(Okta などの) ユーザー認証を行う外部 IdP と統合されたドキュメントビューアだとします。これらのアプリケーションでのユーザーの認証は、通常、ユーザーのウェブブラウザのリダイレクトによって行われます。ディレクトリ内のユーザーは IAM プリンシパルではないため、アプリケーションには、S3 Access Grants GetDataAccess API オペレーションを呼び出し、ユーザーに代わって S3 データへのアクセス認証情報を取得 できる IAM 認証情報が必要です。認証情報を自身で取得する IAM ユーザーやロールとは異なり、アプリケーションには IAM ロールにマップされていないディレクトリユーザーを示す方法が必要です。これにより、ユーザーは S3 Access Grants を通じてデータにアクセスできるようになります。

認証されたディレクトリユーザーから、ディレクトリユーザーに代わって S3 Access Grants へのリクエストを実行できる IAM 呼び出し元へのこの移行は、アプリケーションが IAM アイデンティティセンターの信頼できるトークン発行者機能を通じて行います。アプリケーションは、ディレクトリユーザーを認証すると、(Okta などの) IdP からのアイデンティティトークンを取得し、Okta に従ってディレクトリユーザーを示します。IAM アイデンティティセンターの信頼されたトークン発行者の設定により、アプリケーションはこの Okta トークン (Okta テナントが「信頼できる発行者」として設定されている) を、AWS のサービス 内でディレクトリユーザーを安全に示す IAM アイデンティティセンターの別のアイデンティティトークンと交換できます。その後、データアプリケーションは IAM ロールを引き受け、IAM アイデンティティセンターからのディレクトリユーザーのトークンを追加のコンテキストとして提供します。アプリケーションは、結果として得られる IAM セッションを使用して S3 Access Grants を呼び出すことができます。このトークンは、アプリケーションのアイデンティティ (IAM プリンシパル自体) とディレクトリユーザーのアイデンティティの両方を示します。

この移行の主なステップはトークンの交換です。アプリケーションは IAM アイデンティティセンターの CreateTokenWithIAM API オペレーションを呼び出して、このトークン交換を実行します。当然、これもまた AWS API 呼び出しであり、署名には IAM プリンシパルが必要です。このリクエストを行う IAM プリンシパルは、通常、アプリケーションに関連付けられた IAM ロールです。例えば、アプリケーションが Amazon EC2 で実行されている場合、CreateTokenWithIAM リクエストは通常、アプリケーションが実行されている EC2 インスタンスに関連付けられている IAM ロールによって実行されます。CreateTokenWithIAM 呼び出しが正常に完了すると、新しいアイデンティティトークンが生成され、AWS のサービス 内でそのトークンが認識されます。

アプリケーションがディレクトリユーザーに代わって GetDataAccess を呼び出す前の次のステップは、アプリケーションがディレクトリユーザーのアイデンティティを含む IAM セッションを取得することです。アプリケーションは、追加のアイデンティティコンテキストとしてディレクトリユーザーの IAM アイデンティティセンターのトークンも含めた AWS Security Token Service (AWS STS) AssumeRole リクエストを使用してこれを実行します。この追加コンテキストにより、IAM アイデンティティセンターはディレクトリユーザーのアイデンティティを次のステップにプロパゲートできるようになります。アプリケーションが引き受ける IAM ロールは、GetDataAccess オペレーションを呼び出すために IAM アクセス権限を必要とするロールです。

追加のコンテキストとしてディレクトリユーザーのための IAM アイデンティティセンターのトークンを使用して アイデンティティベアラー IAM ロールを引き受けたため、アプリケーションには、認証されたディレクトリユーザーに代わって GetDataAccess に署名付きリクエストを行うために必要なものがすべて揃っています。

トークンのプロパゲーションは次のステップに基づいています。

IAM アイデンティティセンターのアプリケーションを作成する

まず、IAM アイデンティティセンターに新しいアプリケーションを作成します。このアプリケーションは、使用できるアプリケーション設定タイプを IAM アイデンティティセンターが識別できるテンプレートを使用します。アプリケーションを作成するコマンドでは、IAM アイデンティティセンターインスタンスの Amazon リソースネーム (ARN)、アプリケーション名、アプリケーションプロバイダー ARN を指定する必要があります。アプリケーションプロバイダーは、アプリケーションが IAM アイデンティティセンターを呼び出すために使用する SAML または OAuth アプリケーションプロバイダーです。

次のコマンド例を使用する際は、user input placeholders をユーザー自身の情報に置き換えます。

aws sso-admin create-application \ --instance-arn "arn:aws:sso:::instance/ssoins-ssoins-1234567890abcdef" \ --application-provider-arn "arn:aws:sso::aws:applicationProvider/custom" \ --name MyDataApplication

レスポンス:

{ "ApplicationArn": "arn:aws:sso::123456789012:application/ssoins-ssoins-1234567890abcdef/apl-abcd1234a1b2c3d" }

信頼できるトークン発行者を作成します。

IAM アイデンティティセンターアプリケーションが完成したところで、次のステップは、IdP IdToken からの値を IAM アイデンティティセンターのトークンと交換するために使用される信頼できるトークン発行者を設定することです。このステップを完了するには、以下の項目が必要です。

  • アイデンティティプロバイダーの発行者の URL

  • 信頼されたトークン発行者名

  • クレーム属性パス

  • アイデンティティストア属性パス

  • JSON Web Key Set (JWKS) 取り出しオプション

クレーム属性パスは、アイデンティティストア属性へのマッピングに使用されるアイデンティティプロバイダー属性です。通常、クレーム属性パスはユーザーのメールアドレスであるとはいえ、その他の属性を使用してマッピングを実行することもできます。

oidc-configuration.json というファイルを次の内容で作成します。このポリシーを使用するには、user input placeholders をユーザー自身の情報に置き換えます。

{ "OidcJwtConfiguration": { "IssuerUrl": "https://login.microsoftonline.com/a1b2c3d4-abcd-1234-b7d5-b154440ac123/v2.0", "ClaimAttributePath": "preferred_username", "IdentityStoreAttributePath": "userName", "JwksRetrievalOption": "OPEN_ID_DISCOVERY" } }

信頼できるトークン発行者を作成するには、次のコマンドを実行します。このコマンドの例を実行するには、user input placeholders をユーザー自身の情報に置き換えます。

aws sso-admin create-trusted-token-issuer \ --instance-arn "arn:aws:sso:::instance/ssoins-1234567890abcdef" \ --name MyEntraIDTrustedIssuer \ --trusted-token-issuer-type OIDC_JWT \ --trusted-token-issuer-configuration file://./oidc-configuration.json

レスポンス

{ "TrustedTokenIssuerArn": "arn:aws:sso::123456789012:trustedTokenIssuer/ssoins-1234567890abcdef/tti-43b4a822-1234-1234-1234-a1b2c3d41234" }

IAM アイデンティティセンターアプリケーションを信頼できるトークン発行者に接続します。

信頼されたトークン発行者が機能するには、さらにいくつかの設定が必要です。信頼できるトークン発行者が信頼する対象者を設定します。対象者はキーによって識別される IdToken 内部の値で、アイデンティティプロバイダーの設定で確認できます。例:

1234973b-abcd-1234-abcd-345c5a9c1234

次のコンテンツを含む grant.json という名前のファイルを作成します。このファイルを使用するには、アイデンティティプロバイダーの設定と一致するように対象者を変更し、前のコマンドで返された信頼できるトークン発行者 ARN を指定します。

{ "JwtBearer": { "AuthorizedTokenIssuers": [ { "TrustedTokenIssuerArn": "arn:aws:sso::123456789012:trustedTokenIssuer/ssoins-1234567890abcdef/tti-43b4a822-1234-1234-1234-a1b2c3d41234", "AuthorizedAudiences": [ "1234973b-abcd-1234-abcd-345c5a9c1234" ] } ] } }

次のコマンド例を実行します。このコマンドを使用するには、user input placeholders をユーザー自身の情報に置き換えます。

aws sso-admin put-application-grant \ --application-arn "arn:aws:sso::123456789012:application/ssoins-ssoins-1234567890abcdef/apl-abcd1234a1b2c3d" \ --grant-type "urn:ietf:params:oauth:grant-type:jwt-bearer" \ --grant file://./grant.json \

このコマンドは、grant.json ファイル内の対象者を信頼する設定を使用して、信頼されたトークン発行者を設定し、このオーディエンスを、タイプ jwt-bearer のトークンを交換するための最初のステップで作成されたアプリケーションにリンクします。urn:ietf:params:oauth:grant-type:jwt-bearer の文字列は任意の文字列ではありません。これは、OAuth SON Web Token (JWT) アサーションプロファイルに登録されている名前空間です。この名前空間の詳細については、RFC 7523 を参照してください。

次のコマンドを使用して、信頼できるトークン発行者が アイデンティティプロバイダーからの IdToken 値を交換する際にどの範囲を含めるかを設定します。S3 Access Grants の場合、--scope パラメータの値は s3:access_grants:read_write です。

aws sso-admin put-application-access-scope \ --application-arn "arn:aws:sso::111122223333:application/ssoins-ssoins-111122223333abcdef/apl-abcd1234a1b2c3d" \ --scope "s3:access_grants:read_write"

最後のステップは、リソースポリシーを IAM アイデンティティセンターのアプリケーションにアタッチすることです。このポリシーにより、アプリケーションの IAM ロールが sso-oauth:CreateTokenWithIAM API オペレーションにリクエストを行い、IAM アイデンティティセンター から IdToken 値を受け取ることができるようになります。

次のコンテンツを含む authentication-method.json という名前のファイルを作成します。123456789012 をアカウント ID に置き換えます。

{ "Iam": { "ActorPolicy": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:role/webapp" }, "Action": "sso-oauth:CreateTokenWithIAM", "Resource": "*" } ] } } }

ポリシーを IAM アイデンティティセンターアプリケーションにアタッチするには、次のコマンドを実行します。

aws sso-admin put-application-authentication-method \ --application-arn "arn:aws:sso::123456789012:application/ssoins-ssoins-1234567890abcdef/apl-abcd1234a1b2c3d" \ --authentication-method-type IAM \ --authentication-method file://./authentication-method.json

これで、ウェブアプリケーションを通じてディレクトリユーザーに S3 Access Grants を使用するための設定が完了しました。この設定はアプリケーション内で直接テストすることも、IAM アイデンティティセンターアプリケーションポリシーで許可されている IAM ロールから次のコマンドを使用して CreateTokenWithIAM API オペレーションを呼び出しても行えます。

aws sso-oidc create-token-with-iam \ --client-id "arn:aws:sso::123456789012:application/ssoins-ssoins-1234567890abcdef/apl-abcd1234a1b2c3d" \ --grant-type urn:ietf:params:oauth:grant-type:jwt-bearer \ --assertion IdToken

結果は次のとおりになります。

{ "accessToken": "<suppressed long string to reduce space>", "tokenType": "Bearer", "expiresIn": 3600, "refreshToken": "<suppressed long string to reduce space>", "idToken": "<suppressed long string to reduce space>", "issuedTokenType": "urn:ietf:params:oauth:token-type:refresh_token", "scope": [ "sts:identity_context", "s3:access_grants:read_write", "openid", "aws" ] }

base64 でエンコードされた IdToken 値をデコードすると、JSON 形式のキーバリューペアが表示されます。キー sts:identity_context には、アプリケーションがディレクトリ ユーザーのアイデンティティ情報を含めるために sts:AssumeRole リクエストで送信する必要がある値が含まれています。デコードされた IdToken の例は次のとおりです。

{ "aws:identity_store_id": "d-996773e796", "sts:identity_context": "AQoJb3JpZ2luX2VjEOTtl;<SUPRESSED>", "sub": "83d43802-00b1-7054-db02-f1d683aacba5", "aws:instance_account": "123456789012", "iss": "https://identitycenter.amazonaws.com/ssoins-1234567890abcdef", "sts:audit_context": "AQoJb3JpZ2luX2VjEOT<SUPRESSED>==", "aws:identity_store_arn": "arn:aws:identitystore::232642235904:identitystore/d-996773e796", "aud": "abcd12344U0gi7n4Yyp0-WV1LWNlbnRyYWwtMQ", "aws:instance_arn": "arn:aws:sso:::instance/ssoins-6987d7fb04cf7a51", "aws:credential_id": "EXAMPLEHI5glPh40y9TpApJn8...", "act": { "sub": "arn:aws:sso::232642235904:trustedTokenIssuer/ssoins-6987d7fb04cf7a51/43b4a822-1020-7053-3631-cb2d3e28d10e" }, "auth_time": "2023-11-01T20:24:28Z", "exp": 1698873868, "iat": 1698870268 }

sts:identity_context から値を取得し、この情報を sts:AssumeRole 呼び出しで渡すことができます。CLI 出力例は次のとおりです。引き受けるロールは、s3:GetDataAccess 呼び出しアクセス許可のある一時的なロールです。

aws sts assume-role \ --role-arn "arn:aws:iam::123456789012:role/temp-role" \ --role-session-name "TempDirectoryUserRole" \ --provided-contexts ProviderArn="arn:aws:iam::aws:contextProvider/IdentityCenter",ContextAssertion="value from sts:identity_context"

これで、この呼び出しで受け取った認証情報を使用して s3:GetDataAccess API オペレーションを呼び出し、S3 リソースにアクセスできる最終的な認証情報を受け取ることができます。