Di Container Service for Kubernetes, Anda dapat mencegah proses di dalam kontainer keluar dari batas isolasinya dan mengakses host. Hal ini melibatkan pembatasan agar kontainer tidak berjalan dalam mode istimewa, membatasi proses aplikasi agar tidak berjalan sebagai pengguna root, serta menonaktifkan pemasangan otomatis token Service Account. Anda dapat mengonfigurasi kebijakan keamanan pod untuk memperkuat keamanan kluster dan mencegahnya menjadi sasaran penyerang.
Cegah proses keluar dari batas kontainer dan mendapatkan izin
Jika Anda seorang developer atau insinyur O&M yang menggunakan Kubernetes, sangat penting untuk mencegah proses di dalam kontainer keluar dari batas isolasinya dan mengakses host. Hal ini penting karena dua alasan utama:
Pertama, proses di dalam kontainer secara default berjalan dalam konteks pengguna
Linux root. Meskipun operasi penggunarootdi dalam kontainer sebagian dibatasi olehLinux capabilitiesyang diberikan Docker kepada kontainer, izin default ini berpotensi memungkinkan penyerang melakukan peningkatan hak istimewa atau mengakses informasi sensitif pada host. Informasi tersebut mencakup resource sensitif seperti objekSecretsdanConfigMap. Berikut adalah daftarcapabilitiesdefault yang diberikan kepada kontainer Docker. Untuk informasi lebih lanjut, lihat capabilities(7) — Linux manual page.cap_chown, cap_dac_override, cap_fowner, cap_fsetid, cap_kill, cap_setgid, cap_setuid, cap_setpcap, cap_net_bind_service, cap_net_raw, cap_sys_chroot, cap_mknod, cap_audit_write, cap_setfcap.Hindari menjalankan pod dengan status istimewa (
privileged) sebisa mungkin, karena status tersebut memberikan semuacapabilitiesLinux yang terkait dengan pengguna root pada host.Kedua, semua node pekerja Kubernetes menggunakan mode otorisasi yang disebut node authorizer. Node authorizer memberikan izin untuk semua permintaan API yang berasal dari Kubelet dan memungkinkan sebuah node melakukan operasi berikut:
Operasi Baca:
Layanan
Titik Akhir
Node
Pods
Secrets, ConfigMaps, PersistentVolumes (PVs), dan PersistentVolumeClaims (PVCs) yang terkait dengan pod yang terikat pada node Kubelet tersebut
Operasi Tulis:
Nodes dan status node (Aktifkan plugin admission
NodeRestrictionuntuk membatasi Kubelet hanya mengubah objek nodenya sendiri)Pods dan status pod (Aktifkan plugin admission
NodeRestrictionuntuk membatasi Kubelet hanya mengubah pod yang terikat padanya)Peristiwa
Operasi terkait autentikasi:
Akses baca/tulis ke API
CertificateSigningRequest (CSR)untuk TLS bootstrappingKemampuan membuat
TokenReviewdanSubjectAccessReviewuntuk pemeriksaan otentikasi identitas dan otorisasi yang didelegasikan
Kluster ACK secara default menggunakan admission controller Node Restriction. Controller ini hanya mengizinkan sebuah node untuk mengubah sekumpulan terbatas properti node dan objek pod yang terikat padanya. Namun, penyerang yang berhasil mengakses host tetap dapat mengambil informasi sensitif dari lingkungan melalui API Kubernetes. Untuk informasi lebih lanjut, lihat Node Restriction admission controller.
Rekomendasi konfigurasi keamanan pod
Restrict containers from running in privileged mode
Seperti disebutkan sebelumnya, kontainer yang berjalan dengan status istimewa mewarisi semua capabilities Linux yang diberikan kepada pengguna root pada host. Dalam sebagian besar skenario, kontainer tidak memerlukan izin ini untuk berfungsi dengan benar. Anda dapat membuat kebijakan keamanan pod untuk menolak pod yang dikonfigurasi berjalan dalam mode istimewa. Kebijakan keamanan pod adalah serangkaian batasan keamanan yang harus dipenuhi oleh pod sebelum dapat dibuat. ACK menyediakan kemampuan container security policy berbasis Open Policy Agent (OPA) dan Gatekeeper. Kemampuan ini memvalidasi permintaan pembuatan dan pembaruan pod pada kluster berdasarkan aturan keamanan yang dikonfigurasi pengguna. Jika permintaan pembuatan atau pembaruan pod tidak mematuhi aturan yang ditetapkan, sistem akan menolak permintaan tersebut dan mengembalikan error. Demikian pula, Anda dapat menerapkan kebijakan ACKPSPPrivilegedContainer untuk membatasi penerapan kontainer istimewa di namespace tertentu dalam kluster.
Restrict application processes from running as the root user
Secara default, kontainer berjalan sebagai pengguna root. Hal ini dapat menjadi masalah keamanan jika penyerang mengeksploitasi kerentanan pada aplikasi dan mendapatkan akses shell ke kontainer yang sedang berjalan. Anda dapat mengurangi risiko ini dengan beberapa cara. Salah satunya adalah menghapus shell dari gambar kontainer. Cara lain adalah menambahkan instruksi USER ke Dockerfile Anda atau menjalankan kontainer dalam pod sebagai pengguna non-root. Spesifikasi pod Kubernetes (podSpec) berisi field
spec.securityContext,runAsUser, danrunAsGroup. Field-field ini memungkinkan Anda menentukan pengguna dan grup untuk menjalankan aplikasi. Anda dapat membuat kebijakan ACKPSPAllowedUsers untuk menegakkan pembatasan ini.Forbid running containers in Docker-in-Docker mode or mounting Docker.sock in a container
Menggunakan kontainer bersarang atau memasang Docker.sock memudahkan pembuatan atau menjalankan gambar kontainer di dalam kontainer Docker. Namun, hal ini memberikan kendali penuh atas node kepada proses yang berjalan di dalam kontainer. Untuk informasi lebih lanjut tentang pembuatan gambar kontainer di Kubernetes, lihat Build an image using an Enterprise Edition instance, Kaniko, dan img.
Restrict the use of HostPath, and if you must use it, only mount directories with a specified prefix and configure the volume as read-only
Anda dapat menggunakan
HostPathuntuk langsung memasang direktori host ke dalam kontainer. Fitur ini hanya diperlukan dalam beberapa skenario bisnis. Jika bisnis Anda memerlukan fitur ini, Anda harus memahami risiko yang terkait. Secara default, pod yang berjalan sebagai root memiliki akses tulis ke sistem file yang diekspos olehHostPath. Akses ini dapat memungkinkan penyerang memodifikasi pengaturanKubelet, membuat tautan simbolik ke direktori atau file yang tidak secara langsung diekspos melaluiHostPath(seperti/etc/shadow), menginstal kunci SSH, membaca rahasia yang dipasang pada host, dan melakukan tindakan berbahaya lainnya. Untuk mengurangi risiko penggunaanHostPath, Anda dapat mengatur fieldspec.containers.volumeMountsmenjadi read-only. Contohnya:volumeMounts: - name: hostPath-volume readOnly: true mountPath: /host-pathDemikian pula, Anda dapat menerapkan instance kebijakan ACKPSPHostFilesystem untuk membatasi rentang direktori host yang boleh dipasang oleh pod yang diterapkan di namespace tertentu dalam kluster.
Set requests and resource limits for each container to avoid resource contention or DoS attacks
Pod tanpa requests atau batas resource secara teoretis dapat mengonsumsi seluruh resource yang tersedia pada host. Jika pod tersebut dijadwalkan ke node ini, node tersebut mungkin mengalami kekurangan CPU atau memori. Hal ini dapat menyebabkan
Kubeletcrash atau mengeluarkan pod lain dari node tersebut. Meskipun hal ini tidak dapat dihindari sepenuhnya, menetapkan requests dan batas resource membantu meminimalkan konflik sumber daya. Hal ini juga mengurangi risiko konsumsi resource berlebihan akibat aplikasi yang ditulis dengan buruk.PodSpec memungkinkan Anda membatasi penggunaan CPU dan memori. Anda dapat menegakkan batasan requests dan resource dengan menetapkan Resource Quota atau membuat Limit Range pada namespace. Kuota sumber daya memungkinkan Anda menentukan jumlah total resource, seperti CPU dan RAM, yang dialokasikan ke namespace. Saat diterapkan pada namespace, kuota ini mewajibkan Anda menentukan requests dan batas untuk semua kontainer yang diterapkan di namespace tersebut. Sebaliknya, limit range memberikan kontrol alokasi sumber daya yang lebih detail halus. Dengan limit range, Anda dapat menetapkan resource CPU dan memori minimum serta maksimum untuk setiap pod atau kontainer dalam namespace. Anda juga dapat menetapkan nilai request dan batas default jika tidak ada nilai yang diberikan. Untuk informasi lebih lanjut, lihat Managing Resources for Containers.
Demikian pula, Anda dapat menerapkan instance kebijakan ACKContainerLimits untuk mewajibkan pod aplikasi yang diterapkan di namespace tertentu dalam kluster memiliki konfigurasi batas resource.
Disable privilege escalation configurations
Peningkatan hak istimewa memungkinkan proses mengubah konteks keamanan tempat proses tersebut berjalan. Contohnya termasuk
sudodan file biner dengan bitSUIDatauSGID. Peningkatan hak istimewa memungkinkan pengguna mengeksekusi file dengan izin pengguna atau grup lain. Anda dapat mencegah kontainer melakukan peningkatan hak istimewa menggunakan kebijakan keamananpodyang mengaturallowPrivilegeEscalationkefalse, atau dengan mengatursecurityContext.allowPrivilegeEscalationdalampodSpec.Demikian pula, Anda dapat menerapkan instance kebijakan ACKPSPAllowPrivilegeEscalationContainer untuk mewajibkan pod yang diterapkan di namespace tertentu dalam kluster memiliki parameter allowPrivilegeEscalation yang dikonfigurasi.
Disable automatic mounting of Service Account tokens
Untuk pod yang tidak perlu mengakses API Kubernetes, Anda dapat menonaktifkan pemasangan otomatis token
ServiceAccountpadaPodSpec. Anda juga dapat menonaktifkannya untuk semua pod yang menggunakanServiceAccounttertentu.apiVersion: v1 kind: Pod metadata: name: pod-no-automount spec: automountServiceAccountToken: false ...Menonaktifkan pemasangan otomatis
ServiceAccounttidak memblokir akses jaringan pod ke API Kubernetes. Untuk memblokir akses jaringan pod ke API Kubernetes, Anda dapat mengubah metode aksesEndpointkluster ACK dan menggunakan kebijakan jaringan untuk memblokir akses jaringan pod tersebut. Untuk informasi lebih lanjut, lihat Use network policies in an ACK cluster.apiVersion: v1 kind: ServiceAccount metadata: name: sa-no-automount automountServiceAccountToken: false ...Demikian pula, Anda dapat menerapkan instance kebijakan ACKBlockAutomountToken untuk mewajibkan field
automountServiceAccountToken: falseditetapkan pada pod aplikasi guna mencegah pemasangan otomatis Service Account.Disable service discovery
Untuk pod yang tidak perlu menemukan atau memanggil layanan kluster, Anda dapat membatasi informasi yang diberikan ke pod tersebut. Anda dapat mengatur kebijakan DNS pod agar tidak menggunakan CoreDNS dan mencegah Services di namespace diekspos sebagai variabel lingkungan di dalam pod. Untuk informasi lebih lanjut, lihat Environment variables.
Nilai default kebijakan DNS pod adalah
ClusterFirst, yang menggunakan DNS dalam kluster. NilaiDefaultbukanlah pengaturan default sebenarnya dan mengonfigurasi pod untuk menggunakan resolusi DNS dari node dasar. Untuk informasi lebih lanjut, lihat Kubernetes docs on Pod DNS policy.Menonaktifkan service links dan mengubah kebijakan DNS pod tidak memblokir akses jaringan pod ke layanan DNS dalam kluster. Penyerang masih dapat mencantumkan layanan dalam kluster dengan mengakses layanan DNS dalam kluster (misalnya:
dig SRV *.*.svc.cluster.local @$CLUSTER_DNS_IP). Untuk memblokir penemuan layanan dalam kluster, lihat Use network policies in an ACK cluster.apiVersion: v1 kind: Pod metadata: name: pod-no-service-info spec: dnsPolicy: Default # Nilai "Default" bukan nilai default sebenarnya. enableServiceLinks: false ...Configure images to have a read-only file system
Anda dapat mengonfigurasi citra Anda agar memiliki sistem file read-only untuk mencegah penyerang menimpa file pada sistem file yang digunakan aplikasi Anda. Jika aplikasi Anda harus menulis ke sistem file, Anda dapat menulis ke direktori temporary atau memasang volume tambahan. Anda dapat menegakkan hal ini dengan mengatur
SecurityContextpod sebagai berikut:... securityContext: readOnlyRootFilesystem: true ...Demikian pula, Anda dapat menerapkan instance kebijakan ACKPSPReadOnlyRootFilesystem untuk membatasi pod yang diterapkan di namespace tertentu dalam kluster agar hanya menggunakan sistem file root read-only.