【问题标题】:Grant access to Amazon S3 bucket only to one IAM User仅向一位 IAM 用户授予对 Amazon S3 存储桶的访问权限
【发布时间】:2021-04-27 01:47:15
【问题描述】:

我希望有一个只有一个 IAM 用户可以使用 AWS 控制台访问的存储桶,列出其内容并访问其中的对象文件。

所以,我已经创建了 IAM 用户、存储桶本身以及以后:

桶策略如下:

{
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "statement1",
                "Effect": "Allow",
                "Principal": {
                    "AWS": "arn:aws:iam::0000000:user/dave"
                },
                "Action": [
                    "s3:GetBucketLocation",
                    "s3:ListBucket"
                ],
                "Resource": "arn:aws:s3:::testbucket1234"
            },
            {
                "Sid": "statement2",
                "Effect": "Allow",
                "Principal": {
                    "AWS": "arn:aws:iam::0000000:user/dave"
                },
                "Action": "s3:GetObject",
                "Resource": "arn:aws:s3:::testbucket1234/*"
            }
        ]
    }

还有一个附加到我的用户组的内联策略,如下所示:

    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:*Object",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::testbucket1234/*"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": "s3:ListAllMyBuckets",
            "Resource": "*"
        }
    ]
}

现在:我可以列出我的存储桶、访问所需的存储桶、列出其内容(到目前为止一切顺利)。问题是当我尝试打开存储桶内的一个文件对象时,我收到“拒绝访问”错误。如果我将对象公开,我可以访问它,但我也可以使用其他 IAM 帐户访问它,这不是本意。我只想通过使用此特定 IAM 帐户来访问存储桶、列出其内容和访问对象。我究竟做错了什么?我怎样才能达到这个目标?提前致谢。

【问题讨论】:

  • 向其他用户授予了哪些 S3 权限?他们是否有任何策略可以授予对所有 S3 存储桶的访问权限?
  • 你好@JohnRotenstein,实际上我只有我描述过的这些政策。并且公共访问被禁用。

标签: amazon-web-services amazon-s3 amazon-ec2


【解决方案1】:

默认情况下,没有 IAM 用户可以访问任何存储桶。只有授予用户权限,他们才能访问资源。

但是,许多人倾向于授予 Amazon S3 对所有存储桶的权限,至少对管理员而言是这样。这使得 删除 权限变得困难,因此一个存储桶只能由一个用户访问。虽然可以使用 Deny 策略来完成,但此类策略很难正确制定。

对于特定数据只能由一个用户或一组特定用户(例如 HR 员工)访问的情况,我建议您创建一个单独的 AWS 账户并仅向特定 IAM 用户或通过存储桶策略 的 IAM 组(跨账户运行良好)。这样,任何授予“所有存储桶”访问权限的通用策略都不会应用于此单独帐户中的存储桶。


更新:访问私有对象

扩展以下 cmets 中提到的内容,授权用户可以访问 Amazon S3 中的私有对象。但是,在访问对象时,需要识别正在访问该对象,并且必须证明他们的身份。这可以通过以下几种方式之一完成:

  • Amazon S3 管理控制台 中,使用 打开 命令(在 操作 菜单中)。这将使用预签名 URL 打开对象,该 URL 根据登录控制台的用户授权访问。 下载选项使用相同的方法。
  • 使用AWS Command-Line Interface (CLI),您可以下载对象。 AWS CLI 需要预先配置您的 IAM 安全凭证以证明您的身份。
  • 使用 AWS SDK 的程序可以使用其 IAM 安全凭证访问 S3 对象。事实上,AWS CLI 只是一个使用 AWS 开发工具包的 Python 程序。
  • 如果您想通过 URL 访问对象,应用程序可以生成 Amazon S3 pre-signed URLs。此 URL 包括用户的身份和安全签名,该签名允许在有限的时间段内(例如 5 分钟)访问私有对象。当 Web 应用程序想要授予对私有对象(例如文档或照片)的访问权限时,通常使用此方法。当用户选择 Actions/Open 时,S3 管理控制台实际上使用此方法,以便用户可以在浏览器中查看私有对象。

【讨论】:

  • 你好约翰,实际上我被拒绝了,这就是问题所在。我的存储桶策略运行良好(只有所需的用户能够列出存储桶的内容)..问题是,我的 IAM 用户无法读取存储桶内的任何文件对象,我只能使其工作将文件对象公开,但确实如此不满足我,因为其他 IAM 用户也可以访问它。因此,我需要维持我的存储桶管理和列表工作,但我还需要启用此 IAM 来读取和打开存储桶内的文件。目前,当我尝试打开其中任何一个时,它都会被拒绝访问
  • 您应该只需要为 IAM 用户创建一个内联策略。无需创建存储桶策略,因为 IAM 策略就足够了(而且更合适,因为它仅适用于一个用户)。您是如何访问该对象的——您是通过 Amazon S3 管理控制台进行的吗?你到底在点击什么,它在哪里说拒绝访问?我想知道控制台是否需要更多权限,例如GetObjectAcl
  • 是的,我正在通过 AWS 控制台使用 Web 浏览器进行操作。我可以列出存储桶,打开所需的存储桶,列出其中的目标文件。但是,当我单击其中一个文件对象的网络链接并尝试在浏览器中打开它(例如读取 .txt 文件)时,它会显示 XML 文件说“拒绝访问”。我可以打开文件的唯一方法是将其公开,我实际上并不想要它,因为我需要保护它不被其他人看到。一切似乎都很好,除了我无法打开目标文件本身。我不知道我错过了什么或做错了什么。
  • 有两种方法可以从 S3 管理控制台“打开”文件。一种方法只是提供一个匿名 URL,它仅在对象是公共的情况下才有效。另一种方法是使用“Actions / Open”,它会创建一个包含您的身份信息的预签名 URL——这将提供对私有对象的访问。 “下载”选项也是如此——它将生成一个预签名的 URL,让您下载私有对象。试试这些选项,看看你是否有访问权限。
  • 谢谢你,约翰。那么,在 Web 控制台中实际打开/查看文件内容的唯一方法是下载文件并在我的计算机中打开?要通过浏览器(如页面)访问它,唯一的方法是事先将其公开?我说得对吗?我能够像你说的那样得到文件(实际上是使用控制台中的 DOWNLOAD 选项下载它)。
猜你喜欢
  • 1970-01-01
  • 2013-10-31
  • 1970-01-01
  • 1970-01-01
  • 2023-02-21
  • 1970-01-01
  • 2020-08-22
  • 1970-01-01
  • 2017-11-01
相关资源
最近更新 更多