Menyediakan peran IAM dengan hak istimewa paling sedikit dengan menerapkan solusi mesin penjual otomatis peran - AWS Prescriptive Guidance

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Menyediakan peran IAM dengan hak istimewa paling sedikit dengan menerapkan solusi mesin penjual otomatis peran

Benjamin Morris, Nima Fotouhi, Aman Kaur Gandhi, dan Cad Moon, Amazon Web Services

Ringkasan

Izin peran over-scoped AWS Identity and Access Management (IAM) untuk jaringan pipa dapat menimbulkan risiko yang tidak perlu bagi organisasi. Pengembang terkadang memberikan izin luas selama pengembangan tetapi mengabaikan untuk mengurangi izin setelah memecahkan masalah kode mereka. Hal ini menyebabkan masalah di mana peran yang kuat hadir tanpa kebutuhan bisnis dan mungkin tidak pernah ditinjau oleh insinyur keamanan.

Pola ini menawarkan solusi untuk masalah ini: mesin penjual otomatis peran (RVM). Menggunakan model penyebaran yang aman dan terpusat, RVM mendemonstrasikan cara menyediakan peran IAM dengan hak istimewa paling sedikit untuk saluran pipa repositori individu dengan sedikit usaha dari pengembang. GitHub Karena RVM adalah solusi utama, Anda dapat mengonfigurasi tim keamanan Anda sebagai pengulas yang diperlukan untuk menyetujui perubahan. Pendekatan ini memungkinkan keamanan untuk menolak permintaan peran pipeline yang memiliki izin berlebih.

RVM mengambil kode Terraform sebagai input dan menghasilkan peran IAM siap pipeline sebagai output. Input yang diperlukan adalah Akun AWS ID, nama GitHub repositori, dan kebijakan izin. RVM menggunakan input ini untuk membuat kebijakan kepercayaan dan kebijakan izin peran. Kebijakan kepercayaan yang dihasilkan memungkinkan GitHub repositori yang ditentukan untuk mengambil peran dan menggunakannya untuk operasi pipa.

RVM menggunakan peran IAM (dikonfigurasi selama bootstrap). Peran ini memiliki izin untuk mengasumsikan a role-provisioning-role di setiap akun di organisasi. Peran dikonfigurasi melalui AWS Control Tower Account Factory for Terraform (AFT) atau. AWS CloudFormation StackSets Itu role-provisioning-roles adalah peran yang benar-benar menciptakan peran pipeline untuk pengembang.

Prasyarat dan batasan

Prasyarat

  • Aktif Akun AWS.

  • Sebuah GitHub organisasi yang digunakan untuk menyebarkan infrastruktur sebagai kode (IAc) melalui GitHub Actions. (GitHub Enterprise/Premium/Ultimatetidak diperlukan.)

  • AWS Lingkungan multi-akun. Lingkungan ini tidak perlu menjadi bagian dari AWS Organizations.

  • Mekanisme untuk menerapkan peran IAM di semua Akun AWS (misalnya, AFT atau CloudFormation StackSets).

  • Terraform versi 1.3 atau yang terakhir diinstal dan dikonfigurasi.

  • AWS Penyedia Terraform versi 4 atau yang lebih baru diinstal dan dikonfigurasi.

Batasan

  • Kode pola ini khusus untuk GitHub Actions dan Terraform. Namun, konsep umum pola dapat digunakan kembali dalam kerangka kerja integrasi dan pengiriman berkelanjutan (CI/CD) lainnya.

  • Beberapa Layanan AWS tidak tersedia di semua Wilayah AWS. Untuk ketersediaan Wilayah, lihat AWS Layanan menurut Wilayah. Untuk titik akhir tertentu, lihat Titik akhir dan kuota layanan, dan pilih tautan untuk layanan.

Arsitektur

Diagram berikut menggambarkan alur kerja untuk pola ini.

Alur kerja untuk mengotomatiskan pembuatan dan penerapan peran IAM dengan menggunakan Tindakan. GitHub

Alur kerja untuk penggunaan tipikal mesin penjual otomatis peran terdiri dari langkah-langkah berikut:

  1. Pengembang mendorong kode yang berisi kode Terraform untuk peran IAM yang baru diminta ke repositori RVM. GitHub Tindakan ini memicu pipeline Tindakan RVM GitHub .

  2. Pipeline menggunakan kebijakan kepercayaan OpenID Connect (OIDC) untuk mengasumsikan peran asumsi peran RVM.

  3. Saat pipeline RVM berjalan, ia mengasumsikan peran alur kerja RVM di akun tempat ia menyediakan peran IAM baru pengembang. (Peran alur kerja RVM disediakan dengan menggunakan AFT atau.) CloudFormation StackSets

  4. RVM menciptakan peran IAM pengembang dengan izin dan kepercayaan yang sesuai, sehingga peran tersebut dapat diasumsikan oleh pipeline aplikasi lain.

  5. Pengembang aplikasi dapat mengonfigurasi pipeline aplikasi mereka untuk mengambil peran yang disediakan RVM ini.

Peran yang dibuat mencakup izin yang diminta oleh pengembang dan ReadOnlyAccess kebijakan. Peran ini hanya dapat diasumsikan oleh pipeline yang berjalan melawan main cabang repositori yang ditentukan pengembang. Pendekatan ini membantu memastikan bahwa perlindungan dan tinjauan cabang dapat diperlukan untuk menggunakan peran tersebut.

Otomatisasi dan skala

Izin hak istimewa paling sedikit memerlukan perhatian terhadap detail untuk setiap peran yang disediakan. Model ini mengurangi kompleksitas yang diperlukan untuk membuat peran ini, memungkinkan pengembang untuk membuat peran yang mereka butuhkan tanpa banyak pembelajaran atau usaha tambahan.

Alat

Layanan AWS

  • AWS Identity and Access Management (IAM) membantu Anda mengelola akses ke AWS sumber daya dengan aman dengan mengontrol siapa yang diautentikasi dan diberi wewenang untuk menggunakannya.

  • AWS Organizationsadalah layanan manajemen akun yang membantu Anda mengkonsolidasikan beberapa Akun AWS ke dalam organisasi yang Anda buat dan kelola secara terpusat.

Alat-alat lainnya

  • Git adalah sistem kontrol versi terdistribusi open source. Ini termasuk kemampuan untuk membuat akun organisasi.

  • GitHub Actions adalah platform integrasi berkelanjutan dan pengiriman berkelanjutan (CI/CD) yang terintegrasi erat dengan GitHub repositori. Anda dapat menggunakan GitHub Actions untuk mengotomatiskan pipeline build, test, dan deployment.

  • Terraform adalah alat infrastruktur sebagai kode (IAc) HashiCorp yang membantu Anda membuat dan mengelola sumber daya cloud dan lokal.

Repositori kode

Kode untuk pola ini tersedia di GitHub role-vending-machinerepositori.

Praktik terbaik

  • Buat jalan yang benar mudah dan cara yang salah sulit — Buatlah mudah untuk melakukan hal yang benar. Jika pengembang berjuang dengan proses penyediaan RVM, mereka mungkin mencoba membuat peran melalui cara lain, yang merusak sifat sentral RVM. Pastikan tim keamanan Anda memberikan panduan yang jelas tentang cara menggunakan RVM dengan aman dan efektif.

    Anda juga harus menyulitkan pengembang untuk melakukan hal yang salah. Gunakan kebijakan kontrol layanan (SCPs) atau batas izin untuk membatasi peran apa yang dapat membuat peran lain. Pendekatan ini dapat membantu membatasi pembuatan peran hanya untuk RVM dan sumber tepercaya lainnya.

  • Berikan contoh yang baik - Tidak dapat dihindari, beberapa pengembang akan mengadaptasi peran yang ada di repositori RVM sebagai templat informal untuk memberikan izin untuk peran baru mereka. Jika Anda memiliki contoh izin paling sedikit yang dapat disalin, hal itu dapat mengurangi risiko pengembang meminta izin yang luas dan berat wildcard. Jika Anda memulai dengan peran yang sangat diizinkan dengan banyak wildcard, masalah itu dapat berlipat ganda seiring berjalannya waktu.

  • Gunakan konvensi dan ketentuan penamaan — Bahkan jika pengembang tidak mengetahui semua nama sumber daya yang akan dibuat aplikasi mereka, mereka tetap harus membatasi izin peran dengan menggunakan konvensi penamaan. Misalnya, jika mereka membuat bucket Amazon S3, nilai kunci sumber daya mereka mungkin terlihat seperti arn:aws:s3:::myorg-myapp-dev-* sehingga peran mereka tidak memiliki izin di luar bucket yang cocok dengan nama itu. Menegakkan konvensi penamaan melalui kebijakan IAM memiliki manfaat tambahan untuk meningkatkan kepatuhan terhadap konvensi penamaan. Peningkatan ini terjadi karena sumber daya yang tidak cocok tidak akan diizinkan untuk dibuat.

  • Required pull request (PR) review — Nilai solusi RVM adalah menciptakan lokasi pusat di mana peran pipeline baru dapat ditinjau. Namun, desain ini hanya berguna jika ada pagar pembatas yang membantu memastikan keamanan, kode berkualitas tinggi berkomitmen untuk RVM. Lindungi cabang yang digunakan untuk menyebarkan kode (misalnya,main) dari dorongan langsung dan memerlukan persetujuan untuk setiap permintaan gabungan yang menargetkannya.

  • Konfigurasikan peran hanya-baca — Secara default, RVM menyediakan readonly versi dari setiap peran yang diminta. Peran ini dapat digunakan dalam CI/CD pipeline yang tidak menulis data, seperti alur kerja terraform plan pipeline. Pendekatan ini membantu mencegah perubahan yang tidak diinginkan jika alur kerja hanya-baca berperilaku buruk.

    Secara default, ReadOnlyAccess kebijakan AWS terkelola dilampirkan ke peran hanya-baca dan peran baca-tulis. Kebijakan ini mengurangi kebutuhan iterasi saat menentukan izin yang diperlukan, tetapi mungkin terlalu permisif untuk beberapa organisasi. Jika mau, Anda dapat menghapus kebijakan dari kode Terraform.

  • Berikan izin minimum - Ikuti prinsip hak istimewa paling sedikit dan berikan izin minimum yang diperlukan untuk melakukan tugas. Untuk informasi selengkapnya, lihat Berikan hak istimewa terkecil dan praktik terbaik Keamanan dalam dokumentasi IAM.

Epik

TugasDeskripsiKeterampilan yang dibutuhkan

Salin repositori sampel ke organisasi Anda GitHub .

Kloning repositori pola ini atau fork repositori ini ke GitHub organisasi Anda sehingga Anda dapat menyesuaikannya dengan kebutuhan Anda.

  • Jika Anda memilih untuk mengkloning repositori ini, Anda dapat menggunakan perintah berikut: git clone https://github.com/aws-samples/role-vending-machine

  • Jika Anda memilih untuk melakukan fork repositori ke GitHub organisasi Anda, Anda dapat menggunakan perintah berikut:

    gh repo fork aws-samples/role-vending-machine --org YOUR_ORGANIZATION_NAME

DevOps insinyur

Tentukan Akun AWS untuk RVM.

Tentukan penyebaran infrastruktur mana yang Akun AWS akan digunakan untuk RVM. Jangan gunakan akun manajemen atau root.

Arsitek awan

(Opsional) Izinkan jaringan pipa organisasi untuk dibuat PRs.

catatan

Langkah ini hanya diperlukan jika Anda ingin mengizinkan generate_providers_and_account_vars alur kerja dibuat PRs.

Untuk memungkinkan pipeline organisasi Anda dibuat PRs, gunakan langkah-langkah berikut:

  1. Kunjungi https://github.com/organizations/YOUR_ORG/settings/actions.

  2. Pilih Izinkan GitHub Tindakan untuk membuat dan menyetujui permintaan tarik.

Untuk informasi selengkapnya, lihat Mengelola setelan GitHub Tindakan untuk repositori dalam dokumentasi. GitHub

DevOps insinyur

Berikan izin hanya-baca ke akun RVM.

Buat kebijakan delegasi di akun manajemen Anda yang memberikan izin hanya-baca akun RVM Anda. Ini memungkinkan GitHub alur kerja RVM Anda menarik daftar akun AWS organisasi secara dinamis saat skrip berjalan. generate_providers_and_account_vars.py

Gunakan kode berikut dan ganti <YOUR RVM Account ID> dengan Akun AWS ID yang Anda pilih di Langkah 2:

{ "Version": "2012-10-17", "Statement": [ { "Sid": "Statement", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::<YOUR RVM Account ID>:root" }, "Action": [ "organizations:ListAccounts", "organizations:DescribeOrganization", "organizations:DescribeOrganizationalUnit", "organizations:ListRoots", "organizations:ListAWSServiceAccessForOrganization", "organizations:ListDelegatedAdministrators" ], "Resource": "*" } ] }
Administrator awan

Perbarui nilai default dari repo sampel.

Untuk mengonfigurasi RVM agar beroperasi di lingkungan spesifik Anda dan Wilayah AWS, lakukan hal berikut:

  1. Perbarui scripts/generate_providers_and_account_vars.py dan file lainnya (seperti bootstrap folder) dengan Wilayah yang sesuai tempat Anda beroperasi.

  2. Perbarui .github/workflows/.env file dengan Akun AWS ID, Wilayah, dan variabel lain yang ingin Anda tentukan.

DevOps insinyur
TugasDeskripsiKeterampilan yang dibutuhkan

Bootstrap repo RVM.

Langkah ini diperlukan untuk menciptakan kepercayaan OIDC dan peran IAM yang digunakan oleh pipa RVM itu sendiri, sehingga dapat mulai beroperasi dan menjual peran lain.

Dalam konteks akun RVM Anda, jalankan terraform apply perintah secara manual dari direktori. scripts/bootstrap Berikan nilai yang diperlukan berdasarkan dokumentasi variabel.

DevOps insinyur
TugasDeskripsiKeterampilan yang dibutuhkan

Menyebarkan github-workflow-rvm dan github-workflow-rvm-readonly peran ke semua akun.

Pilih metode penerapan yang selaras dengan praktik organisasi Anda, seperti AFT atau. StackSets Gunakan metode tersebut untuk menerapkan dua peran IAM dalam scripts/assumed_role/main.tf file (nama default github-workflow-rvm dangithub-workflow-rvm-readonly) ke setiap akun tempat Anda ingin RVM dapat membuat peran pipeline.

Peran IAM ini memiliki kebijakan kepercayaan yang memungkinkan peran asumsi peran akun RVM (atau yang setara) untuk mengasumsikannyareadonly. Peran juga memiliki kebijakan izin IAM yang memungkinkan mereka membaca dan menulis (kecuali menggunakan readonly peran) peran yang cocokgithub-workflow-role-*.

Administrator AWS

Jalankan generate_providers_and_account_vars alur kerja.

Untuk mengonfigurasi RVM Anda sehingga siap untuk membuat peran pipeline, lakukan hal berikut:

  1. Jalankan alur kerja dengan menggunakan generate_providers_and_account_vars workflow_dispatch.

  2. Gabungkan PR yang dibuat alur kerja.

Setelah alur kerja selesai, RVM siap untuk:

  • Terima permintaan untuk peran pipeline baru.

  • Buat peran read-only atau read-write seperti yang diminta.

  • Menyebarkan peran ke yang ditentukan Akun AWS.

DevOps insinyur

Pemecahan Masalah

IsuSolusi

Saya membuat peran dengan menggunakan RVM, tetapi GitHub tidak dapat mengasumsikan itu.

Verifikasi bahwa nama GitHub repositori cocok dengan nama yang diberikan ke modul. github_workflow_roles Peran dicakup sehingga hanya satu repositori yang dapat mengasumsikan mereka.

Demikian pula, verifikasi bahwa cabang yang digunakan dalam GitHub pipeline cocok dengan nama cabang yang disediakan untuk github_workflow_roles modul. Biasanya, peran yang dibuat RVM dengan izin tulis hanya dapat digunakan oleh alur kerja yang dicakup ke main cabang (yaitu, penerapan yang bersumber dari). main

Peran hanya-baca saya gagal menjalankan pipeline karena tidak memiliki izin untuk membaca sumber daya tertentu.

Meskipun ReadOnlyAccess kebijakan menyediakan izin hanya-baca yang luas, kebijakan tersebut tidak memiliki beberapa tindakan baca (misalnya, tindakan tertentu AWS Security Hub ).

Anda dapat menambahkan izin tindakan tertentu dengan menggunakan inline_policy_readonly parameter github-workflow-roles modul.

Sumber daya terkait

Informasi tambahan

Menggunakan GitHub lingkungan

GitHub lingkungan adalah pendekatan alternatif untuk pembatasan berbasis cabang untuk akses peran. Jika Anda lebih suka menggunakan GitHub lingkungan, berikut adalah contoh sintaks untuk kondisi tambahan dalam kebijakan kepercayaan IAM. Sintaks ini menetapkan bahwa peran hanya dapat digunakan ketika GitHub tindakan berjalan di Production lingkungan.

"StringLike": { "token.actions.githubusercontent.com:sub": "repo:octo-org/octo-repo:environment:Production" }

Contoh sintaks menggunakan nilai placeholder berikut:

  • octo-orgadalah nama GitHub organisasi.

  • octo-repoadalah nama repositori.

  • Productionadalah nama GitHub lingkungan yang spesifik.