Cara Menggunakan Vault untuk Mengelola Sertifikat di APISIX

Junduo Dong

Junduo Dong

June 9, 2023

Technology

API gateway adalah komponen dasar kunci dalam manajemen siklus hidup API. Ini adalah pintu masuk dari semua lalu lintas dan bertanggung jawab untuk merutekan permintaan API dari klien hilir ke layanan hulu yang benar untuk diproses. Oleh karena itu, API gateway bekerja untuk komunikasi jaringan antara layanan hulu dan klien hilir.

Sebagai API gateway cloud-native baru, Apache APISIX menyediakan mekanisme komunikasi TLS/mTLS antara klien hilir dan APISIX, serta antara APISIX dan layanan hulu, untuk memastikan keamanan jaringan di antara mereka. APISIX menyimpan sertifikat SSL sebagai objek sertifikat SSL, dan mewujudkan pemuatan dinamis sertifikat SSL melalui ekstensi SNI (Server Name Indication) yang mendukung protokol TLS.

Untuk menyimpan sertifikat SSL dengan aman di APISIX, APISIX telah mencapai integrasi dengan HashiCorp Vault, sehingga dapat mewujudkan manajemen terpadu sertifikat SSL dengan memanfaatkan penyimpanan rahasia yang aman dari Vault. Artikel ini mengambil contoh konfigurasi komunikasi HTTPS antara klien hilir dan APISIX untuk memperkenalkan bagaimana APISIX mengintegrasikan Vault untuk mengimplementasikan manajemen sertifikat SSL.

Integrasi APISIX dengan Vault

Apa Itu Sertifikat SSL

SSL/TLS adalah protokol kriptografi yang melindungi keamanan komunikasi jaringan dengan membangun koneksi jaringan terenkripsi antara kedua pihak yang berkomunikasi. Protokol SSL/TLS memastikan bahwa data dikirim ke klien dan server yang benar dengan mengautentikasi pengguna dan server. Selain itu, protokol SSL/TLS dapat mengenkripsi data komunikasi, sehingga memastikan bahwa data tidak dapat dicuri, dirusak, atau dipalsukan selama transmisi.

Sertifikat SSL adalah sertifikat digital yang mengautentikasi identitas situs web dan memungkinkan koneksi terenkripsi menggunakan protokol SSL/TLS. Sertifikat SSL biasanya diterbitkan oleh otoritas sertifikat digital (CA) yang terpercaya, yang terutama mencakup informasi berikut:

  • Nama domain
  • Otoritas sertifikat
  • Tanda tangan digital yang ditandatangani oleh otoritas sertifikat
  • Subdomain terkait
  • Tanggal penerbitan sertifikat
  • Tanggal kedaluwarsa sertifikat
  • Kunci publik (sementara kunci privat adalah kunci rahasia)

Apa Itu HashiCorp Vault

HashiCorp Vault (selanjutnya disebut Vault) adalah alat manajemen rahasia tingkat perusahaan yang dapat menyimpan dan mengelola data sensitif seperti token, kata sandi, dan sertifikat. Vault dapat diintegrasikan dengan teknologi di seluruh sistem IT, menyediakan otomatisasi keamanan berbasis identitas dan layanan enkripsi, mengontrol akses ke data dan sistem sensitif secara terpusat, dan membantu organisasi mengurangi risiko kebocoran data dan paparan data, sehingga meningkatkan keamanan cloud dan aplikasi.

HashiCorp Vault

Cara Menyimpan Sertifikat SSL APISIX di Vault

Persiapan Lingkungan

Menyebarkan dan Mengkonfigurasi Layanan Vault

Pada bagian ini, kita akan menggunakan Docker untuk menyebarkan layanan kontainer Vault. Anda dapat melewati bagian ini jika sudah memiliki instance layanan Vault yang tersedia di lingkungan Anda.

Buat dan sebarkan kontainer Vault dalam mode Dev, beri nama apisix-quickstart-vault. Tentukan Vault Token sebagai apisix-quickstart-vault-token dan petakan port 8200 ke host:

docker run -d --cap-add=IPC_LOCK \ -e 'VAULT_DEV_LISTEN_ADDRESS=0.0.0.0:8200' \ -e 'VAULT_ADDR=http://0.0.0.0:8200' \ -e 'VAULT_DEV_ROOT_TOKEN_ID=apisix-quickstart-vault-token' \ -e 'VAULT_TOKEN=apisix-quickstart-vault-token' \ --network=apisix-quickstart-net \ --name apisix-quickstart-vault \ -p 8200:8200 vault:1.13.0

Pilih kv sebagai jalur penyimpanan sertifikat SSL APISIX:

docker exec apisix-quickstart-vault vault secrets enable -path=kv -version=1 kv

Mengkonfigurasi APISIX

APISIX perlu membaca sertifikat SSL dari Vault, sehingga Vault harus memberikan izin baca ke APISIX pada jalur yang ditentukan.

Buat kebijakan Vault bernama apisix-policy.hcl, memberikan akses baca ke APISIX pada jalur kv/apisix/:

docker exec apisix-quickstart-vault /bin/sh -c "echo ' path \"kv/apisix/*\" { capabilities = [\"read\"] } ' > /etc/apisix-policy.hcl"

Terapkan file kebijakan yang dibuat apisix-policy.hcl ke Vault:

docker exec apisix-quickstart-vault vault policy write apisix-policy /etc/apisix-policy.hcl

Buat objek rahasia APISIX dengan id quickstart-secret-id untuk menyimpan informasi koneksi Vault dan jalur penyimpanan sertifikat:

curl -i "http://127.0.0.1:9180/apisix/admin/secrets/vault/quickstart-secret-id" -X PUT -d ' { "uri": "http://apisix-quickstart-vault:8200", "prefix": "kv/apisix", "token" : "apisix-quickstart-vault-token" }'

Menyimpan Sertifikat SSL di Vault

Buat sertifikat CA yang ditandatangani sendiri ca.crt dan kunci ca.key:

openssl genrsa -out ca.key 2048 && \ openssl req -new -sha256 -key ca.key -out ca.csr -subj "/CN=ROOTCA" && \ openssl x509 -req -days 36500 -sha256 -extensions v3_ca -signkey ca.key -in ca.csr -out ca.crt

Sertifikat SSL server.crt dan kunci server.key diterbitkan oleh CA, dan nama umum (CN) adalah test.com:

openssl genrsa -out server.key 2048 && \ openssl req -new -sha256 -key server.key -out server.csr -subj "/CN=test.com" && \ openssl x509 -req -days 36500 -sha256 -extensions v3_req \ -CA ca.crt -CAkey ca.key -CAserial ca.srl -CAcreateserial \ -in server.csr -out server.crt

Salin sertifikat SSL dan kunci yang diterbitkan ke kontainer Vault:

docker cp server.key apisix-quickstart-vault:/root/ docker cp server.crt apisix-quickstart-vault:/root/

Gunakan perintah vault kv put untuk menyimpan sertifikat SSL dan kunci sebagai rahasia, kuncinya adalah ssl, dan jalur penyimpanannya adalah kv/apisix:

docker exec apisix-quickstart-vault vault kv put kv/apisix/ssl test.com.crt=@/root/server.crt test.com.key=@/root/server.key

Melalui perintah di atas, kita telah menyimpan rahasia bernama ssl di Vault, yang berisi 2 pasangan kunci-nilai: sertifikat dan kunci privat.

Cara Menggunakan Sertifikat SSL APISIX yang Disimpan di Vault

APISIX mendukung enkripsi jaringan TLS/mTLS antara klien hilir dan APISIX, serta antara APISIX dan layanan hulu, di mana sertifikat SSL yang disimpan di Vault dapat digunakan. Kami akan mengambil contoh konfigurasi komunikasi HTTPS antara klien dan APISIX untuk mendemonstrasikan cara menggunakan sertifikat SSL yang disimpan di Vault di APISIX.

Mengkonfigurasi Komunikasi HTTPS Antara Klien dan APISIX

Buat objek sertifikat SSL untuk menyimpan sertifikat SSL:

curl -i "http://127.0.0.1:9180/apisix/admin/ssls" -X PUT -d ' { "id": "quickstart-tls-client-ssl", "sni": "test.com", "cert": "$secret://vault/quickstart-secret-id/ssl/test.com.crt", "key": "$secret://vault/quickstart-secret-id/ssl/test.com.key" }'

sni dari objek ini adalah test.com, yang konsisten dengan CN yang menerbitkan sertifikat. cert dan key sesuai dengan sertifikat dan kunci privat yang diterbitkan, yang secara otomatis diperoleh dari Vault melalui lokator sumber daya rahasia yang telah dibuat, dan aturan lokator sumber daya adalah:

$secret://$manager/$id/$secret_name/$key
  • manager: layanan manajemen kunci Vault
  • id: ID sumber daya rahasia APISIX
  • secret_name: nama rahasia di Vault
  • key: kunci dari pasangan kunci-nilai dalam rahasia bernama secret_name

Verifikasi Komunikasi HTTPS Antara Klien dan APISIX

Buat rute untuk meneruskan semua permintaan yang dikirim ke /ip ke upstream httpbin.org:

curl -i "http://127.0.0.1:9180/apisix/admin/routes" -X PUT -d ' { "id": "quickstart-client-ip", "uri": "/ip", "upstream": { "nodes": { "httpbin.org:80":1 }, "type": "roundrobin" } }'

Gunakan cURL untuk mengirim permintaan ke https://test.com:9443/ip, test.com diarahkan ke 127.0.0.1:

curl -ikv --resolve "test.com:9443:127.0.0.1" "https://test.com:9443/ip"

Jika konfigurasi berhasil, proses handshake TLS antara klien dan APISIX yang dikembalikan oleh cURL akan sama dengan hasil berikut:

* Added test.com:9443:127.0.0.1 to DNS cache * Hostname test.com was found in DNS cache * Trying 127.0.0.1:9443... * Connected to test.com (127.0.0.1) port 9443 (#0) * ALPN, offering h2 * ALPN, offering http/1.1 * successfully set certificate verify locations: * CAfile: /etc/ssl/certs/ca-certificates.crt * CApath: /etc/ssl/certs * TLSv1.3 (OUT), TLS handshake, Client hello (1): * TLSv1.3 (IN), TLS handshake, Server hello (2): * TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8): * TLSv1.3 (IN), TLS handshake, Certificate (11): * TLSv1.3 (IN), TLS handshake, CERT verify (15): * TLSv1.3 (IN), TLS handshake, Finished (20): * TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1): * TLSv1.3 (OUT), TLS handshake, Finished (20): * SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384 * ALPN, server accepted to use h2 * Server certificate: * subject: CN=test.com * start date: Apr 21 07:47:54 2023 GMT * expire date: Mar 28 07:47:54 2123 GMT * issuer: CN=ROOTCA * SSL certificate verify result: unable to get local issuer certificate (20), continuing anyway. * Using HTTP2, server supports multi-use * Connection state changed (HTTP/2 confirmed) * Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0 * Using Stream ID: 1 (easy handle 0x556274d632e0) > GET /ip HTTP/2 > Host: test.com:9443 > user-agent: curl/7.74.0 > accept: */* > * TLSv1.3 (IN), TLS handshake, Newsession Ticket (4): * TLSv1.3 (IN), TLS handshake, Newsession Ticket (4): * old SSL session ID is stale, removing * Connection state changed (MAX_CONCURRENT_STREAMS == 128)! < HTTP/2 200 HTTP/2 200 ...

Ringkasan

Kami memperkenalkan bagaimana APISIX mengintegrasikan Vault untuk mengimplementasikan manajemen sertifikat SSL, dan menunjukkan langkah-langkah konfigurasi dan integrasi secara detail dengan mengambil contoh komunikasi HTTPS antara klien hilir dan APISIX.

Untuk konsep terkait dan skenario penggunaan sertifikat SSL di APISIX, silakan merujuk ke artikel berikut:

Tags: