Иногда возникает потребность запретить доступ к 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 — задает расположение файла с именами и паролями пользователей которым будет разрешен доступ.
Создания файл с именами и паролями вы можете несколькими способами
- Использовать утилиту htpasswd из стандартной поставки вэб сервера Apache
- В консоле запустить команду openssl passwd
- Либо старонними средствами которые позволяют генерировать пароли с помощью функции 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_module, ngx_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; }