Mengonfigurasi keamanan transportasi

Anda dapat mengamankan traffic antarlayanan di Cloud Service Mesh dengan API Istio dengan menerapkan mutual TLS (mTLS) yang ketat. Dalam workload Kubernetes, mTLS otomatis diaktifkan secara default: proxy sidecar klien secara otomatis mengirimkan traffic mTLS ke sidecar, tetapi layanan tujuan masih menerima permintaan teks biasa dan terenkripsi.

Kebijakan PeerAuthentication memungkinkan Anda membatasi layanan agar hanya menerima mTLS. Anda dapat menerapkan kebijakan di seluruh mesh, ke namespace tertentu, atau ke workload individual. Untuk kolom yang didukung di seluruh platform, lihat Fitur yang didukung (bidang kontrol terkelola), Dukungan API di Cloud Service Mesh terkelola, dan Fitur yang didukung (bidang kontrol dalam cluster).

Mengaktifkan mutual TLS per namespace

Untuk mengaktifkan mTLS bagi semua workload dalam namespace tertentu, gunakan kebijakan autentikasi di seluruh namespace. Anda menentukan namespace yang berlaku di bagian metadata.

kubectl apply -f - <<EOF
apiVersion: "security.istio.io/v1beta1"
kind: "PeerAuthentication"
metadata:
  name: "AUTH_POLICY_NAME"
  namespace: "NAMESPACE"
spec:
  mtls:
    mode: STRICT
EOF

Output yang diharapkan:

peerauthentication.security.istio.io/AUTH_POLICY_NAME created

Mengaktifkan mutual TLS per workload

Untuk menetapkan kebijakan PeerAuthentication untuk workload tertentu, Anda harus mengonfigurasi bagian selector dan menentukan label yang cocok dengan workload yang ditargetkan. Namun, Cloud Service Mesh tidak dapat menggabungkan kebijakan tingkat workload untuk traffic mTLS keluar ke layanan. Anda perlu mengonfigurasi aturan tujuan untuk mengelola perilaku tersebut.

  1. Terapkan kebijakan autentikasi ke workload tertentu di namespace Anda:

    cat <<EOF | kubectl apply -n NAMESPACE -f -
    apiVersion: "security.istio.io/v1beta1"
    kind: "PeerAuthentication"
    metadata:
      name: "AUTH_POLICY_NAME"
      namespace: "NAMESPACE"
    spec:
      selector:
        matchLabels:
          app: WORKLOAD
      mtls:
        mode: STRICT
    EOF
    

    Output yang diharapkan:

    peerauthentication.security.istio.io/AUTH_POLICY_NAME created
  2. Konfigurasikan aturan tujuan yang cocok:

    cat <<EOF | kubectl apply -n NAMESPACE -f -
    apiVersion: "networking.istio.io/v1beta1"
    kind: "DestinationRule"
    metadata:
      name: "DEST_RULE_NAME"
    spec:
      host: "WORKLOAD.NAMESPACE.svc.cluster.local"
      trafficPolicy:
        tls:
          mode: ISTIO_MUTUAL
    EOF
    

    Output yang diharapkan:

    destinationrule.networking.istio.io/DEST_RULE_NAME created

Menerapkan mTLS di seluruh mesh

Agar semua layanan Anda di mesh tidak menerima traffic teks biasa, tetapkan kebijakan PeerAuthentication di seluruh mesh dengan mode mTLS yang ditetapkan ke STRICT (defaultnya adalah PERMISSIVE). Kebijakan PeerAuthentication di seluruh mesh tidak boleh memiliki pemilih dan harus diterapkan di namespace root, istio-system. Saat Anda men-deploy kebijakan, bidang kontrol akan otomatis menyediakan sertifikat TLS sehingga workload dapat saling melakukan autentikasi.

Untuk menerapkan mTLS di seluruh mesh:

kubectl apply -f - <<EOF
apiVersion: "security.istio.io/v1beta1"
kind: "PeerAuthentication"
metadata:
  name: "AUTH_POLICY_NAME"
  namespace: "istio-system"
spec:
  mtls:
    mode: STRICT
EOF

Output yang diharapkan:

peerauthentication.security.istio.io/AUTH_POLICY_NAME created

Menonaktifkan mTLS

Cloud Service Mesh terkelola dengan bidang kontrol TRAFFIC_DIRECTOR tidak mendukung mode DISABLE di resource PeerAuthentication (mtls.mode: DISABLE atau portLevelMtls.mode: DISABLE).

Untuk mengirim traffic teks biasa ke layanan atau port tertentu di Cloud Service Mesh terkelola, konfigurasikan proxy sisi server dan sisi klien:

  1. Sisi server (PeerAuthentication): Pastikan workload tujuan menerima traffic teks biasa menggunakan mode PERMISSIVE. Jika mesh atau namespace Anda menggunakan kebijakan PERMISSIVE default, Anda tidak perlu membuat resource PeerAuthentication. Jika Anda menerapkan mTLS STRICT di seluruh mesh atau namespace, terapkan kebijakan PeerAuthentication khusus workload atau khusus port yang ditetapkan ke PERMISSIVE.
  2. Sisi klien (DestinationRule): Konfigurasikan resource DestinationRule dengan tls.mode: DISABLE agar proxy sidecar klien mengirim traffic teks biasa saat memanggil layanan atau port tersebut.

CATATAN: Karena proxy sisi server menggunakan mode PERMISSIVE, bukan DISABLE, workload tujuan masih menerima traffic mTLS dari klien mana pun yang tidak tercakup oleh DestinationRule. Untuk memastikan semua klien mesh mengirim teks biasa, buat DestinationRule di namespace layanan tujuan (atau istio-system) tanpa membatasi exportTo.

Contoh: Menonaktifkan mTLS untuk layanan

  1. Jika mesh atau namespace Anda menerapkan mTLS STRICT, izinkan workload target (atau port tertentu) untuk menerima traffic teks biasa dengan menetapkan mode PeerAuthentication-nya ke PERMISSIVE:

    cat <<EOF | kubectl apply -n NAMESPACE -f -
    apiVersion: "security.istio.io/v1beta1"
    kind: "PeerAuthentication"
    metadata:
      name: "AUTH_POLICY_NAME"
      namespace: "NAMESPACE"
    spec:
      selector:
        matchLabels:
          app: WORKLOAD
      mtls:
        mode: PERMISSIVE
    EOF
    

    Untuk mengizinkan teks biasa hanya pada port workload tertentu (misalnya, saat bermigrasi dari portLevelMtls), tetapkan portLevelMtls:

    spec:
      selector:
        matchLabels:
          app: WORKLOAD
      mtls:
        mode: STRICT
      portLevelMtls:
        WORKLOAD_PORT:
          mode: PERMISSIVE
    
  2. Konfigurasikan DestinationRule untuk menginstruksikan proxy klien agar mengirim traffic teks biasa ke layanan target:

    cat <<EOF | kubectl apply -n NAMESPACE -f -
    apiVersion: "networking.istio.io/v1beta1"
    kind: "DestinationRule"
    metadata:
      name: "DEST_RULE_NAME"
      namespace: "NAMESPACE"
    spec:
      host: "SERVICE_NAME.NAMESPACE.svc.cluster.local"
      trafficPolicy:
        tls:
          mode: DISABLE
    EOF
    

    Untuk menonaktifkan mTLS hanya untuk port layanan tertentu, gunakan portLevelSettings di DestinationRule:

    spec:
      host: "SERVICE_NAME.NAMESPACE.svc.cluster.local"
      trafficPolicy:
        portLevelSettings:
        - port:
            number: SERVICE_PORT
          tls:
            mode: DISABLE
    

Menemukan dan menghapus kebijakan PeerAuthentication

Untuk mengetahui daftar semua kebijakan PeerAuthentication di mesh layanan:

kubectl get peerauthentication --all-namespaces

Jika ada kebijakan PeerAuthentication yang berlaku, Anda dapat menghapusnya dengan kubectl delete:

kubectl delete peerauthentication -n NAMESPACE AUTH_POLICY_NAME

Langkah berikutnya