Kubernetes Pod dapat berkomunikasi dengan bebas satu sama lain secara default. Ini menimbulkan risiko keamanan saat klaster Anda digunakan untuk beberapa aplikasi atau tim. Perilaku salah atau akses jahat di satu Pod dapat mengarahkan lalu lintas ke Pod lain di cluster Anda. Artikel ini akan mengajarkan Anda cara menghindari skenario ini dengan mengatur kebijakan jaringan. Aturan ini memungkinkan Anda mengontrol arus lalu lintas Pod-to-Pod pada tingkat alamat IP (OSI layer 3 atau 4). Anda dapat secara tepat menentukan sumber masuk dan keluar yang diizinkan untuk setiap Pod.
Membuat Kebijakan Jaringan
Kebijakan jaringan dibuat dengan menambahkan objek NetworkPolicy ke klaster Anda. Setiap kebijakan menentukan Pod yang berlaku untuknya dan satu atau lebih aturan masuk dan keluar. Berikut manifes kebijakan dasar:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: network-policy namespace: app spec: podSelector: matchLabels: component: database policyTypes: - Masuknya - Masuknya keluar: - dari: - podSelector : matchLabels: component: api egress: - to: - podSelector: matchLabels: component: api
Kebijakan jaringan ini berlaku untuk semua Pod dengan label component: database di namespace aplikasi. Dinyatakan bahwa lalu lintas masuk (masuk) dan keluar (keluar) hanya diperbolehkan dari dan ke Pod dengan label komponen: api. Setiap permintaan yang berasal dari Pod lain, seperti komponen: web-frontend, akan diblokir. Kebijakan
Network dapat diterapkan seperti objek lainnya dengan menggunakan Kubectl. Mereka akan langsung berlaku setelah dibuat. Anda dapat menambahkan kebijakan jaringan sebelum Anda memulai Pod yang dipilihnya.
$ kubectl apply -f policy.yaml networkingpolicy.networking.k8s.io/network-policy createdHow Network Policies Work
Kebijakan jaringan diterapkan oleh plugin jaringan aktif klaster Anda. Kebijakan Anda tidak akan berpengaruh jika plugin Anda tidak mendukung fitur tersebut. Pilihan yang paling populer seperti Calico dan Cilium dikirimkan dengan dukungan kebijakan jaringan yang diaktifkan.
Ketika kebijakan jaringan diterapkan pada sebuah Pod, plugin akan memeriksa lalu lintasnya untuk memeriksa kepatuhannya terhadap persyaratan kebijakan. Koneksi apa pun yang tidak memenuhi kriteria tidak akan diizinkan. Pod yang mencoba memulai koneksi akan menemukan host jarak jauh tidak dapat dijangkau, baik karena Pod mencoba mengakses sumber daya yang diblokir oleh aturan egress, atau karena Pod jarak jauh menolak koneksi masuk menggunakan aturan ingress.
A koneksi berhasil antara dua Pod hanya dapat dibuat ketika kebijakan jaringan pada keduanya mengizinkannya. Koneksi dapat dilarang oleh aturan jalan keluar dari Pod yang memulai, atau aturan jalan masuk pada target. Kebijakan
Network selalu bersifat aditif. Ketika beberapa kebijakan memilih Pod yang sama, daftar sumber masuk dan keluar yang diizinkan akan menjadi kombinasi dari semua kebijakan. Kebijakan Jaringan
Example
Kebijakan jaringan mendukung banyak opsi berbeda untuk menyesuaikan Pod yang mereka targetkan dan jenis koneksi yang diizinkan. Contoh berikut menampilkan beberapa kasus penggunaan umum.
Menerapkan kebijakan ke setiap Pod di namespace, hanya mengizinkan lalu lintas Ingress dari alamat IP tertentu block
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: network-policy namespace: app spec: podSelector: {} policyTypes: - Ingress ingress: - from: - ipBlock: cidr: 172.17.0.0/16
Blok podSelector yang kosong berarti semua Pod namespace ditargetkan oleh kebijakan. Aturan ipBlock membatasi lalu lintas masuk ke Pod dengan alamat IP dalam rentang yang ditentukan. Traffic keluar tidak diblokir.
Izinkan traffic Ingress dari blok alamat IP, tetapi kecualikan beberapa IP tertentu
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: network-policy namespace: app spec: podSelector: {} policyTypes: - Ingress masuknya: - dari: - ipBlock: cidr: 172.17.0.0/16 kecuali: - 172.17.0.1/24 - 172.17.0.2/24 - 172.17.0.3/24
ipBlock aturan mendukung bidang pengecualian untuk mengecualikan lalu lintas yang berasal dari, atau diarahkan untuk, IP tertentu.
Allow Ingress traffic dari semua Pod di namespace, tetapi hanya dari port
apiVersion tertentu: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: network-policy namespace: app spec: podSelector: {} policyTypes: - Masuknya masuk: - dari: - podSelector: {} port: - protokol: port TCP: 443
Bidang port tersedia pada aturan masuk dan keluar. Ini mendefinisikan port yang lalu lintas dapat diterima dari dan dikirim ke. Anda dapat secara opsional menentukan rentang port, seperti 3000 – 3500, dengan mengatur kolom endPort (3500) selain port (3000).
Izinkan lalu lintas dari Pod dengan label spesifik yang ada di namespace
apiVersion: networking.k8s yang berbeda. io/v1 kind: NetworkPolicy metadata: name: network-policy namespace: database spec: podSelector: {} policyTypes: - Ingress masuknya: - from: - namespaceSelector: matchLabels: aplikasi: demo-app podSelector: matchLabels: component: database
Status kebijakan bahwa setiap Pod berlabel komponen: database dapat menjangkau semua Pod dalam namespace database, jika namespace miliknya diberi label demo-app.
Anda dapat mengizinkan lalu lintas dari semua Pod dalam namespace eksternal dengan membuat aturan yang hanya menyertakan field NamespaceSelector.
Mengizinkan secara eksplisit semua lalu lintas
Terkadang Anda mungkin ingin secara eksplisit mengizinkan semua lalu lintas dari jenis tertentu dalam ruang nama. Sertakan tipe dalam kebijakan Anda tetapi berikan pemilih Pod kosong dan tanpa aturan:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: network-policy namespace: app spec: podSelector: {} policyTypes: - Ingress - Egress ingress: - {} egress: - {}
Semua Pod di namespace bisa berkomunikasi dengan bebas, seolah-olah tidak ada kebijakan. Tetap membuat kebijakan memungkinkan Anda menunjukkan niat Anda kepada pengguna cluster lainnya. Mereka mungkin mempertanyakan keberadaan sebuah namespace dengan jaringan tak terbatas dalam sebuah cluster yang sebaliknya telah diamankan.
Kapan Menggunakan Kebijakan Jaringan
Kebijakan jaringan harus dibuat untuk setiap namespace dan Pod di cluster Anda. Ini mengisolasi Pod Anda dengan lebih baik dan memberi Anda kendali atas arus lalu lintas.
Cobalah untuk membuat kebijakan Anda serinci mungkin. Memperluas akses terlalu banyak, seperti mengizinkan akses di antara semua Pod di namespace, membuat Anda terpapar risiko jika salah satu kontainer Anda disusupi. Pertimbangkan untuk menggunakan pemilih yang tepat untuk mengidentifikasi jarak masuk dan keluar individu untuk Pod sensitif seperti layanan autentikasi, basis data, dan penangan pembayaran.
Kubernetes tidak mengaktifkan kebijakan jaringan apa pun secara default yang dapat memungkinkan terjadinya pengawasan, bahkan jika Anda bermaksud agar semua Pod dilindungi oleh suatu kebijakan. Anda dapat mengurangi risiko ini dengan menambahkan kebijakan penampung-semua ke ruang nama Anda. Kebijakan ini memilih setiap Pod dalam namespace dan menerapkan aturan yang melarang semua komunikasi jaringan:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: deny-all namespace: app spec: podSelector: {} policyTypes: - Ingress - Kebijakan Egress
Network selalu dicakup ke ruang nama sehingga Anda harus membuat catch-all terpisah untuk masing-masing.
Summary
Kubernetes memungkinkan semua Pod di klaster Anda untuk berkomunikasi satu sama lain. Ini terlalu permisif untuk aplikasi dunia nyata yang berjalan di cluster multiguna. Kebijakan jaringan mengatasi masalah ini dengan menyediakan sistem seperti firewall untuk mengelola sumber masuk dan target keluar yang diterima setiap Pod. Nbsp
Merupakan praktik yang baik untuk mengonfigurasi kebijakan jaringan di semua Pod Anda. Ini akan mengamankan klaster Anda sehingga hanya arus lalu lintas yang sah yang diizinkan. Namun, kebijakan jaringan hanyalah satu bagian dari keamanan Kubernetes: mekanisme perlindungan lain seperti konteks keamanan RBAC dan Pod juga merupakan alat penting untuk memperkuat lingkungan Anda.
Disadur dari HowToGeek.com.