Analisis Kubernetes RBAC menjadi mudah
Krane adalah alat analisis statis Kubernetes RBAC sederhana. Ini mengidentifikasi potensi risiko keamanan dalam desain K8S RBAC dan membuat saran tentang cara mengurangi mereka. Dasbor Krane menyajikan postur keamanan RBAC saat ini dan memungkinkan Anda menavigasi definisi.
Anda dapat memulai dengan Krane dengan memasangnya melalui grafik Helm di target kluster Kubernetes Anda atau menjalankannya secara lokal dengan Docker.
Diasumsikan bahwa Anda memiliki Helm CLI yang dipasang di mesin Anda.
$ helm repo add appvia https://appvia.github.io/krane
$ helm repo update
$ helm install krane appvia/krane --namespace krane --create-namespaceIkuti output instalasi grafik helm tentang cara port-forward krane dashboard.
Diasumsikan bahwa Anda memiliki Docker yang berjalan di mesin lokal Anda. Instal Docker-Compose jika Anda belum melakukannya.
Krane tergantung pada redisgraph. docker-compose Stack mendefinisikan semua apa yang diperlukan untuk membangun dan menjalankan layanan Krane secara lokal. Ini juga akan mengurus ketergantungan redisgraph -nya.
docker-compose up -d
Gambar Krane Docker akan pra-dibangun secara otomatis jika belum ada di mesin lokal.
Perhatikan bahwa saat menjalankan docker-compose secara lokal, Krane tidak akan memulai laporan RBAC dan dasbor secara otomatis. Sebaliknya, wadah akan tidur selama 24 jam secara default - nilai ini dapat disesuaikan dalam docker-compose.override.yml . EXEC ke wadah Krane yang sedang berjalan untuk menjalankan perintah. docker-compose lokal juga akan memasang konfigurasi Kube ( ~/.kube/config ) di dalam wadah yang memungkinkan Anda menjalankan laporan terhadap kluster Kubernetes mana pun yang sudah Anda akses.
EXEC ke dalam wadah Krane yang sedang berjalan.
docker-compose exec krane bash Setelah di wadah Anda dapat mulai menggunakan perintah krane . Coba krane -help .
krane -hUntuk memeriksa layanan apa yang berjalan dan port terkait:
docker-compose ps
Untuk menghentikan Krane dan layanan ketergantungannya:
docker-compose down
$ krane --help
NAME:
krane
DESCRIPTION:
Kubernetes RBAC static analysis & visualisation tool
COMMANDS:
dashboard Start K8s RBAC dashboard server
help Display global or [command] help documentation
report Run K8s RBAC report
GLOBAL OPTIONS:
-h, --help
Display help documentation
-v, --version
Display version information
-t, --trace
Display backtrace when an error occurs
AUTHOR:
Marcin Ciszak <[email protected]> - Appvia Ltd <appvia.io>
kubectl lokalUntuk menjalankan laporan terhadap cluster yang sedang berjalan, Anda harus memberikan konteks Kubectl
krane report -k <context>
Anda juga dapat melewati -c <cluster-name> bendera jika Anda berencana untuk menjalankan alat terhadap beberapa cluster dan indeks grafik RBAC secara terpisah untuk setiap nama cluster.
Untuk menjalankan laporan terhadap file RBAC YAML/JSON lokal, berikan jalur direktori
krane report -d </path/to/rbac-directory>
Catatan: Krane mengharapkan file -file berikut (dalam format YAML atau JSON) hadir dalam jalur direktori yang ditentukan:
Jika kebijakan keamanan pod tidak digunakan, Anda dapat melewati ekspektasi di atas dengan membuat file psp secara manual dengan konten berikut:
{
"items" : []
} Catatan, PodSecurityPolicy sudah usang di Kubernetes v1.21, dan dihapus dari Kubernetes di v1.25.
Untuk menjalankan laporan dari wadah yang berjalan di kluster Kubernetes
krane report --incluster
Catatan: Akun layanan yang digunakan oleh Krane akan memerlukan akses ke sumber daya RBAC. Lihat Prasyarat untuk detailnya.
Untuk memvalidasi definisi RBAC sebagai langkah dalam pipa CI/CD
krane report --ci -d </path/to/rbac-directory>
Catatan: Krane mengharapkan konvensi penamaan tertentu diikuti untuk file sumber daya RBAC yang disimpan secara lokal. Lihat bagian di atas. Untuk menjalankan perintah krane , disarankan agar Executor CI merujuk quay.io/appvia/krane:latest docker gambar.
Mode CI diaktifkan oleh -Bendera --ci . Krane akan mengembalikan kode status non nol bersama dengan rincian aturan risiko yang melanggar ketika satu atau lebih bahaya telah terdeteksi.
Untuk melihat pohon Facets RBAC, grafik jaringan, dan temuan laporan terbaru, Anda harus memulai server dasbor terlebih dahulu.
krane dashboard
Bendera cluster -c <cluster-name> dapat dilewati jika Anda ingin menjalankan dasbor terhadap nama cluster tertentu. Dasbor akan mencari data yang terkait dengan nama cluster tertentu yang di -cache pada sistem file.
Perintah di atas akan memulai server web lokal pada port default 8000 , dan menampilkan tautan dasbor.
Krane Indexes RBAC masuk dalam redisgraph. Ini memungkinkan kami untuk menanyakan jaringan dependensi secara efisien dan hanya menggunakan subset cypherQL yang didukung oleh redisgraph.
Node berikut dibuat dalam grafik untuk objek RBAC yang relevan:
Psp - Node PSP yang berisi atribut di sekitar kebijakan keamanan pod. Hanya berlaku saat bekerja dengan K8 <1,25.Rule - Node aturan mewakili aturan kontrol akses di sekitar sumber daya Kubernetes.Role - Node peran mewakili peran atau clusterrole yang diberikan. Atribut kind mendefinisikan jenis peran.Subject - Subjek mewakili semua aktor yang mungkin di cluster ( kind : User, Group dan ServiceAccount)Namespace - Node Namespace Kubernetes. :SECURITY - Menentukan tautan antara aturan dan node PSP. Hanya berlaku saat bekerja dengan K8 <1,25.:GRANT - mendefinisikan hubungan antara peran dan aturan yang terkait dengan peran itu.:ASSIGN - mendefinisikan tautan antara aktor (subjek) dan peran yang diberikan/clusterrole (node peran).:RELATION - mendefinisikan tautan antara dua node aktor (subjek) yang berbeda.:SCOPE - mendefinisikan tautan antara peran dan node namespace.:ACCESS - Menentukan tautan antara subjek dan node namespace.:AGGREGATE -mendefinisikan tautan antar clusterrol (satu clusterrole agregat lain) A-(aggregates)->B:COMPOSITE -mendefinisikan tautan antara clusterrole (satu clusterrole dapat dikumpulkan di yang lain) A<-(is a composite of)-B Semua tepi adalah dua arah, yang berarti grafik dapat ditanya di kedua arah. Hanya pengecualian adalah :AGGREGATE dan :COMPOSITE yang uni-directional, meskipun peduli dengan node tepi yang sama.
Untuk menanyakan grafik secara langsung, Anda dapat mengeksekusi ke dalam wadah redisgraph yang sedang berjalan, mulailah redis-cli dan jalankan kueri sewenang-wenang Anda. Ikuti instruksi resmi untuk contoh perintah.
Anda juga dapat menanyakan grafik dari konsol Krane . Eksekutif pertama untuk menjalankan wadah krane , lalu
# Start Krane console - this will open interactive ruby shell with Krane code preloaded
console
# Instantiate Graph client
graph = Krane :: Clients :: RedisGraph . client cluster : 'default'
# Run arbitrary CypherQL query against indexed RBAC Graph
res = graph . query ( %Q(
MATCH (r:Rule {resource: "configmaps", verb: "update"})<-[:GRANT]-(ro:Role)<-[:ASSIGN]-(s:Subject)
RETURN s.kind as subject_kind, s.name as subject_name, ro.kind as role_kind, ro.name as role_name) )
# Print the results
res . print_resultset # Results...
+----------------+--------------------------------+-----------+------------------------------------------------+
| subject_kind | subject_name | role_kind | role_name |
+----------------+--------------------------------+-----------+------------------------------------------------+
| ServiceAccount | bootstrap-signer | Role | system:controller:bootstrap-signer |
| User | system:kube-controller-manager | Role | system::leader-locking-kube-controller-manager |
| ServiceAccount | kube-controller-manager | Role | system::leader-locking-kube-controller-manager |
| User | system:kube-scheduler | Role | system::leader-locking-kube-scheduler |
| ServiceAccount | kube-scheduler | Role | system::leader-locking-kube-scheduler |
+----------------+--------------------------------+-----------+------------------------------------------------+
CATATAN: Contoh kueri di atas akan memilih semua subjek dengan peran/clusterroles yang ditetapkan yang memberikan akses untuk update configmaps .
Aturan risiko RBAC didefinisikan dalam file aturan. Struktur masing-masing aturan sebagian besar jelas. Set bawaan dapat diperluas / ditimpa dengan menambahkan aturan khusus ekstra ke file aturan cutom.
Makro adalah "wadah" untuk serangkaian atribut umum/bersama, dan dirujuk oleh satu atau lebih aturan risiko. Jika Anda memilih untuk menggunakan makro dalam aturan risiko yang diberikan, Anda perlu merujuknya dengan nama, misalnya macro: <macro-name> . Perhatikan bahwa atribut yang ditentukan dalam macro yang direferensikan akan diutamakan daripada atribut yang sama yang ditentukan pada tingkat aturan.
Makro dapat berisi salah satu atribut berikut:
query - Kueri Redisgraph. Memiliki prioritas daripada template . Membutuhkan writer untuk didefinisikan.writer - Writer adalah ekspresi ruby yang digunakan untuk memformat set hasil query . Penulis telah diutamakan daripada template .template - Nama Templat Kueri/Penulis Built -in. Jika query & writer tidak ditentukan maka generator kueri yang dipilih akan digunakan bersama dengan penulis yang cocok. Aturan dapat berisi salah satu atribut berikut:
id [wajib] ID aturan adalah pengidentifikasi aturan yang unik.
group_title [wajib] Judul berlaku untuk semua item yang termasuk dalam pemeriksaan risiko ini.
severity [diperlukan] keparahan, sebagai salah satu dari: bahaya ,: peringatan ,: info.
info [diperlukan] informasi tekstual tentang cek dan saran tentang cara mengurangi risiko.
query [Konditonal] Redisgraph Query.
template . Membutuhkan writer untuk didefinisikan. writer [Conditonal] Penulis adalah ekspresi ruby yang digunakan untuk memformat set hasil kueri.
template . Membutuhkan query untuk didefinisikan. template [conditonal] Nama templat kueri/penulis bawaan. Jika query & writer tidak ditentukan maka generator kueri yang dipilih akan digunakan bersama dengan penulis yang cocok.
Beberapa templat bawaan memerlukan atribut match_rules untuk ditentukan pada tingkat aturan individu untuk membangun kueri yang benar. Template saat ini membutuhkannya:
match_rules . Kueri grafik yang dihasilkan mengembalikan kolom berikut: match_rules [conditonal] Diperlukan ketika template bergantung pada aturan kecocokan untuk membangun kueri.
match_rules :
- resources : ['cronjobs']
verbs : ['update'] custom_params [Opsional] Daftar pasangan nilai kunci khusus untuk dievaluasi dan diganti dalam query aturan dan representasi writer .
custom_params :
- attrA : valueA
- attrB : valueB{{attrA}} dan {{attrB}} akan diganti dengan valueA dan valueB masing -masing. Nilai Numerik threshold [Opsional]. Ketika pasti ini akan tersedia sebagai placeholder template {{threshold}} dalam ekspresi writer .
Referensi macro [opsional] ke parameter umum yang ditentukan dalam makro bernama.
disabled [Opsional] Ketika diatur ke true itu akan menonaktifkan aturan yang diberikan dan mengecualikannya dari evaluasi. Secara default semua aturan diaktifkan.
- id : verbose-rule-example
group_title : Example rule
severity : :danger
info : Risk description and instructions on how to mitigate it goes here
query : |
MATCH
(s:Subject)-[:ACCESS]->(ns:Namespace)
WHERE
NOT s.name IN {{whitelist_subject_names}}
RETURN
s.kind as subject_kind,
s.name as subject_name,
COLLECT(ns.name) as namespace_names
ORDER BY
subject_kind,
subject_name,
namespace_names DESC
threshold : 2
writer : |
if result.namespace_names.count > {{threshold}}
"#{result.subject_kind} #{result.subject_name} can access namespaces: #{result.namespace_names.join(', ')}"
end
disabled : true Contoh di atas secara eksplisit mendefinisikan query grafik yang digunakan untuk mengevaluasi risiko RBAC, dan ekspresi writer yang digunakan untuk memformat set hasil kueri. Kueri hanya memilih semua Subjects (tidak termasuk daftar putih) dan Namespaces yang dapat mereka akses. Perhatikan bahwa set hasil hanya akan mencakup Subjects yang memiliki akses ke lebih dari 2 namespaces (nilai threshold yang diperhatikan di sana?). Ekspresi writer terakhir akan ditangkap sebagai output item hasil yang diformat.
writer dapat mengakses item set hasil melalui objek result dengan metode pencocokan metode yang dikembalikan oleh kueri, result.subject_name result.subject_kind
Catatan:
{{threshold}} placeholder dalam ekspresi writer akan digantikan oleh nilai kata kunci threshold aturan.{{whitelist_subject_names}} mewakili bidang khusus yang akan diinterpolasi dengan nilai -nilai whitelist yang ditentukan untuk id aturan yang diberikan. Jika nama lapangan placeholder tidak didefinisikan dalam daftar putih itu akan diganti dengan array kosong [''] secara default. Baca lebih lanjut tentang daftar putih di bawah ini. Template bawaan menyederhanakan definisi aturan risiko secara signifikan, namun, mereka dirancang untuk mengekstraksi jenis informasi tertentu dan mungkin tidak cocok untuk aturan khusus Anda. Jika Anda menemukan diri Anda menggunakan kembali query atau ekspresi writer yang sama di berbagai aturan, Anda harus mempertimbangkan untuk mengekstraksinya ke macro dan merujuknya dalam aturan khusus Anda untuk mengeringkannya.
- id : risky-any-verb-secrets
group_title : Risky Roles/ClustersRoles allowing all actions on secrets
severity : :danger
info : Roles/ClusterRoles allowing all actions on secrets. This might be dangerous. Review listed Roles!
template : risky-role
match_rules :
- resources : ['secrets']
verbs : ['*'] Contoh di atas menunjukkan salah satu aturan bawaan. Ini merujuk pada templat risky-role yang setelah diproses akan memperluas aturan dengan menyuntikkan query dan ekspresi writer sebelum aturan evalutasi memicu. match_rules akan digunakan untuk membangun kueri kecocokan yang sesuai.
Daftar putih opsional berisi satu set nama atribut yang ditentukan khusus dan nilai masing -masing (daftar putih).
Nama atribut dan nilainya sewenang -wenang. Mereka didefinisikan dalam file daftar putih dan dibagi menjadi tiga bagian terpisah:
global - ruang lingkup tingkat atas. Atribut khusus yang ditentukan di sini akan berlaku untuk semua aturan risiko terlepas dari nama cluster.common - Atribut khusus akan dicakup ke id aturan risiko tertentu terlepas dari nama cluster.cluster (dengan daftar nama cluster bersarang) - Atribut khusus akan berlaku untuk id aturan risiko tertentu untuk nama cluster yang diberikan. Setiap aturan risiko, setelah dievaluasi, akan berusaha untuk menginterpolasi semua placeholder parameter yang digunakan dalam query , misalnya {{your_whitelist_attribute_name}} . Jika nama parameter placeholder (yaitu nama antara braket keriting ganda) cocok dengan salah satu nama atribut yang masuk daftar putih untuk id aturan risiko itu, itu akan diganti dengan nilai yang dihitung. Jika tidak ada nilai yang ditemukan untuk placeholder yang diberikan, itu akan diganti dengan [''] .
Contoh Whitelist di bawah ini menghasilkan placeholder-key => value untuk aturan risiko dengan nilai atribut id yang cocok dengan "beberapa risiko-aturan-id"
{{whitelist_role_names}} => ['acp:prometheus:operator']
{{whitelist_subject_names}} => ['privileged-psp-user', 'another-user']
Kunci placeholder di atas, ketika digunakan dalam kueri grafik khusus, akan digantikan oleh nilai masing -masing setelah evaluasi aturan risiko.
Contoh:
---
rules :
global : # global scope - applies to all risk rule and cluster names
whitelist_role_names : # custom attribute name
- acp:prometheus:operator # custom attribute values
common : # common scope - applies to specific risk rule id regardless of cluster name
some-risk-rule-id : # this corresponds to risk rule id defined in config/rules.yaml
whitelist_subject_names : # custom attribute name
- privileged-psp-user # custom attribute values
cluster : # cluster scope - applies to speciifc risk rule id and cluster name
default : # example cluster name
some-risk-rule-id : # risk rule id
whitelist_subject_names : # custom attribute nane
- another-user # custom attribute values Krane dapat dikerahkan ke kelompok Kubernetes lokal atau jarak jauh dengan mudah.
Kubernetes namespace, akun layanan bersama dengan RBAC yang sesuai harus ada di cluster. Lihat prasyarat untuk referensi.
Default Krane Entrypoint mengeksekusi bin/in-cluster-run yang menunggu instance redisgraph tersedia sebelum memulai loop laporan RBAC dan server web dasbor .
Anda dapat mengontrol aspek-aspek tertentu dari eksekusi in-cluster dengan variabel lingkungan berikut:
KRANE_REPORT_INTERVAL - mendefinisikan interval dalam detik untuk laporan analisis statis RBAC. Default: 300 (dalam detik, yaitu 5 menit).KRANE_REPORT_OUTPUT - mendefinisikan format output laporan risiko RBAC. Nilai yang mungkin :json , :yaml , :none . Default :: :json .Sebelum kita mulai, Anda akan membutuhkan alat berikut:
Instal Helm Chart:
$ helm repo add appvia https://appvia.github.io/krane
$ helm repo update
$ helm install krane appvia/krane --namespace krane --create-namespaceLihat file values.yaml untuk detail opsi dan parameter yang dapat disetel lainnya.
kubectl create
--context < docker-desktop >
--namespace krane
-f k8s/redisgraph-service.yaml
-f k8s/redisgraph-deployment.yaml
-f k8s/krane-service.yaml
-f k8s/krane-deployment.yamlPerhatikan bahwa layanan dasbor Krane tidak diekspos secara default!
kubectl port-forward svc/krane 8000
--context= < docker-desktop >
--namespace=krane
# Open Krane dashboard at http://localhost:8000Anda dapat menemukan contoh penerapan manifes dalam direktori K8S.
Ubah manifes seperti yang diperlukan untuk penyebaran Anda memastikan Anda merujuk versi yang benar dari gambar Krane Docker dalam file penyebarannya. Lihat Krane Docker Registry untuk tag yang tersedia, atau cukup gunakan latest .
Jika klaster K8S Anda dilengkapi dengan dukungan pengontrol compose-in-in-kubernetes ( docker-desktop mendukungnya secara default), maka Anda dapat menggunakan Krane dan dependensinya dengan perintah Stack Docker tunggal:
docker stack deploy
--orchestrator kubernetes
--namespace krane
--compose-file docker-compose.yml
--compose-file docker-compose.k8s.yml kraneCatatan: Pastikan konteks kap Anda saat ini diatur dengan benar sebelum menjalankan perintah di atas!
Tumpukan aplikasi sekarang harus digunakan ke kluster Kubernetes dan semua layanan siap dan terbuka. Perhatikan bahwa Krane akan secara otomatis memulai loop laporan dan server dasbor.
docker stack services --orchestrator kubernetes --namespace krane kranePerintah di atas akan menghasilkan output berikut:
ID NAME MODE REPLICAS IMAGE PORTS
0de30651-dd5 krane_redisgraph replicated 1/1 redislabs/redisgraph:1.99.7 *:6379->6379/tcp
aa377a5f-62b krane_krane replicated 1/1 quay.io/appvia/krane:latest *:8000->8000/tcp
Periksa postur keamanan kluster Kubernetes Anda dengan mengunjungi http: // localhost: 8000.
Perhatikan bahwa untuk penyebaran cluster jarak jauh Anda mungkin perlu layanan port-forward krane terlebih dahulu
kubectl --context=my-remote-cluster --namespace=krane port-forward svc/krane 8000Untuk menghapus tumpukan
docker stack rm krane
--orchestrator kubernetes
--namespace kraneKrane akan memberi tahu Anda tentang anomali yang terdeteksi dengan keparahan menengah dan tinggi melalui integrasi kendurnya.
Untuk mengaktifkan pemberitahuan, tentukan slack webhook_url & channel dalam file config/config.yaml, atau alternatifnya atur kedua variabel lingkungan SLACK_WEBHOOK_URL dan SLACK_CHANNEL . Variabel lingkungan akan diutamakan daripada nilai file konfigurasi.
Bagian ini menjelaskan langkah -langkah untuk memungkinkan pengembangan lokal.
Instal dependensi kode krane dengan
./bin/setup Krane tergantung pada redisgraph. docker-compose adalah cara tercepat untuk membuat ketergantungan Krane berjalan secara lokal.
docker-compose up -d redisgraphUntuk memeriksa layanan redisgraph sudah habis:
docker-compose psUntuk menghentikan layanan:
docker-compose downPada titik ini Anda harus dapat memodifikasi krane codebase dan menguji hasil dengan memanggil perintah di shell lokal.
$ ./bin/krane --help # to get help
$ ./bin/krane report -k docker-desktop # to generate your first report for
# local docker-desktop k8s cluster
...Untuk mengaktifkan mode pengembangan lokal dashboard UI
$ cd dashboard
$ npm install
$ npm startIni akan secara otomatis memulai server dasbor, buka browser default dan menonton perubahan file sumber.
Krane datang dikonfigurasikan sebelumnya untuk pengalaman pengembang yang lebih baik dengan Skaffold. Iterasi pada proyek dan memvalidasi aplikasi dengan menjalankan seluruh tumpukan di cluster Kubernetes lokal atau jarak jauh menjadi lebih mudah. Kode Hot-Reload memungkinkan perubahan lokal diperbanyak secara otomatis ke wadah berjalan untuk siklus hidup pengembangan yang lebih cepat.
skaffold dev --kube-context docker-desktop --namespace krane --port-forwardJalankan tes secara lokal dengan
bundle exec rspecKami menyambut setiap kontribusi dari komunitas! Lihat panduan kontribusi kami untuk informasi lebih lanjut tentang cara memulai. Jika Anda menggunakan Krane , temukan berguna, atau umumnya tertarik pada keamanan Kubernetes maka beri tahu kami dengan membintangi dan menonton repo ini. Terima kasih!
Bergabunglah dengan diskusi di saluran komunitas kami.
Krane adalah proyek komunitas dan kami menyambut kontribusi Anda. Untuk melaporkan bug, menyarankan peningkatan, atau meminta fitur baru, buka masalah GitHub. Lihat panduan berkontribusi kami untuk informasi lebih lanjut tentang bagaimana Anda dapat membantu.
Lihat peta jalan kami untuk detail tentang rencana kami untuk proyek tersebut.
Penulis: Marcin Ciszak [email protected]
Hak Cipta (C) 2019-2020 Appvia Ltd
Proyek ini didistribusikan di bawah lisensi Apache, versi 2.0.