如何通过预签名 URL 安全地传输文件 安全博客
如何安全地使用预签名 URL 传输文件
关键要点
现代企业需要安全共享大文件以及对私有数据的受控访问,以推动创新和提高客户体验。预签名 URL 提供了对 Amazon S3 对象的有限时间访问,避免了长期凭证的暴露。实现安全的预签名 URL 生成和使用是防止数据泄露的重要举措。在大规模分布式工作和数字化持续扩展的时代,安全共享大文件及对私有数据的受控访问已成为现代组织的战略必需。有效的协作和信息交流是推动创新、加快决策和提高客户体验的关键。然而,保护敏感数据始终是优先事项,因为未经授权的曝光可能对组织造成严重后果。
预签名 URL 应对了这一挑战,同时维护了内部资源的治理。它们提供了对 Amazon Simple Storage Service (Amazon S3) 对象的临时访问权限,且可以配置详细的权限和过期规则。预签名 URL 提供安全的临时访问权限,使私有 Amazon S3 对象在不暴露长期凭证或要求公共访问的情况下,可以方便地进行协作和文件传输。
预签名 URL 也常用于受信任的业务应用之间交换数据。这种架构模式显著减少了通过网络传输的数据量,避免了文件转移。然而,在使用预签名 URL 时,实施保护措施以防止无意的数据曝光至关重要。
在本博文中,我们提供了在 AWS 中安全使用预签名 URL 的指导。我们展示了生成和分发预签名 URL 的最佳实践、安全考虑和监控使用情况及访问模式的建议。
预签名 URL 生成的最佳实践
确保安全的 预签名 URL 生成至关重要。将分层保护与业务目标对齐,有助于实现安全的临时数据访问。强化生成政策对于负责任地使用预签名 URL 也至关重要。以下是一些安全生成预签名 URL 的关键技术考虑:
紧密限制 AWS 身份与访问管理IAM 权限,仅限于所需的 Amazon S3 操作和资源,以减少意外暴露的风险。尽可能使用临时凭证如角色而非访问密钥。如果使用访问密钥,请定期轮换,以防止凭证被泄露后发生长期未经授权的访问。使用 VPC 端点 连接 S3,允许您的 Amazon 虚拟私有云Amazon VPC 直接访问 S3 存储桶,而无需经过互联网地址空间。这提高了隔离性和安全性。对生成操作要求 多因素身份验证MFA,以增强身份保证。采用 即时生成 策略,确保预签名 URL 的生命周期最小化。遵循 最小权限访问 和 传输加密,以降低使用预签名 URL 时意外数据访问和曝光的下游风险。在 URL 中使用唯一的随机值nonce以帮助防止未经授权访问,并验证 nonce 以防止重放攻击。这与时间限制访问结合可以有效降低 URL 被猜测的风险。解决方案概述
预签名 URL 简化了受信任业务应用之间的数据交换,减少了对单独访问管理的需求。使用独特的、一次性的 nonce 可以通过最小化未授权使用和重放攻击来增强安全性。访问限制可以进一步提升安全性,通过限制预签名 URL 从单个应用的使用并在达到限制后撤销访问。
此解决方案实现了两个 API:
预签名 URL 生成 API访问对象 API预签名 URL 生成 API
此 API 生成一个预签名 URL 和相应的 nonce,并将它们存储在 Amazon DynamoDB。它会返回供客户访问对象 API 的 URL。
小熊twitter加速器以下架构展示了一个无服务器的 AWS 解决方案,通过生成带有唯一 nonce 的预签名 URL,为对 Amazon S3 对象提供安全、受控的一次性访问。Amazon API Gateway 接收用户请求,随后调用 AWS Lambda 函数 生成 nonce 和预签名 URL,并将其存储在 DynamoDB 中,以便进行验证,并返回预签名 URL 给用户。
生成有唯一 nonce 的预签名 URL
工作流程包括以下步骤:
生产者应用程序向生成预签名 URL 合法访问 Amazon S3 对象的请求。请求由 Amazon API Gateway 接收,作为 API 的入口点,路由请求到适当的 Lambda 函数。调用 Lambda 函数,其执行以下任务:为预签名 URL 生成唯一的 nonce。为请求的 S3 对象创建预签名 URL,设置特定的过期时间及其他访问条件。将 nonce 和预签名 URL 存储在 DynamoDB 表中,以便未来验证。生产者应用程序将 nonce 与其他接收数据的受信任应用程序分享。访问对象 API
消费方应用程序从生产者应用程序接收负载中的 nonce。消费方应用程序使用访问对象 API 访问 Amazon S3 对象。在第一次访问时,nonce 会被验证,然后从 DynamoDB 中删除。这样,预签名 URL 的使用限制为一次。后续对此 URL 的请求会被 Lambda 授权器禁止,以增加安全性。
以下架构展示了一个无服务器 AWS 解决方案,使通过预签名 URL 安全访问 Amazon S3 对象成为可能。它使用 API Gateway 作为入口点,Lambda 授权器进行 nonce 验证,另一个 Lambda 函数通过与 DynamoDB 交互来进行访问重定向,并在后续删除 nonce 以防止再次访问同一 URL。
通过预签名 URL 安全访问 Amazon S3 的解决方案

工作流程由以下步骤组成:
消费方应用程序使用从生产者应用程序接收到的 nonce请求 Amazon S3 对象。API Gateway 接收请求,并使用 Lambda 授权器进行验证,以确定请求是否有效 nonce。Lambda 授权器的 ValidateNonce 函数验证 nonce 是否存在于 DynamoDB 表中,并将允许策略返回给 API Gateway。如果 Lambda 授权器发现 nonce 不存在,则意味着 nonce 已经被使用,并向 API Gateway 发送拒绝策略,从而不允许请求继续。当 API Gateway 接收到允许策略时,将请求路由到 AccessObject Lambda 函数。AccessObject Lambda 函数:从 DynamoDB 表中检索与 nonce 关联的预签名 URL唯一值。从 DynamoDB 表中删除 nonce,从而使预签名 URL 失效。将请求重定向到 S3 对象。后续尝试使用相同的预签名 URL 访问 S3 对象将被 Lambda 授权器拒绝,因为 nonce 已经从 DynamoDB 表中移除。为帮助您理解该解决方案,我们开发了基于 Python 和 AWS CDK 的代码,您可以从 预签名 URL Nonce 代码 下载。该代码演示了如何在两个业务应用程序之间生成和使用预签名 URL。
前提条件
要跟随本文的示例,您需要具备以下项目:
一个 AWS 账户 ,以及与之相关联的 IAM 角色AWS 命令行界面 (AWS CLI)安装了 Python 3x 和 pip安装了 AWS 云开发工具包AWS CDK实施解决方案
使用生成 URL 的 Lambda 函数生成并保存一个强随机 nonce 字符串,每当您以编程方式创建预签名 URL 时:python def createnonce() # 生成一个 16 字节128 位的 nonce nonce = secretstokenbytes(16) return nonce
def storenonce(nonce url) res = ddbclientputitem(TableName=ddbtable Item={nonceid {S noncehex()} url {S url}}) return res
将 nonce 作为 URL 参数包含,便于在验证时提取。例如:消费方应用程序可以使用以下 URL 请求 Amazon S3 对象:https//ltyourdomaingt/stage/accessobjectnonce=ltnoncegt当访问该对象时,使用 Lambda 提取 nonce,在 Lambda 授权器中验证 nonce 是否存在。在 DynamoDB 表中查找提取的 nonce,验证它是否匹配生成的值:python def validatenonce(nonce) try response = noncetablegetitem(Key={nonceid nonce}) print(The ddb key response is {}format(response)) except ClientError as e loggererror(e) return False
if Item in response # 找到 nonce return True else # 未找到 nonce return False如果 nonce 是有效的并且在 DynamoDB 中找到,允许访问 S3 对象。nonce 在使用后从 DynamoDB 中删除,以防止重放。
python if validatenonce(nonce) loggerinfo(有效的 nonce nonce) return generatepolicy( Allow event[methodArn]) else loggerinfo(无效的 nonce nonce) return generatepolicy( Deny event[methodArn])
注意:您可以使用 Python 的 secrets 模块来提高 nonce 的安全性。Secretstokenbytes(16) 生成二进制令牌,而 secretstokenhex(16) 生成十六进制字符串。您还可以通过选择 32 字节的 nonce 进一步提高对 暴力攻击 的防护。
清理
为避免产生将来的费用,请使用下面的命令通过 AWS CDK 工具包清理您为此解决方案创建的所有资源:
cdk destroy force有关 AWS CDK 工具包的更多信息,请参阅 工具包参考。
预签名 URL 共享和监控的最佳实践
确保在广泛共享预签名 URL 时进行适当的治理至关重要。这些措施不仅能安全地释放 URL 分享的好处,还能限制脆弱性。持续监控使用模式并实施自动撤销程序进一步增强保护。在满足业务需求的同时进行分层安全尤为重要。
使用 HTTPS 加密,强制使用 TLS 证书以保护传输中的 URL,并使用 S3 策略。在 S3 存储桶上定义详细的 CORS 权限,以限制哪些网站可以请求访问预签名 URL。配置 AWS WAF 规则,以检查请求头中 nonce 的存在,限制请求速率,并只允许是已知来源的经批准 IP 地址使用。同时使用 AWS WAF 监控和过滤可疑的访问模式,并将 API Gateway 和 S3 访问日志 发送到 Amazon CloudWatch 进行监控:启用 WAF 日志:使用 WAF 日志将 AWS WAF web ACL 日志发送到 Amazon CloudWatch Logs,提供详细的访问数据,以分析使用模式并检测可疑活动。验证 nonce:创建 Lambda 授权器,要求在头信息或 URL 参数中包含正确格式的 nonce。阻止缺少预期 nonce 的请求。这可以防止使用无效 URL 的重放攻击。实施速率限制:如果 nonce 未被使用,配置 AWS WAF 基于速率的规则,以允许正常的使用水平并设置阈值以限制单个 IP 地址发出的过多请求。当定义的速率限制被超越时,WAF 会自动开始阻止来自该 IP 的请求,有助于抵御试图用大量请求淹没系统的拒绝服务攻击。配置 IP 白名单:通过定义 AWS WAF 规则,仅允许从预先批准的 IP 范围例如:您组织的 IP 或其他可信来源发送请求。WAF 将仅允许来自指定信任的 IP 地址的访问,有助于阻止不受信任的 IP 利用共享的预签名 URL。通过查看 CloudWatch Logs 中的访问日志分析日志和指标。这使您能够检测请求数量、模式和来源 IP 地址的异常。此外,通过汇总相关指标并设置 CloudWatch 警报以通知活动峰值,密切监控日志数据和指标将有助于发现可能需要进一步调查或采取措施的问题或可疑行为。通过建立对预签名 URL 使用的持续可见性、实施快速撤销能力以及采取适应性安全政策,您的组织能够在共享这些临时访问机制的固有风险下,维持有效的监督和控制。应密切监测关于预签名 URL 使用的分析内容,例如访问日志、拒绝请求和完整性检查。
结论
在这篇博文中,我们展示了预签名 URL 作为安全数据共享机制的潜力。通过严格遵循最佳实践、实施严格的安全控制和保持警惕的监控,您可以在协作效率与数据保护之间找到平衡。这种前瞻性的做法不仅加强了对潜在威胁的防御,同时还确立了预签名 URL 作为支持可持续、安全数据协作的可靠和实用解决方案。
后续步骤
对您的当前数据共享实践进行全面审查,以确定预签名 URL 可能增强安全性和效率的区域。实施本文中概述的建议最佳实践,以在您的 AWS 环境中安全生成、共享和监控预签名 URL。持续监控使用模式和访问日志,以检测异常和潜在的安全漏洞,并实施自动响应以快速降低风险。关注 AWS 安全博客 阅读更多此类文章,及时了解 AWS 安全的最新发展。如果您对本文有反馈,请在评论部分提交意见。如果您对本博文有疑问,请 联系 AWS 支持。
想了解更多 AWS 安全新闻?关注我们的 Twitter。
Sumit Bhati
Sumit 是 AWS 的高级客户解决方案经理,专注于加
在 Amazon OpenSearch Service 中进行手动快照并在跨越不同区域和账户的不同域
在不同域中手动拍摄快照并跨多个区域和账号恢复 Amazon OpenSearch 服务作者:Madhan Kumar Baskaran 和 Priyanshi Omer 发布于2024年10月11日 高级 (300), Amazon OpenSearch 服务, Amazon 简单存储服务 (S3)...