Amazon s3 放置/同步所需的s3cmd S3权限

Amazon s3 放置/同步所需的s3cmd S3权限,amazon-s3,amazon-web-services,s3cmd,Amazon S3,Amazon Web Services,S3cmd,在迁移到AWS EC2时,我想出于充分的理由限制实例的用户权限。实例需要做的一件事是访问S3上的文件并在那里写入文件。但是,如果不将所有权限授予该用户,我无法找到任何方法来实现这一点 s3cmd允许我调用我授予策略权限的s3存储桶上的“ls”和“du”,但在尝试与其中一个文件夹进行放置/同步时总是失败,并出现403错误。如果我使用我的根凭据,传输将直接进行 因此,我不明白为什么如果我为用户提供了上述bucket的所有权限,它就不能放入,但如果我给它arn:aws:s3::::*(所有bucket

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

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

因此,我不明白为什么如果我为用户提供了上述bucket的所有权限,它就不能放入,但如果我给它arn:aws:s3::::*(所有bucket),它就可以。对我来说毫无意义


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

试试这样的方法。我认为问题在于s3cmd需要s3:ListAllMyBucket和s3:ListBucket才能工作。不知道为什么,但除非它能得到一个桶的列表,否则它不会工作。我第一次尝试使用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/*"
      ]
    }
  ]
}

Edit我已经添加了更新版本的s3cmd所需的
s3:PutObjectAcl
操作,如威尔·杰索普所述。

b怀特的回答几乎是正确的(它可能曾经用于较旧版本的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/*"
      ]
    }
  ]
}

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

{
    "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管理文件的bucket,如果您要访问子文件夹(如/bucket name/path/)而不是整个bucket,ListBucket操作需要更具体一点:

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

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

这是完全可能的。您授予了什么权限?我遇到了与OP相同的问题,我缺少的部分是结尾带有“/*”的资源。如果没有这个,你可以列出但不能放置对象(OP说的403错误)。s3cmd现在还需要s3:GetBucketLocation。我的bucket名称上缺少一个通配符:“arn:aws:s3:::bucket/path/*”添加这些动作会根据这些信息更新我的答案。谢谢你的更新。