Nginx

Nginx - Background

Nginx merupakan sebuah perangkat lunak server yang sangat terkenal dalam dunia komputasi server. Diciptakan pertama kali oleh Igor Sysoev pada tahun 2004, Nginx awalnya dikembangkan untuk mengatasi masalah skala besar dalam penanganan koneksi bersamaan yang tinggi pada server web tradisional seperti Apache. Nama "Nginx" sendiri merupakan singkatan dari "Engine-X", yang mencerminkan fokusnya pada performa dan kecepatan.

Sejak diluncurkan, Nginx telah mengalami pertumbuhan yang pesat dan mendapatkan reputasi sebagai salah satu server web terkemuka di dunia. Hal ini terutama disebabkan oleh beberapa keunggulan teknisnya:

  1. Performa Tinggi : Nginx didesain untuk menjadi ringan dan efisien dalam penggunaan sumber daya, sehingga mampu menangani banyak koneksi secara simultan dengan baik tanpa mengorbankan kecepatan.
  2. Skalabilitas : Kemampuannya dalam menangani beban lalu lintas yang tinggi membuatnya sangat cocok untuk aplikasi dan situs web yang memerlukan skalabilitas horizontal.

  3. Proxying dan Load Balancing : Nginx tidak hanya berfungsi sebagai server web, tetapi juga dapat berperan sebagai reverse proxy dan load balancer. Ini memungkinkan Nginx untuk mendistribusikan lalu lintas web ke beberapa server backend, meningkatkan efisiensi dan keandalan aplikasi.

  4. Caching : Nginx memiliki fitur caching yang kuat, memungkinkan penyimpanan sementara konten statis seperti gambar, CSS, dan JavaScript. Hal ini tidak hanya mempercepat waktu respon, tetapi juga mengurangi beban pada server backend.

  5. Konfigurasi yang Fleksibel : Konfigurasi Nginx menggunakan file teks yang mudah dimengerti, memungkinkan administrator sistem untuk menyesuaikan pengaturan server sesuai kebutuhan spesifik aplikasi atau lingkungan operasional.

Nginx telah menjadi pilihan utama untuk banyak organisasi besar dan start-up teknologi karena kombinasi fitur-fitur canggihnya, performa yang dapat diandalkan, serta kemudahan dalam konfigurasi dan skalabilitasnya. Dengan komunitas pengguna yang besar dan aktif, Nginx terus mengalami perkembangan dan pembaruan, menjaga posisinya sebagai salah satu solusi terbaik dalam infrastruktur web modern.

Nginx - Install Nginx Ubuntu

Perbarui Indeks Repository

apt update && apt upgrade -y

Syarat Instalasi

sudo apt install curl gnupg2 ca-certificates lsb-release ubuntu-keyring -y

Import official nginx signing key

curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
    | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

Verifikasi Key

gpg --dry-run --quiet --no-keyring --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg

Output Fingerprint yang dihasilkan

pub   rsa2048 2011-08-19 [SC] [expires: 2024-06-14]
      573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62
uid                      nginx signing key <signing-key@nginx.com>

Note : Jika output fingerprint yang dihasilkan berbeda, hapus file tersebut

Untuk instalasi paket Nginx yang stabil ( Stable ), Jalankan perintah dibawah ini 

echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
    | sudo tee /etc/apt/sources.list.d/nginx.list

Jika ingin menggunakan paket Nginx Mainline, Jalankan perintah dibawah ini

echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/mainline/ubuntu `lsb_release -cs` nginx" \
    | sudo tee /etc/apt/sources.list.d/nginx.list

Jalankan juga perintah dibawah ini

echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" \
    | sudo tee /etc/apt/preferences.d/99nginx

Untuk instalasi nginx jalankan perintah dibawah ini

sudo apt update
sudo apt install nginx

Cek versi Nginx menggunakan perintah dibawah ini

nginx -version

Nginx - Web Service

1. Buat file konfigurasi baru pada direktori conf.d :

sudo nano /etc/nginx/conf.d/kevin.conf

2. Tambahkan konfigurasi dasar pada file tersebut :

server {
    listen 80;
    server_name kevin.com;
    root /var/www/kevin;
    index index.html;
}

3. Konfigurasi di atas membuat Nginx untuk :

Optional :

4. Tambahkan direktif tambahan pada server block untuk meningkatkan performa atau fitur tambahan:

server_tokens off;
access_log /var/log/nginx/kevin_access.log;
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
location /static/ {
    expires 7d;
    add_header Cache-Control "public, max-age=604800, immutable";
}
location /api/ {
    proxy_pass http://localhost:8000/;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
}
sudo systemctl restart nginx

Konfigurasi di atas dapat diubah sesuai kebutuhan dan dapat digunakan sebagai dasar untuk mengatur server lain di direktori conf.d. Pastikan untuk melakukan testing setiap kali melakukan perubahan pada konfigurasi.

Nginx - Proxy Pass

Proxy pass di Nginx digunakan untuk mem-forward (meneruskan) permintaan (request) dari klien ke server backend, dan mengembalikan (return) respons dari server backend ke klien. Berikut adalah contoh penggunaan proxy pass di Nginx :

server {
    listen 80;
    server_name kevin.ilusidigital.com;

    location / {
        proxy_pass http://192.168.1.110:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

Penjelasan dari konfigurasi tersebut :

Setelah Anda mengonfigurasi proxy pass di Nginx, pastikan untuk menguji koneksi ke server backend dengan menjalankan perintah berikut :

curl http://localhost

Jika server backend merespons dengan benar, maka konfigurasi proxy pass di Nginx sudah berhasil.

Nginx - Load Balancer

Berikut adalah langkah-langkah konfigurasi load balancer Nginx di file /etc/nginx/conf.d/loadbalancer.conf:

sudo nano /etc/nginx/conf.d/loadbalancer.conf
upstream backend {
    server 10.0.0.1:80;
    server 10.0.0.2:80;
}

server {
    listen 80;
    server_name kevin.ilusidigital.com;
    location / {
        proxy_pass http://backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
  1. Upstream yang terdiri dari 2 server pada alamat IP 10.0.0.1 dan 10.0.0.2 pada port 80
  2. Server yang mendengarkan pada port 80 dan server name kevin.cinema21.co.id
  3. Lokasi root di-proxy ke backend, disertai dengan pengaturan header proxy

Pastikan Anda mengganti kevin.ilusidigital.com dengan nama domain Anda dan mengganti backend dengan nama upstream Anda yang diinginkan. Setelah selesai, simpan dan keluar dari editor dengan menekan Ctrl+X, Y, dan Enter.

sudo nginx -t
sudo systemctl restart nginx

Load balancer Nginx sekarang sudah berjalan dan terhubung ke backend pada alamat IP yang telah didefinisikan. Anda dapat memeriksa dengan membuka browser dan mengunjungi nama domain atau alamat IP server Nginx.

Nginx - Amplify

Nginx Amplify
server {
    listen 127.0.0.1:8080;
    server_name localhost;
    location /nginx_status {
        stub_status on;
        access_log off;
        allow 127.0.0.1;
        deny all;
    }
}
curl -sS -L -O \
https://github.com/nginxinc/nginx-amplify-agent/raw/master/packages/install.sh && \
API_KEY='YOUR_API_KEY' sh ./install.sh

Note : YOUR_API_KEY adalah API KEY yang didapat dari akun Nginx Amplify

service amplify-agent start

image.png

Drnimage.png

Nginx - Anti DDos

http {
    # Aktifkan limit_req module untuk membatasi jumlah request dari satu alamat IP
    limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=5r/s;

    # Aktifkan limit_conn module untuk membatasi jumlah koneksi dari satu alamat IP
    limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;
}
server {
    listen 80;
    server_name kevin.ilusidigital.com;

    location / {
        # Batasi jumlah request dari satu alamat IP menjadi 10 request per detik
        limit_req zone=req_limit_per_ip burst=15 nodelay;

        # Konfigurasi lainnya...
    }
}
server {
    listen 80;
    server_name kevin.ilusidigital.com;

    location / {
        # Batasi jumlah koneksi dari satu alamat IP menjadi 10 koneksi
        limit_conn conn_limit_per_ip 10;

        # Konfigurasi lainnya...
    }
}
server {
    listen 80;
    server_name kevin.ilusidigital.com;

    location / {
        # Aktifkan proteksi dari serangan SYN flood
        limit_conn_zone $binary_remote_addr zone=syn_flood:10m;
        limit_conn syn_flood 10;

        # Konfigurasi lainnya...
    }
}
stream {
    # Aktifkan proteksi dari serangan UDP flood
    limit_conn_zone $binary_remote_addr zone=udp_flood:10m;
    limit_conn udp_flood 10;

    # Konfigurasi lainnya...
}
server {
    listen 80;
    server_name kevin.ilusidigital.com;

    location / {
        # Aktifkan proteksi dari serangan HTTP flood
        limit_req_zone $binary_remote_addr zone=http_flood:10m rate=100r/s;
        limit_req zone=http_flood burst=200 nodelay;

        # Konfigurasi lainnya...
    }
}

Dengan konfigurasi ini, Anda dapat membatasi jumlah request, koneksi, dan mengaktifkan proteksi dari serangan DDoS di server Nginx Anda. Namun, perlu diingat bahwa konfigurasi ini hanya sebagai contoh dan dapat disesuaikan dengan kebutuhan Anda.

Nginx - WAF

sudo apt-get update
sudo apt-get install nginx -y
sudo apt-get install libnginx-mod-security -y
sudo apt-get intall git -y
sudo sed -i 's/# include \/etc\/nginx\/modules-enabled\/\*\.conf;/include \/etc\/nginx\/modules-enabled\/\*\.conf;/' /etc/nginx/nginx.conf
sudo mv /etc/nginx/mods-available/mod-security.conf /etc/nginx/mods-available/mod-security.conf.orig
sudo cp /usr/share/modsecurity-crs/modsecurity.conf-recommended /etc/nginx/mods-available/mod-security.conf
sudo mv /etc/nginx/mods-available/modsecurity.conf /etc/nginx/mods-available/modsecurity.conf.orig
sudo sed -i 's/SecRuleEngine DetectionOnly/SecRuleEngine On/' /etc/nginx/mods-available/modsecurity.conf
sudo sed -i 's/SecResponseBodyAccess On/SecResponseBodyAccess Off/' /etc/nginx/mods-available/modsecurity.conf
sudo git clone https://github.com/SpiderLabs/owasp-modsecurity-crs.git /usr/share/modsecurity-crs
sudo cp /usr/share/modsecurity-crs/crs-setup.conf.example /usr/share/modsecurity-crs/crs-setup.conf
sudo mv /etc/nginx/mods-available/modsecurity-crs.conf /etc/nginx/mods-available/modsecurity-crs.conf.orig
sudo cp /usr/share/modsecurity-crs/rules/*.conf /etc/nginx/mods-available/
sudo cp /usr/share/modsecurity-crs/rules/*.data /etc/nginx/mods-available/
sudo cp /usr/share/modsecurity-crs/rules/*.txt /etc/nginx/mods-available/
sudo cp /usr/share/modsecurity-crs/rules/*.sls /etc/nginx/mods-available/
sudo sed -i 's/Include \/etc\/nginx\/modsecurity.conf/Include \/etc\/nginx\/mods-available\/modsecurity.conf/' /etc/nginx/mods-available/modsecurity-crs.conf
sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.orig
server {
    listen 80;
    listen [::]:80;
    server_name example.com;

    location / {
        proxy_pass http://localhost:8000;
        proxy_set_header Host \$host;
        proxy_set_header X-Real-IP \$remote_addr;
        proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;

        # ModSecurity settings
        modsecurity on;
        modsecurity_rules_file /etc/nginx/mods-available/modsecurity-crs.conf;
    }
}
sudo systemctl restart nginx

Nginx - All Prevention

Prevention secara singkat berarti pencegahan atau tindakan untuk menghindari suatu risiko atau ancaman sebelum terjadi.

Dalam konteks keamanan, prevention bertujuan untuk melindungi sistem dari serangan, eksploitasi, atau penyalahgunaan dengan menerapkan aturan atau mekanisme pengamanan

Berikut Konfigurasinya :

########################### XSS PREVENTION ##############################
        set $block_xss 0;
if ($query_string ~ "base64_(en|de)code\(.*\)") {
set $block_xss 1;
}
if ($request_uri ~ "base64_(en|de)code\(.*\)") {
        set $block_xss 1;
}
if ($query_string ~ "(<|%3C).*script.*(>|%3E)") {
        set $block_xss 1;
}
if ($request_uri ~ "(<|%3C).*script.*(>|%3E)") {
        set $block_xss 1;
}
if ($query_string ~ "(<|%3C).*iframe.*(>|%3E)") {
        set $block_xss 1;
}
if ($request_uri ~ "(<|%3C).*iframe.*(>|%3E)") {
        set $block_xss 1;
}
if ($query_string ~ "GLOBALS(=|\[|\%[0-9A-Z]{0,2})") {
        set $block_xss 1;
}
if ($query_string ~ "_REQUEST(=|\[|\%[0-9A-Z]{0,2})") {
        set $block_xss 1;
}
if ($block_xss = 1) {
        return 403;
}

## Block SQL injections
    set $block_sql_injections 0;
    if ($query_string ~ "union.*select.*\(") {
        set $block_sql_injections 1;
    }
    if ($query_string ~ "union.*all.*select.*") {
        set $block_sql_injections 1;
    }
    if ($query_string ~ "concat.*\(") {
        set $block_sql_injections 1;
    }
    if ($block_sql_injections = 1) {
        return 403;
    }

    ## Block file injections
    set $block_file_injections 0;
    if ($query_string ~ "[a-zA-Z0-9_]=http://") {
        set $block_file_injections 1;
    }
    if ($query_string ~ "[a-zA-Z0-9_]=(\.\.//?)+") {
        set $block_file_injections 1;
    }
    if ($query_string ~ "[a-zA-Z0-9_]=/([a-z0-9_.]//?)+") {
        set $block_file_injections 1;
    }
    if ($block_file_injections = 1) {
        return 403;
    }

    ## Block common exploits
    set $block_common_exploits 0;
    if ($query_string ~ "(<|%3C).*script.*(>|%3E)") {
        set $block_common_exploits 1;
    }
    if ($query_string ~ "GLOBALS(=|\[|\%[0-9A-Z]{0,2})") {
        set $block_common_exploits 1;
    }
    if ($query_string ~ "_REQUEST(=|\[|\%[0-9A-Z]{0,2})") {
        set $block_common_exploits 1;
    }
    if ($query_string ~ "proc/self/environ") {
        set $block_common_exploits 1;
    }
    if ($query_string ~ "mosConfig_[a-zA-Z_]{1,21}(=|\%3D)") {
        set $block_common_exploits 1;
    }
    if ($query_string ~ "base64_(en|de)code\(.*\)") {
        set $block_common_exploits 1;
    }
    if ($block_common_exploits = 1) {
        return 403;
    }

    ## Block spam
    set $block_spam 0;
    if ($query_string ~ "\b(ultram|unicauca|valium|viagra|vicodin|xanax|ypxaieo)\b") {
        set $block_spam 1;
    }
    if ($query_string ~ "\b(erections|hoodia|huronriveracres|impotence|levitra|libido)\b") {
        set $block_spam 1;
    }
    if ($query_string ~ "\b(ambien|blue\spill|cialis|cocaine|ejaculation|erectile)\b") {
        set $block_spam 1;
    }
    if ($query_string ~ "\b(lipitor|phentermin|pro[sz]ac|sandyauer|tramadol|troyhamby)\b") {
        set $block_spam 1;
    }
    if ($block_spam = 1) {
        return 403;
    }

    ## Block user agents
    #SET $BLOCK_USER_AGENTS 0;

    # Don't disable wget if you need it to run cron jobs!
    #if ($http_user_agent ~ "Wget") {
    #    set $block_user_agents 1;
    #}

    # Disable Akeeba Remote Control 2.5 and earlier
    if ($http_user_agent ~ "Indy Library") {
        set $block_user_agents 1;
    }

    # Common bandwidth hoggers and hacking tools.
    if ($http_user_agent ~ "libwww-perl") {
        set $block_user_agents 1;
    }
    if ($http_user_agent ~ "GetRight") {
        set $block_user_agents 1;
    }
    if ($http_user_agent ~ "GetWeb!") {
        set $block_user_agents 1;
    }
    if ($http_user_agent ~ "Go!Zilla") {
        set $block_user_agents 1;
    }
    if ($http_user_agent ~ "Download Demon") {
        set $block_user_agents 1;
    }
    if ($http_user_agent ~ "Go-Ahead-Got-It") {
        set $block_user_agents 1;
    }
    if ($http_user_agent ~ "TurnitinBot") {
        set $block_user_agents 1;
    }
    if ($http_user_agent ~ "GrabNet") {
        set $block_user_agents 1;
    }

    if ($block_user_agents = 1) {
        return 403;
    }

Nginx - XSS Prevention

XSS (Cross-Site Scripting) Prevention adalah langkah-langkah untuk mencegah serangan di mana penyerang menyisipkan skrip berbahaya ke dalam halaman web yang kemudian dieksekusi di browser pengguna.

Berikut Konfigurasinya : 

set $block_xss 0;

if ($query_string ~ "base64_(en|de)code\(.*\)") {
    set $block_xss 1;
}
if ($request_uri ~ "base64_(en|de)code\(.*\)") {
    set $block_xss 1;
}
if ($query_string ~ "(<|%3C).*script.*(>|%3E)") {
    set $block_xss 1;
}
if ($request_uri ~ "(<|%3C).*script.*(>|%3E)") {
    set $block_xss 1;
}
if ($query_string ~ "(<|%3C).*iframe.*(>|%3E)") {
    set $block_xss 1;
}
if ($request_uri ~ "(<|%3C).*iframe.*(>|%3E)") {
    set $block_xss 1;
}
if ($block_xss = 1) {
    return 403;
}

Nginx - SQL Injection Prevention

SQL Injection Prevention adalah langkah-langkah untuk mencegah serangan di mana penyerang menyisipkan SQL berbahaya ke dalam query database.

Berikut Konfigurasinya :

set $block_sql_injections 0;

if ($query_string ~ "union.*select.*\(") {
    set $block_sql_injections 1;
}
if ($query_string ~ "union.*all.*select.*") {
    set $block_sql_injections 1;
}
if ($query_string ~ "concat.*\(") {
    set $block_sql_injections 1;
}
if ($block_sql_injections = 1) {
    return 403;
}

Nginx - File Injection Prevention

File Injection Prevention adalah teknik keamanan yang digunakan untuk mencegah penyisipan file berbahaya ke dalam sistem melalui parameter URL atau input pengguna.

Berikut Konfigurasinya :

set $block_file_injections 0;

if ($query_string ~ "[a-zA-Z0-9_]=http://") {
    set $block_file_injections 1;
}
if ($query_string ~ "[a-zA-Z0-9_]=(\.\.//?)+") {
    set $block_file_injections 1;
}
if ($query_string ~ "[a-zA-Z0-9_]=/([a-z0-9_.]//?)+") {
    set $block_file_injections 1;
}
if ($block_file_injections = 1) {
    return 403;
}

Nginx - Common Exploits Prevention

Common Exploits Prevention adalah upaya untuk mencegah eksploitasi umum yang sering digunakan oleh peretas untuk menyerang sistem.

Berikut Konfigurasinya : 

set $block_common_exploits 0;

if ($query_string ~ "(<|%3C).*script.*(>|%3E)") {
    set $block_common_exploits 1;
}
if ($query_string ~ "GLOBALS(=|\[|\%[0-9A-Z]{0,2})") {
    set $block_common_exploits 1;
}
if ($query_string ~ "_REQUEST(=|\[|\%[0-9A-Z]{0,2})") {
    set $block_common_exploits 1;
}
if ($query_string ~ "proc/self/environ") {
    set $block_common_exploits 1;
}
if ($query_string ~ "mosConfig_[a-zA-Z_]{1,21}(=|\%3D)") {
    set $block_common_exploits 1;
}
if ($query_string ~ "base64_(en|de)code\(.*\)") {
    set $block_common_exploits 1;
}
if ($block_common_exploits = 1) {
    return 403;
}

Nginx - Spam Prevention

Spam Prevention adalah teknik untuk mencegah pengiriman pesan atau request berisi spam ke dalam sistem, seperti di formulir, komentar, atau URL.

Berikut Konfigurasinya : 

set $block_spam 0;

if ($query_string ~ "\b(ultram|unicauca|valium|viagra|vicodin|xanax|ypxaieo)\b") {
    set $block_spam 1;
}
if ($query_string ~ "\b(erections|hoodia|huronriveracres|impotence|levitra|libido)\b") {
    set $block_spam 1;
}
if ($query_string ~ "\b(ambien|blue\spill|cialis|cocaine|ejaculation|erectile)\b") {
    set $block_spam 1;
}
if ($query_string ~ "\b(lipitor|phentermin|pro[sz]ac|sandyauer|tramadol|troyhamby)\b") {
    set $block_spam 1;
}
if ($block_spam = 1) {
    return 403;
}

Nginx - User Agent Blocking

User Agent Blocking Prevention adalah teknik untuk memblokir akses dari user-agent yang mencurigakan seperti bot, scraper, atau alat otomatis yang sering digunakan untuk serangan dan pencurian data.

Berikut Konfigurasinya : 

set $block_user_agents 0;

if ($http_user_agent ~ "Indy Library") {
    set $block_user_agents 1;
}
if ($http_user_agent ~ "libwww-perl") {
    set $block_user_agents 1;
}
if ($http_user_agent ~ "GetRight") {
    set $block_user_agents 1;
}
if ($http_user_agent ~ "GetWeb!") {
    set $block_user_agents 1;
}
if ($http_user_agent ~ "Go!Zilla") {
    set $block_user_agents 1;
}
if ($http_user_agent ~ "Download Demon") {
    set $block_user_agents 1;
}
if ($http_user_agent ~ "Go-Ahead-Got-It") {
    set $block_user_agents 1;
}
if ($http_user_agent ~ "TurnitinBot") {
    set $block_user_agents 1;
}
if ($http_user_agent ~ "GrabNet") {
    set $block_user_agents 1;
}
if ($block_user_agents = 1) {
    return 403;
}