Cara Install + Konfigurasi Nginx yang Aman

cara-instalasi-webserver-dg-nginx

Saya gak perlu lagi menjelaskan secara detail apa itu

cara install nginx yang benar

, 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!

  1. 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
  2. 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
  1. 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 menggunakan

    sestatus

    dan atau gunakan bantuan

    getsebool –a
  2. 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
  1. 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
  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

  1. 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
  2. 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:)

 

BACA JUGA:  Linux SysAdmin Tool yg Sering (saya) Gunakan
close