Apa yang menyebabkan Access Ditolak saat menggunakan aws cli untuk mengunduh dari Amazon S3?

57

Saya benar-benar menggeliat di AWS mencoba mencari tahu apa yang saya lewatkan di sini. Saya ingin membuatnya agar pengguna IAM dapat mengunduh file dari bucket S3 - tanpa hanya membuat file tersebut sepenuhnya publik - tetapi saya mendapatkan akses ditolak. Jika ada yang bisa mengetahui apa yang salah, saya akan terpacu.

Apa yang telah saya lakukan sejauh ini:

  • Dibuat pengguna yang disebut pengguna-saya (misalnya)
  • Kunci akses yang dibuat untuk pengguna dan meletakkannya di ~ / .aws pada instance EC2
  • Membuat kebijakan bucket yang saya harapkan memberi akses untuk pengguna saya
  • Jalankan perintah aws s3 cp --profile my-user s3://my-bucket/thing.zip .

Kebijakan ember:

{
  "Id": "Policy1384791162970",
  "Statement": [
    {
      "Sid": "Stmt1384791151633",
      "Action": [
        "s3:GetObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::my-bucket/*",
      "Principal": {
        "AWS": "arn:aws:iam::111122223333:user/my-user"
      }
    }
  ]
}

Hasilnya adalah A client error (AccessDenied) occurred: Access Deniedmeskipun saya dapat mengunduh menggunakan perintah yang sama dan kunci akses default (akun root?).

Saya sudah mencoba menambahkan kebijakan pengguna juga. Meskipun saya tidak tahu mengapa itu perlu, saya pikir itu tidak ada salahnya, jadi saya lampirkan ini pada pengguna saya.

{
  "Statement": [
    {
      "Sid": "Stmt1384889624746",
      "Action": "s3:*",
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::my-bucket/*"
    }
  ]
}

Hasil yang sama.

Josh Gagnon
sumber

Jawaban:

39

Saya juga berjuang dengan ini, tetapi saya menemukan jawaban di sini https://stackoverflow.com/a/17162973/1750869 yang membantu menyelesaikan masalah ini untuk saya. Jawaban pengeposan di bawah ini.


Anda tidak harus membuka izin untuk semua orang. Gunakan kebijakan Bucket di bawah ini tentang sumber dan tujuan untuk menyalin dari satu ember di satu akun ke akun lain menggunakan pengguna IAM

Bucket untuk Menyalin dari - SourceBucket

Bucket untuk Menyalin ke - DestinationBucket

Sumber ID Akun AWS - XXXX – XXXX-XXXX

Sumber Pengguna IAM - src-iam-pengguna

Kebijakan di bawah ini berarti - pengguna IAM - XXXX – XXXX-XXXX: src – iam-user memiliki s3: ListBucket dan s3: Dapatkan hak istimewa ObB di SourceBucket / * dan s3: ListBucket dan s3: Hak istimewa PutObject di DestinationBucket / *

Di SourceBucket polisnya harus seperti:

{
"Id": "Policy1357935677554",
"Statement": [
    {
        "Sid": "Stmt1357935647218",
        "Action": [
            "s3:ListBucket"
        ],
        "Effect": "Allow",
        "Resource": "arn:aws:s3:::SourceBucket",
        "Principal": {"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/src–iam-user"}
    },
    {
        "Sid": "Stmt1357935676138",
        "Action": ["s3:GetObject"],
        "Effect": "Allow",
        "Resource": "arn:aws:s3::: SourceBucket/*",
        "Principal": {"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/src–iam-user"}
   }
]
}

Di DestinationBucket kebijakannya harus:

{
"Id": "Policy1357935677554",
"Statement": [
    {
        "Sid": "Stmt1357935647218",
        "Action": [
            "s3:ListBucket"
        ],
        "Effect": "Allow",
        "Resource": "arn:aws:s3::: DestinationBucket",
        "Principal": {"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/src–iam-user"}
    },
    {
        "Sid": "Stmt1357935676138",
        "Action": ["s3:PutObject"],
        "Effect": "Allow",
        "Resource": "arn:aws:s3::: DestinationBucket/*",
        "Principal": {"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/src–iam-user"}
   }
]
}

perintah yang akan dijalankan adalah s3cmd cp s3://SourceBucket/File1 s3://DestinationBucket/File1

Sergio
sumber
1
Ya Tuhan, kau pahlawanku. Saya baru saja kehilangan izin ListBucket di level bucket. Saya masih tidak tahu mengapa saya perlu ls ember untuk cp objek dari itu, tapi tidak apa-apa. Mungkin itu hanya kekhasan dari menggunakan perintah aws?
Josh Gagnon
Ya, ini sangat aneh. Anda akan berpikir memiliki kebijakan tunggal s3: * (namun tidak aman yang mungkin) akan cukup untuk pengujian kewarasan.
Sergio
fml, 2 hari terbuang untuk izin ListBucket itu. tangkapan bagus
chaqke
Menghabiskan banyak waktu .. Ini adalah jawaban yang dibutuhkan. ListBucket - bucketname, GetObject - bucketname / *
rsmoorthy
12

Ketika saya menghadapi masalah yang sama ternyata AWS membutuhkan enkripsi sisi server untuk diaktifkan. Jadi perintah berikut ini berhasil bagi saya:

aws s3 cp test.txt s3://my-s3-bucket --sse AES256
zjor
sumber
3
Terima kasih! Dalam kasus saya itu --sse aws:kmsmenggunakan ember "default" ...
Michael Yoo
Jika Anda menggunakan kunci KMS non-standar, Anda harus meneruskannya juga: --sse-kms-key-id 0123-abc-etc Namun, bagian yang tidak jelas adalah bahwa untuk menggunakan kunci KMS Anda sendiri, Anda harus memiliki izin IAM kms:GenerateDataKeyatau Anda masih akan mendapatkan akses ditolak.
digarok
Pertanyaannya adalah tentang Unduhan .. Anda membuat unggahan ke S3 terenkripsi, karenanya persyaratan untuk kuncinya.
Ilhicas
4

Saya tidak akan merekomendasikan opsi 'Pengguna AWS mana pun yang diautentikasi' yang disebutkan oleh James.

Dengan melakukannya, tambahkan ACL level-bucket yang memungkinkan akun AWS apa pun (bukan hanya pengguna IAM Anda) untuk membuat daftar / menghapus / memodifikasi-acl untuk bucket tersebut.

yaitu baca / tulis publik untuk siapa saja dengan akun aws.

Andrew
sumber
Sudahkah Anda menguji ini? Saya mendapat kesan bahwa akun AWS sebenarnya berarti entitas apa pun yang menyertai organisasi saya - yaitu pengguna, instance EC2, peran IAM, tetapi bukan seseorang dari akun yang berbeda. Saya bisa saja salah, dan saya akan mengedit kontribusi saya dan dengan cepat mengaudit ember saya jika itu masalahnya. Terima kasih.
James Dunmore
1
Ya. Penerima "Pengguna yang Diotentikasi" dalam S3 ACL berarti semua akun AWS. Ini menegakkan permintaan yang ditandatangani, tetapi tidak lebih. Berikut referensi: tautan
Andrew
3

Saya berhasil memperbaiki ini tanpa harus menulis kebijakan - dari konsol S3 (web ui) saya memilih ember dan pada tab izin pilih "Pengguna AWS yang Diotentikasi" dan tandai semua kotak.

UPDATE: seperti yang ditunjukkan dalam komentar "Setiap Pengguna AWS yang Diotentikasi" bukan hanya pengguna di akun Anda itu semua adalah pengguna yang diautentikasi AWS, harap gunakan dengan hati-hati

James Dunmore
sumber
Saya membayangkan itu menciptakan kebijakan untuk Anda. Centang semua kotak akan membuat Anda ListBucket, dll. Dan banyak lagi.
Josh Gagnon
Saya yakin itu - Saya hanya tahu bahwa kebijakan menulis bisa menyebalkan, kotak centang itu mungkin memberi Anda sedikit lebih banyak tetapi perbaikan cepat yang bagus
James Dunmore
2

Bahkan jika kebijakan IAM Anda diatur dengan benar, Anda masih bisa mendapatkan kesalahan seperti An error occurred (AccessDenied) when calling the <OPERATION-NAME> operation: Access Deniedkarena persyaratan MFA (Multi-Factor Authentication) pada kredensial Anda. Ini dapat membuat Anda lengah karena jika Anda sudah masuk ke konsol AWS akan tampak bahwa kredensial Anda berfungsi dengan baik, dan izin menolak pesan kesalahan dari aws cli tidak terlalu membantu.

Ada beberapa instruksi bagus tentang cara mengatur MFA dengan aws cli:

Pada dasarnya, Anda perlu mendapatkan alamat perangkat MFA Anda, dan mengirimkannya dengan kode dari perangkat Anda untuk mendapatkan token sementara.

Mark Chackerian
sumber
Anda menyelamatkan teman hariku!
shintaroid
Yas, itulah alasannya! Mengapa AWS tidak menunjukkan alasan ini di output?
tommy.qichang
0

Saya hanya pergi pada webUI dan mengklik pada ember, lalu pergi ke izin dan kemudian pergi ke kebijakan. Ketika saya membukanya saya hanya mengklik delete. Saya melakukan ini karena saya pikir itu konfigurasi juga.

Saya kembali ke halaman s3 utama, lalu mengklik ember dan berusaha menghapusnya dan berhasil.

bahkan ketika saya melakukannya dengan aws-cli menggunakan

$ aws s3 rb s3://bucket-name --force  

Bagaimanapun, itu adalah hal yang bekerja untuk saya. Kebijakan tentang izin menghentikan Anda dari menghapus ember.

Spencer Davis
sumber
0

Setelah saya mendapatkan kesalahan ini dengan hanya mencoba menjalankan:

aws s3 cp s3://[bucketName]/[fileName] .

dalam folder di mana saya tidak memiliki izin. Ini konyol, tapi pastikan Anda adalah pemilik folder tempat Anda berada sebelum pindah!

Jeff Diederiks
sumber
0

Masalah muncul ketika Anda memasukkan nama sumber daya atau objek yang tidak valid. Saya memiliki masalah yang sama dengan boto3 (dalam kasus saya itu adalah nama ember tidak valid)

yunus
sumber