Zero trust adalah pendekatan keamanan yang prinsipnya simpel: jangan percaya siapapun, verifikasi setiap request — bahkan dari dalam network sendiri. Banyak server terganggu karena port SSH terbuka ke publik, dan dalam hitungan menit attacker dapat memperoleh akses penuh.
Artikel ini membedah implementasi zero trust untuk self-hosted server: mTLS (mutual TLS), WireGuard VPN, dan policy enforcement di level aplikasi. Cocok untuk yang memiliki beberapa service di satu server atau multiple server.
Apa Bedanya Zero Trust dengan "Biarin Port Kebuka"?
Pendekatan tradisional: firewall memblokir port yang tidak dipakai, sisanya dibiarkan akses dari mana saja. Masalahnya: satu service yang vulnerable (misal dashboard tanpa auth) menjadi pintu masuk ke seluruh server.
Zero trust approach: setiap koneksi harus diautentikasi dan diotorisasi, terlepas dari asalnya. Internal network atau external — sama saja. Trust is not a location, it is an identity.
Layer 1: WireGuard VPN — Access Layer
Semua service di-bind ke interface WireGuard, bukan ke public interface. Sehingga jika ada port terbuka, hanya dapat diakses lewat VPN.
[Interface]
Address = 10.0.0.1/24
ListenPort = 51820
PrivateKey = [server-private-key]
# Peer — admin laptop
[Peer]
PublicKey = [admin-public-key]
AllowedIPs = 10.0.0.2/32
# Peer — CI/CD runner
[Peer]
PublicKey = [runner-public-key]
AllowedIPs = 10.0.0.3/32
Dengan setup ini, service cukup listen di 10.0.0.1:PORT — tidak perlu expose ke 0.0.0.0. Jika ada yang memindai port publik, hanya port WireGuard (51820) yang terlihat, dan itu pun membutuhkan private key untuk connect.
Layer 2: mTLS — Identity Layer
WireGuard mengurus network-level access. Namun jika dua service di server yang sama ingin berkomunikasi, atau service di server A ingin mengakses API di server B, di sinilah mTLS masuk.
mTLS berbeda dengan TLS biasa: dua arah. Client memverifikasi server certificate, server juga memverifikasi client certificate. Setiap request dapat dipastikan identitas pengirimnya.
# Generate CA (Root)
openssl genrsa -out ca-key.pem 4096
openssl req -x509 -new -nodes -key ca-key.pem -sha256 -days 3650 -out ca-cert.pem -subj "/CN=Internal CA"
# Generate server certificate
openssl genrsa -out server-key.pem 2048
openssl req -new -key server-key.pem -out server.csr -subj "/CN=api.internal.example.com"
openssl x509 -req -in server.csr -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -days 365 -sha256
# Generate client certificate (per service/user)
openssl genrsa -out client-key.pem 2048
openssl req -new -key client-key.pem -out client.csr -subj "/CN=monitoring-service"
openssl x509 -req -in client.csr -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -out client-cert.pem -days 365 -sha256
Tips: generate CA dengan key size 4096 (aman 10 tahun), namun sertifikat client/server cukup 2048 (handshake lebih cepat).
Layer 3: Enforce di Aplikasi
Sertifikat tidak berguna jika aplikasi tidak mengeceknya. Berikut contoh enforce mTLS di Nginx sebagai reverse proxy:
server {
listen 443 ssl;
server_name api.internal.example.com;
ssl_certificate /etc/certs/server-cert.pem;
ssl_certificate_key /etc/certs/server-key.pem;
ssl_client_certificate /etc/certs/ca-cert.pem;
ssl_verify_client on;
ssl_verify_depth 1;
proxy_set_header X-Client-CN $ssl_client_s_dn_cn;
location / {
proxy_pass http://localhost:3000;
if ($ssl_client_s_dn_cn != "monitoring-service" &&
$ssl_client_s_dn_cn != "api-gateway") {
return 403;
}
}
}
Yang Paling Sering Dilupa: Certificate Rotation
Sertifikat yang expired = service mati total. Seringkali insiden downtime berjam-jam terjadi karena sertifikat monitoring tidak diperpanjang. Gunakan systemd timer untuk auto-renew:
#!/bin/bash
# /usr/local/bin/rotate-mtls.sh
DAYS_LEFT=$(openssl x509 -in /etc/certs/server-cert.pem -noout -enddate | cut -d= -f2)
EXPIRY=$(date -d "$DAYS_LEFT" +%s)
NOW=$(date +%s)
LEFT=$(( (EXPIRY - NOW) / 86400 ))
if [ "$LEFT" -lt 30 ]; then
echo "Certificate expires in $LEFT days — regenerating..."
openssl x509 -req -in /tmp/server.csr -CA /etc/ca/ca-cert.pem -CAkey /etc/ca/ca-key.pem -out /etc/certs/server-cert.pem -days 365
systemctl reload nginx
echo "Certificate rotated, Nginx reloaded"
fi
Arsitektur zero trust memang lebih ribet daripada "buka port saja". Namun setelah diterapkan, insiden keamanan seperti authentication bypass dapat dicegah. Setup VPN + mTLS + rotate cert membutuhkan waktu, namun setelah itu maintenance-nya minimal.
💬 Komentar (2)
Great article!
Caddy proxy test!