Melanjutkan tulisan saya sebelumnya tentang portainer yaitu sebuah user interface manajemen berbasis web yang memungkinkan kita untuk mengelola container dari sebuah docker host dengan lebih mudah. Kali ini saya melanjutkan dokumentasi saya untuk membuat koneksi lebih aman ke secure portainer dengan SSL (Secure Socket Layer) menggunakan Let’s Encrypt Certificate secara gratis. Untuk dokumentasi proses installasi docker di Ubuntu 20.04 dan installasi portainer bisa kembali dilihat pada tulisan saya sebelumnya.
Studi Kasus
Pada case kali ini saya akan menggunakan topologi yang sama pada tulisan saya sebelumnya tentang reverse proxy pada nginx, selanjutnya saya akan menambahkan 1 server lagi yaitu server docker host yang sudah terinstall docker engine dan portainer-nya. Saya akan membuat 1 buah domain untuk mengakses portainer kemudian menambahkan SSL agar portainer dalam diakses dengan lebih aman menggunakan protokol https.
Secara default, portainer yang sudah kita install berkerja pada port tcp 9000 dan ini tidak mensupport protokol https. Disini saya akan menempatkan docker host dibelakang nginx reverse proxy, sehingga apabila ada permintaan dari komputer client ke portainer, traffic akan melewati reverse proxy yang menggunkaan protokol https pada port 443 kemudian server reverse proxy akan meneruskan traffic tersebut ke docker host pada port 9000.
1. Membuat vHost dan reverse proxy untuk domain portainer
Pertama, saya sudah mempersiapkan sebuah domain, portainer.server3.com yang sudah dimapping ke alamat IP Public yang saya miliki. Selanjutnya kita akan membuat sebuah vhost di dalam reverse proxy untuk akses ke portainer.
$ sudo nano /etc/nginx/sites-enabled/portainer.server3.com
server { server_name portainer.server3.com; location / { proxy_pass http://192.168.10.30:9000; proxy_read_timeout 300; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Real-PORT $remote_port; } listen [::]:80; listen 80; }
Cek konfigurasi nginx untuk reverse proxy ke docker host, pastikan tidak ada error.
$ sudo nginx -t
Aktifkan vhost yang sudah dibuat.
$ sudo ln -s /etc/nginx/sites-enabled/portainer.server3.com /etc/nginx/sites-enabled/
Untuk menerapkan perubahannya, restart nginx.
$ sudo systemctl restart nginx
Pastikan kita dapat mengkases domain portainer.server3.com masih melalui protokol http di port 80 melalui web browser sebelum kita membuat SSL dari LetsEncryt Certificate. Jika berhasil, selanjutnya kita akan menginstall Certbot untuk mengkonfigurasi certificate di vhost.
2. Install Certbot
Certbot adalah sebuah tools atau software gratis untuk menggunakan Let’s Encrypt certificates secara otomatis pada websites dengan mengaktifkan dukungan pada protokol HTTPS. Dengan menggunakan Certbot’s, kita dapat dnegan mudah mengconvert sebuah http site ke secure https site menggunakan nonprofit certificate authority yang menyediakan ssl/tls certificate.
$ sudo apt install certbot
$ sudo apt install python-certbot-nginx
3. Menjalankan Certbot
Jalankan Certbot untuk mengkonfigurasi SSL/TLS certificate pada Nginx website. Certbot akan otomatis melakukan konfigurasi yang diperlukan untuk vhost nginx kita. Ikuti langkah-langkahnya sampai dengan selesai.
$ sudo certbot --nginx -d portainer.server3.com
Jika sudah selesai, kita bisa coba memeriksa hasil konfigurasi certbot pada file vhost portainer.
$ sudo nano /etc/nginx/sites-enabled/portainer.server3.com
server { server_name portainer.server3.com; location / { proxy_pass http://192.168.10.30:9000; proxy_read_timeout 300; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Real-PORT $remote_port; } listen [::]:443 ssl; # managed by Certbot listen 443 ssl; # managed by Certbot ssl_certificate /etc/letsencrypt/live/portainer.server3.com/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/portainer.server3.com/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot } server { if ($host = portainer.server3.com) { return 301 https://$host$request_uri; } # managed by Certbot server_name portainer.server3.com; listen [::]:80; listen 80; return 404; # managed by Certbot }
Sampai disini proses konfigurasi ssl pada domain portainer kita sudah selesai, sebelum menerapkan perubahan pastikan konfigurasi nginx kita tidak ada error ke jika aman, silahkan restart nginx.
$ sudo nginx -t
$ sudo systemctl restart nginx
Silahkan coba mengkases portainer menggunakan web browser melalui domain yang sudah kita konfigurasi tadi, dan lihat apakah koneksi kita sudah berhasil menggunakan https.