【问题标题】:Amazon S3 - How do I download objects owned by anonymous user?Amazon S3 - 如何下载匿名用户拥有的对象?
【发布时间】:2015-01-17 20:52:08
【问题描述】:

我有一个示例网页,允许匿名用户上传对象并在我的 S3 存储桶中创建文件夹。

很遗憾,在执行此操作之前,我没有设置任何特定的存储桶策略或 ACL。

现在我遇到了一个问题,匿名用户创建了一个文件夹并上传了我(作为 root 用户)无法下载或访问的对象。我计划在更多用户上传对象之前设置一个新的存储桶策略,但现在我需要访问匿名拥有的这些当前对象。

谁能告诉我该怎么做?

【问题讨论】:

  • 我可以知道您是如何以 root 用户身份访问它的吗?我的意思是通过 AWS 控制台或代码?
  • 是的,我以 root 用户身份通过​​ AWS 控制台访问对象。如果我尝试下载文件,这有关系吗?

标签: amazon-web-services amazon-s3 download anonymous-users


【解决方案1】:

“匿名用户”是指“未经身份验证的用户”吗?如果是这样,那么您有两个选择(下面的#1 和#2)。如果没有,那么您有一个选择(下面的#1)。当然,所有这些都假设您无法说服上传者自己修改这些对象的 ACL。

  1. 删除对象。作为存储桶所有者,您可以随时删除对象(并停止为它们付费)。

  2. 成为对象所有者并授予存储桶所有者(您)完全控制权。任何人都可以是未经身份验证的用户,因此是对象所有者。

这是一个如何使用 node.js 和 AWS JavaScript SDK 为 bkt/cat.jpg 执行 #2 的示例。此代码以未经身份验证的用户身份调用 putObjectAcl,并赋予存储桶所有者(您)对对象的完全控制权。

var aws = require('aws-sdk');
var s3 = new aws.S3();
var p = { Bucket: 'bkt', Key: 'cat.jpg', ACL: 'bucket-owner-full-control' };
s3.makeUnauthenticatedRequest('putObjectAcl', p, function(e,d) {
  if (e) console.log('err: ' + e);
  if (d) console.log('data: ' + d);
});

不幸的是,awscli 似乎不支持未经身份验证的 S3 调用,否则我会建议使用它来修改对象的 ACL。

请注意,bucket-owner-full-control 的canned ACL 赋予对象所有者存储桶所有者完全控制权。

【讨论】:

  • 这解决了我的一个主要痛点。感谢 s3.makeUnauthenticatedRequest 方法,我不知道。
【解决方案2】:

查看您用于访问 AWS 管理控制台的身份和访问管理 (IAM) 用户的策略。如果它具有 AdministratorPower User 策略设置,那么您将拥有对与您的 AWS 账户关联的所有 Amazon S3 存储桶中的对象的完全访问权限。

您需要通过经过身份验证的方法(例如 S3 管理控制台)访问对象。

如果您使用您账户的 root 用户,您还可以完全访问您的 S3 存储桶及其内容。不建议您每天都使用您的根用户,因为它可以完全访问您的帐户,并且如果被入侵会很危险——相反,使用根帐户在 IAM 中创建一个管理用户,这样可以更轻松地进行管理(例如更改权限、轮换密钥)。

如果您仍然无法查看对象,请通过选择对象然后从“操作”菜单中选择打开来确保正在访问它们。这将创建一个将打开文件的经过身份验证的 URL。如果您只是单击对象属性窗口中显示的链接,它将使用没有身份验证的 URL,并且可能会失败。

【讨论】:

  • 存储桶拥有者并不能完全访问他自己的 S3 存储桶中的对象,这看起来很奇怪。如果将它们放在那里的所有者没有授予存储桶所有者访问权限(读取、读/写或完全控制),则存储桶所有者除了删除对象之外没有访问权限。而且,afaik,他有权删除它们的唯一原因是他正在为 S3 存储桶支付账单。
猜你喜欢
  • 2016-02-21
  • 1970-01-01
  • 1970-01-01
  • 2012-06-17
  • 2012-10-11
  • 2012-05-26
  • 2013-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多