1. Блог
  2. Мануалы

Защита папки сайта паролем через .htaccess и .htpasswd

Защита папки сайта паролем через .htaccess и .htpasswd

Базовая HTTP-аутентификация — самый быстрый способ закрыть от посторонних часть сайта: административную панель, тестовую версию, каталог со служебными файлами. Браузер покажет окно с запросом логина и пароля ещё до загрузки страницы, а боты, перебирающие пароли к админке, даже не доберутся до формы входа.

Как это работает

Нужны два файла:

  • .htpasswd — список пользователей с хешами паролей;
  • .htaccess — файл в защищаемом каталоге, который включает проверку и указывает путь к .htpasswd.

Способ работает на веб-сервере Apache и совместимом с ним LiteSpeed — они используются на большинстве тарифов виртуального хостинга. Для Nginx настройка описана в конце статьи.

Шаг 1. Создайте файл с паролями

На сервере с доступом по SSH используйте утилиту htpasswd. Она входит в пакет apache2-utils (Debian, Ubuntu) или httpd-tools (AlmaLinux, Rocky Linux).

htpasswd -c -B /home/user/.htpasswd admin
  • -c создаёт новый файл;
  • -B использует стойкий алгоритм bcrypt;
  • admin — имя пользователя.

Утилита дважды запросит пароль. Чтобы добавить ещё одного пользователя, выполните команду без ключа -c — иначе файл будет перезаписан:

htpasswd -B /home/user/.htpasswd editor

Удалить пользователя:

htpasswd -D /home/user/.htpasswd editor

Если доступа по SSH нет, воспользуйтесь разделом защиты каталогов в панели управления хостингом: она создаст оба файла сама.

Шаг 2. Создайте .htaccess

В каталоге, который нужно закрыть, создайте файл .htaccess:

AuthType Basic
AuthName "Restricted area"
AuthUserFile /home/user/.htpasswd
Require valid-user
  • AuthName — текст, который браузер может показать в окне входа;
  • AuthUserFile — абсолютный путь к файлу паролей на сервере;
  • Require valid-user — доступ для любого пользователя из файла.

Защита распространяется на каталог и все вложенные в него. Узнать абсолютный путь можно командой pwd в нужном каталоге.

Доступ только для отдельных пользователей

Require user admin editor

Защита одного файла

Чтобы закрыть паролем один файл, например страницу входа WordPress, оберните директивы в блок Files:

<Files "wp-login.php">
    AuthType Basic
    AuthName "Restricted area"
    AuthUserFile /home/user/.htpasswd
    Require valid-user
</Files>

Это заметно снижает нагрузку от ботов, перебирающих пароли: запросы отсекаются веб-сервером и не доходят до PHP.

Пароль или доверенный IP-адрес

Удобный вариант для офиса: с рабочего адреса пускать без пароля, остальных — только по паролю.

AuthType Basic
AuthName "Restricted area"
AuthUserFile /home/user/.htpasswd

<RequireAny>
    Require ip 198.51.100.7
    Require valid-user
</RequireAny>

Чтобы требовать и адрес, и пароль одновременно, замените RequireAny на RequireAll.

Проверка

Откройте защищённый адрес в приватном окне браузера — должно появиться окно с запросом логина и пароля. Из консоли:

curl -I https://example.com/admin/
curl -I -u admin:пароль https://example.com/admin/

Первая команда должна вернуть код 401, вторая — 200.

Если не работает

  • Ошибка 500. Опечатка в .htaccess или неверный путь в AuthUserFile. Подробности — в журнале ошибок веб-сервера.
  • Пароль не запрашивается. Обработка .htaccess отключена. В конфигурации Apache для каталога сайта должна быть директива AllowOverride All или хотя бы AllowOverride AuthConfig.
  • Пароль не подходит. Проверьте путь к файлу и права на чтение для веб-сервера: chmod 644 .htpasswd.
  • Окно входа появляется повторно. Неверный логин или пароль; регистр символов учитывается.

Аналог для Nginx

Nginx не читает .htaccess. Защита задаётся в конфигурации сайта:

location /admin/ {
    auth_basic "Restricted area";
    auth_basic_user_file /etc/nginx/.htpasswd;
}

Файл паролей создаётся той же утилитой htpasswd. После изменения выполните sudo nginx -t && sudo systemctl reload nginx. Остальные примеры конфигурации — в статье о виртуальных хостах Nginx.

Ограничения способа

  • Только вместе с HTTPS. При базовой аутентификации пароль передаётся при каждом запросе почти в открытом виде. Без SSL-сертификата его может перехватить любой, кто видит трафик.
  • Нет выхода из системы. Браузер помнит пароль до закрытия.
  • Нет защиты от перебора. Сам веб-сервер не ограничивает число попыток — на своём сервере дополните защиту Fail2Ban.

Базовая аутентификация хороша как дополнительный барьер перед админкой или тестовым сайтом, но не заменяет полноценную систему учётных записей.

Видеоинструкция

YouTube video