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

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

S3 Access Grants 和公司目錄身分

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

這項新功能 — 支援使用最終使用者身分存取資料 — 透過將 S3 Access Grants 執行個體與執行個體建立關聯而提供。 AWS IAM Identity Center IAM 身分識別中心支援標準型身分識別提供者,並且是支援使用者身分的任何服務或功能 (包括 S3 存取授權) 的中樞。 AWS 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 存取權授與) 來參考使用者和群組。如需設定 IAM Identity Center 自動佈建的詳細資訊,請參閱《AWS IAM Identity Center 使用者指南》中的自動佈建

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

不過,如果您的 AWS Organizations 管理員尚未設定中央 IAM 身分中心執行個體,您可以在與 S3 存取授權執行個體相同的帳戶中建立本機執行個體。這種配置對於本地開發用例 proof-of-concept 或本地開發用例更為常見。在所有情況下,IAM 身分中心執行個體必須與要關聯 AWS 區域 的 S3 存取授權執行個體位於相同的情況下。

下圖中的 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 身分中心憑證,做為其他身分內容。這個額外內容可讓 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 資源存取權的最終憑證。