Cara Mengamankan Nginx Web Server dengan Let's Encrypt di Ubuntu 16.04

Bagus Aji Santoso 20 Oktober 2017

Cara Mengamankan Nginx Web Server dengan Let's Encrypt di Ubuntu 16.04

Pendahuluan

Tutorial ini akan mengajak pembaca untuk mengatur sertifikat TLS/SSL dari Let’s Encrypt di server Ubuntu 16.04 yang menjalankan Nginx sebagai server webnya. Kita juga akan membahas bagaimana mengotomasi proses perbaruan sertifikat.

Sertifikat SSL dipakai di dalam server web untuk mengenkripsi traffic antara server dan klien dengan memberikan tambahan lapisan keamanan bagi user yang mengakses aplikasi web kita. Let's Encrypt memberikan cara mudah untuk mengambil dan memasang sertifikat terpercaya tanpa biaya.

Cara Mengamankan Apache Web Server dengan Let's Encrypt di Ubuntu 16.04

Prasyarat

Untuk menyelesaikan tutorial ini kita akan membutuhkan:

  • Server Ubuntu 16.04 dengan user non-root yang memiliki akses sudo, yang mana bisa diatur dengan mengikuti tutorial Yang Perlu Dilakukan Setelah Memasang Server Ubuntu 16.04.
  • Server web Nginx telah terpasang.
  • Memiliki domain yang ingin didaftarkan (atau memiliki akses ke domain ini)
  • Sebuah DNS A Record yang mengarahkan alamat IP publik ke server Nginx.

Setelah memenuhi semua prasyarat, mari kita lanjutkan dengan memasang Certbot, aplikasi klien untuk Let's Encrypt.

Langkah 1 — Pasang Klien Let's Encrypt

Sertifikat Let's Encrypt dapat diunduh lewat software klien yang berjalan di server kita. Klien resmi untuk Let's Encrypt bernama Certbot dan sudah memiliki repositori Ubuntu sendiri dengan versi terbaru. Karena pengembangannya yang sangat aktif, maka kita dapat langsung memasang Certbot terbaru dari repositorinya sendiri daripada menggunakan repositori Ubuntu.

Pertama, tambahkan dulu repositorinya:

sudo add-apt-repository ppa:certbot/certbot

Tekan ENTER untuk menerima. Lalu, jalankan perintah di bawah:

sudo apt-get update

Terakhir, pasang Certbot dengan perintah:

sudo apt-get install python-certbot-apache

Software klien certbot Let's Encrypt sekarang sudah siap dipakai.

Langkah 2 — Menyiapkan Nginx

Certbot dapat secara otomatis mengatur SSL untuk Nginx, tapi ia perlu mengetahui server block yang benar di konfigurasi. Nginx melakukan hal ini dengan melihat sebuat server_name yang sama dengan domain untuk didaftarkan sertifikat SSL-nya. Jika pembaca menggunakan Nginx yang baru diinstall, kita bisa memperbarui file konfigurasi bawaannya:

$ sudo nano /etc/nginx/sites-available/default

Cari baris server_name:

server_name _;

Ganti tanda _ dengan nama domain yang ingin dipakai:

server_name example.com www.example.com;

Simpan dan keluar dari editor. Lakukan validasi sintaks yang baru ditulis dengan menjalankan perintah:

$ sudo nginx -t

Jika tidak ada kesalahan, restart Nginx untuk membaca pengaturan yang baru:

$ sudo systemctl reload nginx

Certbot sekarang akan bisa menemukan server block yang benar dan meperbaruinya. Sekarang kita perlu memperbarui firewall agar mengijinkan traffic HTTPS.

Langkah 3 — Mengatur Firewall

Jika pembaca mengaktifkan firewall ufw, seperti yang direkomendasikan di tutorial ini, pembaca perlu mengaturnya untuk menerima traffic HTTPS. Untungnya, Nginx telah mendaftarkan beberapa profil untuk ufw saat dipasang.

Ketikkan perintah berikut:

$ sudo ufw status

Dari pesan yang muncul, kita dapat lihat bahwa baru traffic HTTP yang diijinkan:

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere                  
Nginx HTTP                 ALLOW       Anywhere                  
OpenSSH (v6)               ALLOW       Anywhere (v6)             
Nginx HTTP (v6)            ALLOW       Anywhere (v6)

Untuk menambahkan traffic HTTPS kita bisa meng-allow-kan profil "Nginx full" lalu menghapus profil "Nginx HTTP" yang sudah aktif.:

$ sudo ufw allow 'Nginx Full'
$ sudo ufw delete allow 'Nginx HTTP'

Ketikkan lagi perintah berikut:

$ sudo ufw status

Maka statusnya sekarang seharusnya sudah terlihat seperti berikut ini:

Status: active

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

Sekarang kita sudah siap untuk menjalankan Certbot dan mendapatkan sertifikat SSL.

Langkah 4 — Mendapatkan Sertifikat SSL

Certbot memberikan beberapa cara untuk mendapatkan sertifikat SSL melalui beberapa plugin. Plugin Nginx akan melakukan konfigurasi Nginx ulang dan memuat ulang konfigurasi yang dibutuhkan:

$sudo certbot --nginx -d example.com -d www.example.com

Perintah di atas akan menjalankan certbot dengan plugin --nginx menggunakan opsi -d untuk menentukan nama domain yang ingin diatur.

Jika baru pertama kali menjalankan certbot, ia akan meminta kita memasukkan alamat email dan menyetujui terms of service-nya. Setelah memberikan apa yang ia minta, certbot lalu akan menghubungi server Let's Encrypt, menjalankan sebuah challenge untuk mengetahui apakah kita memiliki kontrol domain yang ditambahkan tadi.

Jika challenge berhasil, certbot akan menanyakan bagaimana kita ingin mengatur konfigurasi HTTPS:

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):

Pilihan 2 akan me-redirect semua traffic untuk mengarah ke HTTPS. Sedangkan, opsi 1 masih tetap menerima permintaan HTTP. Opsi 2 merupakan pilihan terbaik kecuali masih ada layanan HTTP yang tidak bisa dijadikan HTTPS. Masukan angka yang diinginkan lalu tekan tombol ENTER. Setelah proses dilanjutkan dan berhasil, certbot akan memberikan pesan pemberitahuan tempat di mana sertifikatnya disimpan:

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/example.com/fullchain.pem. Your cert will
   expire on 2017-10-23. 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"
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - 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

Sekarang coba akses alamat servernya dan perhatikan indikator dibagian address bar. Jika berhasil, maka akan muncul ikon gembok berwarna hijau.

Langkah 5 — Memperbarui Parameter Diffie-Hellman

Jika pembaca menguji server yang sekarang menggunakan SSL Labs Server Test, pengujian ini hanya akan memberikan nilai B karena parameter Diffie-Hellman. Kita bisa memperbaikinya dengan membuat file dhparam.pem dan menambahkannya ke server block.

Buat file tadi dengan OpenSSL:

$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Perintah di atas akan berlangsung agak lama, mungkin beberapa menit. Jika selesai, buka file konfigruasi Nginx yang ada server block kita. Di contoh ini, yang dibuka adalah konfigurasi bawaan:

$ sudo nano /etc/nginx/sites-available/default

Paste baris berikut di dalam file yang sedang dibuka di mana saja:

ssl_dhparam /etc/ssl/certs/dhparam.pem;

Simpan dan keluar dari editor. Jalankan perintah berikut untuk memeriksa kesalahan sintaks:

$ sudo nginx -t

Jika tidak ada kesalahan, muat ulang Nginx:

$ sudo systemctl reload nginx

Sekarang server lebih aman dan mendapatkan nilai A.

Langkah 6 — Memperbarui Sertifikat Secara Otomatis

Sertifikat Let's Encrypt hanya valid selama 90 hari. Pengguna disarankan untuk mengotomatiskan proses perbaruan sertifikatnya. Kita perlu menyiapkan perintah yang akan berjalan secara otomatis untuk memeriksa tanggal kadaluarsa sebuah sertifikat dan memperbaruinya.

Untuk menjalankan proses di atas kita akan menggunakan cron, service sistem standar untuk melakukan pekerjaan yang berulang. Kita akan memberitahu cron apa yang harus dilakukan dengan membuka dan mengubah isi file bernama crontab.

sudo crontab -e

Tambahkan baris berikut ke dalam crontab:

crontab

. . .
15 3 * * * /usr/bin/certbot renew --quiet

Bagian 15 3 * * * dari perintah di atas artinya "jalankan perintah ini setiap hari jam 3:15 pagi.

Perinath renew akan memberitahu Certbot untuk memeriksa semua sertifikat yang terpasang di sistem dan memperbarui setiap sertifikat yang akan kadaluarsa dalam 30 hari. Opsi --quiet memberitahu Certbot untuk tidak menampilkan informasi apapun atau menunggu masukan pengguna.

Sistem cron akan menjalankan perintah ini setiap hari. Karena kita memasang sertifikat dengan menggunakan --apache, maka Apache juga akan direstart untuk menggunakan sertifkat yang baru.

Penutup

Di tutorial ini, kita telah belajar bagaimana memasang sertifikat SSL gratis dari Let's Encrypt untuk mengamankan website yang menggunakan Nginx. Kami sarankan pembaca untuk memeriksan blog resmi Let's Encrypt untuk info terbaru serta membaca dokumentasi Certbot untuk detail lebih lengkap mengenai klien yang tadi kita gunakan.

Diterjemahkan dari How To Secure Nginx with Let's Encrypt on Ubuntu 16.04 di bawah Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.