Sunday, March 15, 2015

SSL Offloading with HAProxy


Secure Socket Layer (SSL) merupakan sebuah standardisasi komunikasi yang aman antara sebuah client dengan sebuah server dengan menggunakan enkripsi asimetris (pasangan public/private key). Tanpa SSL, komunikasi client dengan server biasa dilakukan melalui plain text. Sehingga pertukaran data yang sensitif seperti informasi kartu kredit, identitas, dan data sensitif lainnya dapat ditangkap oleh pihak ketiga yang tidak bertanggung jawab [1].

HTTP Secure (HTTPS) merupakan protokol Web HTTP yang telah dilengkapi dengan fitur SSL. Adalah suatu kewajiban bagi service provider untuk menggunakan SSL jika service yang akan digunakan dikonsumsi oleh khalayak umum. Untuk itulah kita patut mencurigai website e-banking atau media sosial yang tidak memiliki awalan https pada URL lengkapnya, karena artinya segala bentuk pertukaran data yang terjadi pada website tersebut dilakukan tanpa enkripsi apapun. Tentunya kita tidak ingin kan password kita yang sangat rahasia dikirim ke server dalam bentuk plain text? :)

Artikel kali ini saya tidak akan membahas secara lebih mendalam mengenai apa itu SSL serta teknologi dan sejarahnya. Namun saya ingin berbagi mengenai bagaimana cara mengkonfigurasi SSL pada aplikasi sehingga pertukaran data lebih aman. Konfigurasi SSL dapat dilakukan langsung di tier aplikasi backend (Tomcat, WebLogic, Glassfish, dsb.) atau dilakukan di tier load balancer/proxy (HAProxy, Nginx, Apache HTTP) sebagai SSL offloader. Artikel ini akan membahas bagaimana saya mengkonfigurasi SSL pada HAProxy.

Setidaknya ada 3 keuntungan yang dapat diperoleh dengan mengkonfigurasi SSL terminator pada HAProxy:
  1. Konfigurasi yang lebih mudah dan lugas.
  2. Terpusat pada load balancer, sehingga konfigurasi tidak perlu dilakukan kembali jika ada penambahan backend server.
  3. Resource pada backend server tidak perlu digunakan untuk proses mengenkripsi/mendekripsi request/response, sehingga dapat lebih fokus menjalankan beban aplikasi.

Sebagai gambaran, saya akan menggunakan topologi yang dibahas pada artikel saya sebelumnya [2]. Pada topologi tersebut, URL yang diakses oleh public adalah https://api.example.co.id. Dengan asumsi kedua backend Tomcat server tersebut berada di lingkungan yang secure (firewall, intranet, dsb.), HAProxy meneruskan request tersebut dengan menggunakan protokol HTTP ke kedua Tomcat tersebut. Pada topologi ini jelas terlihat bahwa komunikasi berbasis SSL dihentikan (terminate) pada node HAProxy.

Langkah-langkah yang perlu dilakukan adalah [4]:
  1. Membuat private key
  2. Membuat Certificate Signing Request (CSR)
  3. Membeli SSL certificate berdasarkan CSR 
  4. Instalasi SSL certificate di HAProxy
Detil dari setiap langkah tersebut akan dijabarkan pada bagian berikutnya.


1. Membuat Private Key


Keseluruhan langkah-langkah ini membutuhkan command openssl. Sehingga kita harus memastikan OpenSSL package terinstalasi di server. Private key dibuat dengan cara menggunakan command berikut ini:
okky@hap01:~$ sudo mkdir /etc/ssl/example.co.id
okky@hap01:~$ sudo openssl genrsa -out "/etc/ssl/example.co.id/example_co_id.key" 2048

2. Membuat Certificate Signing Request (CSR)


CSR diperlukan sebagai input file bagi Certificate Authority (CA) untuk menandatangani SSL certificate kita. CSR ini berisi informasi terkait website domain spesifik yang ingin kita buat koneksi SSL-nya. Dalam artikel ini domain yang akan dibuat SSL certificate-nya adalah domain example.co.id.
okky@hap01:~$ sudo openssl req -new -key "/etc/ssl/example.co.id/example_co_id.key" -out "/etc/ssl/example.co.id/example_co_id.csr"
Country Name (2 letter code) [AU]:ID
State or Province Name (full name) [Some-State]: DKI Jakarta
Locality Name (eg, city) []: Jakarta
Organization Name (eg, company) [Internet Widgets Pty Ltd]: Nostratech Example
Organizational Unit Name (eg, section) []: IT Department
Common Name (e.g. server FQDN or YOUR name) []: *.example.co.id
Email Address []: it-admin@nostratech.com

Please enter the following 'extra' attributes
 to be sent with your certificate request
 A challenge password []: S4n64tR4h4s14
 An optional company name []: Nostratech Example

3. Membeli SSL Certificate Berdasarkan CSR


Setelah CSR telah dibuat, proses selanjutnya adalah pembelian SSL certificate ke CA yang diinginkan, misalnya AlphaSSL [3]. Kemudian CA memberikan file SSL certificate yang akan saya rename menjadi example_co_id.crt. HAProxy bisa membaca private key dan certificate sekaligus dalam 1 file .pem, dengan cara menggabungkan kedua file tersebut dengan command cat.
okky@hap01:~$ sudo su
root@hap01:/home/okky$ sudo cat /etc/ssl/example.co.id/example_co_id.crt /etc/ssl/example.co.id/example_co_id.key > /etc/ssl/example.co.id/example_co_id.pem
root@hap01:/home/okky$ exit

Alternatif lainnya jika kita belum bisa membeli SSL certificate untuk kebutuhan development misalnya, adalah dengan menggunakan self-signed certificate.
okky@hap01:~$ sudo openssl x509 -req -days 365 -in "/etc/ssl/example.co.id/example_co_id.csr" -signkey "/etc/ssl/example.co.id/example_co_id.key" -out "/etc/ssl/example.co.id/example_co_id.crt"

4. Instalasi SSL/Self-Signed Certificate di HAProxy


Ubah konfigurasi HAProxy pada bagian frontend dari Tomcat menjadi seperti ini. Jika pada langkah sebelumnya yang dilakukan adalah membeli SSL certificate dari CA, maka lampirkan juga file CAroot.crt yang merupakan intermediary CA certificate.
frontend tomcat
    bind *:80
    bind *:443 ssl crt /etc/ssl/example_co_id.pem ca-file /etc/ssl/CAroot.crt
    mode http
    option httplog
    option http-server-close
    redirect scheme https if !{ ssl_fc }
    default_backend tomcat-cluster

backend tomcat-cluster
    mode http
    option httplog
    option httpchk HEAD /gojek HTTP/1.1\r\nHost:localhost
    compression algo gzip
    compression offload
    compression type text/html text/plain text/css text/js application/json
    option forwardfor
    http-request set-header X-Forwarded-Port %[dst_port]
    http-request add-header X-Forwarded-Proto https if { ssl_fc }
    cookie SERVERID insert indirect nocache
    balance roundrobin
    server tom01 tom01:8080 check cookie tom01
    server tom02 tom02:8080 check cookie tom02


Restart service HAProxy dan selamat mencoba! :)

No comments:

Post a Comment