Beberapa waktu lalu, saya membuat server repo pribadi untuk sistem operasi berbasis Red Hat maupun Debian menggunakan Nginx sebagai web enginenya. Tujuannya adalah untuk memastikan server-server klien saya dapat melakukan download paket yang sudah saya custom. Setelah semua berjalan lancar, rekan saya menyarankan untuk membatasi akses ke repository tersebut sehingga tidak semua orang bisa mengaksesnya.
Saya ingin agar package-package di dalamnya hanya bisa di-download melalui server-server klien saya saja. Membatasi akses berdasarkan IP Address memang bisa, tapi tidak fleksibel. Jika klien saya berganti provider atau IP-nya berubah, maka saya harus selalu melakukan update rule di firewall, yang tentu saja merepotkan. Solusi terbaik adalah menggunakan autentikasi pakai username dan password. Nah hari ini saya sudah dapat caranya, ya sebenarnya caranya sama saja kalau kita mau mengaktifkan autentikasi di web server nginx kok.
Sebelum kita mulai, saya akan menunjukan file konfigurasi nginx untuk repo saya, supaya bisa terlihat apa saja yang nanti akan kita tambahkan:
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name repo.colamen.id;
root /var/repositories;
location / {
try_files $uri $uri/ =404;
}
location /rpm {
autoindex on;
auth_basic "Restricted Repository";
auth_basic_user_file /etc/nginx/.htpasswd;
}
location /apt {
autoindex on;
autoindex_exact_size off;
autoindex_format html;
autoindex_localtime on;
auth_basic "Restricted Repository";
auth_basic_user_file /etc/nginx/.htpasswd;
}
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
ssl_certificate /etc/letsencrypt/live/repo.colamen.id/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/repo.colamen.id/privkey.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m;
ssl_session_tickets off;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;
ssl_prefer_server_ciphers off;
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains" always;
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
add_header Referrer-Policy "no-referrer";
add_header X-Frame-Options "deny";
ssl_stapling off;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/letsencrypt/live/repo.colamen.id/fullchain.pem;
resolver 8.8.8.8;
}
Mengaktifkan Autentikasi Nginx (Server Repo)
Nginx memiliki kemampuan yang memungkinkan autentikasi menggunakan file yang berisi username & password. Pertama, saya membuat file password bernama .htpasswd dengan script htpasswd yang bisa di-install dengan perintah berikut:
# Jika menggunakan Red Hat dan sejenisnya dnf install httpd-tools # Jika menggunakan Debian dan sejenisnya apt install apache2-tools
Melakukan generate file username & password serta menambahkan user pertama dengan berikut:
# htpasswd -c -B /etc/nginx/.htpasswd raihan New password: Re-type new password:
Lalu untuk menambahkan user lain, bisa menggunakan perintah yang sama namun tanpa “-c”:
# htpasswd -B /etc/nginx/.htpasswd excellent New password: Re-type new password:
Catatan: Saat memasukan password, jika memungkinkan, hindari penggunaan ambigious character seperti $, @, &, ?, atau !. Karakter-karakter ini memiliki fungsi khusus dalam URL atau skrip shell, dan bisa dianggap sebagai sebuah command atau parameter. Pilih kombinasi huruf kecil, huruf kapital dan angka mempermudah proses input password di klien.
Namun, jika ada keharusan penggunaan karakter-karakter simbol tersebut, ada solusinya. Password tersebut harus di convert ke dalam bentuk URL encoded terlebih dahulu. Ini mengubah karakter ambigu menjadi kode heksadesimal yang aman. Kita bisa menggunakan online tools atau perintah python berikut:
raihan@Raihans-MacBook-Pro ~ % python3 -c "from urllib.parse import quote; print(quote('My?P@ssw0rd'))"
My%3FP%40ssw0rd
Setelah itu, edit file konfigurasi nginx untuk repository. Menambahkan dua baris kode di setiap blok location yang ada:
.....
location /rpm {
autoindex on;
auth_basic "Restricted Repository";
auth_basic_user_file /etc/nginx/.htpasswd;
}
location /apt {
autoindex on;
autoindex_exact_size off;
autoindex_format html;
autoindex_localtime on;
auth_basic "Restricted Repository";
auth_basic_user_file /etc/nginx/.htpasswd;
}
.....
Lakukan pengecekan konfigurasi nginx untuk memastikan tidak ada miskonfigurasi serta melakukan restart service dengan perintah berikut:
# nginx -t # systemctl restart nginx
Input Username & Password (Server Klien)
Setelah server nginx siap, proses selanjutnya adalah input username & password di server klien. Kita harus memberi tahu package manager seperti DNF di Red Hat dan APT di Debian untuk menggunakan kredensial yang sudah ditambahkan di server repo.
Sistem Operasi Red Hat
Edit file .repo yang berkaitan dengen server repo lalu menambahkan baris “username” dan “password”:
[raihan-excellent] name=Raihan Repository baseurl=https://repo.colamen.id/rpm gpgcheck=0 enabled=1 username=excellent password=password
Sistem Operasi Ubuntu
Buat & edit file baru pada direktori /etc/apt/auth.conf.d dengan ekstensi .conf dengan isi file sebagai berikut:
machine repo.colamen.id login excellent password password
Update List Upgradable Package
Jalankan perintah untuk update list package yang bisa dilakukan update:
# Jika menggunakan Red Hat dan sejenisnya dnf check-update # Jika menggunakan Debian dan sejenisnya apt update
Pastikan prosesnya normal dan tidak ada pesan error unauthorized.
Setelah semua dikonfigurasi, server klien akhirnya bisa mengakses repository menggunakan username password, lalu setiap akses tanpa username password yang valid akan ditolak requestnya. Dengan cara ini, kita bisa membatasi akses repository.