web-dev-qa-db-ja.com

バケットレベルのアクセス許可でPutObject操作を呼び出すときにアクセスが拒否されました

http://docs.aws.Amazon.com/IAM/latest/UserGuide/access_policies_examples.html#iam-policy-example-s の例に従って、ユーザーにアクセスを許可する方法について1つのバケット。

次に、W3 Total Cache Wordpressプラグインを使用して構成をテストしました。テストは失敗しました。

私も問題を再現しようとしました

aws s3 cp --acl=public-read --cache-control='max-age=604800, public' ./test.txt s3://my-bucket/

そしてそれは失敗しました

upload failed: ./test.txt to s3://my-bucket/test.txt A client error (AccessDenied) occurred when calling the PutObject operation: Access Denied

バケットにアップロードできないのはなぜですか?

62
Greg

私自身の質問に答えるには:

サンプルポリシーはPutObjectアクセスを許可しましたが、PutObjectAclアクセスも許可する必要がありました。

変えなければならなかった

"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject"

例から:

"s3:PutObject",
"s3:PutObjectAcl",
"s3:GetObject",
"s3:GetObjectAcl",
"s3:DeleteObject"

また、次の2つのボックスのチェックを外して、クライアントがパブリックにアクセス可能なACLを設定するようにバケットが設定されていることを確認する必要があります。

enter image description here

125
Greg

私は同様の問題を抱えていました。 ACLを使用していないので、s3:PutObjectAclは必要ありませんでした。

私の場合、私はやっていた( Serverless Framework YML):

- Effect: Allow
  Action:
    - s3:PutObject
  Resource: "arn:aws:s3:::MyBucketName"

の代わりに:

- Effect: Allow
  Action:
    - s3:PutObject
  Resource: "arn:aws:s3:::MyBucketName/*"

/*をバケットARNの最後に追加します。

お役に立てれば。

24
movermeyer

S3アップロードを大きなファイルで動作させるために、壁に頭をぶつけただけです。最初は私のエラーは:

An error occurred (AccessDenied) when calling the CreateMultipartUpload operation: Access Denied

次に、より小さいファイルをコピーしてみました:

An error occurred (AccessDenied) when calling the PutObject operation: Access Denied

オブジェクトを一覧表示することはできましたが、役割ポリシーにs3:*権限があったとしても、他に何もできませんでした。私は最終的にこれにポリシーを作り直しました:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObject"
            ],
            "Resource": "arn:aws:s3:::my-bucket/*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucketMultipartUploads",
                "s3:AbortMultipartUpload",
                "s3:ListMultipartUploadParts"
            ],
            "Resource": [
                "arn:aws:s3:::my-bucket",
                "arn:aws:s3:::my-bucket/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": "*"
        }
    ]
}

これで、任意のファイルをアップロードできます。 my-bucketをバケット名に置き換えます。これが他の誰かに役立つことを願っています。

6
Ken J

これが他の誰かに役立つ場合、私の場合、私はCMKを使用していました(デフォルトのaws/s3キーを使用してうまく機能しました)

IAMで暗号化キーの定義に移動し、boto3にログインしたプログラムユーザーを「このキーを使用してアプリケーション内から、およびKMSと統合されたAWSサービスを使用するときにデータを暗号化および復号化できる」ユーザーのリストに追加する必要がありました。

3
PeskyGnat

KWS暗号化で保護されたS3バケットへのアップロードでも同様の問題がありました。特定のs3キーの下にオブジェクトを追加できる最小限のポリシーがあります。

ロールがオブジェクトをバケットに入れることを許可するには、ポリシーに次のKMSアクセス許可を追加する必要がありました。 (厳密に必要とされるよりもわずかに多い場合があります)

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "kms:ListKeys",
                "kms:GenerateRandom",
                "kms:ListAliases",
                "s3:PutAccountPublicAccessBlock",
                "s3:GetAccountPublicAccessBlock",
                "s3:ListAllMyBuckets",
                "s3:HeadBucket"
            ],
            "Resource": "*"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "kms:ImportKeyMaterial",
                "kms:ListKeyPolicies",
                "kms:ListRetirableGrants",
                "kms:GetKeyPolicy",
                "kms:GenerateDataKeyWithoutPlaintext",
                "kms:ListResourceTags",
                "kms:ReEncryptFrom",
                "kms:ListGrants",
                "kms:GetParametersForImport",
                "kms:TagResource",
                "kms:Encrypt",
                "kms:GetKeyRotationStatus",
                "kms:GenerateDataKey",
                "kms:ReEncryptTo",
                "kms:DescribeKey"
            ],
            "Resource": "arn:aws:kms:<MY-REGION>:<MY-ACCOUNT>:key/<MY-KEY-GUID>"
        },
        {
            "Sid": "VisualEditor2",
            "Effect": "Allow",
            "Action": [
            <The S3 actions>
            ],
            "Resource": [
                "arn:aws:s3:::<MY-BUCKET-NAME>",
                "arn:aws:s3:::<MY-BUCKET-NAME>/<MY-BUCKET-KEY>/*"
            ]
        }
    ]
}
3
Spangen

私が犯した間違いに対して同じエラーメッセージが表示されていました:s3://my-bucket-name/などの正しいs3 uriを使用していることを確認してください

(my-bucket-nameが明らかにaws s3のルートにある場合)

ブラウザからs3バケットをコピーして貼り付けると、https://s3.console.aws.Amazon.com/s3/buckets/my-bucket-name/?region=my-aws-regiontab=overviewのようなものが表示されるためです

したがって、私はs3://buckets/my-bucket-nameを使用するミスを犯しました:

An error occurred (AccessDenied) when calling the PutObject operation: Access Denied

1
François