PUT / Sync需要s3cmd S3权限

时间:2012-07-22 20:04:47

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

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

s3cmd允许我在我赋予策略权限的s3存储桶上调用“ls”和“du”,但在尝试与其中一个文件夹进行PUT /同步时总是失败并显示403错误。如果我使用我的root凭据,则传输将直接进行。

所以,我不明白为什么如果我为所述桶提供所有权限,它不能PUT,但是如果我给它 arn:aws:s3 ::: * (所有桶)那么它可以。对我毫无意义。

之前有其他人曾经处理过此事吗?

4 个答案:

答案 0 :(得分:28)

尝试这样的事情。我认为问题是你需要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所述。

答案 1 :(得分: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/*"
      ]
    }
  ]
}

答案 2 :(得分: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管理文件的存储桶

答案 3 :(得分:0)

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

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

我认为,如果您提供对整个存储桶的访问权限,它也可以使用原始答案。