バケットレベルの権限でPutObjectオペレーションを呼び出すとアクセスが拒否される


108

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

次に、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

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

回答:


204

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

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

私は変えなければなりませんでした

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

例から:

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

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

ここに画像の説明を入力してください


2
ありがとうございました!Amazon独自のドキュメントがオフになっている理由がわかりません。中止されたアップロードを適切にクリアできるように、「s3:AbortMultipartUpload」も含めることができます。
ハッシュカット

S3ポリシーのサンプルはここに置かdocs.aws.amazon.com/IAM/latest/UserGuide/...
E.Big

1
ところでそれは私にとってはうまくいきません。boto3の相互作用、s3fullaccessポリシーを使用していても、「PutObjectのAccessDenied」を取得
E.Big

2
私の場合、AWS cliを使用していますが、botoを使用しても問題はありません
Hardik Gajjar 2018

3
S3へのフルアクセスはありましたが、新しいパブリックACLのブロックとパブリックオブジェクトのアップロードがありません。ありがとうございました!
the_ccalderon

36

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

私の場合、私は(サーバーレスフレームワーク YMLで)やっていました:

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

の代わりに:

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

これ/*により、バケットARNの末尾にが追加されます。

お役に立てれば。


2
/ *付きのものが必要だった
cyrf

私にとってもそうでした
Visualspark

10

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バケット名に置き換えます。これが他の誰かに役立つことを願っています。


2
これにより、欠落した必須フィールドプリンシパル:(
Sameera K '21

2
また、次のエラーが発生します:必須フィールドがありませんプリンシパル
Karan Sharma

ymlでこれを行う方法
ichimaru

注意:これにより、IAMユーザー/ロールに、すべてのバケット内のキーをリストするアクセス権が付与されます。注意して使用してください。理想的にはこれまでの使用を避け"Resource": "*"ます。
Darian Moody

追加-「プリンシパル」:「*」、「効果」:「許可」の下に、必須フィールドが欠落している問題を解決する
meck373

9

これが他の人を助ける場合、私の場合は、CMKを使用していました(デフォルトのaws / s3キーを使用すると問題なく動作しました)

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


これは私を助けました。ありがとう!権限と同じエラーですが、実際には暗号化でした。
ビセンテロシャ

6

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

驚くばかり。権限をデフォルトの管理対象aws/s3キーから(KMSポリシーではなく)ロールにアタッチされたIAMポリシーにコピーしましたが、うまく機能します。私はKMS ARNSに対して必要なアクションのみでした:kms:Encryptkms:Decryptkms:ReEncrypt*kms:GenerateDataKey*kms:DescribeKey。次に、標準のS3権限のみです。
z0r

3

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

(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

上記の1つの投稿と同様に(管理者の資格情報を使用していた場合を除く)、S3のアップロードで50Mの大きなファイルを処理できます。

最初に私のエラーは:

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

multipart_thresholdを50Mを超えるように切り替えました

aws configure set default.s3.multipart_threshold 64MB

そして私は得ました:

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

バケットのパブリックアクセス設定を確認したところ、すべて許可されました。したがって、すべてのS3バケットのアカウントレベルパブリックアクセスをブロックできることがわかりました。

S3はアカウントレベルでパブリックACLをブロックできます


1

バケットにパブリックアクセスを設定しても、それが機能しない場合は、バッカーポリシーを編集し、以下を貼り付けます。

    {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl",
                "s3:GetObject",
                "s3:GetObjectAcl",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::yourbucketnamehere",
                "arn:aws:s3:::yourbucketnamehere/*"
            ],
            "Effect": "Allow",
            "Principal": "*"
        }
    ]
}

私のために働いて、私は新しいS3バケットを作成し、それを完全に公開しました。書き込み可能なput_objectですが、ACL =オプションを指定してput_objectを実行すると失敗します。変?
Doug F

0

S3暗号化用に独自の顧客管理KMS鍵を指定した場合は、フラグも指定する必要があります。--server-side-encryption aws:kms次に例を示します。

aws s3api put-object --bucket bucket --key objectKey --body /path/to/file --server-side-encryption aws:kms

フラグを追加しないと--server-side-encryption aws:kms、CLIにAccessDeniedエラーが表示されます


0

私はポリシーからLambdaへの完全なs3アクセスを許可することで問題を解決することができました。Lambdaの新しいロールを作成し、S3アクセスを完全に含むポリシーをアタッチします。

これがお役に立てば幸いです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.