Automasi Rahasia TLS APISIX dengan Cert-Manager Menggunakan Argo Events: Panduan Praktis
Dalam lanskap arsitektur mikroservis yang terus berkembang, keamanan dan otomatisasi adalah hal terpenting. Mengamankan Application Programming Interfaces (API) dengan Transport Layer Security (TLS) adalah praktik standar untuk melindungi data sensitif yang transit. Namun, mengelola sertifikat TLS secara manual bisa menjadi tugas yang membosankan dan rentan terhadap kesalahan. Di sinilah otomatisasi berperan. Posting blog ini membahas tentang cara mengotomatiskan rahasia TLS APISIX menggunakan Cert-Manager dan Argo Events, sehingga menyederhanakan proses dan meningkatkan postur keamanan Anda.
Mengapa Otomatiskan Rahasia TLS APISIX?
Sebelum mempelajari detail teknis, mari kita pahami mengapa mengotomatiskan rahasia TLS APISIX sangat penting:
- Keamanan yang Ditingkatkan: Sertifikat TLS yang kedaluwarsa dapat menyebabkan kerentanan keamanan. Otomatisasi memastikan sertifikat diperbarui secara berkala, sehingga mengurangi risiko pelanggaran.
- Pengoperasian yang Disederhanakan: Pengelolaan sertifikat manual sangat memakan waktu dan rentan terhadap kesalahan manusia. Otomatisasi menyederhanakan proses, membebaskan tim untuk fokus pada tugas-tugas strategis.
- Skalabilitas: Seiring pertumbuhan aplikasi Anda, jumlah sertifikat yang perlu Anda kelola juga meningkat. Otomatisasi menskalakan dengan mulus, memastikan semua API Anda aman.
- Pengurangan Downtime: Sertifikat yang kedaluwarsa dapat menyebabkan downtime aplikasi. Otomatisasi mencegah hal ini dengan memperbarui sertifikat sebelum kedaluwarsa.
- Konsistensi: Otomatisasi memastikan sertifikat dikonfigurasi secara konsisten di semua lingkungan, sehingga mengurangi risiko kesalahan konfigurasi.
Pengantar APISIX, Cert-Manager, dan Argo Events
Untuk menerapkan otomatisasi rahasia TLS APISIX, kita akan menggunakan tiga komponen utama:
- APISIX: APISIX adalah gateway API dan load balancer cloud-native berkinerja tinggi yang menyediakan berbagai fitur termasuk perutean, otentikasi, dan otorisasi.
- Cert-Manager: Cert-Manager adalah pengontrol Kubernetes yang mengotomatiskan pemberian dan pengelolaan sertifikat TLS dari berbagai sumber, seperti Let’s Encrypt, HashiCorp Vault, dan CA pribadi.
- Argo Events: Argo Events adalah kerangka kerja berbasis peristiwa untuk Kubernetes yang memungkinkan Anda memicu alur kerja berdasarkan peristiwa.
Prasyarat
Sebelum memulai, pastikan Anda memiliki prasyarat berikut:
- Kluster Kubernetes: Anda memerlukan kluster Kubernetes yang berfungsi. Anda dapat menggunakan kluster lokal seperti Minikube atau Kind, atau kluster cloud seperti AWS EKS, Google GKE, atau Azure AKS.
- kubectl: Alat baris perintah kubectl harus dikonfigurasi untuk terhubung ke kluster Kubernetes Anda.
- Helm: Helm adalah pengelola paket untuk Kubernetes. Ini akan digunakan untuk menginstal Cert-Manager dan Argo Events.
- APISIX: APISIX harus diinstal di kluster Kubernetes Anda.
Langkah 1: Instal Cert-Manager
Pertama, kita akan menginstal Cert-Manager menggunakan Helm:
- Tambahkan Repositori Helm Cert-Manager:
helm repo add jetstack https://charts.jetstack.io helm repo update
- Instal Cert-Manager:
helm install cert-manager jetstack/cert-manager \ --namespace cert-manager \ --create-namespace \ --version v1.11.0 \ --set installCRDs=true
- Verifikasi Instalasi:
kubectl get pods --namespace cert-manager
Pastikan semua pod dalam namespace `cert-manager` dalam keadaan `Running`.
Langkah 2: Konfigurasi Penerbit Cert-Manager
Cert-Manager menggunakan sumber daya `Issuer` atau `ClusterIssuer` untuk mewakili sumber sertifikat. Kami akan menggunakan Let’s Encrypt untuk contoh ini. Buat file bernama `letsencrypt-issuer.yaml` dengan konten berikut:
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: your-email@example.com
privateKeySecretRef:
name: letsencrypt-prod
solvers:
- http01:
ingress:
class: apisix
Catatan: Ganti `your-email@example.com` dengan alamat email Anda yang valid. Pastikan kelas ingress sesuai dengan kelas ingress yang Anda gunakan untuk APISIX.
Terapkan Issuer:
kubectl apply -f letsencrypt-issuer.yaml
Langkah 3: Instal Argo Events
Sekarang, mari kita instal Argo Events menggunakan Helm:
- Tambahkan Repositori Helm Argo:
helm repo add argo https://argoproj.github.io/argo-helm helm repo update
- Instal Argo Events:
helm install argo-events argo/argo-events --namespace argo-events --create-namespace
- Verifikasi Instalasi:
kubectl get pods --namespace argo-events
Pastikan semua pod dalam namespace `argo-events` dalam keadaan `Running`.
Langkah 4: Buat Sumber Peristiwa Cert-Manager
Kita akan membuat sumber peristiwa yang memantau sumber daya `Certificate` di Kubernetes dan memicu peristiwa ketika status sertifikat berubah. Buat file bernama `cert-manager-event-source.yaml` dengan konten berikut:
apiVersion: argoproj.io/v1alpha1
kind: EventSource
metadata:
name: cert-manager
namespace: argo-events
spec:
resource:
groupVersion: cert-manager.io/v1
kind: Certificate
namespace: default # Ganti dengan namespace sertifikat Anda
eventTypes:
- ADD
- UPDATE
filter:
jsonLogic:
"and":
- { "==": [ { "var": "data.status.conditions.#(type==\"Ready\").status" }, "True" ] }
- { "==": [ { "var": "data.metadata.annotations.example\\.com/auto-reload" }, "true" ] }
pollingInterval: 60s
Penjelasan:
- `groupVersion`: Menentukan grup API dan versi sumber daya `Certificate`.
- `kind`: Menentukan jenis sumber daya yang akan dipantau, dalam hal ini `Certificate`.
- `namespace`: Menentukan namespace tempat sumber daya `Certificate` berada. Ganti `default` dengan namespace tempat Anda membuat sertifikat.
- `eventTypes`: Menentukan jenis peristiwa yang akan dipicu, dalam hal ini `ADD` dan `UPDATE`.
- `filter`: Menggunakan `jsonLogic` untuk memfilter peristiwa. Peristiwa hanya dipicu jika status sertifikat `Ready` adalah `True` dan anotasi `example.com/auto-reload` diatur ke `true`.
- `pollingInterval`: Menentukan seberapa sering sumber peristiwa memeriksa perubahan, dalam hal ini setiap 60 detik.
Terapkan Sumber Peristiwa:
kubectl apply -f cert-manager-event-source.yaml
Langkah 5: Buat Sensor Argo Events
Sensor mendengarkan peristiwa dari sumber peristiwa dan memicu alur kerja berdasarkan peristiwa tersebut. Kita akan membuat sensor yang memicu alur kerja untuk memperbarui rahasia TLS APISIX ketika sertifikat siap. Buat file bernama `cert-manager-sensor.yaml` dengan konten berikut:
apiVersion: argoproj.io/v1alpha1
kind: Sensor
metadata:
name: cert-manager-sensor
namespace: argo-events
spec:
dependencies:
- name: cert-ready
eventSourceName: cert-manager
eventName: resource
triggers:
- template:
name: update-apisix-secret
k8s:
group: ""
version: v1
resource: secrets
operation: patch
source:
resource:
apiVersion: v1
kind: Secret
metadata:
name: apisix-tls # Ganti dengan nama rahasia TLS APISIX Anda
namespace: default # Ganti dengan namespace rahasia Anda
data:
tls.crt: "{{.Data.data.status.certificate}}"
tls.key: "{{.Data.data.status.privateKey}}"
Penjelasan:
- `dependencies`: Menentukan dependensi peristiwa. Sensor mendengarkan peristiwa bernama `resource` dari sumber peristiwa `cert-manager`.
- `triggers`: Menentukan pemicu yang akan dipicu ketika dependensi peristiwa terpenuhi.
- `template`: Menentukan templat untuk pemicu. Dalam hal ini, templat tersebut memperbarui rahasia Kubernetes.
- `k8s`: Menentukan sumber daya Kubernetes yang akan diperbarui. Dalam hal ini, ini adalah sumber daya `Secret`.
- `operation`: Menentukan operasi yang akan dilakukan pada sumber daya Kubernetes. Dalam hal ini, ini adalah operasi `patch`.
- `source`: Menentukan sumber data untuk operasi `patch`. Dalam hal ini, ini adalah data dari peristiwa.
- `tls.crt`: Diisi dengan sertifikat dari status sertifikat.
- `tls.key`: Diisi dengan kunci pribadi dari status sertifikat.
Penting:
- Ganti `apisix-tls` dengan nama rahasia TLS APISIX Anda.
- Ganti `default` dengan namespace tempat rahasia Anda berada.
Terapkan Sensor:
kubectl apply -f cert-manager-sensor.yaml
Langkah 6: Buat Sertifikat
Sekarang, kita akan membuat sumber daya `Certificate` yang meminta sertifikat dari Let’s Encrypt. Buat file bernama `example-certificate.yaml` dengan konten berikut:
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: example-com
namespace: default # Ganti dengan namespace Anda
annotations:
example.com/auto-reload: "true"
spec:
secretName: apisix-tls # Ganti dengan nama rahasia TLS APISIX Anda
issuerRef:
name: letsencrypt-prod
kind: ClusterIssuer
dnsNames:
- example.com
- www.example.com
Penjelasan:
- `secretName`: Menentukan nama rahasia Kubernetes yang akan menyimpan sertifikat dan kunci pribadi. Ganti `apisix-tls` dengan nama rahasia TLS APISIX Anda.
- `issuerRef`: Menentukan penerbit yang akan digunakan untuk mengeluarkan sertifikat. Dalam hal ini, kita menggunakan `letsencrypt-prod` yang kita buat pada Langkah 2.
- `dnsNames`: Menentukan nama domain yang valid untuk sertifikat. Ganti `example.com` dan `www.example.com` dengan domain Anda.
- `annotations`: menambahkan anotasi `example.com/auto-reload: “true”` agar sensor hanya memicu peristiwa jika sertifikat memiliki anotasi ini.
Terapkan Sertifikat:
kubectl apply -f example-certificate.yaml
Langkah 7: Verifikasi Otomatisasi
Untuk memverifikasi bahwa otomatisasi berfungsi, periksa status sumber daya `Certificate`:
kubectl describe certificate example-com -n default
Cari kondisi `Ready` dan pastikan statusnya `True`.
Setelah sertifikat siap, Argo Events akan memicu sensor, dan sensor akan memperbarui rahasia TLS APISIX. Anda dapat memeriksa rahasia untuk memastikan sertifikat dan kunci pribadi diperbarui:
kubectl get secret apisix-tls -n default -o yaml
Periksa data `tls.crt` dan `tls.key` untuk memastikan sertifikat dan kunci pribadi diperbarui.
Langkah 8: Konfigurasikan APISIX untuk Menggunakan Rahasia TLS
Terakhir, Anda perlu mengonfigurasi APISIX untuk menggunakan rahasia TLS yang diperbarui. Ini dapat dilakukan dengan memperbarui sumber daya APISIX `Route` atau `StreamRoute` untuk menentukan rahasia TLS.
Contoh:
apiVersion: apisix.apache.org/v2beta3
kind: Route
metadata:
name: example-route
spec:
host: example.com
tls:
secret:
name: apisix-tls
upstream:
type: roundrobin
nodes:
- host: 127.0.0.1:8080
weight: 1
Pastikan untuk mengganti `apisix-tls` dengan nama rahasia TLS Anda dan `example.com` dengan nama host Anda.
Troubleshooting
Jika Anda mengalami masalah, berikut adalah beberapa tip untuk memecahkan masalah:
- Periksa Log Cert-Manager: Periksa log pod Cert-Manager untuk kesalahan apa pun.
- Periksa Log Argo Events: Periksa log sumber peristiwa dan sensor Argo Events untuk kesalahan apa pun.
- Periksa Status Sertifikat: Gunakan `kubectl describe certificate
` untuk memeriksa status sumber daya `Certificate`. - Periksa Rahasia TLS: Pastikan rahasia TLS diperbarui dengan sertifikat dan kunci pribadi yang benar.
- Periksa Konfigurasi APISIX: Pastikan konfigurasi APISIX dikonfigurasi dengan benar untuk menggunakan rahasia TLS.
Kesimpulan
Dalam posting blog ini, kita telah membahas cara mengotomatiskan rahasia TLS APISIX menggunakan Cert-Manager dan Argo Events. Dengan mengotomatiskan proses ini, Anda dapat meningkatkan keamanan, menyederhanakan operasi, dan memastikan API Anda aman dan dapat diandalkan. Otomatisasi ini tidak hanya menghemat waktu tetapi juga mengurangi risiko kesalahan manusia, sehingga memberikan lingkungan yang lebih aman dan efisien untuk aplikasi Anda.
Dengan mengikuti langkah-langkah yang diuraikan dalam panduan ini, Anda dapat mengintegrasikan solusi otomatisasi ini ke dalam infrastruktur Anda, memastikan sertifikat TLS Anda selalu terbaru dan APISIX Anda aman. Integrasi Cert-Manager dan Argo Events secara bersama-sama menyediakan solusi yang kuat untuk pengelolaan siklus hidup sertifikat di lingkungan Kubernetes Anda.
Pertimbangkan untuk menjelajahi fitur-fitur lanjutan Cert-Manager dan Argo Events untuk lebih mengoptimalkan otomatisasi dan mengintegrasikannya dengan alat dan alur kerja lain dalam ekosistem Anda. Eksperimen dengan berbagai konfigurasi untuk menyesuaikan proses otomatisasi dengan kebutuhan spesifik Anda, sehingga memaksimalkan efektivitas dan efisiensi implementasi Anda.
Sumber Daya Tambahan
- Dokumentasi Cert-Manager: https://cert-manager.io/docs/
- Dokumentasi Argo Events: https://argoproj.github.io/argo-events/
- Dokumentasi APISIX: https://apisix.apache.org/docs/
“`