Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Keamanan Pod
Spesifikasi pod mencakup berbagai atribut berbeda yang dapat memperkuat atau melemahkan postur keamanan Anda secara keseluruhan. Sebagai praktisi Kubernetes, perhatian utama Anda adalah mencegah proses yang berjalan dalam wadah agar tidak lolos dari batas isolasi runtime container dan mendapatkan akses ke host yang mendasarinya.
Kemampuan Linux
Proses yang berjalan dalam wadah berjalan di bawah konteks pengguna root [Linux] secara default. Meskipun tindakan root dalam wadah sebagian dibatasi oleh serangkaian kemampuan Linux yang ditetapkan runtime kontainer ke wadah, hak istimewa default ini dapat memungkinkan penyerang untuk meningkatkan hak istimewa mereka dan/atau mendapatkan akses ke informasi sensitif yang terikat ke host, termasuk Rahasia dan. ConfigMaps Di bawah ini adalah daftar kemampuan default yang ditetapkan ke kontainer. Untuk informasi tambahan tentang setiap kemampuan, lihat http://man7. org/linux/man-pages/man7/capabilities.7.html
CAP_AUDIT_WRITE, CAP_CHOWN, CAP_DAC_OVERRIDE, CAP_FOWNER, CAP_FSETID, CAP_KILL, CAP_MKNOD, CAP_NET_BIND_SERVICE, CAP_NET_RAW, CAP_SETGID, CAP_SETUID, CAP_SETFCAP, CAP_SETPCAP, CAP_SYS_CHROOT
EC2 dan pod Fargate diberi kemampuan yang disebutkan di atas secara default. Selain itu, kemampuan Linux hanya dapat dihapus dari pod Fargate.
Pod yang dijalankan sebagai hak istimewa, mewarisi semua kemampuan Linux yang terkait dengan root pada host. Ini harus dihindari jika memungkinkan.
Otorisasi Node
Semua node pekerja Kubernetes menggunakan mode otorisasi yang disebut Node Authorization.
Baca operasi:
-
layanan
-
titik akhir
-
simpul
-
polong
-
secret, configmaps, klaim volume persisten, dan volume persisten yang terkait dengan pod yang terikat pada node kubelet
Tulis operasi:
-
node dan status node (aktifkan plugin
NodeRestriction
penerimaan untuk membatasi kubelet untuk memodifikasi simpulnya sendiri) -
pod dan status pod (aktifkan plugin
NodeRestriction
penerimaan untuk membatasi kubelet untuk memodifikasi pod yang terikat pada dirinya sendiri) -
peristiwa
Operasi terkait Author:
-
Akses baca/tulis ke API CertificateSigningRequest (CSR) untuk bootstrap TLS
-
kemampuan untuk membuat TokenReview dan SubjectAccessReview untuk pemeriksaan yang didelegasikan authentication/authorization
EKS menggunakan node restriction admission controller
Solusi Keamanan Pod
Kebijakan Keamanan Pod (PSP)
Di masa lalu, sumber daya Pod Security Policy (PSP)
penting
PSPs tidak digunakan lagi di Kubernetes
Migrasi ke solusi keamanan pod baru
Karena PSPs telah dihapus pada Kubernetes v1.25, administrator dan operator klaster harus mengganti kontrol keamanan tersebut. Dua solusi dapat memenuhi kebutuhan ini:
-
Policy-as-code (PAC) solusi dari ekosistem Kubernetes
-
Standar Keamanan Pod
Kubernetes (PSS)
Baik solusi PAC dan PSS dapat hidup berdampingan dengan PSP; mereka dapat digunakan dalam cluster sebelum PSP dihapus. Ini memudahkan adopsi saat bermigrasi dari PSP. Silakan lihat dokumen
Kyverno, salah satu solusi PAC yang diuraikan di bawah ini, memiliki panduan khusus yang diuraikan dalam posting blog
Policy-as-code (PAC)
Policy-as-code Solusi (PAC) menyediakan pagar pembatas untuk memandu pengguna klaster, dan mencegah perilaku yang tidak diinginkan, melalui kontrol yang ditentukan dan otomatis. PAC menggunakan Kubernetes Dynamic Admission Controllers
Ada beberapa solusi PAC open source yang tersedia untuk Kubernetes. Solusi ini bukan bagian dari proyek Kubernetes; mereka bersumber dari ekosistem Kubernetes. Beberapa solusi PAC tercantum di bawah ini.
Untuk informasi lebih lanjut tentang solusi PAC dan cara membantu Anda memilih solusi yang tepat untuk kebutuhan Anda, lihat tautan di bawah ini.
Standar Keamanan Pod (PSS) dan Penerimaan Keamanan Pod (PSA)
Menanggapi penghentian PSP dan kebutuhan berkelanjutan untuk mengontrol keamanan pod out-of-the-box, dengan solusi Kubernetes bawaan, Kubernetes Auth Special Interest Group
Menurut dokumentasi Kubernetes, PSS “mendefinisikan tiga kebijakan berbeda untuk mencakup spektrum keamanan secara luas. Kebijakan ini bersifat kumulatif dan berkisar dari yang sangat permisif hingga sangat membatasi. `”
Kebijakan ini didefinisikan sebagai:
-
Hak istimewa: Kebijakan tidak terbatas (tidak aman), memberikan tingkat izin seluas mungkin. Kebijakan ini memungkinkan eskalasi hak istimewa yang diketahui. Ini adalah tidak adanya kebijakan. Ini bagus untuk aplikasi seperti agen logging, driver penyimpanan CNIs, dan aplikasi luas sistem lainnya yang membutuhkan akses istimewa.
-
Baseline: Kebijakan pembatasan minimal yang mencegah eskalasi hak istimewa yang diketahui. Mengizinkan konfigurasi Pod default (minimal ditentukan). Kebijakan dasar melarang penggunaan HostNetwork, HostPid, HostPic, HostPath, HostPort, ketidakmampuan untuk menambahkan kemampuan Linux, bersama dengan beberapa batasan lainnya.
-
Dibatasi: Kebijakan yang sangat dibatasi, mengikuti praktik terbaik pengerasan Pod saat ini. Kebijakan ini mewarisi dari baseline dan menambahkan pembatasan lebih lanjut seperti ketidakmampuan untuk berjalan sebagai root atau root-group. Kebijakan yang dibatasi dapat memengaruhi kemampuan aplikasi untuk berfungsi. Mereka terutama ditargetkan untuk menjalankan aplikasi keamanan kritis.
Kebijakan ini mendefinisikan profil untuk eksekusi pod
Untuk mengimplementasikan kontrol yang ditentukan oleh PSS, PSA beroperasi dalam tiga mode:
-
menegakkan: Pelanggaran kebijakan akan menyebabkan pod ditolak.
-
Audit: Pelanggaran kebijakan akan memicu penambahan anotasi audit pada peristiwa yang dicatat dalam log audit, tetapi sebaliknya diizinkan.
-
peringatan: Pelanggaran kebijakan akan memicu peringatan yang dihadapi pengguna, tetapi sebaliknya diizinkan.
Mode-mode ini dan level profil (pembatasan) dikonfigurasi pada level Namespace Kubernetes, menggunakan label, seperti yang terlihat pada contoh di bawah ini.
apiVersion: v1 kind: Namespace metadata: name: policy-test labels: pod-security.kubernetes.io/enforce: restricted
Ketika digunakan secara independen, mode operasional ini memiliki respons berbeda yang menghasilkan pengalaman pengguna yang berbeda. Mode enforce akan mencegah pod dibuat jika masing-masing PodSpecs melanggar level pembatasan yang dikonfigurasi. Namun, dalam mode ini, objek Kubernetes non-pod yang membuat pod, seperti Deployments, tidak akan dicegah untuk diterapkan ke cluster, bahkan jika PodSpec di dalamnya melanggar PSS yang diterapkan. Dalam hal ini Deployment akan diterapkan, sedangkan pod akan dicegah untuk diterapkan.
Ini adalah pengalaman pengguna yang sulit, karena tidak ada indikasi langsung bahwa objek Deployment yang berhasil diterapkan memungkiri pembuatan pod yang gagal. PodSpecs yang menyinggung tidak akan membuat pod. Memeriksa sumber daya Deployment dengan kubectl get deploy <DEPLOYMENT_NAME> -oyaml
akan mengekspos pesan dari .status.conditions
elemen pod yang gagal, seperti yang terlihat di bawah ini.
... status: conditions: - lastTransitionTime: "2022-01-20T01:02:08Z" lastUpdateTime: "2022-01-20T01:02:08Z" message: 'pods "test-688f68dc87-tw587" is forbidden: violates PodSecurity "restricted:latest": allowPrivilegeEscalation != false (container "test" must set securityContext.allowPrivilegeEscalation=false), unrestricted capabilities (container "test" must set securityContext.capabilities.drop=["ALL"]), runAsNonRoot != true (pod or container "test" must set securityContext.runAsNonRoot=true), seccompProfile (pod or container "test" must set securityContext.seccompProfile.type to "RuntimeDefault" or "Localhost")' reason: FailedCreate status: "True" type: ReplicaFailure ...
Baik dalam mode audit maupun warning, pembatasan pod tidak mencegah agar Pod tidak dibuat dan dimulai. Namun, dalam mode ini, anotasi audit pada server API, peristiwa log audit dan peringatan kepada klien server API, seperti kubectl, dipicu, masing-masing, ketika pod, serta objek yang membuat pod, berisi PodSpecs dengan pelanggaran. Pesan kubectl
peringatan terlihat di bawah ini.
Warning: would violate PodSecurity "restricted:latest": allowPrivilegeEscalation != false (container "test" must set securityContext.allowPrivilegeEscalation=false), unrestricted capabilities (container "test" must set securityContext.capabilities.drop=["ALL"]), runAsNonRoot != true (pod or container "test" must set securityContext.runAsNonRoot=true), seccompProfile (pod or container "test" must set securityContext.seccompProfile.type to "RuntimeDefault" or "Localhost") deployment.apps/test created
Mode audit dan peringatan PSA berguna saat memperkenalkan PSS tanpa berdampak negatif pada operasi klaster.
Mode operasional PSA tidak saling eksklusif, dan dapat digunakan secara kumulatif. Seperti yang terlihat di bawah ini, beberapa mode dapat dikonfigurasi dalam satu namespace.
apiVersion: v1 kind: Namespace metadata: name: policy-test labels: pod-security.kubernetes.io/audit: restricted pod-security.kubernetes.io/enforce: restricted pod-security.kubernetes.io/warn: restricted
Dalam contoh di atas, peringatan yang mudah digunakan dan anotasi audit diberikan saat menerapkan Deployment, sedangkan pemberlakuan pelanggaran juga disediakan di tingkat pod. Bahkan beberapa label PSA dapat menggunakan tingkat profil yang berbeda, seperti yang terlihat di bawah ini.
apiVersion: v1 kind: Namespace metadata: name: policy-test labels: pod-security.kubernetes.io/enforce: baseline pod-security.kubernetes.io/warn: restricted
Dalam contoh di atas, PSA dikonfigurasi untuk memungkinkan pembuatan semua pod yang memenuhi tingkat profil dasar, dan kemudian memperingatkan pada pod (dan objek yang membuat pod) yang melanggar level profil terbatas. Ini adalah pendekatan yang berguna untuk menentukan kemungkinan dampak ketika mengubah dari baseline ke profil terbatas.
Pod yang ada
Jika namespace dengan pod yang ada dimodifikasi untuk menggunakan profil PSS yang lebih ketat, mode audit dan warning akan menghasilkan pesan yang sesuai; namun, mode enforce tidak akan menghapus pod. Pesan peringatan terlihat di bawah ini.
Warning: existing pods in namespace "policy-test" violate the new PodSecurity enforce level "restricted:latest" Warning: test-688f68dc87-htm8x: allowPrivilegeEscalation != false, unrestricted capabilities, runAsNonRoot != true, seccompProfile namespace/policy-test configured
Pengecualian
PSA menggunakan Pengecualian untuk mengecualikan penegakan pelanggaran terhadap pod yang seharusnya diterapkan. Pengecualian ini tercantum di bawah ini.
-
Nama pengguna: permintaan dari pengguna dengan nama pengguna yang dikecualikan yang diautentikasi (atau ditiru) diabaikan.
-
RuntimeClassNames: Pod dan sumber daya beban kerja yang menentukan nama kelas runtime yang dikecualikan akan diabaikan.
-
Namespaces: Pod dan sumber daya beban kerja dalam namespace yang dikecualikan diabaikan.
Pengecualian ini diterapkan secara statis dalam konfigurasi pengontrol penerimaan PSA sebagai bagian dari konfigurasi
Dalam implementasi Validating Webhook, pengecualian dapat dikonfigurasi dalam ConfigMap
apiVersion: v1 kind: ConfigMap metadata: name: pod-security-webhook namespace: pod-security-webhook data: podsecurityconfiguration.yaml: | apiVersion: pod-security.admission.config.k8s.io/v1 kind: PodSecurityConfiguration defaults: enforce: "restricted" enforce-version: "latest" audit: "restricted" audit-version: "latest" warn: "restricted" warn-version: "latest" exemptions: # Array of authenticated usernames to exempt. usernames: [] # Array of runtime class names to exempt. runtimeClasses: [] # Array of namespaces to exempt. namespaces: ["kube-system","policy-test1"]
Seperti yang terlihat pada ConfigMap YAMAL di atas, level PSS default di seluruh cluster telah diatur untuk dibatasi untuk semua mode PSA, mengaudit, menegakkan, dan memperingatkan. Ini memengaruhi semua ruang nama, kecuali yang dikecualikan:. namespaces: ["kube-system","policy-test1"]
Selain itu, dalam ValidatingWebhookConfigurationsumber daya, terlihat di bawah, pod-security-webhooknamespace juga dikecualikan dari PSS yang dikonfigurasi.
... webhooks: # Audit annotations will be prefixed with this name - name: "pod-security-webhook.kubernetes.io" # Fail-closed admission webhooks can present operational challenges. # You may want to consider using a failure policy of Ignore, but should # consider the security tradeoffs. failurePolicy: Fail namespaceSelector: # Exempt the webhook itself to avoid a circular dependency. matchExpressions: - key: kubernetes.io/metadata.name operator: NotIn values: ["pod-security-webhook"] ...
penting
Penerimaan Pod Security lulus menjadi stabil di Kubernetes v1.25. Jika Anda ingin menggunakan fitur Pod Security Admission sebelum diaktifkan secara default, Anda perlu menginstal pengontrol penerimaan dinamis (mutating webhook). Petunjuk untuk menginstal dan mengkonfigurasi webhook dapat ditemukan di sini.
Memilih antara policy-as-code dan Standar Keamanan Pod
Pod Security Standards (PSS) dikembangkan untuk menggantikan Pod Security Policy (PSP), dengan menyediakan solusi yang sudah ada di dalam Kubernetes dan tidak memerlukan solusi dari ekosistem Kubernetes. Karena itu, solusi policy-as-code (PAC) jauh lebih fleksibel.
Daftar Pro dan Kontra berikut ini dirancang untuk membantu Anda membuat keputusan yang lebih tepat tentang solusi keamanan pod Anda.
Policy-as-code (dibandingkan dengan Standar Keamanan Pod)
Kelebihan:
-
Lebih fleksibel dan lebih terperinci (hingga atribut sumber daya jika perlu)
-
Tidak hanya berfokus pada pod, dapat digunakan untuk melawan sumber daya dan tindakan yang berbeda
-
Tidak hanya diterapkan di tingkat namespace
-
Lebih matang dari Standar Keamanan Pod
-
Keputusan dapat didasarkan pada apa pun dalam payload permintaan server API, serta sumber daya cluster yang ada dan data eksternal (tergantung solusi)
-
Mendukung mutasi permintaan server API sebelum validasi (tergantung solusi)
-
Dapat menghasilkan kebijakan pelengkap dan sumber daya Kubernetes (tergantung solusi - Dari kebijakan pod, Kyverno dapat secara otomatis membuat kebijakan untuk pengontrol tingkat yang lebih tinggi, seperti Deployment
. Kyverno juga dapat menghasilkan sumber daya Kubernetes tambahan “`ketika sumber daya baru dibuat atau ketika sumber diperbarui`” dengan menggunakan Generate Rules.) -
Dapat digunakan untuk beralih ke kiri, ke pipeline CICD, sebelum melakukan panggilan ke server API Kubernetes (tergantung solusi)
-
Dapat digunakan untuk menerapkan perilaku yang belum tentu terkait keamanan, seperti praktik terbaik, standar organisasi, dll.
-
Dapat digunakan dalam kasus penggunaan non-Kubernetes (tergantung solusi)
-
Karena fleksibilitas, pengalaman pengguna dapat disesuaikan dengan kebutuhan pengguna
Kontra:
-
Tidak dibangun di Kubernetes
-
Lebih kompleks untuk dipelajari, dikonfigurasi, dan didukung
-
Penulisan kebijakan mungkin memerlukan yang baru skills/languages/capabilities
Penerimaan Keamanan Pod (dibandingkan dengan policy-as-code)
Kelebihan:
-
Dibangun di Kubernetes
-
Lebih sederhana untuk dikonfigurasi
-
Tidak ada bahasa baru untuk digunakan atau kebijakan untuk penulis
-
Jika tingkat penerimaan default cluster dikonfigurasi ke privileged, label namespace dapat digunakan untuk memilih namespace ke dalam profil keamanan pod.
Kontra:
-
Tidak sefleksibel atau granular policy-as-code
-
Hanya 3 tingkat pembatasan
-
Terutama berfokus pada pod
Ringkasan
Jika saat ini Anda tidak memiliki solusi keamanan pod, di luar PSP, dan postur keamanan pod yang Anda butuhkan sesuai dengan model yang ditentukan dalam Standar Keamanan Pod (PSS), maka jalur yang lebih mudah mungkin adalah mengadopsi PSS, sebagai pengganti solusi. policy-as-code Namun, jika postur keamanan pod Anda tidak sesuai dengan model PSS, atau Anda membayangkan menambahkan kontrol tambahan, di luar yang ditentukan oleh PSS, maka policy-as-code solusi akan tampak lebih cocok.
Rekomendasi
Gunakan beberapa mode Pod Security Admission (PSA) untuk pengalaman pengguna yang lebih baik
Seperti disebutkan sebelumnya, mode penegakan PSA mencegah Pod dengan pelanggaran PSS diterapkan, tetapi tidak menghentikan pengontrol tingkat yang lebih tinggi, seperti Deployment. Faktanya, Deployment akan berhasil diterapkan tanpa indikasi bahwa pod gagal diterapkan. Meskipun Anda dapat menggunakan kubectl untuk memeriksa objek Deployment, dan menemukan pesan pod yang gagal dari PSA, pengalaman pengguna bisa lebih baik. Untuk membuat pengalaman pengguna lebih baik, beberapa mode PSA (audit, menegakkan, memperingatkan) harus digunakan.
apiVersion: v1 kind: Namespace metadata: name: policy-test labels: pod-security.kubernetes.io/audit: restricted pod-security.kubernetes.io/enforce: restricted pod-security.kubernetes.io/warn: restricted
Dalam contoh di atas, dengan mode enforce yang ditentukan, ketika manifes Deployment dengan pelanggaran PSS di PodSpec masing-masing mencoba diterapkan ke server API Kubernetes, Deployment akan berhasil diterapkan, tetapi pod tidak akan berhasil. Dan, karena mode audit dan peringatan juga diaktifkan, klien server API akan menerima pesan peringatan dan peristiwa log audit server API akan dianotasi dengan pesan juga.
Batasi kontainer yang dapat berjalan sebagai hak istimewa
Seperti disebutkan, kontainer yang berjalan sebagai hak istimewa mewarisi semua kemampuan Linux yang ditugaskan untuk melakukan root pada host. Jarang kontainer membutuhkan jenis hak istimewa ini untuk berfungsi dengan baik. Ada beberapa metode yang dapat digunakan untuk membatasi izin dan kemampuan kontainer.
penting
Fargate adalah tipe peluncuran yang memungkinkan Anda menjalankan container “tanpa server” di mana kontainer pod dijalankan pada infrastruktur yang dikelola AWS. Dengan Fargate, Anda tidak dapat menjalankan kontainer istimewa atau mengonfigurasi pod Anda untuk menggunakan HostNetwork atau HostPort.
Jangan menjalankan proses dalam wadah sebagai root
Semua kontainer berjalan sebagai root secara default. Ini bisa menjadi masalah jika penyerang dapat mengeksploitasi kerentanan dalam aplikasi dan mendapatkan akses shell ke wadah yang sedang berjalan. Anda dapat mengurangi risiko ini dengan berbagai cara. Pertama, dengan menghapus shell dari gambar kontainer. Kedua, menambahkan direktif USER ke Dockerfile Anda atau menjalankan container di pod sebagai pengguna non-root. Kubernetes PodSpec menyertakan sekumpulan bidang, di bawahnyaspec.securityContext
, yang memungkinkan Anda menentukan and/or grup pengguna untuk menjalankan aplikasi Anda. Bidang ini adalah runAsUser
dan runAsGroup
masing-masing.
Untuk menegakkan penggunaanspec.securityContext
, dan elemen-elemen yang terkait, dalam Kubernetes PodSpec, policy-as-code atau Standar Keamanan Pod dapat ditambahkan ke klaster. Solusi ini memungkinkan Anda untuk menulis dan/atau menggunakan kebijakan atau profil yang dapat memvalidasi muatan permintaan server API Kubernetes masuk, sebelum disimpan ke etcd. Selain itu, policy-as-code solusi dapat mengubah permintaan masuk, dan dalam beberapa kasus, menghasilkan permintaan baru.
Jangan pernah menjalankan Docker di Docker atau memasang soket di wadah
Meskipun ini memungkinkan Anda untuk membuat build/run gambar dalam wadah Docker, pada dasarnya Anda melepaskan kendali penuh node ke proses yang berjalan di wadah. Jika Anda perlu membuat image kontainer di Kubernetes, gunakan Kaniko
catatan
Cluster Kubernetes yang digunakan untuk pemrosesan CICD, seperti membangun image kontainer, harus diisolasi dari cluster yang menjalankan beban kerja yang lebih umum.
Batasi penggunaan hostPath atau jika hostPath diperlukan batasi awalan mana yang dapat digunakan dan konfigurasikan volume sebagai hanya-baca
hostPath
adalah volume yang memasang direktori dari host langsung ke wadah. Jarang pod membutuhkan jenis akses ini, tetapi jika mereka melakukannya, Anda harus menyadari risikonya. Secara default pod yang berjalan sebagai root akan memiliki akses tulis ke sistem file yang diekspos oleh HostPath. Ini dapat memungkinkan penyerang untuk memodifikasi pengaturan kubelet, membuat tautan simbolis ke direktori atau file yang tidak langsung diekspos oleh HostPath, misalnya /etc/shadow, menginstal kunci ssh, membaca rahasia yang dipasang ke host, dan hal-hal berbahaya lainnya. Untuk mengurangi risiko dari HostPath, konfigurasikan spec.containers.volumeMounts
asreadOnly
, misalnya:
volumeMounts: - name: hostPath-volume readOnly: true mountPath: /host-path
Anda juga harus menggunakan policy-as-code solusi untuk membatasi direktori yang dapat digunakan oleh hostPath
volume, atau mencegah hostPath
penggunaan sama sekali. Anda dapat menggunakan Pod Security Standards Baseline atau kebijakan Restricted untuk mencegah penggunaan. hostPath
Untuk informasi lebih lanjut tentang bahaya eskalasi istimewa, baca blog Seth Art Bad Pods: Kubernetes Pod
Tetapkan permintaan dan batasan untuk setiap kontainer untuk menghindari pertentangan sumber daya dan serangan DoS
Pod tanpa permintaan atau batasan secara teoritis dapat menggunakan semua sumber daya yang tersedia di host. Karena pod tambahan dijadwalkan ke sebuah node, node mungkin mengalami CPU atau tekanan memori yang dapat menyebabkan Kubelet menghentikan atau mengusir pod dari node. Meskipun Anda tidak dapat mencegah hal ini terjadi bersama-sama, menetapkan permintaan dan batasan akan membantu meminimalkan pertentangan sumber daya dan mengurangi risiko dari aplikasi yang ditulis dengan buruk yang mengkonsumsi sumber daya dalam jumlah berlebihan.
podSpec
Ini memungkinkan Anda untuk menentukan permintaan dan batas untuk CPU dan memori. CPU dianggap sebagai sumber daya yang dapat dikompresi karena dapat kelebihan langganan. Memori tidak dapat dimampatkan, yaitu tidak dapat dibagi di antara beberapa wadah.
Saat Anda menentukan permintaan untuk CPU atau memori, pada dasarnya Anda menentukan jumlah memori yang dijamin akan didapat oleh kontainer. Kubernetes mengumpulkan permintaan dari semua kontainer dalam sebuah pod untuk menentukan node mana yang akan menjadwalkan pod tersebut. Jika sebuah wadah melebihi jumlah memori yang diminta, mungkin akan dihentikan jika ada tekanan memori pada node.
Batas adalah jumlah maksimum CPU dan sumber daya memori yang diizinkan untuk dikonsumsi oleh wadah dan secara langsung sesuai dengan memory.limit_in_bytes
nilai cgroup yang dibuat untuk wadah. Sebuah wadah yang melebihi batas memori akan OOM dimatikan. Jika sebuah kontainer melebihi batas CPU-nya, itu akan dibatasi.
catatan
Saat menggunakan kontainer, sangat resources.limits
disarankan agar penggunaan sumber daya kontainer (alias Resource Footprints) digerakkan oleh data dan akurat, berdasarkan pengujian beban. Tanpa jejak sumber daya yang akurat dan tepercaya, wadah resources.limits
dapat dilapisi. Misalnya, resources.limits.memory
dapat diberi empuk 20-30% lebih tinggi dari maksimum yang dapat diamati, untuk memperhitungkan potensi ketidakakuratan batas sumber daya memori.
Kubernetes menggunakan tiga kelas Quality of Service (QoS) untuk memprioritaskan beban kerja yang berjalan pada sebuah node. Ini termasuk:
-
terjamin
-
bisa meledak
-
upaya terbaik
Jika batas dan permintaan tidak disetel, pod dikonfigurasi sebagai upaya terbaik (prioritas terendah). Pod dengan upaya terbaik adalah yang pertama terbunuh ketika memori tidak mencukupi. Jika limit ditetapkan pada semua kontainer di dalam pod, atau jika permintaan dan limit disetel ke nilai yang sama dan tidak sama dengan 0, pod dikonfigurasi sebagai jaminan (prioritas tertinggi). Pod yang dijamin tidak akan dimatikan kecuali melebihi batas memori yang dikonfigurasi. Jika batas dan permintaan dikonfigurasi dengan nilai yang berbeda dan tidak sama dengan 0, atau satu kontainer dalam pod menetapkan batas dan yang lainnya tidak atau memiliki batas yang ditetapkan untuk sumber daya yang berbeda, pod dikonfigurasi sebagai burstable (prioritas menengah). Pod ini memiliki beberapa jaminan sumber daya, tetapi dapat dimatikan setelah melebihi memori yang diminta.
penting
Permintaan tidak memengaruhi memory_limit_in_bytes
nilai cgroup container; batas cgroup diatur ke jumlah memori yang tersedia di host. Namun demikian, pengaturan nilai permintaan terlalu rendah dapat menyebabkan pod ditargetkan untuk dihentikan oleh kubelet jika node mengalami tekanan memori.
Kelas | Prioritas | Ketentuan | Kondisi Bunuh |
---|---|---|---|
Terjamin |
tertinggi |
batas = permintaan! = 0 |
Hanya melebihi batas memori |
Terbakar |
medium |
batas! = permintaan! = 0 |
Dapat dimatikan jika melebihi memori permintaan |
Upaya Terbaik |
terendah |
batas & permintaan Tidak Ditetapkan |
Pertama terbunuh ketika memori tidak mencukupi |
Untuk informasi tambahan tentang resource QoS, silakan lihat dokumentasi Kubernetes
Anda dapat memaksa penggunaan permintaan dan batasan dengan menetapkan kuota sumber daya
Policy-as-code solusi dapat digunakan menerapkan permintaan dan batasan. atau bahkan untuk membuat kuota sumber daya dan rentang batas saat ruang nama dibuat.
Jangan biarkan eskalasi istimewa
Eskalasi istimewa memungkinkan proses untuk mengubah konteks keamanan di mana ia berjalan. Sudo adalah contoh yang baik dari ini seperti binari dengan bit SUID atau SGID. Eskalasi istimewa pada dasarnya adalah cara bagi pengguna untuk mengeksekusi file dengan izin pengguna atau grup lain. Anda dapat mencegah penampung menggunakan eskalasi istimewa dengan menerapkan kebijakan policy-as-code mutasi yang disetel allowPrivilegeEscalation
ke false
atau dengan securityContext.allowPrivilegeEscalation
menyetel di. podSpec
Policy-as-code kebijakan juga dapat digunakan untuk mencegah permintaan server API berhasil jika pengaturan yang salah terdeteksi. Standar Keamanan Pod juga dapat digunakan untuk mencegah Pod menggunakan eskalasi hak istimewa.
Nonaktifkan ServiceAccount token mount
Untuk pod yang tidak perlu mengakses Kubernetes API, Anda dapat menonaktifkan pemasangan ServiceAccount token secara otomatis pada spesifikasi pod, atau untuk semua pod yang menggunakan tertentu. ServiceAccount
apiVersion: v1 kind: Pod metadata: name: pod-no-automount spec: automountServiceAccountToken: false
apiVersion: v1 kind: ServiceAccount metadata: name: sa-no-automount automountServiceAccountToken: false
Nonaktifkan penemuan layanan
Untuk pod yang tidak perlu mencari atau memanggil layanan in-cluster, Anda dapat mengurangi jumlah informasi yang diberikan ke pod. Anda dapat mengatur kebijakan DNS Pod agar tidak menggunakan CoreDNS, dan tidak mengekspos layanan di namespace pod sebagai variabel lingkungan. Lihat dokumen Kubernetes tentang variabel lingkungan
apiVersion: v1 kind: Pod metadata: name: pod-no-service-info spec: dnsPolicy: Default # "Default" is not the true default value enableServiceLinks: false
Konfigurasikan gambar Anda dengan sistem file root read-only
Mengkonfigurasi gambar Anda dengan sistem file root read-only mencegah penyerang menimpa biner pada sistem file yang digunakan aplikasi Anda. Jika aplikasi Anda harus menulis ke sistem file, pertimbangkan untuk menulis ke direktori sementara atau melampirkan dan memasang volume. Anda dapat menerapkan ini dengan menyetel pod SecurityContext sebagai berikut:
... securityContext: readOnlyRootFilesystem: true ...
Policy-as-code dan Standar Keamanan Pod dapat digunakan untuk menegakkan perilaku ini.
Sesuai kontainer Windows di KubernetessecurityContext.readOnlyRootFilesystem
tidak dapat diatur true
untuk wadah yang berjalan di Windows karena akses tulis diperlukan untuk registri dan proses sistem untuk berjalan di dalam wadah.
Alat dan sumber daya
-
open-policy-agent/gatekeeper-library: Pustaka kebijakan OPA Gatekeeper adalah pustaka kebijakan yang dapat Anda gunakan
sebagai pengganti. OPA/Gatekeeper PSPs -
Kumpulan kebijakan
OPA dan Kyverno umum untuk EKS. -
Pod Security Policy Migrator
adalah alat yang mengkonversi PSPs ke kebijakan OPA/GateKeeper,, atau Kyverno KubeWarden -
NeuVector oleh SUSE
open source, platform keamanan wadah zero-trust, menyediakan kebijakan proses dan sistem file serta aturan kontrol penerimaan.