17

在迁移到 AWS EC2 时,我想限制我的实例的用户权限是有充分理由的。实例需要做的一件事是访问 S3 上的文件并在那里写入文件。但是,如果不授予该用户所有权限,我找不到任何方法来实现这一点

s3cmd 允许我在我授予策略权限的 s3 存储桶上调用“ls”和“du”,但在尝试与这些文件夹之一进行 PUT/同步时总是失败并出现 403 错误。如果我使用我的根凭据,则传输会直接进行。

所以,我不明白为什么如果我将所有权限授予用户所述存储桶,它不能 PUT,但如果我给它arn:aws:s3:::* (所有存储桶) 那么它可以。对我来说毫无意义。

以前有其他人处理过这个吗?

4

4 回答 4

29

尝试这样的事情。我认为问题在于您需要 s3:ListAllMyBuckets 和 s3:ListBuckets 才能使 s3cmd 工作。不知道为什么,但除非它可以获得桶列表,否则它不会工作。我第一次尝试对 s3cmd 使用权限时遇到了同样的问题,这就是解决方案。

{
  "Statement": [
    {
      "Action": [
        "s3:ListAllMyBuckets"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::*"
    },
    {
      "Action": [ 
          "s3:ListBucket", 
          "s3:PutObject",
          "s3:PutObjectAcl"
      ],
      "Effect": "Allow",
      "Resource": [
          "arn:aws:s3:::bucket/path", 
          "arn:aws:s3:::bucket/path/*"
      ]
    }
  ]
}

编辑我已经添加了s3:PutObjectAcl较新版本的 s3cmd 所需的操作,如下面的 Will Jessop 所述。

于 2012-07-24T14:30:23.190 回答
4

bwight 的答案几乎是正确的(它可能曾经用于旧版本的 s3cmd),但我需要添加一个s3:PutObjectAcl才能让它工作:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt123456",
      "Effect": "Allow",
      "Action": [
        "s3:ListAllMyBuckets"
      ],
      "Resource": [
        "arn:aws:s3:::*"
      ]
    },
    {
      "Sid": "Stmt123457",
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket",
        "s3:PutObject",
        "s3:PutObjectAcl"
      ],
      "Resource": [
        "arn:aws:s3:::bucketname",
        "arn:aws:s3:::bucketname/*"
      ]
    }
  ]
}
于 2014-04-18T17:29:50.820 回答
4

我试图上传大文件,但该策略对我来说效果不佳,我结束了向用户添加下一个策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1397834652000",
            "Effect": "Allow",
            "Action": [
                "s3:ListAllMyBuckets"
            ],
            "Resource": [
                "arn:aws:s3:::*"
            ]
        },
        {
            "Sid": "Stmt1397834745000",
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:ListBucketMultipartUploads",
                "s3:GetBucketLocation",
                "s3:AbortMultipartUpload",
                "s3:GetObjectAcl",
                "s3:GetObjectVersion",
                "s3:DeleteObject",
                "s3:DeleteObjectVersion",
                "s3:GetObject",
                "s3:PutObjectAcl",
                "s3:PutObject",
                "s3:GetObjectVersionAcl"
            ],
            "Resource": [
                "arn:aws:s3:::my_bucket",
                "arn:aws:s3:::my_bucket/*"
            ]
        }
    ]
}

其中 my_bucket 是我需要通过 s3cmd 管理文件的存储桶

于 2015-05-20T13:52:24.887 回答
0

如果您要访问子文件夹(如 /bucket-name/path/ 的原始答案)而不是整个存储桶,则ListBucket操作需要更多的特异性:

{
    "Sid": "AllowListingOfFilesInFolder",
    "Effect": "Allow",
    "Action": [
        "s3:ListBucket"
    ],
    "Resource": [
        "arn:aws:s3:::bucket-name"
    ],
    "Condition": {
        "StringLike": {
            "s3:prefix": [
                "path/*"
            ]
        }
    }
}

如果您提供对整个存储桶的访问权限,我相信它也适用于原始答案。

于 2018-02-12T13:44:11.330 回答