Nginx adalah server web open source, ringan, berkinerja tinggi dengan pertumbuhan tercepat di seluruh dunia. Nginx berjalan di sistem operasi Linux, Windows, Mac OS, dan Solaris. NGINX terus meningkat popularitasnya, sehingga semakin banyak penerapan NGINX yang perlu diamankan.
Dalam tutorial ini, kami akan menjelaskan beberapa tip dan trik keamanan server Nginx yang populer.
Persyaratan
- Server yang menjalankan Ubuntu 18.04 atau Debian 9.
- Kata sandi root disiapkan di server Anda.
Instal Nginx
Pertama, Anda perlu menginstal Nginx ke sistem Anda. Anda dapat menginstalnya dengan menjalankan perintah berikut:
apt-get install nginx -y
Setelah Nginx terinstal, Anda dapat memeriksa status Nginx dengan perintah berikut:
systemctl status nginx
Anda akan melihat output berikut:
? nginx.service - A high performance web server and a reverse proxy server Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled) Active: active (running) since Sun 2019-03-10 02:43:14 UTC; 4min 40s ago Docs: man:nginx(8) Process: 2271 ExecStop=/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid (code=exited, status=0/SUCCESS) Process: 2281 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS) Process: 2274 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS) Main PID: 2285 (nginx) Tasks: 2 (limit: 1111) CGroup: /system.slice/nginx.service ??2285 nginx: master process /usr/sbin/nginx -g daemon on; master_process on; ??2290 nginx: worker process Mar 10 02:43:14 ubuntu1804 systemd[1]: Starting A high performance web server and a reverse proxy server... Mar 10 02:43:14 ubuntu1804 systemd[1]: nginx.service: Failed to parse PID from file /run/nginx.pid: Invalid argument Mar 10 02:43:14 ubuntu1804 systemd[1]: Started A high performance web server and a reverse proxy server.
Perbarui Nginx
Anda perlu memperbarui server web Nginx Anda karena ada banyak peningkatan kinerja, fitur baru, dan perbaikan keamanan sedang ditambahkan. Sebagian besar distribusi Linux modern tidak akan hadir dengan versi terbaru nginx ke dalam daftar paket default mereka. Jadi, Anda perlu memutakhirkan nginx versi terbaru melalui pengelola paket. Anda dapat memperbarui server web Nginx Anda dengan perintah berikut:
apt-get update -y
apt-get install nginx --reinstall -y
Mencegah Keterbukaan Informasi
Pertama, Anda perlu mencegah Nginx untuk mengungkapkan informasi versi mereka.
Secara default, Nginx menampilkan nama dan versinya di header HTTP.
Anda dapat memeriksanya dengan perintah berikut:
curl -I http://localhost
Anda akan melihat output berikut:
HTTP/1.1 200 OK Server: nginx/1.14.0 (Ubuntu) Date: Sat, 09 Mar 2019 15:28:01 GMT Content-Type: text/html Content-Length: 10918 Last-Modified: Fri, 01 Feb 2019 16:05:17 GMT Connection: keep-alive ETag: "5c546e3d-2aa6" Accept-Ranges: bytes
Pada output di atas, Anda akan melihat Nginx dan versi sistem operasinya.
Anda dapat menyembunyikan informasi ini dengan mengedit file /etc/nginx/nginx.conf:
nano /etc/nginx/nginx.conf
Tambahkan server_tokens off line di dalam bagian konfigurasi http:
http { ## # Basic Settings ## server_tokens off;
Simpan dan tutup file, ketika Anda selesai. Kemudian, restart server web Nginx untuk menerapkan perubahan:
systemctl restart nginx
Sekarang, jalankan kembali perintah curl:
curl -I http://localhost
Anda akan melihat output berikut:
HTTP/1.1 200 OK Server: nginx Date: Sat, 09 Mar 2019 15:33:31 GMT Content-Type: text/html Content-Length: 10918 Last-Modified: Fri, 01 Feb 2019 16:05:17 GMT Connection: keep-alive ETag: "5c546e3d-2aa6" Accept-Ranges: bytes
Batasi IP dari Akses
Nginx hadir dengan modul sederhana yang disebut ngx_http_access_module untuk mengizinkan atau menolak alamat IP tertentu.
Jika Anda ingin mengizinkan formulir Nginx 172.16.0.0/16 dan menolak dari subnet lain. Kemudian, buka file /etc/nginx/sites-enabled/default:
nano /etc/nginx/sites-enabled/default
Buat perubahan berikut di dalam blok server:
server { listen 80 default_server; listen [::]:80 default_server; allow 172.16.0.0/16; deny all;
Simpan dan tutup file, ketika Anda selesai. Kemudian, mulai ulang Nginx untuk menerapkan perubahan ini:
systemctl restart nginx
Sekarang, coba akses server Nginx Anda dari rentang alamat IP lain seperti 192.168.0.102.
Selanjutnya, periksa log Nginx dengan perintah berikut:
tail -f /var/log/nginx/error.log
Anda harus mendapatkan akses terlarang di output berikut:
2019/03/09 16:13:01 [error] 11589#11589: *1 access forbidden by rule, client: 192.168.0.102, server: _, request: "GET /test/ HTTP/1.1", host: "172.16.0.122"
Amankan Nginx dengan TLS
TLS (Transport Layer Security) adalah penerus SSL (Secure Socket Layer). Ini memberikan HTTPS yang lebih kuat dan lebih efisien dan berisi lebih banyak perangkat tambahan seperti Forward Secrecy, kompatibilitas dengan suite cipher OpenSSL modern, dan HSTS. Tutorial ini menunjukkan cara mengaktifkan Sertifikat SSL yang ditandatangani sendiri di Nginx. Jika Anda ingin menggunakan sertifikat Let's Encrypt, lihat di sini: https://www.howtoforge.com/tutorial/nginx-with-letsencrypt-ciphersuite/
Pertama, buat direktori untuk SSL dengan perintah berikut:
mkdir /etc/nginx/ssl/
Selanjutnya, buat kunci dan sertifikat dengan perintah berikut:
cd /etc/nginx/ssl/
Pertama, buat kunci dengan perintah berikut:
openssl genrsa -aes256 -out nginx.key 1024
Anda akan melihat output berikut:
Generating RSA private key, 1024 bit long modulus ...++++++ .............................++++++ e is 65537 (0x010001) Enter pass phrase for nginx.key: Verifying - Enter pass phrase for nginx.key:
Selanjutnya, generate csr dengan perintah berikut:
openssl req -new -key nginx.key -out nginx.csr
Berikan semua informasi seperti yang ditunjukkan di bawah ini:
Generating RSA private key, 1024 bit long modulus ...++++++ .............................++++++ e is 65537 (0x010001) Enter pass phrase for nginx.key: Verifying - Enter pass phrase for nginx.key: [email protected]:~# openssl req -new -key nginx.key -out nginx.csr Enter pass phrase for nginx.key: You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:IN State or Province Name (full name) [Some-State]:Gujarat Locality Name (eg, city) []:Junagadh Organization Name (eg, company) [Internet Widgits Pty Ltd]:IT Organizational Unit Name (eg, section) []:IT Common Name (e.g. server FQDN or YOUR name) []:HITESH Email Address []:[email protected] Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []:admin An optional company name []:IT
Selanjutnya, tanda tangani sertifikat dengan perintah berikut:
openssl x509 -req -days 365 -in nginx.csr -signkey nginx.key -out nginx.crt
Anda akan melihat output berikut:
Signature ok subject=C = IN, ST = Gujarat, L = Junagadh, O = IT, OU = IT, CN = HITESH, emailAddress = [email protected] Getting Private key Enter pass phrase for nginx.key:
Selanjutnya, buka file virtual host default Nginx dan tentukan sertifikatnya:
nano /etc/nginx/sites-enabled/default
Lakukan perubahan berikut:
server { listen 192.168.0.100:443 ssl; root /var/www/html; index index.html index.htm index.nginx-debian.html; server_name _; ssl_certificate /etc/nginx/ssl/nginx.crt; ssl_certificate_key /etc/nginx/ssl/nginx.key; ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
Simpan dan tutup file, ketika Anda selesai. Kemudian, restart server Nginx untuk menerapkan perubahan ini:
systemctl restart nginx
Lindungi Direktori dengan Sandi
Saat menyiapkan server web Nginx, Anda juga dapat melindungi direktori tertentu dengan kata sandi. Anda dapat melakukannya menggunakan file .htpasswd.
Untuk melakukannya, buat file passwd dan tambahkan pengguna ke dalamnya dengan perintah berikut:
mkdir /etc/nginx/.htpasswd
htpasswd -c /etc/nginx/.htpasswd/passwd admin
Anda akan melihat output berikut:
New password: Re-type new password: Adding password for user admin
Selanjutnya, buat direktori pengujian di dalam root web Nginx dengan perintah berikut:
mkdir /var/www/html/test
Selanjutnya, berikan kepemilikan kepada pengguna www-data dengan perintah berikut:
chown -R www-data:www-data /var/www/html/test
Selanjutnya, buka file virtual host default Nginx dengan perintah berikut:
nano /etc/nginx/sites-enabled/default
Selanjutnya, lindungi direktori pengujian seperti yang ditunjukkan di bawah ini:
location /test { auth_basic "Restricted"; auth_basic_user_file /etc/nginx/.htpasswd/passwd;
Simpan dan tutup file, ketika Anda selesai. Kemudian, mulai ulang layanan Nginx untuk menerapkan perubahan ini:
systemctl restart nginx
Selanjutnya, buka browser web Anda dan ketik URL http://your-server-ip/test. Anda akan diminta untuk memasukkan nama pengguna dan kata sandi untuk mengakses direktori pengujian seperti yang ditunjukkan pada halaman berikut:
Selamat! Anda telah berhasil mengamankan server Nginx Anda di server Ubuntu 18.04. Saya harap ini akan membantu Anda untuk melindungi aplikasi Anda yang dihosting di server web Nginx. Jangan ragu untuk bertanya kepada saya jika Anda memiliki pertanyaan. Untuk informasi lebih lanjut, Anda dapat merujuk ke dokumen keamanan Nginx.