Episode ini memperkuat lapisan transport: TLS termination di reverse proxy, versi TLS dan cipher yang direkomendasikan, header keamanan seperti HSTS, X-Frame-Options, CSP, dan X-Content-Type-Options, serta flag cookie Secure, HttpOnly, dan SameSite untuk melindungi sesi.

Episode 21 melindungi Authelia dari sisi logika: regulation memblokir penebak password. Tapi ada satu pintu yang lebih mendasar: jalur komunikasi itu sendiri. Jika trafik lewat HTTP polos, semua yang dikirim — termasuk password — bisa dibaca di tengah jalan. Episode 22 ini membangun lapisan transport yang aman: HTTPS, header keamanan, dan kebijakan TLS.
Analoginya seperti mengirim surat: regulation memastikan hanya penerima yang berhak yang boleh membuka kotak surat, sedangkan TLS adalah amplop segel yang memastikan isi surat tidak dibaca siapa pun selama perjalanan. Keduanya wajib ada.
Dalam arsitektur Authelia, sertifikat TLS hampir selalu dipasang di reverse proxy — NGINX, Traefik, Caddy, atau HAProxy — bukan di Authelia itu sendiri. Proxy menerima HTTPS dari browser, membuka amplopnya, lalu meneruskan request ke Authelia lewat HTTP internal.
Termination di proxy menguntungkan karena sertifikat dikelola di satu tempat untuk semua layanan. Agar Authelia tahu bahwa koneksi asli aman, proxy harus menyetel header X-Forwarded-Proto:
server {
listen 443 ssl http2;
server_name auth.example.com;
ssl_certificate /etc/letsencrypt/live/auth.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/auth.example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Frame-Options "DENY" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "geolocation=(), camera=(), microphone=()" always;
location / {
proxy_pass http://authelia:9091;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
}
}Authelia menerima trafik HTTP di port 9091 dari dalam jaringan proxy. Karena koneksi asli sudah HTTPS, cookies bertanda Secure tetap berlaku. Validasi konfigurasi sebelum reload dengan nginx -t.
| Header | Contoh Nilai | Fungsi |
|---|---|---|
Strict-Transport-Security | max-age=31536000; includeSubDomains | Memaksa browser memakai HTTPS |
X-Frame-Options | DENY | Mencegah halaman di-frame situs lain (clickjacking) |
X-Content-Type-Options | nosniff | Mencegah browser menebak tipe MIME |
Referrer-Policy | strict-origin-when-cross-origin | Membatasi URL yang bocor lewat referrer |
Permissions-Policy | geolocation=(), camera=() | Menonaktifkan fitur browser yang tidak perlu |
Content-Security-Policy | Sesuai kebutuhan | Membatasi sumber konten yang boleh dimuat |
Strict-Transport-Security memberitahu browser: untuk domain ini, jangan pernah menggunakan HTTP selama periode max-age. Setelah browser mengunjungi sekali lewat HTTPS, percobaan koneksi HTTP selanjutnya di-upgrade otomatis. Ini menutup celah serangan downgrade dan penyadapan di halaman awal.
Masa max-age yang umum adalah 31536000 (satu tahun). Untuk kunjungan pertama, pastikan tidak ada aplikasi yang masih bisa diakses lewat HTTP polos — HSTS hanya membantu jika semua koneksi sebelumnya sudah aman.
Content-Security-Policy (CSP) mengontrol sumber daya apa yang boleh dimuat halaman. Untuk Authelia yang memuat portal loginnya sendiri, CSP yang terlalu ketat bisa merusak halaman. Mulai dari kebijakan dasar seperti frame-ancestors 'self', lalu longgarkan bertahap sambil mengamati konsol browser.
X-Frame-Options berlapis dengan frame-ancestors: keduanya mencegah halaman login Authelia di-embed di dalam iframe situs penyerang. Dengan DENY, penyerang tidak bisa menampilkan portal Authelia dalam bingkai transparan dan menipu pengguna memasukkan kredensial.
Warning
Header keamanan diterapkan di proxy, bukan di Authelia. Pastikan penerapannya pada blok server Authelia, dan hati-hati dengan CSP — uji di konsol browser dulu, karena kebijakan yang salah bisa membuat portal login tidak berfungsi.
Cookie sesi Authelia hanya bernilai aman jika flag-nya benar:
Secure — cookie hanya dikirim lewat HTTPS. Authelia menyetelnya otomatis ketika koneksi asli aman, jadi pastikan X-Forwarded-Proto diteruskan dengan benar.HttpOnly — cookie tidak bisa diakses JavaScript, sehingga token tidak bocor lewat skrip.SameSite — default lax pada Authelia, membatasi cookie dikirim lintas situs. Nilai strict lebih ketat; none hanya untuk kasus khusus.Batasi versi TLS hanya ke yang aman: TLSv1.2 dan TLSv1.3. Versi lama seperti TLS 1.0 dan 1.1 punya kerentanan yang sudah lama diketahui. Untuk cipher, arahkan preferensi ke suite modern dengan forward secrecy (misalnya kunci ECDHE); pola HIGH:!aNULL:!MD5 pada konfigurasi NGINX di atas adalah titik awal yang aman.
Di Caddy, kebijakan TLS aman diatur otomatis — cukup pastikan domain dan HTTPS aktif:
auth.example.com {
header Strict-Transport-Security "max-age=31536000; includeSubDomains"
header X-Frame-Options "DENY"
header X-Content-Type-Options "nosniff"
header Referrer-Policy "strict-origin-when-cross-origin"
reverse_proxy authelia:9091
}Caddy menangani sertifikat dan pembaruan otomatis lewat Let's Encrypt. Header diterapkan dengan directive header.
Sebelum menutup episode, pastikan baseline berikut terpenuhi:
Strict-Transport-Security dengan max-age panjang.X-Frame-Options dan X-Content-Type-Options aktif.Secure, HttpOnly, dan SameSite.X-Forwarded-Proto diteruskan dengan benar dari proxy.Tip
Periksa konfigurasi kalian dengan alat pemeriksaan header seperti securityheaders.com atau ekstensi browser. Header yang hilang akan terlihat jelas di sana, dan hasilnya bisa dibandingkan sebelum serta sesudah perbaikan.
Di episode ini kalian memperkuat lapisan transport:
Secure, HttpOnly, dan SameSite melindungi sesi.Lapisan ini mengamankan jalur, tapi ada satu pertanyaan yang lebih filosofis: berapa banyak data yang sebenarnya perlu kita simpan? Di episode 23, kita membahas Privacy & Anonymization — logging yang hemat data, retensi yang minimal, hingga penghapusan data pengguna. Sampai jumpa!