Mengaktifkan MTA-STS Dengan NGINX Untuk Layanan Mail Server Postfix

Terbit: Perbarui:
Tags


Selalu ada sesuatu yang dibutuhkan ketika datang ke jaringan rumah, tetapi ketika datang ke server yang menghadap publik, ada langkah-langkah tambahan yang harus dilalui. Kedengarannya sangat sulit mengerjakan jaringan pribadi agar bisa diakses secara publik. Namun, ketika anda menggunakan layanan Tunnel Broker IPv6 dari Hurricane Electric, semuanya bisa menjadi nyata. Semua layanan internet publik seperti DNS server, web server bahkan mail server bisa anda jalankan dari rumah.

Tetapi server email yang saya jalankan untuk NMRC yang menjalankan Postfix diperlukan untuk mengimplementasikan RFC-8461 alias MTA-STS. Meskipun, MTA-STS tidak terlalu dibutuhkan oleh Postfix, tetapi saya ingin melakukannya, dan saya telah memutuskan untuk mendokumentasikan apa yang saya lakukan karena dokumentasi yang ada tampaknya tidak menjawab semua pertanyaan yang saya miliki. Memang ini bukan dokumentasi lengkap itu sendiri, tetapi ini adalah langkah-langkah yang telah saya kerjakan.

Pada artikel ini, kita akan melihat konfigurasi server email di bagian tentang kebijakan SMTP dari MTA Strict Transport Security (MTA-STS). MTA-STS adalah standar yang dikembangkan untuk memungkinkan penggunaan TLS untuk koneksi antar server email. Penyedia layanan email utama, seperti Google, telah lama menggunakan kebijakan MTA-STS yang dijelaskan dalam RFC 8461.

Server yang kami gunakan dalam penulisan artikel ini adalah sistem FreeBSD 14.5-PRERELEASE GENERIC amd64.

A. Tentang MTA-STS

MTA-STS (Mail Transfer Agent Strict Transport Security) adalah standar untuk meningkatkan SMTP (Protokol Transfer Surat Sederhana). Intinya, ini membantu menutup celah keamanan saat server email berbicara satu sama lain. Penyerang diberikan lubang yang sangat kecil, sehingga vektor serangan tidak mudah dieksploitasi.

Server surat modern diatur untuk bertukar email melalui saluran terenkripsi untuk mencegah penyadapan dan dapat membaca email teks biasa saat transit melalui Internet. Server email saya mendengarkan koneksi masuk dari server email lain, dan dikonfigurasi sehingga salah satu hal pertama yang dikatakannya selama koneksi server ke server ini adalah ia ingin melanjutkan percakapan saat dienkripsi. Ini dilakukan dengan mengenkripsi kata kunci STARTTLS yang memberi tahu server lain untuk mulai menggunakan enkripsi TLS. Pada dasarnya jenis enkripsi yang sama yang digunakan browser Anda untuk lalu lintas web.

MTA-STS bekerja berdasarkan TOFU (Trust On First Use), artinya setelah kebijakan dibaca setidaknya satu kali, kebijakan tersebut akan di-cache oleh MTA untuk jangka waktu tertentu. Ini secara teknis berarti bahwa penyerang dapat mengalahkan MTA-STS dengan mencegah MTA korban membuat permintaan ke file kebijakan MTA-STS yang dihosting di domain penerima, namun dalam banyak kasus hal ini tidak menjadi perhatian yang berarti. Namun, mitigasi untuk ini adalah STARTTLS-Everywhere.

Ini mencegah penyerang meluncurkan serangan man-in-the-middle (MITM) yang cara kerjanya mencegah terjadinya bagian STARTTLS sehingga mereka dapat memaksa lalu lintas tidak terenkripsi yang dapat mereka susupi dengan mudah.

Jadi mengapa melakukannya?, pertahanan secara mendalam. Jangan salah paham, ini tidak menyelesaikan seluruh masalah dengan cara apa pun, MTA-STS bukan satu-satunya opsi atau pilihan konfigurasi di server email. Tetapi ini adalah salah satu dari sekian banyak mengamankan server email.

Mengaktifkan fitur MTA-STS menambahkan sedikit bantuan keamanan untuk email masuk, seperti DMARC memungkinkan sedikit bantuan keamanan untuk email keluar. jadi bagi saya MTA-ST masuk akal dan layak untuk diaktifkan untuk layanan email anda.

B. Nama Domain Untuk MTA-STS

Kita asumsikan anda telah memiliki nama domain yang dibeli dari penyedia hosting, sebut saja nama domain anda adalah example.com, yang akan dijadikan sebagai domain utama untuk server email.

Setelah anda memiliki domain, anda harus membuat subdomain untuk server email dan MTA-STS.

Subdomain Penggunaan Alamat IP
mail.example.com Email Server 2001:470:37:61c:4000::2035
mta-sts.example.com MTA-STS 2001:470:37:61c:4000::2035

Alamat IP yang digunakan adalah alamat yang sama dengan server email, karena mereka berada di host yang sama. Namun sangat disarankan, IP yang digunakan untuk server email dan MTA-STS harus beda. Kami menjalankan server email dan MTA-STA di host yang sama. Kami menggunakan IP publik IPv6 dari Hurricane Electric. Agar lebih jelasnya perhatikan, konfigurasi server DNS yang saya gunakan.

unixbsdshell.site. 		300	IN	MX	20	mail.unixbsdshell.site.
mail.unixbsdshell.site.		300	IN	AAAA		2001:470:36:61c:4000::2000
mta-sts.unixbsdshell.site.	300	IN	CNAME		mail.unixbsdshell.site.

Pada konfigurasi server DNS yang saya gunakan, saya menggunakan CNAME untuk host MTA-STS. Jadi alamat IP untuk mail.unixbsdshell.site dan mta-sts.unixbsdshell.site adalah sama yaitu 2001:470:36:61c:4000::2000. Cara kerjanya untuk server email ditanggapi oleh sub domain mail.unixbsdshell.site, sedangkan untuk email masuk akan dienkripsi oleh host mta-sts.unixbsdshell.site.

Selain itu, anda juga harus mengatur zona TXT pada server DNS, seperti contoh di bawah ini.

_mta-sts.unixbsdshell.site.		300	IN	TXT	"v=STSv1; id=20260626T144527"
_smtp._tls.unixbsdshell.site.		300	IN	TXT 	"v=TLSRPTv1; rua=mailto:support@unixbsdshell.site"

Anda tidak perlu menentukan URL atau jalur ke file mta-sts.txt dalam catatan DNS, karena jalur tersebut akan dikerjakan oleh server NGINX nanti.

Setelah Anda meng-host file kebijakan Anda dan mengatur catatan DNS yang diperlukan, MTA-STS akan diaktifkan untuk domain Anda. Anda dapat menggunakan validator MTA-STS untuk memverifikasi konfigurasi Anda.

MTA-STS secara langsung dilengkapi dengan TLSRPT atau SMTP TLS Reporting yang diatur di RFC8460, yang merupakan mekanisme pelaporan yang memungkinkan Anda mengumpulkan informasi tentang apakah email berhasil dikirim melalui TLS, serta kesalahan apa pun yang mungkin terjadi, misalnya sertifikat kedaluwarsa.

TLSRPT bekerja dengan cara yang sangat mirip dengan pelaporan DMARC. Anda menentukan titik akhir pelaporan (URL atau alamat email) melalui catatan DNS, yang kemudian menyebabkan penyedia layanan email mengirimi Anda laporan harian dalam format JSON.

Sebelum kita lanjutkan ke topik berikutnya, jangan lupa mengubah nama hostname pada server FreeBSD anda. Pada file /etc/hosts ketikkan skrip berikut ini.

2001:470:36:61c:4000::2000	mail.unixbsdshell.site		mail
::1				localhost.unixbsdshell.site	localhost
127.0.0.1			localhost.unixbsdshell.site	localhost

C. Mengaktifkan MTA-STS untuk Email Masuk Dengan NGINX

Untuk mengaktifkan MTA-STS untuk email masuk, Anda harus terlebih dahulu membuat dan meng-host file kebijakan. File kebijakan MTA-STS adalah file teks biasa yang harus dapat diakses melalui HTTPS di jalur /.well-known/mta-sts.txtfile di mta-stssubdomain. Misalnya, jalur file kebijakan MTA-STS yang valid adalah https://mta-sts.example.com/.well-known/mta-sts.txt.

Dalam artikel ini kami tak akan membahas cara mengkonfigurasi NGINX, kita langsung saja ke pengaturan MTA-STS. Pada contoh ini file root dari server NGINX kami letakkan di folder /var/www/html/unixbsdshell/_site. Pada folder tersebut anda buat folder baru bernama .well-known.

root@mail:~ # mkdir -p /var/www/html/unixbsdshell/_site/.well-known
root@mail:~ # cd /var/www/html/unixbsdshell/_site/.well-known
root@mail:/var/www/html/unixbsdshell/_site/.well-known # touch mta-sts.txt

Perintah di atas adalah untuk membuat folder .well-known dan membuat file mta-sts.txt di folder /var/www/html/unixbsdshell/_site/.well-known.

setelah itu pada file /var/www/html/unixbsdshell/_site/.well-known/mta-sts.txt, anda ketikkan skrip berikut ini.

version: STSv1
mode: enforce
mx: mail.unixbsdshell.site
mx: mailhost.unixbsdshell.site
max_age: 604800

Langkah berikutnya setelah anda selesai membuat file mta-sts.txt, mengubah file konfigurasi NGINX. Pada contoh ini file konfigurasi NGINX tersimpan di folder /usr/local/etc/nginx.

Pada folder /usr/local/etc/nginx buka file nginx.conf. Achh..!!! biar jelas saya berikan skrip lengkapnya saja. Di bawah ini adalah contoh skrip lengkap dari file /usr/local/etc/nginx/nginx.conf.

#user  nginx;
worker_processes auto;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}
 
http {
    include       mime.types;
    default_type  application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
			'$status $body_bytes_sent "$http_referer" '
			'$ssl_protocol $ssl_curve $ssl_cipher';

access_log  /var/log/nginx/access.log  main;
error_log  /var/log/nginx/error.log;
	sendfile on;
	tcp_nopush on;
	types_hash_max_size 2048;
	tcp_nodelay on;
	keepalive_timeout 65;
	underscores_in_headers on;
	# server_tokens off;

	gzip on;
	gzip_vary on;
	gzip_proxied any;
	gzip_comp_level 6;
	gzip_buffers 16 8k;
	gzip_http_version 1.1;
	gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

	ssl_protocols TLSv1.3 TLSv1.2;
	ssl_stapling_verify on;
	ssl_prefer_server_ciphers on;

    server {
        listen       80;
	server_name mta-sts.unixbsdshell.site;
	return 301 https://mta-sts.unixbsdshell.site$request_uri;

        location / {
           root   /var/www/html/unixbsdshell/_site;
            index  index.html index.htm;     }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /var/www/html/unixbsdshell/_site;
        } 
            }
server {
listen 443 ssl;
listen [2001:470:36:61c:4000::2000]:443 ssl;
	server_name mta-sts.unixbsdshell.site;
	index index.html index.htm index.nginx-debian.html;

location = /.well-known/mta-sts.txt {
    root /var/www/html/unixbsdshell/_site;
    default_type text/plain;
}

        http2 on;
	add_header Alt-Svc 'h3=":443";ma=86400, quic=":443";ma=86400';
        add_header Alt-Svc 'h2=":443";ma=86400;persist=1';
        add_header Alt-Svc 'h2=":443";ma=86400';        
        ssl_early_data on;

ssl_protocols TLSv1.3 TLSv1.2;
ssl_session_cache    shared:SSL:1m;
ssl_session_timeout  1m;
ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;
ssl_prefer_server_ciphers on;
ssl_conf_command Options PrioritizeChaCha;	
	location ~* \.(jpg|jpeg|png|gif|ico|css|js|ttf)$ {
		access_log off;
		expires 7d;
		tcp_nodelay off;
            	open_file_cache max=1000 inactive=120s;
            	open_file_cache_valid 45s;
            	open_file_cache_min_uses 2;
            	open_file_cache_errors off;
		add_header Cache-Control "public, no-transform";
		add_header Vary "Accept-Encoding"; }

        ssl_certificate /usr/local/etc/letsencrypt/live/unixbsdshell.site/fullchain.pem;
        ssl_certificate_key /usr/local/etc/letsencrypt/live/unixbsdshell.site/privkey.pem;
        ssl_dhparam /usr/local/etc/letsencrypt/live/unixbsdshell.site/dhparams.pem;
}

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Xss-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
add_header Referrer-Policy "no-referrer-when-downgrade";
add_header Content-Security-Policy "upgrade-insecure-requests; style-src https://unixbsdshell.site https://unixbsdshell.site https://*.googleapis.com 'unsafe-inline'; frame-ancestors 'self';";

add_header Permissions-Policy "fullscreen=(self)";
add_header X-Frog-Unsafe "0";
add_header X-HTTPS-Protocol $ssl_protocol;
add_header X-HTTPS-Cipher $ssl_cipher;
add_header X-HTTPS-Curve $ssl_curve;

}

Skrip di atas, adalah skrip yang saya gunakan, anda dapat menyesuaikannya sesuai kebutuhan dan spesifikasi server yang digunakan.

D. Menguji MTA-STS

Langkah ini adalah langkah yang sangat menentukan, mungkin anda telah lelah mengutak-atik skrip di atas. Namun demikian hasil kerja anda belum tentu membuahkan hasil. Agar hasil kerja anda dianggap selesai dan dapat digunakan, lakukan pengujian pada server MTA-STS.

Cara melakukan pengujiannya sangat sederhana, caranya adalah buka web browser Google Chrome atau lainnya dan ketikkan alamat server MTA-STS anda.

Contoh dalam artikel ini adalah https://mta-sts.unixbsdshell.site/.well-known/mta-sts.txt.

Lihat hasilnya, kurang lebih jika tak ada konfigurasi yang salah layar monitor anda akan menampilkan seperti gambar di bawah ini.

server mta-sts dengan nginx
Melakukan pengujian server MTA-STS dengan Menjalankan Google Chrome

MTA-STS diperlukan untuk organisasi yang memprioritaskan keamanan dan kepatuhan email. Ini membantu mencegah serangan dunia maya dengan memastikan pesan hanya dikirimkan melalui saluran terenkripsi.

Sedangkan catatan _mta-sts DNS digunakan untuk memberi sinyal bahwa domain Anda mendukung MTA-STS dan untuk menerbitkan id nilai yang menunjukkan versi kebijakan saat ini.

Saya berharap adopsi MTA-STS dan pemanfaatan daftar kebijakan STARTTLS-Everywhere akan terus meningkat, namun dukungan untuk keduanya saat ini sangat terbatas, terutama dalam sistem/layanan email berpemilik yang digunakan oleh banyak perusahaan besar dan pemerintah.