使用 Amazon S3 SignedURL 从浏览器客户端 PUT 文件是否安全?

Dav*_*lsh 2 amazon-s3 amazon-web-services pre-signed-url

我的后端是一个 nodejs 应用程序,我希望用户将图像上传到 Amazon S3 存储桶。

从我的服务器运行:

const s3 = new AWS.S3({
  params: {
    Bucket: bucket
  }
});

app.get('/api/images/signed-url', authMiddleware, (req, res) => {
  s3.getSignedUrl('putObject', 
    { ContentType: 'image/jpeg', Key: uuid() + '.jpeg' }, 
    (_err, url) => res.send({ signedUrl })
})
Run Code Online (Sandbox Code Playgroud)

然后从我的浏览器客户端上传到该端点

该网址如下所示:

https://my-s3-bucket.s3.ap-southeast-2.amazonaws.com/0050db00-c64c-419a-83c2-e8615120f458.jpeg?AWSAccessKeyId=MY_ACCESS_KEY&Content-Type=image%2Fjpeg&Expires=1625365030&Signature=1ebnshTgeMKoLMAH%2Bi2FLletsAU%3D
Run Code Online (Sandbox Code Playgroud)

鉴于此 URL 包含 my MY_ACCESS_KEY_ID,与客户共享是否安全?我不分享我的秘密(显然),但它是等式的一半。

Jat*_*tra 5

Aws 编程键具有access key ID and secret key.

将 ID 视为计算机的用户名,将密钥视为密码。 请注意,在 URL 中,它是访问密钥 ID,而不是密钥。 所以人们可以看到您的用户名。

access-key-id must be specified so the service knows who's making the request.
Run Code Online (Sandbox Code Playgroud)

并且即使您担心暴露您的访问密钥 ID 的事实,那么您应该记住从概念上讲`s3preSignedURL 是基于时间的,它仅在某些特定时间有效,不会超过该时间

如果您担心该 URL 是否在可接受的有效时间范围内与他人共享,请微调您的权限,因为

预签名 URL 允许您访问 URL 中标识的对象,前提是预签名 URL 的创建者有权访问该对象。也就是说,如果您收到用于上传对象的预签名 URL,则仅当预签名 URL 的创建者具有上传该对象所需的权限时,您才能上传该对象。

这些是一些帖子,在帖子 1帖子 2中详细讨论了这一点