Bagikan melalui


Frontend MTLS dengan Application Gateway untuk Kontainer - API Gateway

Dokumen ini membantu menyiapkan contoh aplikasi yang menggunakan sumber daya berikut dari Gateway API. Langkah-langkah disediakan untuk:

  • Buat sumber daya Gateway dengan satu pendengar HTTPS.
  • Buat sumber daya HTTPRoute yang mereferensikan layanan backend.
  • Buat sumber daya FrontendTLSPolicy yang memiliki sertifikat CA.

Background

Keamanan Lapisan Transportasi Bersama (MTLS) adalah proses yang bergantung pada sertifikat untuk mengenkripsi komunikasi dan mengidentifikasi klien ke layanan. Ini memungkinkan Application Gateway untuk Kontainer untuk lebih meningkatkan postur keamanannya dengan hanya mempercayai koneksi dari perangkat yang diautentikasi.

Lihat gambar berikut:

Sebuah diagram yang menunjukkan proses MTLS pada frontend Application Gateway for Containers.

Alur sertifikat klien yang valid menunjukkan klien yang menyajikan sertifikat ke frontend Application Gateway untuk Kontainer. Application Gateway untuk Kontainer menentukan sertifikat valid dan memproksi permintaan ke target backend. Respons pada akhirnya dikembalikan ke klien.

Alur sertifikat klien yang dicabut memperlihatkan klien yang memperlihatkan sertifikat yang dicabut ke antarmuka depan Application Gateway untuk Kontainer. Application Gateway untuk Kontainer menentukan sertifikat tidak valid dan mencegah permintaan diproksikan ke klien. Klien akan menerima permintaan yang salah HTTP 400 dan alasan yang sesuai untuk itu.

Prerequisites

  1. Jika mengikuti strategi penyebaran BYO, pastikan Anda menyiapkan Gerbang Aplikasi untuk sumber daya Kontainer dan Pengontrol ALB.

  2. Jika mengikuti strategi penyebaran terkelola ALB, pastikan Anda memprovisikan Pengontrol ALB Anda dan menyediakan Application Gateway untuk sumber daya Kontainer melalui sumber daya kustom ApplicationLoadBalancer.

  3. Sebarkan contoh aplikasi HTTP:

    Terapkan file deployment.yaml berikut pada kluster Anda untuk membuat contoh aplikasi web dan menyebarkan data rahasia sampel. Hal ini untuk menunjukkan autentikasi frontend (mTLS).

    kubectl apply -f https://raw.githubusercontent.com/MicrosoftDocs/azure-docs/refs/heads/main/articles/application-gateway/for-containers/examples/https-scenario/ssl-termination/deployment.yaml
    

    Perintah ini membuat yang berikut ini pada kluster Anda:

    • Namespace yang dipanggil test-infra
    • Satu layanan yang disebut echo di namespace test-infra
    • Satu penyebaran yang disebut echo di namespace test-infra
    • Satu rahasia yang dipanggil listener-tls-secret di test-infra namespace

Hasilkan sertifikat

Untuk contoh ini, kita akan membuat sertifikat akar dan mengeluarkan sertifikat klien dari akar. Jika Anda sudah memiliki sertifikat akar dan sertifikat klien, Anda dapat melewati langkah-langkah ini.

Membuat kunci privat untuk sertifikat akar

openssl genrsa -out root.key 2048

Membuat sertifikat akar

openssl req -x509 -new -nodes -key root.key -sha256 -days 1024 -out root.crt -subj "/C=US/ST=North Dakota/L=Fargo/O=Contoso/CN=contoso-root"

Membuat kunci privat untuk sertifikat klien

openssl genrsa -out client.key 2048

Membuat permintaan penandatanganan sertifikat untuk sertifikat klien

openssl req -new -key client.key -out client.csr -subj "/C=US/ST=North Dakota/L=Fargo/O=Contoso/CN=contoso-client"

Membuat sertifikat klien yang ditandatangani oleh sertifikat akar

openssl x509 -req -in client.csr -CA root.crt -CAkey root.key -CAcreateserial -out client.crt -days 1024 -sha256

Menyebarkan sumber daya API Gateway yang diperlukan

Membuat gateway

kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: gateway-01
  namespace: test-infra
  annotations:
    alb.networking.azure.io/alb-namespace: alb-test-infra
    alb.networking.azure.io/alb-name: alb-test
spec:
  gatewayClassName: azure-alb-external
  listeners:
  - name: mtls-listener
    port: 443
    protocol: HTTPS
    allowedRoutes:
      namespaces:
        from: Same
    tls:
      mode: Terminate
      certificateRefs:
      - kind : Secret
        group: ""
        name: listener-tls-secret
EOF

Note

Saat Pengontrol ALB membuat Application Gateway untuk sumber daya kontainer di Azure Resource Manager, pengontrol menggunakan konvensi penamaan berikut untuk sumber daya frontend: fe-<eight randomly generated characters>.

Jika Anda ingin mengubah nama sumber daya frontend yang dibuat di Azure, pertimbangkan untuk mengikuti strategi penyebaran bawaan Anda sendiri.

Setelah sumber daya gateway dibuat, pastikan statusnya valid, pendengar diprogram, dan alamat telah ditetapkan ke gateway.

kubectl get gateway gateway-01 -n test-infra -o yaml

Contoh output pembuatan gateway yang berhasil:

status:
  addresses:
  - type: IPAddress
    value: xxxx.yyyy.alb.azure.com
  conditions:
  - lastTransitionTime: "2023-06-19T21:04:55Z"
    message: Valid Gateway
    observedGeneration: 1
    reason: Accepted
    status: "True"
    type: Accepted
  - lastTransitionTime: "2023-06-19T21:04:55Z"
    message: Application Gateway For Containers resource has been successfully updated.
    observedGeneration: 1
    reason: Programmed
    status: "True"
    type: Programmed
  listeners:
  - attachedRoutes: 0
    conditions:
    - lastTransitionTime: "2023-06-19T21:04:55Z"
      message: ""
      observedGeneration: 1
      reason: ResolvedRefs
      status: "True"
      type: ResolvedRefs
    - lastTransitionTime: "2023-06-19T21:04:55Z"
      message: Listener is accepted
      observedGeneration: 1
      reason: Accepted
      status: "True"
      type: Accepted
    - lastTransitionTime: "2023-06-19T21:04:55Z"
      message: Application Gateway For Containers resource has been successfully updated.
      observedGeneration: 1
      reason: Programmed
      status: "True"
      type: Programmed
    name: https-listener
    supportedKinds:
    - group: gateway.networking.k8s.io
      kind: HTTPRoute

Setelah gateway dibuat, buat sumber daya HTTPRoute.

kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: https-route
  namespace: test-infra
spec:
  parentRefs:
  - name: gateway-01
  rules:
  - backendRefs:
    - name: echo
      port: 80
EOF

Setelah sumber daya HTTPRoute dibuat, pastikan rute Diterima dan sumber daya Application Gateway for Containers diprogram.

kubectl get httproute https-route -n test-infra -o yaml

Verifikasi status sumber daya Application Gateway for Containers berhasil diperbarui.

status:
  parents:
  - conditions:
    - lastTransitionTime: "2023-06-19T22:18:23Z"
      message: ""
      observedGeneration: 1
      reason: ResolvedRefs
      status: "True"
      type: ResolvedRefs
    - lastTransitionTime: "2023-06-19T22:18:23Z"
      message: Route is Accepted
      observedGeneration: 1
      reason: Accepted
      status: "True"
      type: Accepted
    - lastTransitionTime: "2023-06-19T22:18:23Z"
      message: Application Gateway For Containers resource has been successfully updated.
      observedGeneration: 1
      reason: Programmed
      status: "True"
      type: Programmed
    controllerName: alb.networking.azure.io/alb-controller
    parentRef:
      group: gateway.networking.k8s.io
      kind: Gateway
      name: gateway-01
      namespace: test-infra

Buat rahasia Kubernetes menggunakan kubectl yang berisi rantai sertifikat ke sertifikat klien.

kubectl create secret generic ca.bundle -n test-infra --from-file=ca.crt=root.crt

Membuat FrontendTLSPolicy

kubectl apply -f - <<EOF
apiVersion: alb.networking.azure.io/v1
kind: FrontendTLSPolicy
metadata:
  name: mtls-policy
  namespace: test-infra
spec:
  targetRef:
    group: gateway.networking.k8s.io
    kind: Gateway
    name: gateway-01
    namespace: test-infra
    sectionNames:
    - mtls-listener
  default:
    verify:
      caCertificateRef:
        name: ca.bundle
        group: ""
        kind: Secret
        namespace: test-infra
EOF

Setelah objek FrontendTLSPolicy dibuat, periksa status pada objek untuk memastikan bahwa kebijakan tersebut valid:

kubectl get frontendtlspolicy mtls-policy -n test-infra -o yaml

Contoh output pembuatan objek FrontendTLSPolicy yang valid:

status:
  conditions:
  - lastTransitionTime: "2023-06-29T16:54:42Z"
    message: Valid FrontendTLSPolicy
    observedGeneration: 1
    reason: Accepted
    status: "True"
    type: Accepted

Menguji akses ke aplikasi

Sekarang kami siap untuk mengarahkan lalu lintas ke aplikasi sampel kami, melalui FQDN yang diberikan ke frontend. Gunakan perintah berikut untuk mendapatkan FQDN:

fqdn=$(kubectl get gateway gateway-01 -n test-infra -o jsonpath='{.status.addresses[0].value}')

Menggunakan perintah curl untuk FQDN dari frontend Anda tanpa sertifikat klien.

curl --insecure https://$fqdn/

Perhatikan bahwa respons memperingatkan sertifikat diperlukan.

curl: (56) OpenSSL SSL_read: OpenSSL/1.1.1k: error:1409445C:SSL routines:ssl3_read_bytes:tlsv13 alert certificate required, errno 0

Gunakan Curl untuk FQDN yang menyajikan sertifikat klien yang telah dihasilkan.

curl --cert client.crt --key client.key --insecure https://$fqdn/

Perhatikan bahwa responsnya berasal dari layanan backend di belakang Application Gateway untuk Kontainer.

Selamat, Anda memasang Pengontrol ALB, menerapkan aplikasi backend, melakukan autentikasi menggunakan sertifikat klien, dan mengembalikan lalu lintas dari layanan backend Anda melalui Application Gateway untuk Kontainer.