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.
- Sebuah A record dengan name
- 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
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./etc/nginx/sites-available/domain.com
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.