Setup Secure Apache HTTPS Server

Pada kesempatan kali ini saya ingin memposting tentang cara mengkonfigurasi web server agar support dengan HTTPS (data yang ditransmisi terenkripsi), pada server Linux Slackware64. Ini hanyalah kegiatan iseng-iseng setelah saya menyadari ternyata aplikasi miniSIEM saya mengirimkan data login user dan password ke webserver dengan koneksi HTTP yang -semua sudah tau- rentan terhadap serangan man-in-the-middle hehehe. Untuk melakukan setup ini, terdapat 2 phase, pertama: karena laptop saya gak modal beli signed certificate dari Certificate Authority (CA), kita akan membuat self-signed certificate saja. Sedangkan langkah kedua: mengkonfigurasi file konfigurasi apache. That’s it? Yes, that’s it. Tapi pada post ini saya juga ingin menambahkan tentang securing HTTPS itu sendiri. Karena walaupun data telah dienkripsi, ada beberapa konfig yang perlu dioptimasi, seperti salah pemilihan algoritma enkripsi yang lemah misalnya, sehingga data yang dienkrip ada kemungkinan lebih mudah untuk di dekripsi.

Seperti yang telah saya sebutkan di atas, ini adalah skema konfig apache untuk Slackware 64 bit, mungkin ada sedikit perbedaan dengan distro lainnya, tapi pada intinya tetap pada 2 phase itu. Mungkin di semua distro linux, package Apache webserver pasti sudah disiapkan dengan mod_ssl walaupun non-aktif. Jadi seharusnya di distro linux lainnya juga tidak ada prosedur seperti menambah mod_ssl ke Apache servernya, karena seharusnya sudah disupport dan diinclude di baris konfigurasi walaupun di-comment dengan hashtag, atau dengan kata lain non-aktif.

Phase 1: Membuat Self-Signed Certificate

============

Disclaimer: Pertama-tama, perlu diketahui bahwa self-signed certificate pasti akan dideteksi dan akan di-alert oleh browser karena sign-nya tidak dilakukan oleh trusted party (CA) yang daftar list CA-nya ada di setiap browser sebagai referensi browser. Sehingga akan ada warning pada web browser tentang “untrusted site” jika kita mengakses web server nya. Ini merupakan hole security baru yang kita ciptakan karena rentan terhada serangan SSL Man-in-the-middle. Hal ini bisa diatasi dengan membeli SSL certificate yang memang di sign oleh CA. Tetapi dengan alasan for fun not fund, kita lanjut aja ya haha. Yang penting tetap terenkripsi daripada tidak sama sekali… *alibi haha*

Satu catatan lagi, private key yang nanti akan kita generate di bawah tidak diproteksi menggunakan passphrase untuk membaca isi filenya. Seharusnya private key dilindungi dari bisa terbaca oleh user. Tetapi penerapan passphrase di “server-server-an” ini saya rasa tidak begitu perlu karena merepotkan saya setiap boot-up servernya atau restart service, web server akan meminta passphrase agar bisa membaca private key tersebut. Jadi perlu dimaklumi pada posting ini, beberapa hardening tidak dilakukan ya. Satu karena alasan uang, satu lagi karena alasan repot hahaha.

============

Untuk membuat self-signed certificate, pastikan package openssl sudah terinstall pada webserver. Kemudian lakukan tiga langkah di bawah ini. 3 langkah tersebut mulai dari 1) membuat private key, 2) membuat file certificate signing request, dan terakhir 3) signed certificate-nya:

[email protected]:/etc/httpd/ssl-key# openssl genrsa -out server.key 2048
membuat server private key dengan panjang key 2048-bit. Beberapa masih ada yang menggunakan kunci 1024-bit. Tetapi dengan spek komputer jaman sekarang dan alasan demi lebih aman, saya menggunakan key 2048-bit. Output: file “server.key”

[email protected]:/etc/httpd/ssl-key# openssl req -new -key server.key -out server.csr
membuat certificate signing request file, tak lain adalah form informasi certificate seperti Issuer, Organization Name, dsb. Output: file “server.csr”

[email protected]:/etc/httpd/ssl-key# openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
membuat signed certificate dari file certificate signing request file di atas. File certificate berlaku 1 tahun. Output: file “server.crt”

Pada contoh ini saya mengeksekusi ketiga file tersebut di direktori /etc/httpd/ssl-key. Ketiga file tersebut akan digenerate pada folder itu juga. File-file inilah yang kita masukkan ke konfigurasi Apache.

Phase 2: Konfigurasi Apache

Di Slackware, Apache dikenal dengan nama httpd dengan konfigurasi httpd.conf nya terletak di file /etc/httpd/httpd.conf. Di file konfigurasi tersebut, diinclude-kan pula konfigurasi SSL yang terletak di file /etc/httpd/extra/httpd-ssl.conf. Dua file inilah yang akan kita edit. Berikut baris yang harus dikonfigurasi:

-Pada file httpd.conf

Aktifkan konfigurasi SSL, cari dan uncomment baris:

#LoadModule ssl_module lib64/httpd/modules/mod_ssl.so
dan
#Include /etc/httpd/extra/httpd-ssl.conf

-Pada file httpd-ssl.conf

Referensikan pada konfig letak certificate SSL yang sudah kita generate di phase 1, sebagai contoh sertifikat saya bernama “server.crt” terletak di direktori /etc/httpd/ssl-key, maka:

SSLCertificateFile “/etc/httpd/ssl-key/server.crt”
SSLCertificateKeyFile “/etc/httpd/ssl-key/server.key”

Setelah semua telah di konfig, tinggal restart web server dan coba lakukan koneksi HTTPS ke webserver. That’s it.

HTTPS Vulnerability Assessment dan Penetration Testing

Vulnerability assessment dan penetration testing dilakukan untuk mencari celah keamanan apa saja yang akan kita temui dan harus segera kita atasi. Untuk ceklist kegiatannya, saya menggunakan Nessus Vulnerability Scanner dan referensi Testing SSL dari OWASP. Tidak semuanya saya bahas disini ya karena hasilnya kepanjangan untuk diceritakan disini.

-Banner-grabing test dengan Nmap:

Hasil banner-grabing memperlihatkan informasi webserver tidak dispoiler ke publik seperti versi OpenSSL yang digunakan dsb. Ini karena saya sebelumnya telah meng-apply konfigurasi Apache agar menampilkan header informasi server yang paling minim.

Nmap scan report for 10.3.246.238
Host is up (0.0060s latency).
PORT STATE SERVICE VERSION
443/tcp open ssl/http Apache httpd

-Testing vulnerability terhadap CVE-2009-3555

Dari hasil scanning memperlihatkan handshake error dari server yang menolak koneksi. Vulnerability ini diketahui terjadi pada OpenSSL sebelum 0.9.8l, sedangkan versi OpenSSL server ini adalah versi 1.0.1e. Berikut ini potongan hasilnya:

[*] Testing for SSLv3/TLSv1 renegotiation vuln. (CVE-2009-3555) …
verify return:1
RENEGOTIATING
Secure Renegotiation IS supported
139768800814752:error:1409E0E5:SSL routines:SSL3_WRITE_BYTES:ssl handshake failure:s3_pkt.c:596:

-Testing SSL-DoS

Saya memanfaatkan tool thc-ssl-dos untuk mencoba melakukan serangan denial of service ke server saya. Hasilnya, negatif rentan terhadap well-known DoS Attack.

SSL DoS Test
SSL DoS Test

-Nessus Vulnerability Scanner

Dari tool Nessus saya mendapatkan vulnerability kategori ‘low’ bahwa pemilihan cipher yang digunakan pada server menggunakan cipher yang lemah (RC4). RC4 merupakan stream-cipher, lebih ringan dari segi performance, bahkan bisa memitigasi ancaman pada 2011, serangan BEAST (Video). NB: Ada vulnerability kategori ‘medium’ yaa… masalah certificate. Tapi sudah saya sampaikan di disclaimer di atas, pada kesempatan kali ini kita exclude masalah SSL certificate ini.

Hasil Scan Nessus
Hasil Scan Nessus

Securing HTTPS Webserver

Di bawah ini adalah langkah-langkah lanjutan yang akan kita lakukan untuk menambah sekuritas HTTPS server kita dan aksi setelah kita melakukan vulnerability scanning dan penetration testing.

Untuk security concern, tambahkan baris:

SSLInsecureRenegotiation Off

letakkan baris tersebut dimana saja pada file httpd.conf, untuk menolak SSL Insecure Renegotiation dari client untuk mencegah serangan DoS key-renegotiation (DoS renegotiation Video Animation)

Pada file httpd-ssl.conf, pastikan si protokol lama SSLv2  di disable:

SSLProtocol all -SSLv2

=============================UPDATE================================

Setelah ditemukannya metode serangan bernama POODLE Attack, SSLv3 direkomendasikan untuk di disable
sehingga konfigurasi yang recommended menjadi:

SSLProtocol all -SSLv2 -SSLv3

====================================================================

Pilih cipher yang kuat. Caranya, pada file httpd-ssl.conf, cari dan aktifkan baris:

#SSLCipherSuite ECDHE-RSA-AES128-SHA256:HIGH:!MD5:!aNULL:!EDH

#SSLHonorCipherOrder On

Contoh di atas ini, berarti SSL server prefer menggunakan cipher ECDHE-RSA saat key-exchange, minimal AES128 untuk enkripsi data, dan hashing menggunakan SHA1 256-bit untuk message authentication. Beberapa opsi nya ada di http://www.openssl.org/docs/apps/ciphers.html.  Silaken pilih-pilih sendiri urutan cipher yang di prefer nya. Apakah mau include yang LOW dan MEDIUM cipher dan sebagainya.

Setelah poin-poin di atas telah dilakukan, restart kembali service Apache untuk meng-apply perubahan konfigurasi dan kembali saya mencoba test menggunakan Nessus. Berikut ini hasil pada tool Nessus setelah dilakukan hardening. Yippie, low vulnerability karena weak cipher sudah hilang…

Hasil Scan Nessus Setelah Hardening
Hasil Scan Nessus Setelah Hardening

Dengan langkah yang komprehensif ini (halah) disertai dengan secure config, kita saat ini bukan hanya membuat server HTTPS saja, tetapi plus server HTTPS yang lebih secure karena enkripsi yang lebih kuat. Sebagai contohnya, untuk hashing message tidak menggunakan MD5 tetapi menggunakan SHA1 dan sebagainya. Berikut ini perbedaan koneksi SSL sebelum dan sesudah hardening:

Perbedaan Sebelum dan Sesudah Hardening HTTPS
Perbedaan Sebelum dan Sesudah Hardening HTTPS

One thought on “Setup Secure Apache HTTPS Server

Leave a Reply

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