AccessDenied untuk ListObjects untuk S3 bucket ketika izin s3: *

134

Saya mendapatkan:

Terjadi kesalahan (AccessDenied) saat memanggil operasi ListObjects: Access Ditolak

Ketika saya mencoba untuk mendapatkan folder dari bucket S3 saya.

Menggunakan perintah ini:

aws s3 cp s3://bucket-name/data/all-data/ . --recursive

Izin IAM untuk bucket terlihat seperti ini:

{
"Version": "version_id",
"Statement": [
    {
        "Sid": "some_id",
        "Effect": "Allow",
        "Action": [
            "s3:*"
        ],
        "Resource": [
            "arn:aws:s3:::bucketname/*"
        ]
    }
] }

Apa yang harus saya ubah untuk dapat copydan lsberhasil?

pengguna1411335
sumber
1
Dalam kasus saya, saya telah mengkonfigurasi awsuntuk satu pengguna dan menggunakannya di dalam skrip bash yang disebut cronjob dari pengguna lain, yang berarti kunci akses dan token akses salah / tidak disetel. Solusi saya adalah langsung memasukkan kredensial ( AWS_ACCESS_KEY_IDdan AWS_SECRET_ACCESS_KEY) ke file skrip bash saya seperti yang dijelaskan di sini .
Uwe Keim

Jawaban:

199

Anda telah memberikan izin untuk melakukan perintah pada objek di dalam bucket S3, tetapi Anda belum memberikan izin untuk melakukan tindakan apa pun pada bucket itu sendiri.

Mengubah sedikit kebijakan Anda akan terlihat seperti ini:

{
  "Version": "version_id",
  "Statement": [
    {
        "Sid": "some_id",
        "Effect": "Allow",
        "Action": [
            "s3:*"
        ],
        "Resource": [
            "arn:aws:s3:::bucketname",
            "arn:aws:s3:::bucketname/*"
        ]
    }
  ] 
}

Namun, itu mungkin memberi lebih banyak izin daripada yang dibutuhkan. Mengikuti praktik terbaik AWS IAM dari Pemberian Least Privilege akan terlihat seperti ini:

{
  "Version": "2012-10-17",
  "Statement": [
      {
          "Effect": "Allow",
          "Action": [
              "s3:ListBucket"
          ],
          "Resource": [
              "arn:aws:s3:::bucketname"
          ]
      },
      {
          "Effect": "Allow",
          "Action": [
              "s3:GetObject"
          ],
          "Resource": [
              "arn:aws:s3:::bucketname/*"
          ]
      }
  ]
}
Markus B
sumber
40
Ini adalah daftar tindakan yang terlalu luas. Untuk hak daftar dan salin, apa yang Anda sarankan adalah tindakan yang diperlukan.
dom farr
6
@domfarr Saya hanya melakukan seminimal mungkin untuk menyesuaikan kebijakan OP untuk membuatnya bekerja untuknya. Jika Anda memiliki pertanyaan tertentu, Anda harus mempostingnya sebagai pertanyaan terpisah di situs ini dan bukan memberi tag ke yang ini dengan komentar. Meskipun harus sangat mudah untuk melihat daftar tindakan S3 dan membangun kebijakan yang Anda inginkan.
Mark B
4
Saya tidak menandai. OP memang meminta apa yang dibutuhkan untuk salinan dan ls. Kurangnya level bucket dan termasuk, tetapi Anda tidak menyesuaikan Tindakan ... maka komentar saya.
dom farr
1
Mungkin langsung menetapkan peran yang sesuai untuk EC3 harus berhasil. :)
ChikuMiku
6
Juga pastikan untuk tidak menulis "Resource": [ "arn:aws:s3:::bucketname/", "arn:aws:s3:::bucketname/*" ]seperti yang saya lakukan (yaitu Anda hanya ingin tebasan sebelum *) - perlu waktu 4 jam untuk menyadari kesalahan ini menyebabkan semua listObjectspanggilan saya gagal ...
Dániel Kis-Nagy
35

Jika Anda ingin menyalin semua objek s3 bucket menggunakan perintah "aws s3 cp s3: // bucket-name / data / all-data /. --Recursive" seperti yang Anda sebutkan, berikut adalah kebijakan aman dan minimal untuk melakukan itu:

{
  "Version": "2012-10-17",
  "Statement": [
      {
          "Effect": "Allow",
          "Action": [
              "s3:ListBucket"
          ],
          "Resource": [
              "arn:aws:s3:::bucket-name"
          ],
          "Condition": {
              "StringLike": {
                  "s3:prefix": "data/all-data/*"
              }
          }
      },
      {
          "Effect": "Allow",
          "Action": [
              "s3:GetObject"
          ],
          "Resource": [
              "arn:aws:s3:::bucket-name/data/all-data/*"
          ]
      }
  ]
}

Pernyataan pertama dalam kebijakan ini memungkinkan untuk mendaftarkan objek di dalam sub direktori ember tertentu. Sumber daya perlu menjadi arn dari bucket S3, dan untuk membatasi daftar hanya pada sub-direktori dalam bucket tersebut Anda dapat mengedit nilai "s3: prefix".

Pernyataan kedua dalam kebijakan ini memungkinkan untuk memasukkan benda ke dalam ember di sub-direktori tertentu. Ini berarti bahwa apa pun di dalam jalur "s3: // bucket-name / data / all-data /" Anda akan dapat menyalin. Ketahuilah bahwa ini tidak memungkinkan Anda untuk menyalin dari jalur induk seperti "s3: // bucket-name / data /".

Solusi ini khusus untuk membatasi penggunaan perintah AWS CLI; jika Anda perlu membatasi akses S3 melalui konsol AWS atau API, maka diperlukan lebih banyak kebijakan. Saya sarankan melihat di sini: https://aws.amazon.com/blogs/security/writing-iam-policies-grant-access-to-user-specific-folders-in-an-amazon-s3-bucket/ .

Masalah serupa dengan ini dapat ditemukan di sini yang menuntun saya ke solusi yang saya berikan. https://github.com/aws/aws-cli/issues/2408

Semoga ini membantu!

Robert Smith
sumber
1
Sebenarnya, sepertinya Anda dapat membatasi ListBucketke subkunci: stackoverflow.com/a/35952877/89218
paleozogt
Terima kasih telah memberi tahu saya, saya akan mencoba ini pada beberapa proyek saya saat ini!
Robert Smith
Terima kasih. Tidak pernah terpikir bahwa jawaban yang tidak pertama dapat membantu saya
Vyacheslav Tsivina
Memang mungkin, aws.amazon.com/blogs/security/…
citynorman
Saya telah mengedit jawaban untuk memasukkan ketentuan untuk membatasi daftar objek yang berada di bawah sub-folder tertentu. Terima kasih untuk bantuannya!
Robert Smith
8

Anda harus menentukan Sumberdaya untuk bucket melalui "arn: aws: 3 ::: bucketname" atau "arn: aws: 3 ::: bucketname *". Yang terakhir lebih disukai karena memungkinkan manipulasi pada objek ember juga. Perhatikan tidak ada garis miring!

Objek daftar adalah operasi di Bucket. Karenanya, tindakan "s3: ListBucket" diperlukan. Menambahkan objek ke Bucket adalah operasi di Object. Oleh karena itu, tindakan "s3: PutObject" diperlukan. Tentu saja, Anda mungkin ingin menambahkan tindakan lain sesuai kebutuhan.

{
"Version": "version_id",
"Statement": [
    {
        "Sid": "some_id",
        "Effect": "Allow",
        "Action": [
            "s3:ListBucket",
            "s3:PutObject"
        ],
        "Resource": [
            "arn:aws:s3:::bucketname*"
        ]
    }
] 
}
marzhaev
sumber
21
masalahnya arn:aws:s3:::bucketname*adalah bahwa ia juga memungkinkan akses kearn:aws:s3:::bucketname-with-suffix
Guss
1
Seperti yang tertulis, ini adalah kebijakan yang buruk; jangan gunakan itu. Harus memungkinkan s3: ListBucket terhadap arn: aws: s3 ::: bucketname dan s3: PutObject terhadap arn: aws: s3 ::: bucketname / *
jarmod
7

Saya tidak dapat mengakses S3 karena

  • pertama saya mengkonfigurasi akses kunci pada instance (tidak mungkin untuk melampirkan peran setelah peluncuran itu)
  • lupakan itu selama beberapa bulan
  • peran terlampir misalnya
  • mencoba mengakses. Kunci yang dikonfigurasi memiliki prioritas lebih tinggi daripada peran, dan akses ditolak karena pengguna tidak diberikan izin S3 yang diperlukan.

Solusi:, rm -rf .aws/credentialslalu awsgunakan peran.

Putnik
sumber
1
Persis masalah yang sama. Gejala dari hal ini adalah satu pengguna dapat mengakses hal-hal yang tidak dapat dilakukan oleh pengguna lain pada simpul EC2 yang sama.
Doc Kaos
6

Saya mendapat kesalahan yang sama ketika menggunakan kebijakan seperti di bawah ini, walaupun saya memiliki "s3: ListBucket" untuk s3: operasi ListObjects.

{
"Version": "2012-10-17",
"Statement": [
    {
        "Action": [
            "s3:ListBucket",
            "s3:GetObject",
            "s3:GetObjectAcl"
        ],
        "Resource": [
            "arn:aws:s3:::<bucketname>/*",
            "arn:aws:s3:::*-bucket/*"
        ],
        "Effect": "Allow"
    }
  ]
 }

Kemudian saya memperbaikinya dengan menambahkan satu baris "arn: aws: s3 ::: bucketname"

{
"Version": "2012-10-17",
"Statement": [
    {
        "Action": [
            "s3:ListBucket",
            "s3:GetObject",
            "s3:GetObjectAcl"
        ],
        "Resource": [
             "arn:aws:s3:::<bucketname>",
            "arn:aws:s3:::<bucketname>/*",
            "arn:aws:s3:::*-bucket/*"
        ],
        "Effect": "Allow"
    }
 ]
}
Gabriel Wu
sumber
4

Saya berpikir kesalahannya adalah karena tindakan "s3: ListObjects" tetapi saya harus menambahkan tindakan "s3: ListBucket" untuk menyelesaikan masalah "AccessDenied untuk ListObjects untuk bucket S3"

Sudhakar Naidu
sumber
4

Saya menghadapi masalah yang sama. Saya baru saja menambahkan konfigurasi kredensial:

aws_access_key_id = your_aws_access_key_id
aws_secret_access_key = your_aws_secret_access_key

ke "~ / .aws / credentials" + restart terminal untuk profil default.

Dalam kasus multi profil --profile arg perlu ditambahkan:

aws s3 sync ./localDir s3://bucketName --profile=${PROFILE_NAME}

tempat PROFILE_NAME :

.bash_profile ( or .bashrc) -> export PROFILE_NAME="yourProfileName"

Info lebih lanjut tentang cara mengkonfigurasi kredensial dan multi profil dapat ditemukan di sini

Ihor Pavlyk
sumber
2

Saya mencoba yang berikut ini:

aws s3 ls s3.console.aws.amazon.com/s3/buckets/{bucket name}

Ini memberi saya kesalahan:

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

Menggunakan formulir ini berhasil:

aws s3 ls {bucket name}
Henry
sumber
0

Saya menambahkan jawaban dengan arah yang sama dengan jawaban yang diterima tetapi dengan perbedaan kecil (penting) dan menambahkan lebih banyak detail.

Pertimbangkan konfigurasi di bawah ini:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:ListBucket"],
      "Resource": ["arn:aws:s3:::<Bucket-Name>"]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:DeleteObject"
      ],
      "Resource": ["arn:aws:s3:::<Bucket-Name>/*"]
    }
  ]
}

Kebijakan hibah program write-delete akses dan dipisahkan menjadi dua bagian:
The ListBuckettindakan menyediakan akses pada ember tingkat dan lainnya PutObject/DeleteObjecttindakan memerlukan izin pada benda di dalam ember.

Path menetapkan unsur Sumber Daya pertama arn:aws:s3:::<Bucket-Name>untuk ListBuckettindakan sehingga aplikasi bisa daftar semua objek dalam ember.

Elemen Sumber Daya kedua menentukan arn:aws:s3:::<Bucket-Name>/*untuk PutObject, dan DeletObjecttindakan sehingga aplikasi dapat menulis atau menghapus objek apa pun dalam ember.

Pemisahan menjadi dua 'arn' yang berbeda penting dari alasan keamanan untuk menentukan izin tingkat butiran halus dan tingkat objek.

Perhatikan bahwa jika saya telah menentukan hanya GetObjectdi blok 2 apa yang akan terjadi adalah bahwa dalam kasus akses terprogram saya akan menerima kesalahan seperti:

Upload failed: <file-name> to <bucket-name>:<path-in-bucket> An error occurred (AccessDenied) when calling the PutObject operation: Access Denied.

RtmY
sumber
-1

Berlari ke masalah yang sama, bagi saya masalahnya adalah bahwa saya memiliki kunci AWS yang berbeda di bash_profile saya.

Saya menjawab pertanyaan serupa di sini: https://stackoverflow.com/a/57317494/11871462

Jika Anda memiliki kunci AWS yang bertentangan di bash_profile Anda, AWS CLI secara default memilih ini.

Varun Tandon
sumber
-1

Saya memiliki masalah ini, kebutuhan saya, saya ingin mengizinkan pengguna untuk menulis ke jalur tertentu

{
            "Sid": "raspiiotallowspecificBucket",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::<bucketname>/scripts",
                "arn:aws:s3:::<bucketname>/scripts/*"
            ]
        },

dan masalah terpecahkan dengan perubahan ini

{
            "Sid": "raspiiotallowspecificBucket",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::<bucketname>",
                "arn:aws:s3:::<bucketname>/*"
            ]
        },
Ameen
sumber