Saya baru-baru ini mulai menggunakan Amazon Elasticsearch Service baru dan sepertinya saya tidak dapat mengetahui kebijakan akses yang saya perlukan sehingga saya hanya dapat mengakses layanan dari instans EC2 saya yang memiliki peran IAM khusus yang ditetapkan padanya.
Berikut adalah contoh kebijakan akses yang saat ini saya tetapkan untuk domain ES:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::[ACCOUNT_ID]:role/my_es_role",
]
},
"Action": "es:*",
"Resource": "arn:aws:es:us-east-1:[ACCOUNT_ID]:domain/[ES_DOMAIN]/*"
}
]
}
Tapi seperti yang saya katakan, ini tidak berhasil. Saya masuk ke instans EC2 (yang memiliki my_es_role
peran yang melekat padanya) dan mencoba menjalankan panggilan curl sederhana di titik akhir "https: //*.es.amazonaws.com", saya mendapatkan kesalahan berikut:
{"Message": "Pengguna: anonim tidak diizinkan melakukan: es: ESHttpDapatkan sumber daya: arn: aws: es: us-east-1: [ACCOUNT_ID]: domain / [ES_DOMAIN] /“}
Adakah yang tahu apa yang harus saya ubah dalam kebijakan akses agar ini berfungsi?
Jawaban:
Anda dapat mengunci akses ke IAM saja, tetapi bagaimana Anda akan melihat Kibana di browser Anda? Anda dapat mengatur proxy ( lihat modul Inti dan / atau NPM ) atau mengaktifkan IAM dan akses berbasis IP untuk melihat hasil.
Saya bisa mendapatkan akses IP terbatas akses IAM dengan Kebijakan Akses berikut. Perhatikan bahwa urutannya penting: Saya tidak bisa membuatnya berfungsi dengan pernyataan berbasis IP sebelum pernyataan IAM.
Instans EC2 saya memiliki profil instans dengan
arn:aws:iam::aws:policy/AmazonESFullAccess
kebijakan. Logstash harus menandatangani permintaan menggunakan plugin output logstash-output-amazon-es . Logstash yang berjalan di instans EC2 saya menyertakan bagian keluaran seperti ini:Saya dapat mengakses Kibana dari dua IP dalam kebijakan akses (192.168.1.0 dan 192.168.1.1).
sumber
aws:SourceIp
di contoh saya dimaksudkan untuk menjadi IP workstation pribadi Anda sehingga Anda dapat menggunakan Kibana. Akses terbatas IAM memungkinkan satu atau beberapa instans EC2 untuk menulis ke Elasticsearch tanpa mengkhawatirkan IP mana yang termasuk dalam instans atau blok CIDR tertentu.aws:SourceIp
dari nilai skalar ke array, seperti pada contoh yang Anda berikan. (Saya notasi CIDR, jika itu membantu orang lain.) Seluruh proses pengaturan kebijakan untuk AWS ES tidak akan terlalu membuat frustrasi jika setiap perubahan kebijakan tidak menempatkan cluster ke dalam status "pemrosesan" misterius selama 20 menit karena polis itu dengan hati-hati ditorehkan pada loh batu, atau apa pun yang mereka lakukan.Menurut dokumen AWS dan saat Anda (dan saya) baru saja menguji, Anda tidak dapat membatasi akses ke domain AWS ES untuk peran / akun / pengguna / ... dan cukup cURL!
Jadi pada dasarnya Anda memiliki dua solusi:
Menandatangani permintaan Anda mungkin merupakan solusi terbaik jika Anda ingin mempertahankan kebijakan akses sebagaimana adanya (yang lebih fleksibel daripada membatasi ke IP), tetapi tampaknya sedikit lebih rumit. Saya belum mencoba sejauh ini dan saya tidak dapat menemukan dokumen apa pun untuk membantu.
sumber
Agak terlambat ke pesta, tetapi saya dapat menangani masalah yang sama persis dengan menambahkan tanda tangan ke permintaan saya.
Jika Anda menggunakan Python (seperti yang saya lakukan), Anda dapat menggunakan pustaka berikut untuk membuatnya sangat mudah diterapkan: https://github.com/DavidMuller/aws-requests-auth
Ini bekerja dengan sempurna untuk saya.
sumber
Anda hanya perlu nama pengguna lengkap dalam kebijakan pencarian elastis.
Dalam kasus ini, Anda bisa mendapatkan nama pengguna lengkap Anda dari pesan kesalahan itu sendiri. Dalam kasus saya: "arn: aws: sts :: [ACCOUNT_ID]: diasumsikan-peran / [LAMBDA_POLICY_NAME] / [LAMBDA_NAME]"
sumber
Anda dapat menggunakan kebijakan berbasis sumber daya atau kebijakan berbasis identitas daripada kebijakan berbasis IP yang seperti hard coding alamat IP.
Tetapi Anda perlu menggunakan Signature versi 4 untuk menandatangani permintaan tersebut
Untuk implementasi Java, silakan lihat http://mytechbites.blogspot.in/2017/04/secure-amazon-elastic-search-service.html
sumber
Peran ARN perlu diubah. akan terlihat seperti "arn: aws: iam :: [ACCOUNT_ID]: role / service-role / my_es_role"
sumber
Saya juga mencoba melakukan ini, dan saya membuatnya berfungsi menggunakan
Allow access to the domain from specific IP(s)
opsi dengan IP Elastis dari instans EC2 saya (juga dapat bekerja menggunakan IP pribadi instans, tetapi saya tidak terlalu yakin)sumber