Amazon SNS 的安全最佳实践
AWS 提供了 Amazon SNS 的许多安全功能。在您自己的安全策略的上下文中查看这些安全功能。
注意
有关这些安全功能的指南适用于常见的应用场景和实施。我们建议您在特定应用场景、架构和威胁模型的上下文中查看这些最佳实践。
预防性最佳实践
以下是针对 Amazon SNS 的预防性安全最佳实践。
主题
确保主题不可公开访问
除非您明确要求 Internet 上的任何人都可以读取或写入 Amazon SNS 主题,否则应确保主题不可公开访问(可供世界上的每个人或任何经过身份验证的 AWS 用户访问)。
-
避免创建
Principal设置为""的策略。 -
避免使用通配符 (
*)。相反,对一个特定用户或多个用户命名。
实施最低权限访问
授予权限后,您可以决定这些权限的接收者、权限所针对的主题以及要允许这些主题使用的特定 API 操作。实施最低权限原则对于降低安全风险至关重要。它还有助于减少错误或恶意意图的负面影响。
遵循授予最低权限的标准安全建议。也就是说,只授予执行特定任务所需的权限。您可以通过使用与用户访问相关的安全策略组合来实施最低权限。
Amazon SNS 使用发布者-订阅者模型,需要三种类型的用户账户访问:
-
管理员 – 用于创建、修改和删除主题的访问权。管理员还控制主题策略。
-
发布者 – 用于向主题发送消息的访问权。
-
订阅者 – 用于订阅主题的访问权。
有关详细信息,请参阅以下章节:
为需要 Amazon SNS 访问权限的应用程序和 AWS 服务使用 IAM 角色
对于访问 Amazon SNS 主题的应用程序或 AWS 服务(例如 Amazon EC2),它们必须在其 AWS API 请求中使用有效 AWS 凭证。由于这些凭证不会自动轮换,因此您不应将 AWS 凭证直接存储在应用程序或 EC2 实例中。
您应该使用 IAM 角色来管理需要访问 Amazon SNS 的应用程序或服务的临时凭证。在使用角色时,您不需要将长期凭证(如用户名、密码和访问密钥)分配给 EC2 实例或 AWS 服务(例如 AWS Lambda)。相反,角色可提供临时权限供应用程序在调用其他 AWS 资源时使用。
有关更多信息,请参阅 IAM 用户指南中的 IAM 角色和角色的常见场景:用户、应用程序和服务。
实施服务器端加密
要减少数据泄漏问题,可以通过静态加密,使用存储在与消息存储位置不同的位置的密钥来对消息进行加密。服务器端加密 (SSE) 提供静态数据加密。Amazon SNS 在存储消息时将在消息级别对数据进行加密,并在您访问消息时为您解密消息。SSE 使用 AWS Key Management Service 中托管的密钥。当您对请求进行身份验证并具有访问权限时,访问加密主题和未加密主题之间没有区别。
有关更多信息,请参阅 使用服务器端加密保护 Amazon SNS 数据安全 和 管理 Amazon SNS 加密密钥和成本。
实施传输中数据加密
可以但不建议使用 HTTP 发布在传输过程中未加密的消息。但是,当使用 AWS KMS 对主题进行静态加密时,需要使用 HTTPS 来发布消息,以确保静态和传输中的消息都要加密。虽然该主题不会自动拒绝 HTTP 消息,但必须使用 HTTPS 来维持安全标准。
AWS 建议您使用 HTTPS 而不是 HTTP。使用 HTTPS 时,消息将在传输过程中自动加密,即使 SNS 主题本身没有加密。如果没有 HTTPS,基于网络的攻击者便能使用中间人之类的攻击来窃听或操纵网络流量。
要仅通过 HTTPS 强制实施加密连接,请将 aws:SecureTransport 条件添加到已附加到未加密 SNS 主题的 IAM 策略中。这会强制消息发布者使用 HTTPS 而不是 HTTP。您可以使用以下示例策略作为指导:
考虑使用 VPC 终端节点来访问 Amazon SNS
如果您的主题必须能够与您交互,但这些主题绝对不能暴露在 Internet 上,则可使用 VPC 终端节点将主题访问限制为仅访问特定 VPC 中的主机。您可以使用主题策略控制从特定 Amazon VPC 终端节点或特定 VPC 对主题的访问。
Amazon SNS VPC 终端节点提供两种方式来控制对消息的访问:
-
您可以控制允许通过特定 VPC 端点访问的请求、用户或组。
-
您可以使用主题策略控制哪些 VPC 或 VPC 终端节点有权访问您的主题。
有关更多信息,请参阅 创建终端节点 和 为 Amazon SNS 创建 Amazon VPC 终端节点策略。
确保订阅未配置为提供原始 http 终端节点
避免将订阅配置为传输到原始 http 终端节点。始终将订阅传输到终端节点域名。例如,配置为向终端节点 http://1.2.3.4/my-path 传输的订阅应该更改为 http://my.domain.name/my-path。
取消订阅时强制进行身份验证
除非您需要支持未经身份验证取消订阅,例如轻松取消订阅电子邮件或短信,否则您必须强制进行身份验证才能取消订阅某个主题。这与最低权限访问控制建议一致。
您可以在确认订阅时将 AuthenticateOnUnsubscribe 设置为 True。如果在确认 Amazon SNS 订阅时未能将 AuthenticateOnUnsubscribe 设置为 True,则即使取消订阅请求未经身份验证,也可能导致取消订阅请求成功。有关更多信息,请参阅“Amazon SNS API 参考”中的 ConfirmSubscription 或 Amazon Q 检测器库中的 Python 示例。
例如,要使用 AWS CLI 确认电子邮件订阅,请复制电子邮件通知中“确认订阅”文本中的链接。该 URL 将为您提供调用以下 AWS CLI 命令所需的信息。
aws sns confirm-subscription --region us-west-2 \ --topic-arn sns-topic-arn \ --token token-from-subscribe-notification \ --authenticate-on-unsubscribe true
其中:
-
aws-region 是主题所在的 AWS 区域。这也可以在主题 ARN 中找到。
-
sns-topic-arn 是主题的 ARN。这是确认订阅 URL 中“TopicArn=”之后、“&Token”之前的文本。
-
token-from-subscribe-notification 是确认订阅 URL 中“Token=”之后、“&Endpoint”之前的 UUID 字符串。
以下是示例 URL:
https://sns.us-west-2.amazonaws.com/confirmation.html?TopicArn=arn:aws:sns:us-west-2:123456789012:sns-topic&Token=a1b2c3d4e5f6789012345678901234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1&Endpoint=email@address.com