Rails Activestorage和S3,存储敏感数据

hac*_*pai 1 security ruby-on-rails amazon-s3 rails-activestorage

ActiveStorage使得可以通过JS中的用户浏览器直接在S3上上传和访问文件。这是否意味着您的S3凭据已嵌入到用户浏览器中?我想我误会了,那会使您的证书几乎公开...

在那种情况下,唯一阻止任何人访问其他用户数据的就是唯一的令牌生成。但是24字节的随机密钥很容易被暴力破解。我是否应该通过为每个用户实现与其自身数据相关的唯一密钥来实施安全性?

什么是好的安全架构?

Tar*_*mni 6

一个好的安全体系结构,可能在ActiveStorage中实现的是:

1-请求包含上载表格的页面。

2-Blob记录将在服务器端创建并保存到数据库中(甚至在任何上载之前)。https://github.com/rails/rails/blob/0718c75bc2a7378d30e729a3c1d25ceb99400b7b/activestorage/app/models/active_storage/blob.rb#L70

3-服务器在后端调用第三方云服务(例如,AWS S3),并使用AWS凭证(秘密凭证且不应公开)发布预签名的URL,以用于上载。https://github.com/rails/rails/blob/master/activestorage/lib/active_storage/service/s3_service.rb#L87

https://www.rubydoc.info/github/aws/aws-sdk-ruby/Aws%2FS3%2FObject:presigned_url

4-服务器呈现嵌入了表单和presigned_url的页面。

5-此时,前端将在服务器上生成该presigned_url并将其呈现为表单。

6-Javascript将捕获来自html DOM的presigned_url并将其用于上传。

7-上传后,javascript将具有signed_id将在窗体中发布的javascript ,以更新blob记录并将其标记为已上传(在步骤1中创建的记录)。

优点:

1-您不需要通过服务器来上传任何文件,这意味着您在上传过程中不会阻塞任何进程,并可以利用客户端的计算能力来处理这种简单的任务。

2-即使后端关闭,您也可以上传。

3-更快的用户体验(往返次数更少)。

缺点:

1-临时令牌可以由有权访问临时令牌的任何人使用。

2-presigned_url具有有效期(expires_at),如果浏览器在进行实际上载之前保持空闲状态很长时间,则浏览器可能会收到auth错误。可能需要从服务器发出新的临时令牌!

注意:

  • 生成的presigned_url可以基于经过身份验证的用户来限制对特定文件夹/范围的访问,或者如果上载的Blob根据业务需求是公开的,则可以特权访问整个存储桶/范围。

这是如何signed uploads工作的:)

  • 这很近。提交表单后,Active Storage的JS POST会发送到内部端点以为每个文件生成一个签名的上载URL,从而消除了第二个缺点。 (5认同)