设置适用于 S3 的存储浏览器
要将最终用户与 Amazon S3 位置 相连,您必须先设置身份验证和授权方法。使用存储浏览器设置身份验证和授权方法有三种方法:
方法 1:管理客户和第三方合作伙伴的数据访问权限
使用此方法,您可以使用 Amazon Amplify Auth
您可以将 Amazon Amplify Auth 与配置为使用 Amplify Storage 的 S3 存储桶结合使用,来向最终用户和第三方合作伙伴提供 IAM 凭证。Amazon AmplifyAuth 建立在 Amazon Cognito 的基础上,Amazon Cognito 是一项完全托管式客户身份和访问管理服务,其中,您可以通过内置的用户目录或企业目录或使用者身份提供者对用户进行身份验证和授权。Amplify 授权模型定义了当前经过身份验证的用户可以访问哪些前缀。有关如何为 Amazon Amplify 设置授权的更多信息,请参阅 Set up storage
要使用 Amplify 身份验证和存储方法初始化组件,请将以下代码段添加到您的 Web 应用程序中:
import { createAmplifyAuthAdapter, createStorageBrowser, } from '@aws-amplify/ui-react-storage/browser'; import "@aws-amplify/ui-react-storage/styles.css"; import config from './amplify_outputs.json'; Amplify.configure(config); export const { StorageBrowser } = createStorageBrowser({ config: createAmplifyAuthAdapter(), });
方法 2:管理您 Amazon 账户的 IAM 主体的数据访问权限
如果您想直接管理 IAM 主体或您 Amazon Web Services 账户的访问权限,则可以创建一个有权调用 GetDataAccess S3 API 操作的 IAM 角色。要进行此设置,您必须创建一个 S3 访问权限管控实例,来将 S3 通用存储桶和前缀的权限映射到指定的 IAM 身份。然后,存储浏览器组件(必须在获取 IAM 凭证后在客户端上调用此组件)将调用 ListCallerAccessGrants S3 API 操作,来获取对身份请求者的可用授权,并在组件中填充位置。在您获得 s3:GetDataAccess
权限后,存储浏览器组件将使用这些凭证来请求对 S3 的数据访问权限。
import { createManagedAuthAdapter, createStorageBrowser, } from '@aws-amplify/ui-react-storage/browser'; import "@aws-amplify/ui-react-storage/styles.css"; export const { StorageBrowser } = createStorageBrowser({ config: createManagedAuthAdapter({ credentialsProvider: async (options?: { forceRefresh?: boolean }) => { // return your credentials object return { credentials: { accessKeyId: 'my-access-key-id', secretAccessKey: 'my-secret-access-key', sessionToken: 'my-session-token', expiration: new Date() }, } }, // AWS `region` and `accountId` region: '', accountId: '', // call `onAuthStateChange` when end user auth state changes // to clear sensitive data from the `StorageBrowser` state registerAuthListener: (onAuthStateChange) => {}, }) });
方法 3:大规模管理数据访问权限
如果您想将 S3 访问权限管控实例与 IAM Identity Center 关联,以获得更具可扩展性的解决方案(例如向整个公司提供数据访问权限),则可以代表当前经过身份验证的用户从 Amazon S3 请求数据。例如,您可以向公司目录中的用户组授予访问 S3 中数据的权限。这种方法可让您集中管理用户和组的 S3 访问权限管控权限,包括托管在外部提供商(例如 Microsoft Entra、Okta 等)上的用户和组的权限。
使用此方法时,integration with the IAM Identity Center 可让您使用现有的用户目录。IAM Identity Center 可信身份传播的另一个好处是:Amazon S3 的每个 Amazon CloudTrail 数据事件均包含对访问 S3 数据的最终用户身份的直接引用。
如果您的应用程序支持 OAuth 2.0,并且用户需要从这些应用程序访问 Amazon 服务,建议您使用可信身份传播。通过可信身份传播,用户可以登录应用程序,而该应用程序可以在任何旨在访问 Amazon 服务中数据的请求中传递用户的身份。此应用程序代表任何经过身份验证的用户与 IAM Identity Center 进行交互。有关更多信息,请参阅 Using trusted identity propagation with customer managed applications。
设置
要在 Amazon Web Services Management Console中使用 S3 访问权限管控和 IAM Identity Center trusted identity propagation 设置存储浏览器身份验证,应用程序必须代表当前经过身份验证的用户从 Amazon S3 请求数据。通过这种方法,您可以为公司目录中的用户或用户组提供对 S3 存储桶、前缀或对象的直接访问权限。这意味着您的应用程序无需将任何用户映射到 IAM 主体。
以下工作流程概述了使用 IAM Identity Center 和 S3 访问权限管控来设置适用于 S3 的存储浏览器的步骤:
步骤 | 描述 |
---|---|
1 | 为您的 Amazon Organizations 启用 IAM Identity Center |
2 | 配置 Amazon Identity and Access Management Identity Center 联合身份验证 |
3 | 在 Amazon Identity and Access Management Identity Center 控制台中添加可信令牌发布者
可信令牌发布者表示您在 IAM Identity Center 中的身份提供者(IdP),同时使其能够识别您的应用程序经过身份验证的用户的身份令牌。 |
4 | 为 bootstrap 应用程序和 identity bearer 创建 IAM 角色 |
5 | 在 IAM Identity Center 中创建和配置应用程序
此应用程序代表经过身份验证的用户与 IAM Identity Center 进行交互。 |
6 | 将 S3 访问权限管控添加为身份传播的可信应用程序
此步骤将您的应用程序连接到 S3 访问权限管控,以便它可以代表经过身份验证的用户向 S3 访问权限管控提出请求。 |
7 | 创建对用户或组的授权
此步骤将 Amazon Identity and Access Management Identity Center 中的用户与跨域身份管理系统(SCIM)同步。SCIM 使您的 IAM Identity Center 身份与身份提供者(IdP)的身份保持同步。 |
8 | 创建适用于 S3 的存储浏览器组件 |
为您的 Amazon Organizations 启用 IAM Identity Center
要为您的 Amazon Organizations 启用 IAM Identity Center,请执行以下步骤:
-
使用以下方法之一登录 Amazon Web Services Management Console:
-
Amazon 新用户(根用户):通过选择根用户并输入您的 Amazon Web Services 账户电子邮件地址,以账户所有者身份登录。在下一页,输入您的密码。
-
已经在使用 Amazon(IAM 凭证):使用具有管理权限的 IAM 凭证登录。
-
-
在启用 IAM Identity Center下,选择启用。
注意
IAM Identity Center 要求设置 Amazon Organizations。如果您未设置组织,则可以选择让 Amazon 自动为您创建一个组织。选择创建 Amazon 组织完成此过程。
-
然后选择使用 Amazon Organizations 启用。
-
选择继续。
-
(可选)添加要与此组织实例关联的任何标签。
-
(可选)配置委托管理。
注意
如果您正在使用多账户环境,我们建议您配置委托管理。通过委托管理,您可以限制 Amazon Organizations 中需要访问管理帐户的人数。有关更多信息,请参阅 Delegated administration。
-
选择保存。
Amazon Organizations 会自动向与管理帐户关联的地址发送验证电子邮件。在您接收到验证电子邮件之前可能会有一段延迟。请确保在验证电子邮件到期之前 24 小时内验证电子邮件地址。
配置 Amazon Identity and Access Management Identity Center 联合身份验证
要将适用于 S3 的存储浏览器用于公司目录用户,您必须将 IAM Identity Center 配置为使用外部身份提供者(IdP)。您可以使用您选择的首选身份提供者。但请注意,每个身份提供者使用不同的配置设置。有关使用不同外部身份提供者的教程,请参阅 IAM Identity Center source tutorials。
注意
请务必记录您配置的身份提供者的发布者 URL 和受众属性,因为您需要在后续步骤中引用它。如果您没有配置 IdP 所需的访问权限,则可能需要联系外部 IdP 的管理员来获取访问权限。
在 Amazon Identity and Access Management Identity Center 控制台中添加可信令牌发布者
可信令牌发布者在 Amazon Identity and Access Management Identity Center 中表示外部身份提供者,并识别应用程序经过身份验证的用户的令牌。您的 Amazon Organizations 中 IAM Identity Center 实例的账户所有者必须执行这些步骤。这些步骤可以在 IAM Identity Center 控制台中完成,也可以通过编程方式完成。
要在 Amazon Identity and Access Management Identity Center 控制台中添加可信令牌发布者,请执行以下步骤:
-
选择设置。
-
选择身份验证选项卡。
-
导航至可信令牌发布者部分,并填写以下详细信息:
-
在发布者 URL 下,输入作为可信令牌发布者的外部 IdP 的 URL。您可能需要联系外部 IdP 的管理员以获取此信息。有关更多信息,请参阅 Using applications with a trusted token issuer。
-
在可信令牌发布者名称下,输入可信令牌发布者的名称。当为身份传播配置应用程序资源时,该名称将出现在您可以在步骤 8 中选择的可信令牌发布者列表中。
-
-
将映射属性更新为首选应用程序属性,其中每个身份提供者属性都映射到一个 IAM Identity Center 属性。例如,您可能希望 map the application attribute
email
到 IAM Identity Center 用户属性email
。要查看 IAM Identity Center 中支持的用户属性列表,请参阅 Attribute mappings for Amazon Managed Microsoft AD directory 中的表。 -
(可选)如果要添加资源标签,请输入键和值对。要添加多个资源标签,请选择添加新标签以生成新条目并输入键和值对。
-
选择创建可信令牌发布者。
-
创建完可信令牌发布者后,请联系应用程序管理员,告知他们可信令牌发布者的名称,以便他们可以确认可信令牌发布者在适用的控制台中可见。
-
确保应用程序管理员在适用的控制台中选择此可信令牌发布者,才能允许用户从为可信身份传播配置的应用程序中访问该应用程序。
为 bootstrap
应用程序和 identity bearer
创建 IAM 角色
为确保 bootstrap
应用程序和 identity bearer
用户可以正常相互协作,请务必 create two IAM roles。bootstrap
应用程序需要一个 IAM 角色,而另一个 IAM 角色必须用于身份持有者,或访问通过 S3 访问权限管控请求访问权限的 Web 应用程序的最终用户。bootstrap
应用程序接收身份提供者颁发的令牌并调用 CreateTokenWithIAM
API,同时将此令牌与 Identity Center 发布的令牌交换。
创建具有如下权限的 IAM 角色,例如 bootstrap-role
。以下示例 IAM 策略向 bootstrap-role
授予执行令牌交换的权限:
{ "Version": "2012-10-17", "Statement": [{ "Action": [ "sso-oauth:CreateTokenWithIAM", ], "Resource": "arn:${
Partition
}:sso::${AccountId
}:application/${InstanceId
}/${ApplicationId
}", "Effect": "Allow" }, { "Action": [ "sts:AssumeRole", "sts:SetContext" ], "Resource": "arn:aws:iam::${AccountId
}:role/identity-bearer-role
", "Effect": "Allow" }] }
然后,创建第二个 IAM 角色(例如 identity-bearer-role
),身份凭证代理程序使用该角色生成 IAM 凭证。适用于 S3 的存储浏览器组件使用从身份凭证代理程序返回到 Web 应用程序的 IAM 凭证来支持访问 S3 数据:
{ "Action": [ "s3:GetDataAccess", "s3:ListCallerAccessGrants", ], "Resource": "arn:${
Partition
}:s3:${Region
}:${Account
}:access-grants/default", "Effect": "Allow" }
此 IAM 角色 (identity-bearer-role
) 必须使用带有以下语句的信任策略:
{ "Effect": "Allow", "Principal": { "AWS": "arn:${
Partition
}:iam::${Account
}:role/${RoleNameWithPath
}" }, "Action": [ "sts:AssumeRole", "sts:SetContext" ] }
在 IAM Identity Center 中创建和配置应用程序
注意
开始之前,请确保您已在上一步中创建所需的 IAM 角色。您需要在此步骤中指定其中一个 IAM 角色。
要在 Amazon IAM Identity Center 中创建和配置客户托管式应用程序,请执行以下步骤:
-
选择应用程序。
-
选择客户托管选项卡。
-
选择添加应用程序。
-
在选择应用程序类型页面,选择设置首选项下的我有想设置的应用程序。
-
在应用程序类型下,选择 OAuth 2.0。
-
选择下一步。将显示指定应用程序页面。
-
在应用程序名称和描述部分下,输入应用程序的显示名称,如
storage-browser-oauth
。 -
输入 Description(描述)。应用程序描述显示在 IAM Identity Center 控制台和 API 请求中,但不显示在 Amazon 访问门户中。
-
在用户和组分配方法下,选择不需要分配。此选项可让所有经授权的 IAM Identity Center 用户和组访问此应用程序。
-
在 Amazon 访问门户下,输入用户可以访问应用程序的应用程序 URL。
-
(可选)如果要添加资源标签,请输入键和值对。要添加多个资源标签,请选择添加新标签以生成新条目并输入键和值对。
-
选择下一步。将显示指定身份验证页面。
-
在使用可信令牌发布者进行身份验证下,使用复选框选择您之前创建的可信令牌发布者。
-
在配置选定的可信令牌发布者下,输入 Aud 声明。Aud 声明标识 JSON Web 令牌(JWT)的受众,它是可信令牌发布者用来标识此应用程序的名称。
注意
您可能需要联系外部 IdP 的管理员以获取此信息。
-
选择下一步。将显示指定身份验证凭证页面。
-
在配置方法下,选择输入一个或多个 IAM 角色。
-
在输入 IAM 角色下,为身份持有者令牌添加 IAM 角色或 Amazon 资源名称(ARN)。您必须输入您在上一步中为身份凭证代理程序应用程序创建的 IAM 角色(例如
bootstrap-role
)。 -
选择下一步。
-
在查看和配置页面上,检查应用程序配置的详细信息。如果您需要修改任何设置,请对于要编辑和进行更改的部分选择编辑。
-
选择提交。将显示您刚添加的应用程序的详细信息页面。
设置应用程序后,您的用户可以基于 permission sets that you’ve created 和 user access that you’ve assigned,从其 Amazon 访问门户中访问您的应用程序。
将 S3 访问权限管控添加为身份传播的可信应用程序
设置客户托管式应用程序后,您必须为身份传播指定 S3 访问权限管控。S3 访问权限管控提供凭证供用户访问 Amazon S3 数据。当您登录到客户托管式应用程序时,S3 访问权限管控会将您的用户身份传递给可信应用程序。
先决条件:在执行这些步骤之前,请确保您已设置 S3 访问权限管控(例如创建 S3 访问权限管控实例和注册位置)。有关更多信息,请参阅开始使用 S3 访问权限管控。
要向客户托管式应用程序中添加用于身份传播的 S3 访问权限管控,请执行以下步骤:
-
选择应用程序。
-
选择客户托管选项卡。
-
在客户托管的应用程序列表中,选择要对其发起访问请求的 OAuth 2.0 应用程序。这是用户将登录的应用程序。
-
在详细信息页面的用于身份传播的可信应用程序下,选择指定可信应用程序。
-
在设置类型下,选择单个应用程序并指定访问权限,然后选择下一步。
-
在选择服务页面上,选择 S3 访问权限管控。S3 访问权限管控具有的应用程序可供您定义您自己的 Web 应用程序以实现可信身份传播。
-
选择下一步。您将在下一个步骤中选择应用程序。
-
在选择应用程序页面,选择单个应用程序,对于每个可以接收访问请求的应用程序选中此复选框,然后选择下一步。
-
在配置访问权限页面的配置方法下,选择以下任一项:
-
选择每个应用程序的访问权限 - 选择此选项可为每个应用程序配置不同的访问权限级别。选择要为其配置访问权限级别的应用程序,然后选择编辑访问权限。在要应用的访问权限级别中,根据需要更改访问权限级别,然后选择保存更改。
-
对所有应用程序应用相同的访问权限级别:如果不需要针对每个应用程序配置访问权限级别,请选择此选项。
-
-
选择下一步。
-
在审查配置页面中,审查您所做的选择。
注意
您希望确保已向您的用户授予
s3:access_grants:read_write
权限。此权限使您的用户能够检索凭证以访问 Amazon S3。请务必使用您之前创建的 IAM 策略或 S3 访问权限管控,来限制对写入操作的访问权限。 -
要进行更改,请为要更改的配置部分选择编辑。然后,进行所需的更改并选择保存更改。
-
选择可信应用程序以添加用于身份传播的可信应用程序。
创建对用户或组的授权
在此步骤中,您将使用 IAM Identity Center 来预置您的用户。您可以使用 SCIM 来 automated or manual provisioning of users and groups。SCIM 使您的 IAM Identity Center 身份与身份提供者(IdP)的身份保持同步。这包括 IdP 和 IAM Identity Center 之间的任何用户预置、更新和取消预置。
注意
此步骤是必需的,因为在将 S3 访问权限管控与 IAM Identity Center 结合使用时,不使用本地 IAM Identity Center 用户。相反,用户必须从身份提供者与 IAM Identity Center 同步。
要将来自身份提供者的用户与 IAM Identity Center 同步,请执行以下步骤:
有关如何针对您的特定应用场景使用 IAM Identity Center 设置身份提供者的示例,请参阅 IAM Identity Center Identity source tutorials。
创建适用于 S3 的存储浏览器组件
设置 IAM Identity Center 实例并在 S3 访问权限管控中创建授权后,打开您的 React 应用程序。在 React 应用程序中,使用 createManagedAuthAdapter
来设置授权规则。您必须提供凭证提供商,才能返回您从 IAM Identity Center 获得的凭证。然后,您可以调用 createStorageBrowser
来初始化适用于 S3 的存储浏览器组件:
import { createManagedAuthAdapter, createStorageBrowser, } from '@aws-amplify/ui-react-storage/browser'; import '@aws-amplify/ui-react-storage/styles.css'; export const { StorageBrowser } = createStorageBrowser({ config: createManagedAuthAdapter({ credentialsProvider: async (options?: { forceRefresh?: boolean }) => { // return your credentials object return { credentials: { accessKeyId: '
my-access-key-id
', secretAccessKey: 'my-secret-access-key
', sessionToken: 'my-session-token
', expiration: new Date(), }, } }, // AWS `region` and `accountId` of the S3 Access Grants Instance. region: '', accountId: '', // call `onAuthStateChange` when end user auth state changes // to clear sensitive data from the `StorageBrowser` state registerAuthListener: (onAuthStateChange) => {}, }) });
接着,创建一种机制,将 Web 应用程序中的 JSON Web 令牌(JWT)与 IAM Identity Center 中的 IAM 凭证交换。有关如何交换 JWT 的更多信息,请参阅以下资源:
-
Amazon 存储博客 中的 How to develop a user-facing data application with IAM Identity Center and S3 Access Grants
博文 -
Amazon 存储博客 中的 Scaling data access with S3 Access Grants
博文 -
Amazon 讲习会参与平台 上的 S3 Access Grants workshop
-
GitHub 上的 S3 Access Grants workshop
然后,设置 API 端点来处理获取凭证的请求。要验证 JSON Web 令牌(JWT)交换,请执行以下步骤:
-
从授权标头中检索传入请求的 JSON Web 令牌。
-
使用指定的 JSON Web 密钥集(JWKS)URL 中的公有密钥验证令牌。
-
验证令牌的到期时间、发布者、主体和受众声明。
要将身份提供者的 JSON Web 令牌与 Amazon IAM 凭证交换,请执行以下步骤:
提示
确保避免记录任何敏感信息。对于缺少授权、令牌过期和其它异常,我们建议您使用错误处理控件。有关更多信息,请参阅 Amazon 计算博客 中的 Implementing Amazon Lambda error handling patterns
-
验证请求中是否提供了所需的权限和范围参数。
-
使用 CreateTokenWithIAM API 将 JSON Web 令牌交换为 IAM Identity Center 令牌。
注意
使用 IdP JSON Web 令牌后,无法再次使用该令牌。必须使用新令牌与 IAM Identity Center 进行交换。
-
使用 AssumeRole API 操作通过 IAM Identity Center 令牌代入临时角色。请务必使用身份持有者角色,也称为携带身份上下文的角色(例如
identity-bearer-role
),来请求凭证。 -
将 IAM 凭证返回给 Web 应用程序。
注意
确保您已设置了正确的日志记录机制。响应以带有相应 HTTP 状态代码的标准化 JSON 格式返回。