S3 Access Grants 和公司目錄身分 - Amazon Simple Storage Service

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

S3 Access Grants 和公司目錄身分

您可以使用 Amazon S3 Access Grants 將存取權授予相同 AWS 帳戶 和其他 中的 AWS Identity and Access Management (IAM) 委託人 (使用者或角色)。不過,在許多情況下,存取資料的實體是公司目錄中的最終使用者。您可以使用 S3 Access Grants 直接將存取權授予公司使用者和群組,而不是將存取權授予 IAM 主體。透過 S3 Access Grants,您不再需要將公司身分映射至中繼 IAM 主體,即可透過公司應用程式存取 S3 資料。

這項新功能支援使用最終使用者身分存取資料,透過將 S3 Access Grants 執行個體與 AWS IAM Identity Center 執行個體建立關聯來提供。IAM Identity Center 支援標準型身分提供者,是 AWS 中支援最終使用者身分的任何服務或功能的中樞,包括 S3 Access Grants。IAM Identity Center 透過其信任的身分傳播功能為企業身分提供身分驗證支援。如需詳細資訊,請參閱跨應用程式的信任身分傳播

若要開始使用 S3 Access Grants 中的人力身分支援,您必須先在 IAM Identity Center 中設定企業身分提供者與 IAM Identity Center 之間的身分佈建。IAM Identity Center 支援企業身分提供者,例如 Okta、Microsoft Entra ID (舊稱為 Azure Active Directory),或任何其他支援跨網域身分識別管理系統 (SCIM) 通訊協定的外部身分提供者 (IdP)。當您將 IAM Identity Center 連線到 IdP 並啟用自動佈建時,IdP 中的使用者和群組會同步到 IAM Identity Center 的身分存放區。在此步驟之後,IAM Identity Center 會有自己的使用者和群組檢視,因此您可以使用其他 AWS 服務 和 功能來參考它們,例如 S3 Access Grants。如需設定 IAM Identity Center 自動佈建的詳細資訊,請參閱《AWS IAM Identity Center 使用者指南》中的自動佈建

IAM Identity Center 已與 整合, AWS Organizations 因此您可以集中管理多個 的許可, AWS 帳戶 而無需手動設定每個帳戶。在一般組織中,您的身分管理員會為整個組織設定一個 IAM Identity Center 執行個體,作為單一身分同步點。此 IAM Identity Center 執行個體通常在您的組織中的專用 AWS 帳戶 中執行。在此常見組態中,您可以從組織中的任何 參考 S3 Access Grants AWS 帳戶 中的使用者和群組身分。

不過,如果您的 AWS Organizations 管理員尚未設定中央 IAM Identity Center 執行個體,您可以在與 S3 Access Grants 執行個體相同的帳戶中建立本機執行個體。這類組態較常用於概念驗證或本機開發使用案例。在所有情況下,IAM Identity Center 執行個體必須與要與其建立關聯的 AWS 區域 S3 Access Grants 執行個體位於相同的 中。

下圖中的 IAM Identity Center 組態具有外部 IdP,該 IdP 設定為使用 SCIM 將 IdP 的身分存放區同步到 IAM Identity Center 的身分存放區。

IAM Identity Center 會透過自動佈建與外部身分存放區整合。

若要使用公司目錄身分搭配 S3 Access Grants,請執行下列操作:

目錄身分如何存取 S3 資料

假設您的公司目錄使用者需要透過公司應用程式 (例如文件檢視器應用程式) 存取 S3 資料,且該應用程式與您的外部 IdP (例如 Okta) 整合以驗證使用者身分。這些應用程式中的使用者身分驗證通常是透過使用者 Web 瀏覽器中的重新導向來完成。由於目錄中的使用者不是 IAM 主體,因此您的應用程式需有可用來呼叫 S3 Access Grants GetDataAccess API 操作的 IAM 憑證,才能代表使用者取得 S3 資料的存取憑證。與自行取得憑證的 IAM 使用者和角色不同的是,您的應用程式需要一種方式來代表未映射至 IAM 角色的目錄使用者,如此使用者才能透過 S3 Access Grants 取得資料存取權。

從已驗證目錄使用者轉換成可代表目錄使用者向 S3 Access Grants 提出請求的 IAM 呼叫者,這個過程是由應用程式透過 IAM Identity Center 的可信權杖發行者功能來完成。在驗證目錄使用者之後,應用程式會擁有來自 IdP 的身分權杖 (例如 Okta),該權杖會根據 Okta 代表目錄使用者。IAM Identity Center 中的可信權杖發行者組態可讓應用程式用此 Okta 權杖 (Okta 租用戶設定為「信任的發行者」) 交換來自 IAM Identity Center 的不同身分權杖,藉此安全地代表 AWS 服務內的目錄使用者。然後,資料應用程式將擔任 IAM 角色,從 IAM Identity Center 提供目錄使用者的權杖作為額外內容。應用程式可以使用產生的 IAM 工作階段來呼叫 S3 Access Grants。權杖代表應用程式的身分 (IAM 主體本身) 以及目錄使用者的身分。

此轉換過程的主要步驟是權杖交換。應用程式透過在 IAM Identity Center 中呼叫 CreateTokenWithIAM API 操作來執行此權杖交換。當然,這也是 AWS API 呼叫,需要 IAM 主體來簽署。提出此請求的 IAM 主體通常是與應用程式相關聯的 IAM 角色。例如,如果應用程式在 Amazon EC2 上執行,則 CreateTokenWithIAM 請求通常是由與應用程式執行所在的 EC2 執行個體相關聯的 IAM 角色執行。成功CreateTokenWithIAM呼叫的結果是新的身分字符,將在其中識別 AWS 服務。

下一步是要在應用程式代表目錄使用者呼叫 GetDataAccess 之前,讓應用程式取得包含目錄使用者身分的 IAM 工作階段。應用程式會使用 AWS Security Token Service (AWS STS) 請求執行此操作,該AssumeRole請求也包含目錄使用者的 IAM Identity Center 字符作為額外的身分內容。這個額外內容可讓 IAM Identity Center 將目錄使用者的身分傳播至下一個步驟。應用程式擔任的 IAM 角色需有 IAM 許可才能呼叫 GetDataAccess 操作。

擔任具有目錄使用者的 IAM Identity Center 權杖作為額外內容的身分持有人 IAM 角色後,應用程式現在一切就緒,可代表已驗證目錄使用者向 GetDataAccess 提出經簽署的請求。

權杖傳播的步驟如下:

建立 IAM Identity Center 應用程式

首先,在 IAM Identity Center 建立新的應用程式。此應用程式將使用範本,以允許 IAM Identity Center 識別您可以使用的應用程式設定類型。建立應用程式的命令會要求您提供 IAM Identity Center 執行個體 Amazon Resource Name (ARN)、應用程式名稱和應用程式提供者 ARN。應用程式提供者是應用程式將用來呼叫 IAM Identity Center 的 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 Identity Center 應用程式,下一步就是設定可信權杖發行者,它將用來交換 IdP 的 IdToken 值與 IAM Identity Center 權杖。您需要在此步驟中提供下列項目:

  • 身分提供者發行者 URL

  • 可信權杖發行者名稱

  • 宣告屬性路徑

  • 身分存放區屬性路徑

  • JSON Web 金鑰組 (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 Identity Center 應用程式與可信權杖發行者連線

可信權杖發行者會需要進行幾項額外的組態設定,以便正常運作。設定可信權杖發行者將信任的對象。對象是 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 JSON Web 權杖 (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 Identity Center 應用程式。此政策可讓應用程式 IAM 角色向 API 操作 sso-oauth:CreateTokenWithIAM 發出請求,並從 IAM Identity Center 接收 IdToken 值。

建立名為 authentication-method.json 且包含下列內容的檔案。使用您的帳戶 ID 取代 123456789012

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

若要將政策連接至 IAM Identity Center 應用程式,請執行下列命令:

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

這樣就完成了透過 Web 應用程式搭配目錄使用者使用 S3 Access Grants 的組態設定。您可以直接在應用程式中測試此設定,也可以從 IAM Identity Center 應用程式政策中允許的 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 資源存取權的最終憑證。