Nginx — ограничение доступа
Aug 18, 2016 20:50 · 389 words · 2 minute read
Ни в коем случае не стоит пренебрегать дополнительной настройкой 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;
}
...