1 votes

Nginx : bloquer les requêtes vers les URLs externes

J'utilise deux serveurs d'hébergement web avec Directadmin. J'utilise Apache comme serveur web principal avec Nginx qui fonctionne comme un proxy en face de lui.

Afin de garder Nginx "invisible" pour Directadmin, j'exécute Nginx sur le port 81 et je fais suivre toutes les connexions arrivant du port 80 au port 81, puis je laisse Nginx fonctionner comme un proxy (j'ai basé ma configuration sur ce poste ). Cela fonctionne parfaitement depuis plus d'un an.

Le fait est qu'hier, nous avons commencé à remarquer une attaque sur quelques-uns de nos serveurs. Nous recevons des requêtes comme celle-ci (extraites du mod_status d'Apache) :

11-2    29087   0/17/17 W   1.88    19  0   0.0 0.07    0.07    31.7.58.56  www.somedomain.com  GET http://124.108.121.178/?.src=pop&.intl=e1&.help=1&.v=0&.u=c
12-2    29105   0/5/5   W   0.02    42  0   0.0 0.06    0.06    95.79.20.72 www.somedomain.com  GET http://chek.zennolab.com/proxy.php HTTP/1.1
13-2    29111   0/14/14 W   0.29    26  0   0.0 0.07    0.07    87.227.9.151    www.somedomain.com  POST http://arhack.net/vb/index.php HTTP/1.1
14-2    29113   0/5/5   W   0.80    35  0   0.0 0.00    0.00    94.153.69.101   www.somedomain.com  GET http://72.14.203.105/search?as_q=%22/yybbs53a/yybbs.cgi%22+
15-2    29117   0/12/12 W   1.16    19  0   0.0 0.06    0.06    27.159.254.158  www.somedomain.com  GET http://search.sky.com/web?term=chiropractic+seattle+%22Rece
16-2    29118   0/5/5   W   0.61    36  0   0.0 0.30    0.30    31.7.58.56  www.somedomain.com  GET http://217.146.187.123/?.src=pop&.intl=e1&.help=1&.v=0&.u=c
17-2    29119   0/3/3   W   0.71    38  0   0.0 3.95    3.95    203.116.85.147  www.somedomain.com  GET http://119.160.247.158/?.src=pop&.intl=e1&.help=1&.v=0&.u=c
18-2    29120   0/4/4   W   0.52    36  0   0.0 0.06    0.06    176.9.25.25 www.somedomain.com  GET http://www.bing.com/search?q=link%3Arapidvisa.com&setplang=
19-2    29132   0/12/12 W   1.75    25  0   0.0 0.08    0.08    176.31.122.7    www.somedomain.com  GET http://www.baidu.com/%22>Inicio</a>+|+<a+href=%22/webmail%2
20-2    29142   0/11/11 W   1.48    20  0   0.0 0.58    0.58    87.245.203.22   www.somedomain.com  GET http://www.baidu.com/ HTTP/1.1

Le problème est que si je laisse les demandes atteindre Apache, la moyenne de charge commence à augmenter. Si je suspends le domaine (ce qui fait qu'Apache ne renvoie qu'une page d'erreur, sans grand traitement), la situation s'améliore nettement. Ce que j'aimerais faire, c'est que Nginx refuse ce genre de requêtes afin qu'elles n'atteignent même pas Apache.

Comment dois-je m'y prendre ?

J'ai essayé d'ajouter ceci mais cela n'a pas fonctionné (peut-être que la regexp est fausse).

location ~* ^http.* {
            deny all;
        }

Voici mon nginx.conf ( X.X.X.X est l'IP publique de mon serveur) :

user  apache;
worker_processes  4;

events {
    worker_connections  4096;
}

http {

    include       mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  /var/log/nginx/access.log  main;

    ## Size Limits
    client_body_buffer_size     128K;
    client_header_buffer_size   128K;
    client_max_body_size          1M;
    large_client_header_buffers 1 1k;

    ## Timeouts
    client_body_timeout   60;
    client_header_timeout 60;
    keepalive_timeout     60 60;
    send_timeout          60;

    ## General Options
    ignore_invalid_headers   on;
    keepalive_requests      100;
    limit_zone gulag $binary_remote_addr 5m;
    limit_rate              512k;
    recursive_error_pages    on;
    sendfile                 on;
    server_name_in_redirect off;
    server_tokens           off;

    ## TCP options
    tcp_nodelay on;
    tcp_nopush  on;

    ## Compression
    gzip              on;
    gzip_buffers      16 8k;
    gzip_comp_level   6;
    gzip_http_version 1.0;
    gzip_min_length   0;
    gzip_types        text/plain text/css image/x-icon application/x-perl application/x-httpd-cgi;
    gzip_vary         on;

    server_names_hash_bucket_size 64;
    reset_timedout_connection on;

        server {
        listen       0.0.0.0:81;
        server_name  myserver.fqdn.com _;

        charset off;

        access_log off;

        limit_conn  gulag 20;

        # Main reverse proxy for most requests
        location / {
                    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              http://X.X.X.X;    # apache here

                    client_max_body_size       16m;
                    client_body_buffer_size    128k;

                    proxy_buffering     on;  

                    proxy_connect_timeout      90;
                    proxy_send_timeout         90;
                    proxy_read_timeout         120;
                    proxy_buffer_size          8k;
                    proxy_buffers              32 32k;
                    proxy_busy_buffers_size    64k;
                    proxy_temp_file_write_size 64k;

                    error_page              502 503 /50x.html;
        }

        location /nginx_status {
            stub_status on;
            access_log   off;
            allow 127.0.0.1;
            deny all;
        }

        location ~* ^http.* {
                deny all;
        }        

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /var/www/html;
    }

}

4voto

kolbyjack Points 7644

Il n'y a aucun moyen de faire correspondre ces demandes avec un emplacement, puisque ce style d'uri de demande sera traité par nginx pour supprimer la partie scheme://host.

if ($request ~* https?://) { return 444; }

Dans le serveur correspondra à toutes les lignes de demande qui contiennent http:// ou https://. 444 est un code spécial pour nginx, il interrompra la connexion sans envoyer de réponse. Vous pouvez le remplacer par un retour 403 si vous préférez.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X