Mengonfigurasi kebijakan jaringan

Halaman ini menunjukkan cara menggunakan kebijakan jaringan cluster untuk mengontrol apakah Pod dapat menerima traffic jaringan masuk (atau Traffic Masuk), dan apakah Pod dapat mengirim traffic keluar (atau Traffic Keluar).

Dengan kebijakan jaringan, Anda dapat membatasi koneksi antar-objek Pod, sehingga Anda dapat mengurangi paparan serangan.

Kebijakan jaringan berfungsi sebagai firewall pada lapisan 3 atau lapisan 4 dari model OSI. Fitur tersebut tidak menawarkan fitur tambahan seperti otorisasi atau enkripsi.

Membatasi traffic masuk ke objek Pod

Objek NetworkPolicy memungkinkan Anda mengonfigurasi kebijakan akses jaringan untuk Pod. Objek NetworkPolicy berisi informasi berikut:

  • Objek Pod yang memberlakukan kebijakan. Anda dapat menentukan objek dan beban kerja Pod dengan label dan pemilih.

  • Jenis traffic yang terpengaruh oleh kebijakan jaringan: Traffic masuk untuk traffic masuk, Traffic keluar untuk traffic keluar, atau keduanya.

  • Untuk kebijakan Ingress, objek Pod mana yang dapat terhubung ke objek Pod yang ditentukan.

  • Untuk kebijakan Keluar, objek Pod yang dapat dihubungkan dengan objek Pod yang ditentukan.

Contoh pembatasan traffic masuk

Bagian ini menunjukkan pembuatan batasan traffic masuk pada aplikasi contoh. Ubah contoh ini agar sesuai dengan lingkungan aplikasi Anda.

  1. Jalankan aplikasi server web dengan label app=hello dan ekspos secara internal di cluster:

    kubectl run hello-web --labels app=hello \
        --image=us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0 \
        --port 8080 --expose
    
  2. Konfigurasikan NetworkPolicy untuk mengizinkan traffic ke Pod hello-web hanya dari objek Pod app=foo. GKE di AWS memblokir traffic masuk dari objek Pod yang tidak memiliki label ini, serta traffic eksternal, dan traffic dari objek Pod di Namespace yang berbeda.

    Manifes berikut memilih objek Pod dengan label app=hello dan menentukan kebijakan Ingress untuk mengizinkan traffic hanya dari objek Pod dengan label app=foo:

    kind: NetworkPolicy
    apiVersion: networking.k8s.io/v1
    metadata:
      name: hello-allow-from-foo
    spec:
      policyTypes:
      - Ingress
      podSelector:
        matchLabels:
          app: hello
      ingress:
      - from:
        - podSelector:
            matchLabels:
              app: foo
  3. Terapkan kebijakan ini ke cluster:

    kubectl apply -f hello-allow-from-foo.yaml
    

Memverifikasi kebijakan Ingress

  1. Jalankan Pod sementara dengan label app=foo. Untuk memverifikasi bahwa traffic masuk diizinkan, buat permintaan ke endpoint hello-web:8080:

    kubectl run -l app=foo --image=alpine --restart=Never --rm -i -t foo-app \
        -- wget -qO- --timeout=2 http://hello-web:8080
    

    Jika traffic dari Pod app=foo ke objek Pod app=hello diaktifkan, outputnya akan terlihat seperti berikut:

    Hello, world!
    Version: 1.0.0
    Hostname: hello-web-2258067535-vbx6z
    
  2. Jalankan Pod sementara dengan label yang berbeda (app=other) dan buat permintaan yang sama untuk mengamati bahwa traffic tidak diizinkan:

    kubectl run -l app=other --image=alpine --restart=Never --rm -i -t other-app \
        -- wget -qO- --timeout=2 http://hello-web:8080
    

    Output mengonfirmasi bahwa koneksi tidak menerima respons:

    wget: download timed out
    

Membatasi traffic keluar dari objek Pod

Anda dapat membatasi traffic keluar seperti yang dilakukan terhadap traffic masuk.

Namun, untuk mengkueri nama host internal seperti hello-web atau nama host eksternal seperti www.example.com, Anda harus membuat kebijakan Keluar yang mengizinkan traffic DNS pada port 53 menggunakan protokol TCP dan UDP.

Untuk mengaktifkan kebijakan jaringan Keluar, deploy NetworkPolicy yang mengontrol traffic keluar dari objek Pod dengan label app=foo, sekaligus mengizinkan traffic hanya ke objek Pod dengan label app=hello, serta traffic DNS.

Manifes berikut menentukan NetworkPolicy yang mengontrol Traffic keluar dari objek Pod dengan label app=foo dengan dua tujuan yang diizinkan:

  1. Objek pod di Namespace yang sama dengan label app=hello
  2. Endpoint internal atau eksternal di port 53 (UDP dan TCP)
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: foo-allow-to-hello
spec:
  policyTypes:
  - Egress
  podSelector:
    matchLabels:
      app: foo
  egress:
  - to:
    - podSelector:
        matchLabels:
          app: hello
  - ports:
    - port: 53
      protocol: TCP
    - port: 53
      protocol: UDP

Terapkan kebijakan ini ke cluster:

kubectl apply -f foo-allow-to-hello.yaml

Memvalidasi kebijakan Traffic Keluar

  1. Deploy aplikasi web baru bernama hello-web-2 dan ekspos aplikasi tersebut secara internal di cluster:

    kubectl run hello-web-2 --labels app=hello-2 \
      --image=us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0 --port 8080 --expose
    
  2. Jalankan Pod sementara dengan label app=foo dan validasi bahwa Pod dapat menghubungkan ke hello-web:8080:

    kubectl run -l app=foo --image=alpine --rm -i -t --restart=Never foo-app \
      -- wget -qO- --timeout=2 http://hello-web:8080
    

    Pod merespons permintaan tersebut:

    Hello, world!
    Version: 1.0.0
    Hostname: hello-web-2258067535-vbx6z
    
  3. Validasi bahwa Pod tidak dapat terhubung ke hello-web-2:8080:

    kubectl run -l app=foo --image=alpine --rm -i -t --restart=Never foo-app \
        -- wget -qO- --timeout=2 http://hello-web-2:8080
    

    Output mengonfirmasi bahwa koneksi tidak menerima respons:

    wget: download timed out
    
  4. Pastikan Pod tidak dapat terhubung ke situs eksternal seperti www.example.com.

    kubectl run -l app=foo --image=alpine --rm -i -t --restart=Never foo-app \
        -- wget -qO- --timeout=2 http://www.example.com
    

    Output mengonfirmasi bahwa koneksi tidak menerima respons:

    wget: download timed out
    

Pembersihan

Untuk menghapus resource yang Anda buat dalam tutorial ini, jalankan perintah berikut:

kubectl delete pods --labels app=hello-2
kubectl delete pods --labels app=hello
kubectl delete -f foo-allow-to-hello.yaml
kubectl delete -f hello-allow-from-foo.yaml

Langkah selanjutnya