Cara Membuat MTLS di NGINX Ingress Kubernetes

Introduction

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

# 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

# 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

$ kubectl -n kube-system get deployment/ingress-nginx-controller -o yaml
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
apiVersion: apps/v1
kind: Deployment
...
spec:
  template:
    spec:
      containers:
      - args:
          ...
          - --enable-ssl-passthrough

4.b NGINX Ingress – Customize Ingress

$ 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
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
    

Leave a Reply

Your email address will not be published. Required fields are marked *