Introduction
Kali ini penulis akan menjelaskan tentang bagaimana cara membuat MTLS menggunakan NGINX ingress kubernetes , sebelumnya kita perlu mengetahui tentang :
Mutual Transport Layer Security (mTLS) adalah teknologi keamanan yang digunakan untuk melindungi komunikasi dua arah antara dua entitas, seperti antara klien dan server. Dalam konteks Kubernetes dan NGINX Ingress Controller, mTLS dapat diimplementasikan untuk meningkatkan keamanan komunikasi antara klien dan backend server melalui Ingress.
Baca juga :

Berikut adalah panduan singkat tentang cara membuat mTLS di NGINX Ingress di lingkungan Kubernetes:
1. Create CA
Pertama adalah kita harus membuat atau men-generate CA nya, sebagai author/authority, dan untuk CN atau Common Name, ini disesuaikan dengan domain yang nanti kita pakai, karena disini saya mencobanya di local jadi mengguakan "localhost".
openssl req -newkey rsa:2048 \
-new -nodes -x509 \
-days 352 \
-out ca.crt \
-keyout ca.key \
-subj "/C=ID/ST=Jakarta/O=CV igunawan.com/CN=localhost"
2. Create Server Cert
Yang kedua adalah kita men generate certificate untuk di sisi Server, sesuaikan juga untuk organizationya.
# generate key
openssl genrsa -out server.key 2048;
# generate certificate signing request (csr)
openssl req -new -key server.key -out server.csr \
-subj "/C=ID/ST=Jakarta/O=CV igunawan.com/CN=localhost";
# generate certificate based on previous csr and sign it using CA key and certificate
openssl x509 -req -in server.csr \
-extfile <(printf "subjectAltName=DNS:localhost") \
-CA ca.crt -CAkey ca.key \
-days 3652 -sha256 -CAcreateserial \
-out server.crt;
3. Create Client Cert
Untuk yang terakhir adalah men generate sertifikat di sisi Clientnya, dan perhatikan, Organization & Commong Name nya.
# generate key
openssl genrsa -out client.key 2048;
# generate certificate signing request (csr)
openssl req -new -key client.key -out client.csr \
-subj "/C=ID/ST=Jakarta/O=CV Client.com/CN=localhost";
# generate certificate based on previous csr and sign it using CA key and certificate
openssl x509 -req -in client.csr \
-extfile <(printf "subjectAltName=DNS:localhost") \
-CA ca.crt -CAkey ca.key -out client.crt -days 3652 -sha256 -CAserial ca.srl
4. Configure SSL passthrough on the ingress controller
4.a NGINX Ingress Controller — enabling SSL passthrough
Check konfigurasi Nginx ingress kita terlebih dahulu:
$ kubectl -n kube-system get deployment/ingress-nginx-controller -o yaml
Outputnya kurang lebih akan seperti ini,
apiVersion: apps/v1
kind: Deployment
...
spec:
template:
spec:
containers:
- name: controller
args:
- /nginx-ingress-controller
- --publish-service=$(POD_NAMESPACE)/ingress-nginx-controller
- --election-id=ingress-nginx-leader
- --controller-class=k8s.io/ingress-nginx
- --ingress-class=nginx
- --configmap=$(POD_NAMESPACE)/ingress-nginx-controller
- --validating-webhook=:8443
- --validating-webhook-certificate=/usr/local/certificates/cert
- --validating-webhook-key=/usr/local/certificates/key
Kemudian tambahkan arguments untuk enable passthrough --enable-ssl-passthrough
apiVersion: apps/v1
kind: Deployment
...
spec:
template:
spec:
containers:
- args:
...
- --enable-ssl-passthrough
Dan yang terakhir adalah replace file manifests deployment.yaml tsb.
4.b NGINX Ingress – Customize Ingress
Dan yang terakhir adalah custom ingress kita , yang terdiri dari : tambahkan CA & TLS nya kedalam secret dan adjust beberapa annotations berikut:
Secret CA:
$ kubectl create secret generic ca-secret --from-file=ca.crt=ca.crt
Secret Self-TLS:
$ kubectl create secret tls self-tls --key server.key --cert server.crt
Dan yang di adjust di sisi ingress berikut ini , replace atau apply Nginx Ingressnya , dan silahkan dicoba.
metadata:
annotations:
nginx.ingress.kubernetes.io/auth-tls-pass-certificate-to-upstream: "true"
nginx.ingress.kubernetes.io/auth-tls-secret: namespace/ca-secret
nginx.ingress.kubernetes.io/auth-tls-verify-client: "on"
nginx.ingress.kubernetes.io/auth-tls-verify-depth: "1"
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
nginx.ingress.kubernetes.io/ssl-passthrough: "true"
tls:
- hosts:
- localhost
secretName: self-tls

Admin website igunawan.com, System Administrator, DevOps Engineer
