Nginx — ограничение доступа

Aug 18, 2016 20:50 · 389 words · 2 minute read nginx

Ни в коем случае не стоит пренебрегать дополнительной настройкой web-сервера, направленной на защиту от злоумышленников. Давайте разберемся с директивами, призванными обеспечить безопасность проекта!

Прежде всего стоит закрыть доступ к файлам, которые могут вызывать повышенный интерес:

...
        location ~ /.svn/ {
           deny all;
        }
...

Можно разрешить/запретить доступ к файлам лишь с определенных ip-адресов, используя директивы allow и deny:

...
  location /server-status {
      allow 104.45.18.178;
      allow 40.78.146.128;
      deny all;
  }
...

Также для разграничения доступа к файлам можно использовать директивы auth_basic и auth_basic_user_file — в этом случае пользователю необходимо будет ввести логин/пароль для доступа:

...
  location /admin/ {
      auth_basic "Enter password to access";
      auth_basic_user_file /etc/nginx/basic.auth;
  }
...

Прекрасным вариантом может быть комбинация двух вышеописанных способов:

...
  location /admin/ {
      satisfy any;
      allow 104.45.18.178;
      allow 40.78.146.128;
      deny  all;
 
      auth_basic "Enter password to access";
      auth_basic_user_file /etc/nginx/basic.auth;
  }
...

Защититься от запросов к несуществующим файлам на Nginx можно так:

...
        location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
           try_files $uri =404;
        }
...

Nginx позволяет использовать еще три вида ограничения доступа:

  • количество соединений (например, с определенного IP-адреса);
  • количество запросов за единицу времени;
  • скорость передачи ответа клиенту.

Вариант первый, ограничение количества соединений. Прежде всего, с помощью директивы limit_conn_zone в секции http следует определить ключ, имя и набор параметров зоны разделяемой памяти для хранения состояний значений ключа:

...
        limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;
...

Далее, с помощью директивы limit_conn в контексте location следует указать имя зоны разделяемой памяти и максимально допустимое количество соединений для одного значения ключа:

...
        location /download/ {
           limit_conn conn_limit_per_ip 5;
        }
...

Вариант второй, ограничение количества запросов за единицу времени. С помощью директивы limit_req_zone в секции http следует определить ключ, имя и набор параметров зоны разделяемой памяти для хранения состояний значений ключа:

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

После этого, используя директиву limit_req в контексте location следует указать имя зоны разделяемой памяти и максимальный размер всплеска запросов:

...
        location /download/ {
           limit_req zone=req_limit_per_ip burst=10;
        }
...

Вариант третий, ограничение скорости передачи ответа клиенту. Директивой limit_rate в секции location можно задать скорость передачи ответа клиенту (в байтах за секунду) на один запрос (это значит, что при использовании клиентом двух соединений скорость будет вдвое больше ограничения):

...
        location /download/ {
           limit_rate 50k;
        }
...

В последнем варианте также весьма полезным может оказаться использование директивы limit_rate_after, которая задает объем данных, после которого вступит в силу ограничение скорости передачи ответа клиенту:

...
        location /download/ {
           limit_rate_after 1m;
           limit_rate 50k;
        }
...
tweet Share