Mendapatkan Akses Ditolak saat memanggil operasi PutObject dengan izin level bucket

108

Saya mengikuti contoh di http://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_examples.html#iam-policy-example-s3 untuk cara memberikan akses pengguna hanya ke satu keranjang.

Saya kemudian menguji konfigurasi menggunakan plugin W3 Total Cache Wordpress. Tes gagal.

Saya juga mencoba mereproduksi masalah menggunakan

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

dan itu gagal dengan

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

Mengapa saya tidak dapat mengunggah ke keranjang saya?

Greg
sumber

Jawaban:

204

Untuk menjawab pertanyaan saya sendiri:

Contoh kebijakan memberikan akses PutObject, tetapi saya juga harus memberikan akses PutObjectAcl.

Saya harus berubah

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

dari contoh menjadi:

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

Anda juga perlu memastikan bahwa keranjang Anda dikonfigurasi untuk klien agar dapat menyetel ACL yang dapat diakses publik dengan menghapus centang pada dua kotak berikut:

masukkan deskripsi gambar di sini

Greg
sumber
2
Terima kasih! Tidak yakin mengapa dokumentasi Amazon sendiri tidak aktif. Anda mungkin ingin menyertakan "s3: AbortMultipartUpload" juga sehingga unggahan yang dibatalkan dapat dihapus dengan benar.
Hashcut
sampel untuk kebijakan S3 ditempatkan di sini docs.aws.amazon.com/IAM/latest/UserGuide/…
E. Big
1
btw itu tidak berhasil untuk saya. interaksi boto3, bahkan dengan kebijakan s3fullaccess, saya mendapatkan "AccessDenied for PutObject"
E.Big
2
Dalam kasus saya ini bekerja dengan AWS cli, tetapi tidak sesuai dengan boto
Hardik Gajjar
3
Saya memiliki akses penuh S3 tetapi kehilangan Blokir ACL publik baru dan mengunggah objek publik. Terima kasih!
the_ccalderon
37

Saya mengalami masalah serupa. Saya tidak menggunakan barang ACL, jadi saya tidak perlu s3:PutObjectAcl.

Dalam kasus saya, saya melakukan (dalam Serverless Framework YML):

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

Dari pada:

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

Yang menambahkan a /*ke akhir ARN keranjang.

Semoga ini membantu.

movermeyer
sumber
2
Saya membutuhkannya dengan / *
cyrf
ini juga terjadi pada saya
Visualspark
10

Saya hanya membenturkan kepala ke dinding hanya mencoba agar unggahan S3 berfungsi dengan file besar. Awalnya kesalahan saya adalah:

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

Kemudian saya mencoba menyalin file yang lebih kecil dan mendapatkan:

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

Saya dapat mencantumkan objek dengan baik, tetapi saya tidak dapat melakukan apa pun meskipun saya memiliki s3:*izin dalam kebijakan Peran saya. Saya akhirnya mengubah kebijakan menjadi ini:

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

Sekarang saya dapat mengunggah file apa pun. Ganti my-bucketdengan nama keranjang Anda. Saya harap ini membantu orang lain yang mengalami ini.

Ken J
sumber
2
Ini memberikan: Kepala bidang wajib tidak ada :(
Sameera K
2
Saya juga mendapatkan kesalahan berikut: Kepala bidang wajib tidak ada
Karan Sharma
bagaimana Anda melakukan ini di yml
ichimaru
Hati-hati: ini akan memberikan akses kepada Pengguna / peran IAM Anda untuk mencantumkan kunci di semua bucket. Gunakan dengan hati-hati; Idealnya hindari pernah menggunakan "Resource": "*".
Darian Moody
Tambahkan - "Principal": "*", - di bawah "Effect": "Allow", untuk menyelesaikan masalah dengan bidang wajib yang tidak ada
meck373
9

Jika ini membantu orang lain, dalam kasus saya, saya menggunakan CMK (berfungsi dengan baik menggunakan kunci default aws / s3)

Saya harus masuk ke definisi kunci enkripsi saya di IAM dan menambahkan pengguna terprogram yang masuk ke boto3 ke daftar pengguna yang "dapat menggunakan kunci ini untuk mengenkripsi dan mendekripsi data dari dalam aplikasi dan saat menggunakan layanan AWS yang terintegrasi dengan KMS".

PeskyGnat
sumber
Ini membantu saya. Terima kasih! Kesalahan yang sama seperti perizinan, tetapi sebenarnya enkripsi.
Vicente Rocha
6

Saya mengalami masalah serupa saat mengunggah ke bucket S3 yang dilindungi dengan enkripsi KWS. Saya memiliki kebijakan minimal yang memungkinkan penambahan objek di bawah kunci s3 tertentu.

Saya perlu menambahkan izin KMS berikut ke kebijakan saya untuk mengizinkan peran meletakkan objek di keranjang. (Mungkin sedikit lebih dari yang diwajibkan)

{
    "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>/*"
            ]
        }
    ]
}
Spangen
sumber
Hebat. Saya menyalin izin dari aws/s3kunci terkelola default ke kebijakan IAM yang dilampirkan ke peran (bukan dalam kebijakan KMS), dan berfungsi dengan baik. Satu-satunya tindakan yang saya butuhkan terhadap KMS Arns adalah: kms:Encrypt, kms:Decrypt, kms:ReEncrypt*, kms:GenerateDataKey*, kms:DescribeKey. Kemudian hanya izin S3 standar.
z0r
3

Saya mendapatkan pesan kesalahan yang sama untuk kesalahan yang saya buat: Pastikan Anda menggunakan s3 uri yang benar seperti: s3://my-bucket-name/

(Jika nama-ember-saya ada di root aws s3 Anda jelas)

Saya bersikeras karena saat menyalin menempelkan ember s3 dari browser Anda, Anda mendapatkan sesuatu seperti https://s3.console.aws.amazon.com/s3/buckets/my-bucket-name/?region=my-aws-regiontab=overview

Jadi saya membuat kesalahan untuk menggunakan s3://buckets/my-bucket-nameyang menimbulkan:

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

ramah
sumber
1

Bagi saya, saya menggunakan kunci autentikasi yang kedaluwarsa. Menghasilkan yang baru dan booming.

Mark Jackson
sumber
1

Mirip dengan satu posting di atas, (kecuali saya menggunakan kredensial admin) untuk mendapatkan unggahan S3 agar berfungsi dengan file 50 juta besar.

Awalnya kesalahan saya adalah:

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

Saya mengganti multipart_threshold menjadi di atas 50M

aws configure set default.s3.multipart_threshold 64MB

dan saya mendapat:

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

Saya memeriksa setelan akses publik bucket dan semuanya diizinkan. Jadi saya menemukan bahwa akses publik dapat diblokir di tingkat akun untuk semua bucket S3 :

S3 dapat memblokir ACL publik di tingkat akun

dovka
sumber
1

Jika Anda telah menyetel akses publik untuk bucket dan jika masih tidak berfungsi, edit kebijakan bucket dan tempel berikut ini:

    {
    "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": "*"
        }
    ]
}
Den Pat
sumber
Bekerja untuk saya, saya membuat bucket S3 baru, menjadikannya publik sepenuhnya. Put_object-nya bisa ditulisi, tetapi gagal saat melakukan put_object w / ACL = option. Aneh?
Doug F
0

Jika Anda telah menentukan kunci KMS yang dikelola pelanggan Anda sendiri untuk enkripsi S3, Anda juga perlu memberikan tanda --server-side-encryption aws:kms, misalnya:

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

Jika Anda tidak menambahkan bendera --server-side-encryption aws:kms, cli akan menampilkan AccessDeniedkesalahan

Benjamin Slabbert
sumber
0

Saya dapat menyelesaikan masalah dengan memberikan akses s3 lengkap ke Lambda dari kebijakan. Buat peran baru untuk Lambda dan lampirkan kebijakan dengan Akses S3 lengkap padanya.

Semoga ini bisa membantu.

bajaj dalam
sumber
0

Saya mengalami masalah yang sama. Keranjang saya bersifat pribadi dan memiliki enkripsi KMS. Saya dapat menyelesaikan masalah ini dengan memasukkan izin KMS tambahan ke dalam peran tersebut. Daftar berikut adalah sekumpulan peran minimum yang diperlukan.

{
  "Version": "2012-10-17",
  "Statement": [
    {
        "Sid": "AllowAttachmentBucketWrite",
        "Effect": "Allow",
        "Action": [
            "s3:PutObject",
            "kms:Decrypt",
            "s3:AbortMultipartUpload",
            "kms:Encrypt",
            "kms:GenerateDataKey"
        ],
        "Resource": [
            "arn:aws:s3:::bucket-name/*",
            "arn:aws:kms:kms-key-arn"
        ]
    }
  ]
}

Referensi: https://aws.amazon.com/premiumsupport/knowledge-center/s3-large-file-encryption-kms-key/

Aditya Kar
sumber