Nginx ile Layer7 Saldırılara Karşı Koyma

Web sitelerin kabusu çağımızda artık ddos ve botnet türevli saldırılardır. Bu saldırılarda hergün yeni bir taktik geliştirilmektedir. Şuan En çaresiz bırakan sürümü Layer 7 Türevli saldırılardır. Genel Olarak , Layer 7 Tamamen sunucu donanımını kullanan ve zararlı olarak görülemeyen bir saldırı türü olduğu için verdiği hasarda , zarar da diğer türevlerden çok daha farklıdır. Çoğu Firewall Donanımı yada yazılımı bu saldırıları algılayamazken , NGİNX bu saldırıların paketlerini süzerek web siteye sadece organik hitin geçmesini sağlar.

Örneğimizdeki saldırı Layer 7 Türevli ve aktif olarak sunucuyu yormakta olan bir saldırıdır.

Bu saldırı genelde , Apache’yi şişirip Mysql ‘ u yorarak sunucuyu down etmektedir. Ayrıca sunucu down olsa bile paketlerin kesilmemesi , sunucunun çalışma prensibini tamamen alt üst etmekte.

NEDEN NGİNX ?
Nginx Yapı itibari ile Apache LiteSpeed Ve CloudLinux Birleşimini tek başına alt etmesi ve fazla ağır yük olmaması açısında , performans ve geliştirilebilir arayüzü ile güvenlik konusundada vazgeçilmez olmasından dolayı tercih edilir.

CloudFlare Altyapısında bile nginx arayüzlerine rastladığımız şu günlerde , bilinen boyutu ile 340 GBits Saldırıya karşı koyabileceğini gösteren Nginx , Saldırı boyutu konusunda sınırlara takılmaksızın sadece işlevleriyle tüm türevleri püskürtebilir hale gelmiştir.

4 GB Ram 4 CPU Sunucu İçin NGİNX.conf dosyası Ekte Verilmiştir. Kendinize göre düzenleyebilir ve aktif edebilirsiniz.

# Server globals
user                    nginx;
worker_processes        4;
error_log               /var/log/nginx/error.log;
pid                     /var/run/nginx.pid;


worker_rlimit_nofile 50000;
# Worker config
events {
        worker_connections  1024;
        use                 epoll;
}






http {
    # Main settings
    
        sendfile                        on;
    tcp_nopush                      on;
    tcp_nodelay                     on;
    client_header_timeout           5s;
    client_body_timeout             5s;
    client_header_buffer_size       256k;
    client_body_buffer_size         128k;
    client_max_body_size            100m;
    large_client_header_buffers     4  256k;
    send_timeout                    2;
    keepalive_timeout              65;
    reset_timedout_connection       on;
    server_tokens                   off;
    server_name_in_redirect         off;
    server_names_hash_max_size      512;
    server_names_hash_bucket_size   512;




    # Log format
    log_format  main    '$remote_addr - $remote_user [$time_local] $request '
                        '"$status" $body_bytes_sent "$http_referer" '
                        '"$http_user_agent" "$http_x_forwarded_for"';
    log_format  bytes   '$body_bytes_sent';
    #access_log          /var/log/nginx/access.log  main;
    access_log off;




    # Mime settings
    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;
    


    # Compression
    gzip                on;
    gzip_comp_level     9;
    gzip_min_length     10240;
    gzip_buffers        8 64k;
    gzip_types         text/css application/x-javascript text/richtext image/svg+xml text/plain text/xsd text/xsl text/xml image/x-icon;
    gzip_proxied       expired no-cache no-store private auth;
    
    




    # Proxy settings
    proxy_redirect      off;
    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_pass_header   Set-Cookie;
    proxy_connect_timeout   90;
    proxy_send_timeout  90;
    proxy_read_timeout  90;
    proxy_buffers       32 4k;




    # Cloudflare https://www.cloudflare.com/ips
    set_real_ip_from   199.27.128.0/21;
    set_real_ip_from   173.245.48.0/20;
    set_real_ip_from   103.21.244.0/22;
    set_real_ip_from   103.22.200.0/22;
    set_real_ip_from   103.31.4.0/22;
    set_real_ip_from   141.101.64.0/18;
    set_real_ip_from   108.162.192.0/18;
    set_real_ip_from   190.93.240.0/20;
    set_real_ip_from   188.114.96.0/20;  
    set_real_ip_from   197.234.240.0/22;
    set_real_ip_from   198.41.128.0/17;
    set_real_ip_from   162.158.0.0/15;
    set_real_ip_from   104.16.0.0/12;
    set_real_ip_from   172.64.0.0/13;
    #set_real_ip_from   2400:cb00::/32;
    #set_real_ip_from   2606:4700::/32;
    #set_real_ip_from   2803:f800::/32;
    #set_real_ip_from   2405:b500::/32;
    #set_real_ip_from   2405:8100::/32;
    real_ip_header     CF-Connecting-IP;




    # SSL PCI Compliance
    ssl_session_cache   shared:SSL:10m;
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers        "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";


     limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;
  limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=5r/s;


  server {




    limit_conn conn_limit_per_ip 10;
    limit_req zone=req_limit_per_ip burst=10 nodelay;
      }


    # Error pages
    error_page          403          /error/403.html;
    error_page          404          /error/404.html;
    error_page          502 503 504  /error/50x.html;


server {
  if ($request_method !~ ^(GET|HEAD|POST)$ ) {
    return 444;
  }
  }
    limit_conn_zone $binary_remote_addr zone=addr:10m;


server {
    
    location /tr/ {
        limit_conn addr 10;
       
    }
}
limit_req_zone $binary_remote_addr zone=one:10m rate=30r/m;




server {
   
    location /index.html {
        limit_req zone=one;
  
    }
}




    
    server {
        server_name localhost;
    }
    # Cache
    proxy_cache_path /var/cache/nginx levels=2 keys_zone=cache:10m inactive=60m max_size=512m;
    proxy_temp_path  /var/cache/nginx/temp;
    proxy_cache_key "$host$request_uri $cookie_user";
    proxy_ignore_headers Expires Cache-Control;
    proxy_cache_use_stale error timeout invalid_header http_502;
    proxy_cache_valid any 3d;


    map $http_cookie $no_cache {
        default 0;
        ~SESS 1;
        ~wordpress_logged_in 1;
    }


 
    # Wildcard include
    include             /etc/nginx/conf.d/*.conf;
}

Orjinal Yazı: Kani Başpınar tarafından yazılmıştır.

Leave a reply:

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Site Footer

Sliding Sidebar

Hakkımda

Hakkımda

Deli dolu, hafif çatlak yay burcu insanı. Teknoloji düşkünü, hayalperest bir insan.

Tweets

Facebook Page