【问题标题】:Necessary s3cmd S3 permissions for PUT/SyncPUT/Sync 的必要 s3cmd S3 权限
【发布时间】:2012-07-22 20:04:47
【问题描述】:

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

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

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

以前有没有人处理过这个问题?

【问题讨论】:

  • 这是完全可能的。您授予了哪些权限?

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


【解决方案1】:

试试这样的。我认为问题在于您需要 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 所述。

【讨论】:

  • 我遇到了与 OP 相同的问题,我缺少的部分是末尾带有“/*”的资源。没有这个,您可以列出但不能放置对象(如 OP 所说的 403 错误)。
  • s3cmd 现在也需要 s3:GetBucketLocation。
  • 我的存储桶名称上缺少通配符:"arn:aws:s3:::bucket/path/*" 使用这些操作添加此操作对我有用
【解决方案2】:

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/*"
      ]
    }
  ]
}

【讨论】:

  • 将根据此信息更新我的答案。感谢您的更新。
【解决方案3】:

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

{
    "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 管理文件的存储桶

【讨论】:

    【解决方案4】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-17
      • 1970-01-01
      • 1970-01-01
      • 2016-02-12
      • 1970-01-01
      • 2021-12-18
      • 1970-01-01
      相关资源
      最近更新 更多