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
Injeksi sidecar otomatis diaktifkan. Untuk informasi lebih lanjut, lihat Konfigurasikan kebijakan injeksi proxy sidecar.
Gateway ingress dan aplikasi HTTPBin telah diterapkan, serta gateway ingress memiliki port 443 yang diaktifkan. Untuk informasi lebih lanjut, lihat Terapkan aplikasi HTTPBin.
Langkah 1: Hasilkan sertifikat komunikasi mTLS
Saat membuat sertifikat, jika Anda perlu mengisi informasi sertifikat, gunakan nilai default. Nilai-nilai default telah ditetapkan sebelumnya dalam file konfigurasi.
Buat file ca.cnf dengan konten berikut untuk menghasilkan sertifikat root.
Jalankan perintah berikut untuk menghasilkan sertifikat root.
openssl req -x509 -config ca.cnf -newkey rsa:4096 -sha256 -nodes -out cacert.pem -outform PEMPerintah ini menghasilkan file
cacert.pemdancakey.pem.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.comJalankan perintah berikut secara berurutan untuk menghasilkan sertifikat server.
openssl req -config server.cnf -newkey rsa:2048 -sha256 -nodes -out server.csr -outform PEMtouch index.txt echo '01' > serial.txtopenssl ca -config ca.cnf -policy signing_policy -extensions signing_req -out servercert.pem -infiles server.csrPerintah-perintah ini menghasilkan file
servercert.pemdanserverkey.pem.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.clientCommonNamedari sertifikat klien adalahtest.client, dan bidang baruURI.1 = spiffe://test.clientperlu ditambahkan ke informasi Subject Alternative Name (SAN). Awalanspiffe://diperlukan karena bidangprincipalsdalam kebijakan otorisasi ASM cocok dengan bagian setelahspiffe://.Jalankan perintah berikut secara berurutan untuk menghasilkan sertifikat klien.
openssl req -config client.cnf -newkey rsa:2048 -sha256 -nodes -out clientcert.csr -outform PEMopenssl ca -config ca.cnf -policy signing_policy -extensions signing_req -out clientcert.pem -infiles clientcert.csrPerintah-perintah ini menghasilkan file
clientcert.pemdanclient.key.pem.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.
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.comJalankan 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 -IOutput 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
Terapkan kebijakan otorisasi dengan konten berikut untuk membatasi test.client mengakses jalur
/status/418dari 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: ingressgatewayJalankan perintah berikut untuk mengakses jalur
/status/200menggunakan 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 -IOutput 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: 6Jalankan perintah berikut untuk mengakses jalur
/status/418menggunakan 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/418Output yang diharapkan:
RBAC: access denied%Jalankan perintah berikut untuk mengakses jalur
/status/418menggunakan 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/418Output yang diharapkan:
-=[ teapot ]=- _...._ .' _ _ `. | ."` ^ `". _, \_;`"---"`|// | ;/ \_ _/ `"""`