S3 Access Grants 和公司目录身份
您可以使用 Amazon S3 Access Grants 向 Amazon Identity and Access Management(IAM)主体(用户或角色)授予访问权限,无论是在同一个还是其他 Amazon Web Services 账户中。但在许多情况下,访问数据的实体是公司目录中的最终用户。可以使用 S3 Access Grants 直接向公司用户和组授予访问权限,而不是向 IAM 主体授予访问权限。借助 S3 Access Grants,您不再需要将公司身份映射到中间 IAM 主体,即可通过公司应用程序访问您的 S3 数据。
这项新功能(支持使用最终用户身份访问数据)是通过将 S3 Access Grants 实例与 Amazon IAM Identity Center 实例关联来提供的。IAM Identity Center 支持基于标准的身份提供商,并且是 Amazon 中支持最终用户身份的任何服务或功能(包括 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 将拥有自己的用户和组视图,这样您便能使用其他 Amazon Web Services 服务 和功能(例如 S3 Access Grants)来引用它们。有关配置 IAM Identity Center 自动预置的更多信息,请参阅《Amazon IAM Identity Center 用户指南》中的自动预置。
IAM Identity Center 与 Amazon Organizations 集成,这使您能够集中管理多个 Amazon Web Services 账户的权限,而无需手动配置每个账户。在典型企业中,您的身份管理员会为整个企业配置一个 IAM Identity Center 实例,以作为单个身份同步点。此 IAM Identity Center 实例通常在企业的专用 Amazon Web Services 账户中运行。在此通用配置中,您可以从企业内的任何 Amazon Web Services 账户中引用 S3 Access Grants 中的用户和组身份。
但是,如果 Amazon Organizations 管理员尚未配置中央 IAM Identity Center 实例,您可以在与 S3 Access Grants 实例相同的账户中创建一个本地实例。此类配置在概念验证或本地开发使用场景中更常见。在所有情况下,IAM Identity Center 实例都必须在与其关联到的 S3 Access Grants 实例相同的 Amazon Web Services 区域内。
在下面的 IAM Identity Center 配置与外部 IdP 图中,已使用 SCIM 配置 IdP,以将身份存储从 IdP 同步到 IAM Identity Center 中的身份存储。
要将您的公司目录身份与 S3 Access Grants 结合使用,请执行以下操作:
-
在 IAM Identity Center 中设置自动预置,将来自 IdP 的用户和组信息同步到 IAM Identity Center。
-
将您在 IAM Identity Center 中的外部身份源配置为可信令牌颁发机构。有关更多信息,请参阅《Amazon IAM Identity Center 用户指南》中的跨应用程序的可信身份传播。
-
将 S3 Access Grants 实例与 IAM Identity Center 实例关联。您可以在创建 S3 Access Grants 实例时执行此操作。如果您已创建 S3 Access Grants 实例,请参阅 关联或取消关联 IAM Identity Center 实例。
目录身份访问 S3 数据的方式
假设您的公司目录用户需要通过公司应用程序(例如文档查看器应用程序)访问您的 S3 数据,该应用程序与您的外部 IdP(例如 Okta)集成以对用户进行身份验证。这些应用程序中的用户身份验证通常将通过用户 Web 浏览器中的重定向来完成。由于目录中的用户不是 IAM 主体,因此您的应用程序需要 IAM 凭证,该凭证可用于代表用户调用 S3 Access Grants GetDataAccess
API 操作来获取 S3 数据的访问凭证。与自行获得凭证的 IAM 用户和角色不同,您的应用程序需要通过某种方式来表示未映射到 IAM 角色的目录用户,以便该用户能够通过 S3 Access Grants 获得数据访问权限。
从经过身份验证的目录用户到能够代表目录用户向 S3 Access Grants 发出请求的 IAM 调用方是一个过渡,它由应用程序通过 IAM Identity Center 的可信令牌颁发机构功能完成。在对目录用户进行身份验证后,应用程序将获得来自 IdP(例如 Okta)的身份令牌,该令牌代表目录用户,具体取决于 Okta。IAM Identity Center 中的可信令牌颁发机构配置使应用程序能够用此 Okta 令牌(Okta 租户配置为“可信颁发机构”)交换来自 IAM Identity Center 的其他身份令牌,从而安全地表示 Amazon Web Services 服务中的目录用户。之后,数据应用程序将代入一个 IAM 角色,提供来自 IAM Identity Center 的目录用户令牌作为附加上下文。应用程序可使用生成的 IAM 会话来调用 S3 Access Grants。令牌既表示应用程序的身份(IAM 主体本身),也表示目录用户的身份。
此过渡的主要步骤是令牌交换。应用程序通过在 IAM Identity Center 中调用 CreateTokenWithIAM
API 操作来执行此令牌交换。当然,这也是 Amazon API 调用,需要一个 IAM 主体进行签名。发出此请求的 IAM 主体通常是与应用程序关联的 IAM 角色。例如,如果应用程序在 Amazon EC2 上运行,则 CreateTokenWithIAM
请求通常由与运行该应用程序的 EC2 实例关联的 IAM 角色执行。成功调用 CreateTokenWithIAM
会生成一个新的身份令牌,该令牌将在 Amazon Web Services 服务中被识别。
在应用程序可以代表目录用户调用 GetDataAccess
之前,下一步是让应用程序获取包含目录用户身份的 IAM 会话。应用程序通过 Amazon Security Token Service(Amazon STS)AssumeRole
请求执行此操作,该请求还包括目录用户的 IAM Identity Center 令牌作为附加身份上下文。此附加上下文可让 IAM Identity Center 将目录用户的身份传播到下一步。应用程序代入的 IAM 角色需要 IAM 权限才能调用 GetDataAccess
操作。
在代入身份持有者 IAM 角色并将目录用户的 IAM Identity Center 令牌作为附加上下文后,应用程序现在便能代表经过身份验证的目录用户向 GetDataAccess
发出签名请求。
令牌传播基于以下步骤:
创建 IAM Identity Center 应用程序
首先,在 IAM Identity Center 中创建一个新应用程序。此应用程序将使用一个模板,以便 IAM Identity Center 能够识别您可使用的应用程序设置类型。用于创建应用程序的命令要求您提供 IAM Identity Center 实例 Amazon 资源名称(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
" \ --nameMyDataApplication
响应:
{ "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
" \ --nameMyEntraIDTrustedIssuer
\ --trusted-token-issuer-typeOIDC_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": { "Amazon": "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-typeIAM
\ --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 \ --assertionIdToken
响应将与以下内容类似:
{ "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 资源的最终凭证。