Mengamankan Web Server (Nginx) Dengan HTTPS


Setelah memilih Engine-X (Nginx) sebagai web server, serta mempelajari bagaimana melakukan instalasi dan mengelola Nginx, yang dapat kita temui disini. Selanjutnya, mari kita pelajari bagaimana mengamankan web server dengan protocol https.

HTTP (Hypertext Transfer Protocol) adalah sebuah protokol pada suatu jaringan yang mengizinkan pertukaran informasi antara web server dengan client. Dengan kata lain, HTTP lah yang mengatur jalannya proses untuk menampilkan halaman website melalui browser.

Sedangkan HTTPS (Hypertext Transfer Protocol Secure) adalah pengembangan dari HTTP yang mana memiliki standar keamanan yang lebih tinggi dari HTTP. Sama dengan HTTP, HTTPS juga menggunakan TCP (Transmission Control Protocol) ketika akan mengirim dan menerima data. Hanya saja, port yang digunakan bukan port 80, melainkan port 443 dengan koneksi yang dienkripsi oleh SSL/TLS (Transport Layer Security).


Menggunakan Let’s Encrypt

Let’s Encrypt adalah Certificate Authority (CA) yang menyediakan langkah mudah instalasi free TLS/SSL certificates, untuk mengaktivasi encrypted HTTPS pada web server. Ia menyederhanakan proses dengan menyediakan software client, yaitu Certbot, yang melakukan otomasi hampir seluruh langkah yang dibutuhkan. Nah, kabar baiknya, certbot support penuh web server yang kita gunakan, yaitu Nginx.

Di dokumen ini, kita akan belajar melakukan instalasi dan menggunakan Certbot untuk Nginx, pada server Ubuntu 20.04, dan juga langkah untuk memperbarui certificate.


Prerequisites

Sebelum dimulai, kita wajib mempersiapkan hal-hal berikut:

  • Server yang telah terinstalasi OS Ubuntu 20.04 dengan akun selain root dengan akses sudo.
  • Domain teregistrasi. Pada dokumen ini kita akan menggunakan domain.com, sebagai contoh saja. Domain sebenarnya dapat dibeli pada registrar-registrar yang tersedia di Indonesia maupun luar negeri. Lalu, buat dua DNS record dibawah ini lalu pointing ke IP server yang akan kita kerjakan, petunjuk singkatnya menggunakan Cloudflare disini:
    • Sebuah A record dengan name domain.com pointing ke alamat IP publik server.
    • Sebuah A record dengan name www.domain.com pointing ke alamat IP publik server.
  • Server yang akan digarap, telah terinstalasi Nginx. Petunjuk instalasi (untuk OS Ubuntu 20.04) dapat merujuk pada dokumen ini. Pastikan telah dibuat server block untuk domain diatas.

Langkah 1 – Install Certbot

Masuk ke command line interface server melalui ssh dengan user root, menggunakan Terminal, atau Putty untuk pengguna Windows. Perintah login ssh via Terminal:

ssh user@ip_server

Untuk Putty, silahkan mengisi parameter server sesuai form yang disediakan oleh putty, lalu masukan password ketika diminta, atau dapat menggunakan private key (biasanya berupa ppk).

Jalankan perintah berikut:

sudo apt update
sudo apt upgrade

Jika sebelumnya sudah terinstalasi certbot, pastikan certbot tersebut di uninstall guna menghindari konflik dengan perintah dibawah ini (jika terjadi error, maka certbot belum terinstall, dan kita dapat menghiraukannya):

sudo apt remove certbot

Selanjutnya install certbot menggunakan repository snap, dengan perintah berikut:

sudo apt install snapd
sudo snap install core; sudo snap refresh core
sudo snap install --classic certbot

Lalu jalankan perintah berikut guna memastikan kita dapat menggunakan perintah certbot:

sudo ln -s /snap/bin/certbot /usr/bin/certbot

Langkah 2 – Validasi Konfigurasi Nginx

Pastikan server block /etc/nginx/sites-available/domain.com telah dibuat. Jika belum ada, silahkan kembali ke dokumen ini untuk membuat atau memahami konfigurasi server block pada Nginx. Ini penting agar otomasi yang dilakukan certbot berhasil.

Kemudian cek server block tersebut, pastikan terdapat directive server_name yang memiliki value domain.com. Certbot akan membaca server_name sebagai acuan untuk membuat SSL certificate. Sebagai contoh penerapan server_name pada Nginx:

...
server_name domain.com www.domain.com;
...

Setelah memastikan server block telah benar, periksa apakah konfigurasi sudah benar dengan perintah:

sudo nginx -t

Kemudian, jika tidak ada error, restart Nginx dengan perintah:

sudo systemctl reload nginx

Langkah 3 – Validasi Firewall

Mirip seperti langkah 2, pastikan firewall telah di setup untuk Nginx, petunjuk setup nya dapat merujuk pada dokumen ini, kemudian gunakan perintah berikut untuk validasi:

sudo ufw status

Jika konfigurasi benar, maka akan tampil hasil sebagai berikut:

Status: active

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW       Anywhere
OpenSSH                    ALLOW       Anywhere
Nginx Full                 ALLOW       Anywhere
22/tcp (v6)                ALLOW       Anywhere (v6)
OpenSSH (v6)               ALLOW       Anywhere (v6)
Nginx Full (v6)            ALLOW       Anywhere (v6)

Jika belum benar, silahkan kembali ke dokumen ini untuk memahami kembali konfigurasi firewall pada Nginx.


Langkah 4 – Membuat SSL Certificate

Certbot memberikan beberapa cara untuk membuat SSL certificate, diantaranya menggunakan plugin Nginx pada certbot, yang telah otomatis kita tambahkan pada instalasi certbot diatas. Plugin tersebut otomatis akan membaca directive server_name pada server block Nginx, melakukan konfigurasi ulang pada server block Nginx, dan melakukan reload service nginx jika diperlukan. Untuk menjalankan certbot dan menggunakan plugin Nginx, dapat menggunakan perintah:

sudo certbot --nginx -d domain.com -d www.domain.com

Perintah ini berati, menjalankan certbot dengan --nginx plugin, menggunakan tambahan parameter -d untuk mendefinisikan domain mana yang akan dibuatkan SSL certificate nya.

Jika ini pertama kali kita menggunakan perintah certbot, kita akan diminta memasukan email, dan menyetujui the terms of service. Setelah itu, certbot akan melakukan komunikasi dengan server Let’s Encrypt, dan memvalidasi bahwa domain yang telah kita masukan (domain.com) adalah benar, dan telah di ponting ke server yang sedang kita kerjakan ini, sekaligus membuatkan SSL certificate dan menyimpannya di server kita.

Jika berhasil, certbot akan memberikan beberapa opsi konfigurasi otomatis redirect ke https atau tidak, sebaiknya kita memilih redirect. Tampilannya seperti berikut:

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel):

Pilih 2 dan tekan ENTER. Server block akan otomatis diubah untuk mengaktifkan SSL certificate. certbot akan menampilkan pesan bahwa proses berhasil dan memberitahu dimana lokasi file SSL certificate yang telah dibuat:

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/domain.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/domain.com/privkey.pem
   Your cert will expire on 2023-01-18. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot again
   with the "certonly" option. To non-interactively renew *all* of
   your certificates, run "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Sampai disini, seharusnya kita telah berhasil menambahkan SSL certificate. Validasi dengan membuka kembali domain.com pada browser dengan menambahkan https://, contoh https://domain.com. Jika berhasil, website akan terbuka, dan akan ada logo “gembok” pada address bar browser di samping kiri (sebelum) alamat url.


Langkah 5 – Auto Renewal

Langkah terakhir adalah memastikan auto renewal telah aktif. Mengapa perlu auto renewal, karena SSL certificate yang dibuat certbot hanya berlaku untuk 90 hari, agar kita tidak repot untuk membuat ulang, maka kita memerlukan auto renewal ini.

Certbot telah menyediakan fitur auto renewal ini, yang berjalan 2 kali dalam sehari, sehingga kita hanya perlu mengecek apakah auto renewal ini telah aktif atau tidak. Cek status auto renewal status dengan perintah:

sudo systemctl status certbot.timer

Contoh output yang diharapkan:

● certbot.timer - Run certbot twice daily
     Loaded: loaded (/lib/systemd/system/certbot.timer; enabled; vendor preset: enabled)
     Active: active (waiting) since Mon 2020-05-04 20:04:36 UTC; 2 weeks 1 days ago
    Trigger: Thu 2020-05-21 05:22:32 UTC; 9h left
   Triggers: ● certbot.service

Untuk testing proses renewal, jalankan perintah:

sudo certbot renew --dry-run

Jika tidak ada error, maka semua telah berfungsi dengan baik. Jika dibutuhkan, Certbot akan memperbarui certificate dan reload service Nginx untuk mengambil certificate baru tersebut. Jika ada error selama proses berlangsung, kita akan dikirimi email oleh Let’s Encrypt, ke alamat email yang kita masukan di awal.


Kesimpulan

Sampai disini kita telah belajar dan melakukan instalasi SSL certificate (https) menggunakan Let’s Encrypt dengan software certbot, mengunduh SSL certificate untuk domain, mengkonfigurasi Nginx untuk menggunakan certificate tersebut, dan memastikan certificate renewal. Jika butuh informasi lebih dalam terkait apa yang sudah kita praktikan diatas, kita dapat mengunjungi dokumentasi certbot.