全部产品
Search
文档中心

Alibaba Cloud Service Mesh:Konfigurasikan layanan mTLS pada gateway ingress ASM dan batasi akses klien tertentu

更新时间:Jul 02, 2025

Gateway ASM mendukung layanan mTLS eksternal. Protokol mTLS mengharuskan klien untuk menampilkan sertifikat yang berisi informasi identitas pengguna. Anda dapat mengonfigurasi kebijakan otorisasi untuk membatasi akses ke pengguna tertentu, meningkatkan perlindungan layanan. Topik ini menjelaskan cara mengonfigurasi layanan mTLS pada gateway ingress ASM dan membatasi akses melalui kebijakan otorisasi.

Prasyarat

Langkah 1: Hasilkan sertifikat komunikasi mTLS

Catatan

Saat membuat sertifikat, jika Anda perlu mengisi informasi sertifikat, gunakan nilai default. Nilai-nilai default telah ditetapkan sebelumnya dalam file konfigurasi.

  1. Buat file ca.cnf dengan konten berikut untuk menghasilkan sertifikat root.

    Perluas untuk melihat isi file CNF

    HOME = .`
    RANDFILE = $ENV::HOME/.rnd
    ####################################################################
    [ ca ]
    default_ca = CA_default # Bagian ca default
    [ CA_default ]
    default_days = 1000 # berapa lama untuk disertifikasi
    default_crl_days = 30 # berapa lama sebelum CRL berikutnya
    default_md = sha256 # gunakan MD kunci publik default
    preserve = no # pertahankan urutan DN yang dilewati
    x509_extensions = ca_extensions # Ekstensi yang ditambahkan ke sertifikat
    email_in_dn = no # Jangan gabungkan email di DN
    copy_extensions = copy # Diperlukan untuk menyalin SAN dari CSR ke sertifikat
    
    #====7 baris berikut digunakan untuk menandatangani sertifikat lain, bukan untuk membuat sertifikat CA.====
    base_dir = .
    certificate = $base_dir/cacert.pem # Sertifikat CA
    private_key = $base_dir/cakey.pem # Kunci privat CA
    new_certs_dir = $base_dir # Lokasi untuk sertifikat baru setelah penandatanganan
    database = $base_dir/index.txt # File indeks database
    serial = $base_dir/serial.txt # Nomor serial saat ini
    unique_subject = no # Setel ke 'no' untuk mengizinkan pembuatan beberapa sertifikat dengan subjek yang sama.
    
    ####################################################################
    [ req ]
    default_bits = 4096
    default_keyfile = cakey.pem
    distinguished_name = ca_distinguished_name
    x509_extensions = ca_extensions
    string_mask = utf8only
    ####################################################################
    [ ca_distinguished_name ]
    countryName = Nama Negara (kode 2 huruf)
    countryName_default = CN
    stateOrProvinceName = Nama Provinsi atau Negara Bagian (nama lengkap)
    stateOrProvinceName_default = bj
    localityName = Nama Lokalitas (misalnya, kota)
    localityName_default = bj
    organizationName = Nama Organisasi (misalnya, perusahaan)
    organizationName_default = test-asm
    organizationalUnitName = Unit Organisasi (misalnya, divisi)
    organizationalUnitName_default = R&D
    commonName = Nama Umum (misalnya, server FQDN atau nama ANDA)
    commonName_default = Test CA
    emailAddress = Alamat Email
    emailAddress_default = test@example.com
    ####################################################################
    [ ca_extensions ]
    subjectKeyIdentifier = hash
    authorityKeyIdentifier = keyid:always, issuer
    basicConstraints = critical, CA:true
    keyUsage = keyCertSign, cRLSign
    
    
    #====Semua baris di bawah ini digunakan untuk menandatangani sertifikat lain, bukan untuk membuat sertifikat CA.======
    
    ####################################################################
    [ signing_policy ]
    countryName = opsional
    stateOrProvinceName = opsional
    localityName = opsional
    organizationName = opsional
    organizationalUnitName = opsional
    commonName = disediakan
    emailAddress = opsional
    ####################################################################
    [ signing_req ]
    subjectKeyIdentifier = hash
    authorityKeyIdentifier = keyid,issuer
    basicConstraints = CA:FALSE
    keyUsage = digitalSignature, keyEncipherment
  2. Jalankan perintah berikut untuk menghasilkan sertifikat root.

    openssl req -x509 -config ca.cnf -newkey rsa:4096 -sha256 -nodes -out cacert.pem -outform PEM

    Perintah ini menghasilkan file cacert.pem dan cakey.pem.

  3. Buat file server.cnf dengan konten berikut untuk menghasilkan sertifikat server.

    HOME = .
    RANDFILE = $ENV::HOME/.rnd
    ####################################################################
    [ req ]
    default_bits = 2048
    default_keyfile = serverkey.pem
    distinguished_name = server_distinguished_name
    req_extensions = server_req_extensions
    string_mask = utf8only
    ####################################################################
    [ server_distinguished_name ]
    countryName = Nama Negara (kode 2 huruf)
    countryName_default = CN
    stateOrProvinceName = Nama Provinsi atau Negara Bagian (nama lengkap)
    stateOrProvinceName_default = bj
    localityName = Nama Lokalitas (misalnya, kota)
    localityName_default = bj
    organizationName = Nama Organisasi (misalnya, perusahaan)
    organizationName_default = test
    commonName = Nama Umum (misalnya, server FQDN atau nama ANDA)
    commonName_default = test.com
    emailAddress = Alamat Email
    emailAddress_default = test@example.com
    ####################################################################
    [ server_req_extensions ]
    subjectKeyIdentifier = hash
    basicConstraints = CA:FALSE
    keyUsage = digitalSignature, keyEncipherment
    subjectAltName = @alternate_names
    nsComment = "Sertifikat yang Dihasilkan oleh OpenSSL"
    ####################################################################
    [ alternate_names ]
    DNS.1 = test.com
  4. Jalankan perintah berikut secara berurutan untuk menghasilkan sertifikat server.

    openssl req -config server.cnf -newkey rsa:2048 -sha256 -nodes -out server.csr -outform PEM
    touch index.txt
    echo '01' > serial.txt
    openssl ca -config ca.cnf -policy signing_policy -extensions signing_req -out servercert.pem -infiles server.csr

    Perintah-perintah ini menghasilkan file servercert.pem dan serverkey.pem.

  5. Buat file client.cnf dengan konten berikut untuk menghasilkan sertifikat klien.

    HOME = .
    RANDFILE = $ENV::HOME/.rnd
    ####################################################################
    [ req ]
    default_bits = 2048
    default_keyfile = client.key.pem
    distinguished_name = server_distinguished_name
    req_extensions = server_req_extensions
    string_mask = utf8only
    ####################################################################
    [ server_distinguished_name ]
    countryName = Nama Negara (kode 2 huruf)
    countryName_default = CN
    stateOrProvinceName = Nama Provinsi atau Negara Bagian (nama lengkap)
    stateOrProvinceName_default = bj
    localityName = Nama Lokalitas (misalnya, kota)
    localityName_default = bj
    organizationName = Nama Organisasi (misalnya, perusahaan)
    organizationName_default = test.client
    commonName = Nama Umum (misalnya, server FQDN atau nama ANDA)
    commonName_default = test.client
    emailAddress = Alamat Email
    emailAddress_default = test.client@example.com
    ####################################################################
    [ server_req_extensions ]
    subjectKeyIdentifier = hash
    basicConstraints = CA:FALSE
    keyUsage = digitalSignature, keyEncipherment
    subjectAltName = @alternate_names
    nsComment = "Sertifikat yang Dihasilkan oleh OpenSSL"
    ####################################################################
    [ alternate_names ]
    URI.1 = spiffe://test.client

    CommonName dari sertifikat klien adalah test.client, dan bidang baru URI.1 = spiffe://test.client perlu ditambahkan ke informasi Subject Alternative Name (SAN). Awalan spiffe:// diperlukan karena bidang principals dalam kebijakan otorisasi ASM cocok dengan bagian setelah spiffe://.

  6. Jalankan perintah berikut secara berurutan untuk menghasilkan sertifikat klien.

    openssl req -config client.cnf -newkey rsa:2048 -sha256 -nodes -out clientcert.csr -outform PEM
    openssl ca -config ca.cnf -policy signing_policy -extensions signing_req -out clientcert.pem -infiles clientcert.csr

    Perintah-perintah ini menghasilkan file clientcert.pem dan client.key.pem.

  7. Gunakan fitur manajemen sertifikat ASM untuk mengimpor sertifikat mTLS. Pastikan bahwa nama sertifikat yang diimpor adalah test.com. Untuk informasi lebih lanjut, lihat Gunakan fitur manajemen sertifikat ASM.

    Anda juga dapat menggunakan kubectl untuk langsung membuat rahasia guna mengimpor sertifikat. Gunakan kubeconfig cluster data plane dan jalankan perintah berikut.

    kubectl create -n istio-system secret generic test.com \
      --from-file=tls.key=serverkey.pem \
      --from-file=tls.crt=servercert.pem \
      --from-file=ca.crt=cacert.pem

Langkah 2: Konfigurasikan pendengar mTLS pada port 443 gateway

Konfigurasikan pendengar mTLS pada port 443 gateway ASM agar klien eksternal dapat mengakses layanan HTTPBin melalui mTLS.

  1. Perbarui aturan gateway dengan konten berikut.

    apiVersion: networking.istio.io/v1beta1
    kind: Gateway
    metadata:
      name: httpbin
      namespace: default
    spec:
      selector:
        istio: ingressgateway
      servers:
        - hosts:
            - '*'
          port:
            name: test
            number: 80
            protocol: HTTP
        - hosts:
          - test.com
          port:
            number: 443
            name: https
            protocol: HTTPS
          tls:
            mode: MUTUAL
            credentialName: test.com
  2. Jalankan perintah berikut untuk mengakses layanan HTTPBin menggunakan sertifikat klien.

    curl --header "host:test.com" --resolve "test.com:443:${ASM gateway IP}" --cacert cacert.pem --cert clientcert.pem --key client.key.pem  https://test.com/status/200 -I

    Output yang diharapkan:

    HTTP/2 200
    server: istio-envoy
    date: Sun, 28 Jul 2024 7:30:30 GMT
    content-type: text/html; charset=utf-8
    access-control-allow-origin: *
    access-control-allow-credentials: true
    content-length: 0
    x-envoy-upstream-service-time: 6

Langkah 3: Konfigurasikan kebijakan otorisasi untuk membatasi akses test.client

  1. Terapkan kebijakan otorisasi dengan konten berikut untuk membatasi test.client mengakses jalur /status/418 dari aplikasi HTTPBin. Untuk informasi lebih lanjut, lihat Konfigurasikan kebijakan otorisasi untuk permintaan HTTP.

    apiVersion: security.istio.io/v1beta1
    kind: AuthorizationPolicy
    metadata:
      name: test
      namespace: istio-system
    spec:
      action: DENY
      rules:
        - from:
            - source:
                principals:
                  - test.client
          to:
            - operation:
                paths:
                  - /status/418
      selector:
        matchLabels:
          istio: ingressgateway
  2. Jalankan perintah berikut untuk mengakses jalur /status/200 menggunakan sertifikat klien.

    curl --header "host:test.com" --resolve "test.com:443:${ASM gateway IP}" --cacert cacert.pem --cert clientcert.pem --key client.key.pem  https://test.com/status/200 -I

    Output yang diharapkan:

    HTTP/2 200
    server: istio-envoy
    date: Sun, 28 Jul 2024 7:33:30 GMT
    content-type: text/html; charset=utf-8
    access-control-allow-origin: *
    access-control-allow-credentials: true
    content-length: 0
    x-envoy-upstream-service-time: 6
  3. Jalankan perintah berikut untuk mengakses jalur /status/418 menggunakan sertifikat klien.

    curl --header "host:test.com" --resolve "test.com:443:${ASM gateway IP}" --cacert cacert.pem --cert clientcert.pem --key client.key.pem  https://test.com/status/418

    Output yang diharapkan:

    RBAC: access denied%
  4. Jalankan perintah berikut untuk mengakses jalur /status/418 menggunakan sertifikat server.

    curl --header "host:test.com" --resolve "test.com:443:${ASM gateway IP}" --cacert cacert.pem --cert servercert.pem --key serverkey.pem  https://test.com/status/418

    Output yang diharapkan:

        -=[ teapot ]=-
    
           _...._
         .'  _ _ `.
        | ."` ^ `". _,
        \_;`"---"`|//
          |       ;/
          \_     _/
            `"""`