Защитите свой сайт паролем за 5 минут: настраиваем Basic Auth в Nginx
Вспомните стандартное окошко с логином и паролем при входе в настройки вашего Wi-Fi роутера. Этот простой, но надежный механизм защиты можно в два счета перенести на ваш сайт! Речь идет о Basic Auth — встроенной аутентификации на уровне веб-сервера.
Хотите быстро ограничить доступ к админке, скрыть тестовую версию сайта от посторонних глаз или поставить пароль на весь проект? Nginx позволяет сделать это буквально парой директив. Вам не нужны сложные системы или базы данных — только файл с пользователями и несколько строк в конфигурации.
Мы наглядно разберем, как создать этот файл с помощью утилиты `htpasswd`, и куда именно вписать волшебные строки `auth_basic`. Вы научитесь защищать как весь сайт целиком, так и отдельные, особо важные маршруты, например, `wp-admin` в WordPress.
Отдельно разберем тонкости настройки для конкретных `location`-блоков, чтобы ваша авторизация работала безупречно и не конфликтовала с обработкой PHP-скриптов. Это проще, чем кажется, и займет у вас считанные минуты.
Готовы добавить вашему сайту еще один уровень безопасности? Переходите к статье — и уже через 5 минут ваш контент будет под надежной защитой!
Даже если вы ещё не знаете что такое Basic Auth, вы наверняка уже с ней сталкивались, например, при входе в интерфейс настройки роутера. Это механизм авторизации по имени пользователя и паролю на уровне веб-сервера. Такая авторизация поддерживается и в Apache и в Nginx.
В этой статье мы разберемся как настроить Basic Auth Nginx, для определённого маршрута или для всего сайта.
Настройка Basic Auth в Nginx
Окно авторизации Basic Auth выглядит вот так:

Думаю теперь вы знаете о чём идёт речь. Такую авторизацию можно настроить для определённого URL, для всего сайта или для всех сайтов. Но сначала надо создать файл со списком пользователей и паролей. Для этого используется утилита htpasswd. Синтаксис у команды такой:
$ sudo htpasswd -c /путь/к/файлу имя_пользователя
Опция -c используется для создания нового файла, для редактирования уже существующих её использовать не надо. Например:
sudo htpasswd -c /etc/nginx/auth.basic admin

Утилита два раза спросит пароль. Пароль вводится но не отображается. Это так должно быть для безопасности. После того, как файл будет создан можно переходить к настройке Nginx.
Для того чтобы защитить паролем все ваши сайты просто добавьте эти директиву в секцию http файла /etc/nginx/nginx.conf:
auth_basic "Restricted area";
auth_basic_user_file /etc/nginx/auth.basic;

Для защиты только определённой URL добавьте эти же директивы в нужный блок location. Например для /wp-admin/admin-ajax.php:
location /wp-admin/admin-ajax.php {
auth_basic "Restricted area";
auth_basic_user_file /etc/nginx/auth.basic;
}

Для WordPress такой location лучше размещать вложенным в location /. Тогда будут работать все правила описанные там, плюс ваше на защиту доступа. Если же наоборот надо разрешить доступ для определённого location то директива будут выглядеть так auth_basic "off". Например:
location /wp-admin/admin-ajax.php {
auth_basic "off";
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass 127.0.0.1:9002;
fastcgi_index index.php;
include /etc/nginx/fastcgi_params;
}

Здесь разместить этот блок location вложенным уже не получиться, поэтому следует добавить в него обработку php иначе веб-сервер просто предложит пользователям скачать php скрипт, к которому они обращаются.
Выводы
Как видите, авторизация по паролю nginx настраивется не так уж сложно, надо только правильно сформулировать блок location. Если у вас остались вопросы, спрашивайте в комментариях!