Saya gak perlu lagi menjelaskan secara detail apa itu
, silahkan baca di sini dan ini. Yang perlu saya informasikan bahwa situs-situs super sibuk seperti Netflix, box, hulu, wordpress, maxcdn, yandex dan dropbox semuanyanya menggunakan nginx. Cukup ya… klo mau tau informasi lain tetang nginx silahkan di Google aja.
Kali ini saya akan berbagi ilmu yang selama ini saya praktekkan yaitu bagaimana mengkonfigurasi nginx sebagai webserver yang aman. Tutorial ini saya coba terapkan menggunakan sistem operasi CentOS 6. Langsung aja!
- Install hanya module yg diperlukan saja. Contoh berikut ini saat menginstall dg tidak mengikutkan module auto index dan ssi
# ./configure --without-http_autoindex_module --without-http_ssi_module # make # make install
- Memastikan apakah nginx sudah terinstall dengan sukses silahkan gunakan command ini
/usr/local/nginx/sbin/nginx -t
jika sukses akan muncul seperti ini
the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok configuration file /usr/local/nginx/conf/nginx.conf test is successful
- Aktifkan SELinux
SELinux ini sangat berguna untuk mengamankan server dari serangan tetapi butuh konfigurasi yang tepat untuk dapat memanfaatkannya. Untuk CentOS defaultnya SELinux sudah aktif atau coba cek ulang menggunakansestatus
dan atau gunakan bantuan
getsebool –a
- Instal nginx SELinux Policy
# yum -y install selinux-policy-targeted selinux-policy-devel # wget http://softlayer-sng.dl.sourceforge.net/project/selinuxnginx/se-ngix_1_0_10.tar.gz # tar -zxvf se-ngix_1_0_10.tar.gz # cd se-ngix_1_0_10/nginx # make # /usr/sbin/semodule -i nginx.pp
- Sesuaikan konfigurasi /etc/sysctl.conf. Di bawah ini contoh untuk server yg super sibuk dan butuk kecepatan tinggi tp tetap aman
fs.file-max = 100000 vm.swappiness = 10 net.ipv4.ip_local_port_range = 10000 65000 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 net.core.rmem_default = 16777216 net.core.wmem_default = 16777216 net.core.optmem_max = 40960 net.ipv4.tcp_rmem = 4096 87380 16777216 net.ipv4.tcp_wmem = 4096 65536 16777216 net.core.netdev_max_backlog = 50000 net.ipv4.tcp_max_syn_backlog = 30000 net.ipv4.tcp_max_tw_buckets = 2000000 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_fin_timeout = 10 net.ipv4.tcp_slow_start_after_idle = 0 net.ipv4.udp_rmem_min = 8192 net.ipv4.udp_wmem_min = 8192 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.all.accept_source_route = 0 net.ipv4.conf.all.log_martians = 1
- Berkamuflase dengan merubah nginx header dengan mengedit file ngx_http_header_filter_module.c
# vi +48 src/http/ngx_http_header_filter_module.c
temukan baris berikut ini
static char ngx_http_server_string[] = "Server: nginx" CRLF; static char ngx_http_server_full_string[] = "Server: " NGINX_VER CRLF;
dan ganti dengan yg kamu suka misalnya menjadi
static char ngx_http_server_string[] = "Server: Laluvirtual.com - sesama jangan saling serang " CRLF; static char ngx_http_server_full_string[] = "Server: Laluvirtual.com - sesama jangan saling serang" NGINX_VER CRLF;
jangan lupa tambahkan baris
server_tokens off
pada nginx.conf
- Pasang firewall yang memblok semuanya dan hanya membuka yg diperlukan saja. Ini contoh hanya membuka port yang dibutuhkan oleh webserver dan email. Jika kamu bingung untuk merubahnya agar sesuai kebutuhan kamu silahkan sampaikan melalui pesan komentar OK:)
# firewall ini hanya untuk webserver dan email *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :RH-Firewall-1-INPUT - [0:0] -A INPUT -j RH-Firewall-1-INPUT -A FORWARD -j RH-Firewall-1-INPUT -A RH-Firewall-1-INPUT -i lo -j ACCEPT -A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT -A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # port untuk ssh dan snmp -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT -s 192.168.1.0/24 -A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 161 -j ACCEPT -s 192.168.1.0/24 # port untuk smtp, http, https, ssl, tls -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 25 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 110 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 143 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 389 -j ACCEPT -s 192.168.1.0/24 -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 465 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 993 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 995 -j ACCEPT # tolak semuanya -A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited COMMIT
- Konfigurasi nginx.conf dengan teliti, bila perlu tambahkan baris-baris berikut untuk menghidar dari serangan buffer overflow
client_body_buffer_size 1K; client_header_buffer_size 1k; client_max_body_size 1k; large_client_header_buffers 2 1k; client_body_timeout 10; client_header_timeout 10; keepalive_timeout 5 5; send_timeout 10;
jangan lupa untuk selalu memantaui file-file ini:
# /usr/local/nginx/logs/access_log # /usr/local/nginx/logs/access_log # /usr/local/nginx/logs/error_log
Selesai. saya yakin masih banyak yg kurang jika ada masukan dengan senang hati saya menerimanya:)