Episode ini merangkum semua pelajaran keamanan menjadi satu paket: praktik terbaik untuk ACL, timeout, dan connection limit, pencegahan downgrade protokol dan injeksi header, serta konfigurasi default yang aman untuk operasional produksi.

Konfigurasi yang longgar adalah pintu masuk yang tidak disengaja. Hardening bukan soal menambahkan fitur eksotis, tapi membuat setiap keputusan default menjadi konservatif dan setiap permukaan yang tidak perlu ditutup.
Episode 14 menyatukan praktik keamanan dari seluruh series menjadi satu konfigurasi acuan: kebijakan ACL dan timeout yang wajar, pencegahan downgrade dan injeksi, serta struktur file yang aman untuk dioperasikan.
Timeout yang terlalu panjang membiarkan koneksi kosong menghabiskan sumber daya; yang terlalu pendek memutus pengguna sah. Nilai yang umum dipakai:
defaults
mode http
timeout connect 5s
timeout client 30s
timeout server 30s
timeout http-request 10s
timeout queue 10s
timeout tunnel 1hDirektif timeout connect 5s menolak backend yang tidak merespons dalam 5 detik. timeout http-request 10s mencegah klien menahan request separuh, dan timeout tunnel 1h memberi ruang untuk koneksi panjang seperti WebSocket.
Kebijakan koneksi yang ketat melindungi dari kehabisan sumber daya:
global
maxconn 20000
defaults
maxconn 5000
timeout queue 10s
backend api_back
server api1 10.0.0.11:8080 maxconn 1500
server api2 10.0.0.12:8080 maxconn 1500Direktif maxconn 20000 di global adalah batas keras proses; batas per backend dan per server di bawahnya memberi pertahanan berlapis. timeout queue memastikan request menunggu antrean hanya sebentar.
Kumpulan ACL keamanan yang layak dimiliki hampir semua frontend:
frontend web_front
bind *:80
mode http
acl has_host hdr(host) -m found
acl is_https ssl_fc
acl bad_method method TRACE CONNECT
acl suspicious_path path_reg -i /(\.env|\.git|\.bak)
http-request deny deny_status 400 if !has_host
http-request deny deny_status 403 if bad_method
http-request deny deny_status 403 if suspicious_path
default_backend web_backacl has_host hdr(host) -m found menolak request tanpa header Host (ciri probe otomatis), dan suspicious_path memblokir akses ke file konfigurasi yang bocor.
Protocol downgrade terjadi saat klien dipaksa memakai versi TLS yang lemah. Kunci semuanya dari sisi server:
global
ssl-default-bind-options no-sslv3 no-tlsv10 no-tlsv11
ssl-default-bind-ciphersuites \
TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384
ssl-default-server-options no-sslv3ssl-default-bind-options no-sslv3 no-tlsv10 no-tlsv11 mematikan protokol yang sudah tidak aman. Saat backend juga memakai TLS, ssl-default-server-options no-sslv3 mencegah HAProxy sebagai client menawar protokol lawas.
Header yang tidak divalidasi bisa dipakai menyusupkan baris baru atau konten mencurigakan. Bersihkan header dari klien:
frontend web_front
bind *:80
mode http
http-request del-header Proxy-Connection
http-request del-header X-Forwarded-For
http-request set-header X-Forwarded-Proto http
default_backend web_backhttp-request del-header X-Forwarded-For menghapus header yang dipalsukan klien sebelum backend membaca nilai yang dibuat HAProxy sendiri. Prinsipnya: jangan pernah mempercayai header dari klien tanpa menimpa.
Beberapa path tidak boleh dijangkau dari luar:
frontend web_front
bind *:80
mode http
acl is_local src 127.0.0.1 10.0.0.0/8
acl is_admin_path path_beg /admin /api/v1/internal
http-request deny deny_status 404 if is_admin_path !is_local
default_backend web_backacl is_local src 127.0.0.1 10.0.0.0/8 mendefinisikan jaringan internal, dan http-request deny deny_status 404 if is_admin_path !is_local membuat endpoint admin tidak terlihat dari luar (404, bukan 403, agar tidak menarik perhatian).
Informasi versi membantu penyerang mencari celah. Sembunyikan tanda pengenal:
frontend web_front
bind *:80
mode http
http-response set-header Server "haproxy"
http-response set-header X-Content-Type-Options nosniff
http-response set-header X-Frame-Options DENY
default_backend web_backhttp-response set-header X-Content-Type-Options nosniff mencegah browser menebak tipe konten, dan X-Frame-Options DENY menolak pemuatan halaman di iframe pihak lain — pertahanan dasar terhadap clickjacking.
Keamanan juga soal hak akses file:
sudo chown root:root /etc/haproxy/haproxy.cfg
sudo chmod 600 /etc/haproxy/haproxy.cfg
sudo chmod 660 /run/haproxy.socksudo chmod 600 /etc/haproxy/haproxy.cfg memastikan hanya root yang bisa membaca konfigurasi yang mungkin berisi rahasia. Hak akses socket 660 membatasi siapa yang bisa memakai runtime API.
Kesalahan konfigurasi di produksi sama bahayanya dengan serangan:
haproxy -c -f /etc/haproxy/haproxy.cfg && sudo systemctl reload haproxyhaproxy -c -f /etc/haproxy/haproxy.cfg && sudo systemctl reload haproxy hanya reload jika sintaks valid. Biasakan pola ini di semua lingkungan, termasuk CI/CD (episode 20).
Episode 14 mengubah kebiasaan menjadi kebijakan: timeout yang wajar, limit yang ketat, protokol yang terkunci, header yang disterilkan, dan file yang dijaga hak aksesnya. Konfigurasi aman bukanlah fitur, melainkan default.
Inti yang harus dibawa pulang:
maxconn berlapis melindungi dari kehabisan sumber daya.haproxy -c adalah gerbang sebelum setiap reload.Di episode 15 selanjutnya kita akan membahas performance tuning & scalability — tuning maxconn, buffer, dan thread, mengurangi latensi lewat keepalive, compression, dan HTTP/2, serta benchmarking dengan wrk, hey, dan h2load.