TheAdminBay

Nginx ограничение доступа к сайту по IP или по паролю

nginx_secИногда возникает потребность запретить доступ к web сайту или к отдельной его директории по паролю или по ip адресу. В данной статье мы рассмотрим как это реализовать в случае если на сервере используется web сервер Nginx. У Nginx существует модули которые позволяют нам ограничить доступ к требуемой директории как с использованием пароля так и с использование запрета по ip адресу.

Запрет доступа по логину и паролю

Модуль ngx_http_auth_basic_module позволяет ограничить доступ к ресурсам с проверкой имени и пароля пользователя по протоколу “HTTP Basic Authentication”.

Для того чтобы воспользоваться возможностями данного модуля нам необходимо настроить следующие директивы auth_basic и auth_basic_user_file.

auth_basic — задает realm

auth_basic_user_file — задает расположение файла с именами и паролями пользователей которым будет разрешен доступ.

Создания файл с именами и паролями вы можете несколькими способами

  1. Использовать утилиту htpasswd из стандартной поставки вэб сервера Apache
  2. В консоле запустить команду openssl passwd
  3. Либо старонними средствами которые позволяют генерировать пароли с помощью функции crypt()

Если же у вас не окажется перечисленных утилит или же Вы не хотите тратить много времени на то чтобы разбираться с ними, Вы можете воспользоваться удобным онлайн генератором .htpasswd файлов перейдя по ссылке.

В качестве примера мы запретим доступ к корневому каталогу сайта. В location который описывает корень сайта нужно добавить следующие записи :

server {
..................................................
   location / {
     auth_basic "closed site";
     auth_basic_user_file /home/user/www/htpassw;
..................................................
   }
}

После перезагрузки Nginx и захода на сайт Вы увидете запрос на ввод логина и пароля.

Запрет доступа по ip адресу/подсети

Для ограничения доступа по ip адресу мы будем использовать возможности модуля ngx_http_access_module. 

Используя диективы deny и allow мы можем соответственно запрещать или разрешать доступ на основе ip адреса либо подсети. В качестве примера разрешим доступ к сайту для ip 192.168.1.10  и запретим его для всех остальных.

server {
..................................................
   location / {
     allow 192.168.1.10;
     deny all;
..................................................
   }
}

 Или запретим доступ ip 192.168.1.10 и разрешим его остальным.

server {
..................................................
   location / {
     deny 192.168.1.10;
     allow all;
..................................................
   }
}

Вы можете варьировать директивы deny и allow так как вам необходимо и использовать их столько сколько необходимо.

Комбинированный запрет по ip, имени и паролю

В случае необходимости мы можем скомбинировать перечисленные варианты запрета доступа. Для этого нам понадобится дополнительная директива satisfy.

satisfy разрешает доступ если все(all) или хотя бы один(any) из модулей ngx_http_access_modulengx_http_auth_basic_module разрешают доступ.

location / {
    satisfy any;

    allow 192.168.1.10;
    deny  all;

    auth_basic           "closed site";
    auth_basic_user_file /home/user/www/htpassw;
}