本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
Amazon Cognito 身份池的安全最佳实践
Amazon Cognito 身份池为您的 AWS 应用程序提供临时证书。 AWS 账户 通常包含应用程序用户所需的资源和私有后端资源。构成 AWS 证书的 IAM 角色和策略可以授予对其中任何资源的访问权限。
身份池配置的主要最佳实践是确保您的应用程序可以在没有过多或意外权限的情况下完成工作。为防止安全配置错误,请在要发布到生产环境的每个应用程序启动之前查看这些建议。
IAM 配置最佳实践
当访客或经过身份验证的用户在您的应用程序中启动需要身份池证书的会话时,您的应用程序会检索 IAM 角色的临时 AWS 证书。这些凭据可能是默认角色、由身份池配置中的规则选择的角色或应用程序选择的自定义角色的证书。分配给每个角色的权限后,您的用户就可以访问您的 AWS 资源。
有关常规 IAM 最佳实践的更多信息,请参阅 AWS Identity and Access Management 用户指南中的 IAM 最佳实践。
在 IAM 角色中使用信任策略条件
IAM 要求身份池的角色至少有一个信任策略条件。例如,此条件可以将角色的作用域设置为仅限经过身份验证的用户。 AWS STS 还要求跨账户基本身份验证请求具有两个特定条件:cognito-identity.amazonaws.com:aud
和。cognito-identity.amazonaws.com:amr
作为最佳实践,请在所有信任身份池服务主体的IAM角色中应用这两个条件cognito-identity.amazonaws.com
。
-
cognito-identity.amazonaws.com:aud
:身份池令牌中的 a ud 声明必须与可信身份池 ID 相匹配。 -
cognito-identity.amazonaws.com:amr
:身份池令牌中的 amr 声明必须经过身份验证或未经身份验证。在这种情况下,您只能将角色的访问权限保留给未经身份验证的访客,或者仅向经过身份验证的用户保留访问权限。例如,您可以进一步细化此条件的值,将角色限制为来自特定提供商的用户graph.facebook.com
。
以下示例角色信任策略在以下条件下授予对角色的访问权限:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Federated": "cognito-identity.amazonaws.com" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "cognito-identity.amazonaws.com:aud": "us-east-1:a1b2c3d4-5678-90ab-cdef-EXAMPLE11111" }, "ForAnyValue:StringLike": { "cognito-identity.amazonaws.com:amr": "authenticated" } } } ] }
与身份池相关的元素
-
"Federated": "cognito-identity.amazonaws.com"
:用户必须来自身份池。 -
"cognito-identity.amazonaws.com:aud": "us-east-1:a1b2c3d4-5678-90ab-cdef-example11111"
:用户必须来自特定的身份池us-east-1:a1b2c3d4-5678-90ab-cdef-example11111
。 -
"cognito-identity.amazonaws.com:amr": "authenticated"
: 必须对用户进行身份验证。访客用户无法担任该角色。
应用最低权限权限
当您使用 IAM 策略为经过身份验证的访问或访客访问设置权限时,请仅授予执行特定任务所需的特定权限或最低权限权限。以下示例 IAM 策略应用于角色时,授予对 Amazon S3 存储桶中单个图像文件的只读访问权限。
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "s3:GetObject" ], "Effect": "Allow", "Resource": ["arn:aws:s3:::mybucket/assets/my_picture.jpg"] } ] }
身份池配置最佳实践
身份池为生成 AWS 凭证提供了灵活的选项。当您的应用程序可以使用最安全的方法时,不要使用设计捷径。
了解访客访问的影响
未经身份验证的访客访问权限允许用户在登录 AWS 账户 之前从您那里检索数据。任何知道您的身份池 ID 的人都可以申请未经身份验证的证书。您的身份池 ID 不是机密信息。激活访客访问 AWS 权限后,所有人均可使用您授予未经身份验证的会话的权限。
最佳做法是,停用访客访问权限,仅在用户进行身份验证后才获取所需的资源。如果您的应用程序需要在登录前访问资源,请采取以下预防措施。
-
熟悉对未经身份验证的角色设置的自动限制。
-
监控和调整未经身份验证的 IAM 角色的权限,以满足应用程序的特定需求。
-
授予对特定资源的访问权限。
-
保护您的默认未经身份验证的 IAM 角色的信任策略。
-
只有当您确信自己会将 IAM 角色中的权限授予互联网上的任何人时,才能激活访客访问权限。
默认使用增强型身份验证
通过基本(经典)身份验证,Amazon Cognito 会将选择的 IAM 角色委托给您的应用程序。相比之下,增强型流程使用身份池中的集中式逻辑来确定 IAM 角色。它还通过设置了 IAM 权限上限的范围缩小策略,为未经身份验证的身份提供了额外的安全性。增强的流程是最安全的选择,开发人员的工作量最少。要了解有关这些选项的更多信息,请参阅身份池身份验证流程。
基本流程可以公开用于角色选择和组装 AWS STS API 凭证请求的客户端逻辑。增强的流程将逻辑和代理角色请求隐藏在身份池自动化背后。
配置基本身份验证时,请将 IAM 最佳实践应用于您的 IAM 角色及其权限。
安全地使用开发者提供商
经过开发人员身份验证的身份是服务器端应用程序身份池的一项功能。身份池开发者身份验证所需的唯一身份验证证据是身份池开发者的 AWS 证书。身份池不会对您在此身份验证流程中提供的开发者-提供商标识符的有效性施加任何限制。
作为最佳实践,仅在以下条件下实施开发者提供商:
-
要为使用经过开发者身份验证的证书创建问责制,请设计您的开发者提供商名称和标识符以指明身份验证来源。例如:
"Logins" : {"MyCorp provider" : "
。[provider application ID]
"} -
避免使用长期存在的用户凭证。将您的服务器端客户端配置为使用服务相关角色请求身份,例如 EC2 实例配置文件和 Lambda 执行角色。
-
避免在同一个身份池中混合使用内部和外部信任来源。将您的开发者提供商和单点登录 (SSO) 提供商添加到单独的身份池中。