Java 使用根访问密钥和密钥时的S3策略

Java 使用根访问密钥和密钥时的S3策略,java,amazon-web-services,amazon-s3,aws-sdk,Java,Amazon Web Services,Amazon S3,Aws Sdk,因此,我最近创建了一个新的AWS帐户来使用S3存储。我目前只有我的根用户帐户。我正在使用JavaAWSSDK上传文件。S3Client对象是使用我的根帐户密钥和访问密钥设置的。另外,只需使用aws sdk内置putObject()方法进行上传。这里没什么特别的 现在,我尝试将策略附加到我的bucket,以限制bucket上的上载和下载功能。首先,我已经给了我的bucket所有的S3object权限,并且可以通过代码成功上传。然后,我尝试在策略中仅附加getObject、putObject、get

因此,我最近创建了一个新的AWS帐户来使用S3存储。我目前只有我的根用户帐户。我正在使用JavaAWSSDK上传文件。S3Client对象是使用我的根帐户密钥和访问密钥设置的。另外,只需使用aws sdk内置putObject()方法进行上传。这里没什么特别的

现在,我尝试将策略附加到我的bucket,以限制bucket上的上载和下载功能。首先,我已经给了我的bucket所有的S3object权限,并且可以通过代码成功上传。然后,我尝试在策略中仅附加getObject、putObject、getObjectAcl、putObjectAcl,并且可以再次成功上载

在此之后,我删除了putObject和putObjectAcl,只拥有getObject权限,但令人惊讶的是,我仍然可以使用我的代码上传文件。我相信删除上传权限会给我403拒绝访问。是因为我使用的是根用户访问密钥和密钥,这会提供一些额外的权限吗?还是我在这里遗漏了一些基本的东西

我的策略未经上传许可:

{
  "Id": "PolicyXXXXXXX",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "StmtXXXXXX",
      "Action": [
        "s3:GetObject",
        "s3:GetObjectAcl",
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::bucket-name/*",
      "Principal": {
        "AWS": [
          "arn:aws:iam::11111111111:root"
        ]
      }
    }
  ]
}

您正在使用其访问密钥和密钥的用户应具有putObject权限

如果基于资源的策略和基于身份的策略都适用于请求,那么AWS将检查所有策略中至少一个
Allow
。请参阅 用于策略评估逻辑


如果基于身份的策略、基于资源的策略或两者都允许某个操作,则AWS允许该操作。

根用户可以执行任何操作,不受策略限制。在进行这些实验时,您使用的是root用户还是IAM用户?我使用root用户进行这些操作。所以我相信这就是原因。如果你是唯一一个使用AWS帐户的人,那么使用root凭据就可以了。但是,一旦有多个用户,最好避免使用root帐户。相反,请创建一个具有管理员权限的IAM用户。因此,由于我正在使用root用户密钥进行这些操作,我相信root用户具有不受限制的权限,因此我可以上载?是的,您得到了。另外,避免使用根用户凭据。而是创建一个具有管理员权限的用户,并使用管理员用户的凭据。