如何限制使用Amazon S3 presignedl向当前用户发布文件



我可以成功生成preSignedUrl并添加expation(用于上传图像),但我如何确保url不受恶意人员的攻击。

例如在我的nodejs服务器上,我有可以发布图像的用户,一些黑客登录我的网站得到他的jwt令牌,获取s3presignedl并且滥用我的s3存储空间

如何提高安全性?

你可以访问我的网站获得一个presignedl来发布文件访问:http://khelkhelo.in

// This is how I reproduce how a hacker can abuse the service
const { default: axios } = require("axios");
async function uploadFromMaliciousSource() {
// hacker will create account in my website and get his own jwt token
// signedurl we are using here is to upload images in a user post
const { data: signedUrl } = await axios.get("http://khelkhelo.in", {
headers: {
"x-auth-token": "jwt token of a user",
},
});
// here hacker can have access to preSignedurl and can upload his OWN CONTENT like sharing movies
const formdata = new FormData()
formdata.append() // ... 
}
uploadFromMaliciousSource();

一个Amazon S3预签名URL应该由后端服务器生成。它为上传或下载Amazon S3对象授予临时权限。

预先签名的URL是用您的AWS密钥"签名"的。这就是为什么必须由后端而不是前端生成URL的原因。与JWT令牌无关。

为了防止黑客获得这些S3预签名url,您应该要求对您的服务进行身份验证。那么你的问题似乎是:我如何防止黑客对我的服务进行身份验证?

答案取决于这种黑客攻击的后果有多严重,以及您希望合法用户体验到何种程度的不便。

可能的解决方案包括多种方法的组合。这不是一个详尽的列表,只是给你一些想法:

  • 端到端TLS加密和证书的安全处理
  • 复杂、冗长的密码或基于idp的身份验证
  • 在N次错误登录尝试后禁用帐户一段时间
  • 多因素身份验证
  • 地理或基于ip的限制
  • 已拥有服务的使用
  • 用户与网站交互的行为分析
  • 速率限制客户端请求
  • web应用防火墙
  • 短持续时间API密钥,具有无效功能
  • JWT令牌撤销列表

注意:一旦您将预签名的S3上传URL提供给最终用户(无论该用户是否是预期用户),该URL在到期之前保持有效和可用。如果在过期之前重用,它将导致相同键的任何现有对象被覆盖(因此滥用S3存储桶的空间有限)。您还可以实现基于lambda的解决方案,该解决方案在第一次上传到给定的S3密钥时触发摄取工作流,但不会在任何后续上传到相同的密钥时触发摄取工作流。

最新更新