Гид по технологиям

Защита каталогов паролем через mod_auth_mysql на Apache2 (Debian Squeeze)

• 5 min read • DevOps • Обновлено 28 Nov 2025
Пароль для каталогов через mod_auth_mysql на Apache2
Пароль для каталогов через mod_auth_mysql на Apache2

Кратко: этот пошаговый гид показывает, как использовать модуль mod_auth_mysql для аутентификации пользователей из MySQL и защитить веб-каталоги на Apache2 в Debian Squeeze. Включены установка пакетов, создание БД и таблицы, пример .htaccess и варианты конфигурации в vhost. В конце — чеклисты, рекомендации по безопасности и альтернативы.

Введение

Версия 1.0
Автор: Falko Timme
Следуйте за автором в Twitter

Этот документ объясняет, как защитить веб-каталоги паролем, используя пользователей из базы данных MySQL через модуль mod_auth_mysql на Apache2 в Debian Squeeze. Это альтернатива хранению паролей в текстовых файлах (mod_auth), и позволяет управлять пользователями через обычные SQL-запросы. Также можно подключить существующую таблицу пользователей.

Важно: я не даю гарантий, что инструкция сработает в вашей среде без адаптации.

Предварительное замечание

В примерах используется виртуальный хост http://www.example.com, файл конфигурации vhost: /etc/apache2/sites-available/www.example.com.vhost, корневая директория сайта: /var/www/www.example.com/web. В этом туториале мы будем защищать каталог /var/www/www.example.com/web/protecteddir, который доступен по адресу http://www.example.com/protecteddir/.

Что потребуется

  • Сервер с Debian Squeeze и правами root или sudo.
  • Установленные пакеты Apache2 и MySQL (в разделе ниже показана установка).
  • Доступ к файлам конфигурации Apache и возможность перезагрузки сервиса.

1 Установка MySQL и mod_auth_mysql

Для установки выполните:

apt-get install mysql-server mysql-client libapache2-mod-auth-mysql

В процессе вас попросят указать пароль для MySQL-пользователя root: вводите безопасный пароль.

Затем включите модуль mod_auth_mysql:

a2enmod auth_mysql

Перезапустите Apache:

/etc/init.d/apache2 restart

Примечание: в новых версиях Debian/Ubuntu используется systemctl (systemd), но в Debian Squeeze по-прежнему применимы init-скрипты.

2 Конфигурация mod_auth_mysql и создание БД

Документация для модуля находится в /usr/share/doc/libapache2-mod-auth-mysql. Файлы DIRECTIVES.gz и USAGE.gz можно распаковать и прочитать:

cd /usr/share/doc/libapache2-mod-auth-mysql
gunzip DIRECTIVES.gz
vi DIRECTIVES

gunzip USAGE.gz
vi USAGE

Далее создадим базу examplecomdb и таблицу mysql_auth для хранения пользователей, а также MySQL-пользователя examplecom_admin, которым будет подключаться mod_auth_mysql.

mysqladmin -u root -p create examplecomdb
mysql -u root -p

В MySQL-остроке выполните:

GRANT SELECT, INSERT, UPDATE, DELETE ON examplecomdb.* TO 'examplecom_admin'@'localhost' IDENTIFIED BY 'examplecom_admin_password';
GRANT SELECT, INSERT, UPDATE, DELETE ON examplecomdb.* TO 'examplecom_admin'@'localhost.localdomain' IDENTIFIED BY 'examplecom_admin_password';
FLUSH PRIVILEGES;

(Замените examplecom_admin_password на надёжный пароль.)

USE examplecomdb;

Создадим таблицу пользователей:

create table mysql_auth (
 username char(25) not null,
 passwd char(32),
 groups char(25),
 primary key (username)
);

Можно использовать и существующие таблицы с дополнительными полями (например, флаг активный/неактивный). Для демонстрации вставим тестового пользователя с MD5-паролем “test”:

INSERT INTO `mysql_auth` (`username`, `passwd`, `groups`) VALUES('test', MD5('test'), 'testgroup');

Затем выйдите из MySQL:

quit;

Важно: MD5 — устаревший алгоритм хеширования паролей. В разделе по безопасности приведены рекомендации по более безопасной настройке.

3 Разрешение директив в .htaccess или конфигурации vhost

Если вы собираетесь использовать .htaccess, убедитесь, что в конфигурации vhost для каталога включено AllowOverride AuthConfig (или AllowOverride All):

vi /etc/apache2/sites-available/www.example.com.vhost

Пример вставки в конфиг:

[...]
        
                AllowOverride AuthConfig
        
[...]

Если родительская директория уже разрешает Override, повторно менять необязательно. После правки перезагрузите/перечитайте конфигурацию:

/etc/init.d/apache2 reload

4 Пример .htaccess для mod_auth_mysql

Создаём файл .htaccess в защищаемом каталоге:

vi /var/www/www.example.com/web/protecteddir/.htaccess

Пример содержимого файла:

AuthBasicAuthoritative Off
AuthUserFile /dev/null
AuthMySQL On
AuthName "Authentication required"
AuthType Basic
Auth_MySQL_Host localhost
Auth_MySQL_User examplecom_admin
Auth_MySQL_Password examplecom_admin_password
AuthMySQL_DB examplecomdb
AuthMySQL_Password_Table mysql_auth
Auth_MySQL_Username_Field username
Auth_MySQL_Password_Field passwd
Auth_MySQL_Empty_Passwords Off
Auth_MySQL_Encryption_Types PHP_MD5
Auth_MySQL_Authoritative On
require valid-user

Объяснения ключевых директив (коротко):

  • AuthName — сообщение в окне запроса логина.
  • AuthType Basic — базовая HTTP-аутентификация.
  • AuthMySQL* — параметры подключения и соответствие полей таблицы.
  • Auth_MySQL_Encryption_Types — используемый тип хеширования (здесь PHP_MD5).
  • require valid-user — разрешены все пользователи из таблицы.

Примеры альтернатив для ограничения доступа:

require user jane joe

или

require group testgroup

Примечание об ошибках в логе

Пара строк в конфиге AuthBasicAuthoritative Off и AuthUserFile /dev/null предотвращают ошибки вида:

[Wed Jun 11 17:02:45 2008] [error] Internal error: pcfg_openfile() called with NULL filename
[Wed Jun 11 17:02:45 2008] [error] [client 127.0.0.1] (9)Bad file descriptor: Could not open password file: (null)

Эти строки указывают Apache не пытаться читать локальный файл паролей (AuthUserFile) при использовании внешней MySQL-аутентификации.

Условная проверка активности пользователя

Если в таблице есть поле active (например), можно добавить:

Auth_MySQL_Password_Clause " AND active=1"

Важно: строка должна начинаться с пробела внутри кавычек.

5 Размещение конфигурации в vhost вместо .htaccess

Если вы предпочитаете центральную конфигурацию, удалите .htaccess:

rm -f /var/www/www.example.com/web/protecteddir/.htaccess

И добавьте ту же секцию внутрь файла vhost:

[...]
        
                AuthBasicAuthoritative Off
                AuthUserFile /dev/null
                AuthMySQL On
                AuthName "Authentication required"
                AuthType Basic
                Auth_MySQL_Host localhost
                Auth_MySQL_User examplecom_admin
                Auth_MySQL_Password examplecom_admin_password
                AuthMySQL_DB examplecomdb
                AuthMySQL_Password_Table mysql_auth
                Auth_MySQL_Username_Field username
                Auth_MySQL_Password_Field passwd
                Auth_MySQL_Empty_Passwords Off
                Auth_MySQL_Encryption_Types PHP_MD5
                Auth_MySQL_Authoritative On
                require valid-user
        
[...]

После правки перечитайте конфигурацию:

/ etc/init.d/apache2 reload

(Внимание: в командах уберите пробел после слэша — здесь пробел случайный.)

6 Проверка

Попробуйте открыть http://www.example.com/protecteddir/ — браузер должен запросить логин и пароль.

Диалог запроса логина и пароля в браузере

Пример страницы с защищённым доступом, требующей ввод пароля

Безопасность и улучшения (рекомендации)

  • Не используйте MD5 для новых проектов. MD5 уязвим; при возможности храните пароли с солью и современным алгоритмом (bcrypt, Argon2). Если используете старую таблицу с MD5, планируйте миграцию.
  • Всегда применяйте HTTPS при использовании Basic Auth, иначе логин/пароль передаются в открытом виде.
  • Ограничьте привилегии MySQL-пользователя examplecom_admin только необходимыми (SELECT достаточно для аутентификации; INSERT/UPDATE/DELETE понадобятся только если приложение управляет таблицей).
  • Защитите доступ к конфигурации Apache (права файлов), чтобы секреты (пароли) не оказались в публичных файлах.
  • Логи и сообщения об ошибках не должны раскрывать детали конфигурации.

Миграция и альтернативы

Варианты, когда mod_auth_mysql может не подойти, и альтернативы:

  • Если в проекте уже используется современная система аутентификации (LDAP, OAuth2/OpenID Connect), лучше интегрироваться с ней.
  • Для небольших сайтов проще использовать файл .htpasswd (htpasswd) — минимальная зависимость, простота управления.
  • Для приложений с собственной системой пользователей лучше использовать механизм аутентификации приложения (middleware) вместо веб-сервера.

Плюсы mod_auth_mysql: централизованная авторизация в базе, привычные SQL-запросы. Минусы: устаревший модуль, ограниченная поддержка современных хешей и сложность управления паролями и политиками безопасности.

Мини-методология внедрения (шаги)

  1. Подготовьте тестовую среду, не делайте изменений сразу в продакшене.
  2. Установите модуль и создайте отдельно БД/таблицу в тестовой базе.
  3. Протестируйте аутентификацию с минимальной конфигурацией (.htaccess).
  4. Оцените необходимость переносить конфигурацию в vhost (лучше для производственной среды).
  5. Настройте мониторинг и проверку логов ошибок.
  6. Планируйте переход к более безопасному хешированию паролей.

Роль-ориентированные чеклисты

Системный администратор:

  • Установить пакеты и включить модуль.
  • Создать MySQL-пользователя с ограниченными правами.
  • Перезагрузить/прочитать конфигурацию Apache.

Разработчик/DevOps:

  • Создать и протестировать структуру таблицы пользователей.
  • Настроить и протестировать авторизацию в тестовой среде.
  • Реализовать миграцию хешей паролей при необходимости.

Оператор безопасности:

  • Проверить использование HTTPS.
  • Проверить права на файлы конфигурации и доступы к БД.
  • План миграции от MD5 к современным алгоритмам.

Критерии приёмки

  • При обращении к защищённому каталогу браузер запрашивает учётные данные.
  • Пользователь из таблицы с корректным паролем получает доступ.
  • Пользователь с неверным паролем получает 401 Unauthorized.
  • Логи не содержат явных секретов и не раскрывают конфигурацию.

Частые ошибки и отладка

  • Ошибка “Could not open password file: (null)” — добавьте AuthUserFile /dev/null и AuthBasicAuthoritative Off.
  • Неправильные права на .htaccess или vhost — проверьте права доступа и SELinux/AppArmor.
  • Неверная строка Auth_MySQL_Password_Clause — убедитесь, что она начинается с пробела.

1‑строчный глоссарий

  • vhost: виртуальный хост Apache.
  • .htaccess: файл локальных директив Apache.
  • AuthType Basic: простой HTTP Basic-аутентификатор.
  • MD5/PHP_MD5: алгоритм хеширования пароля, используемый в примере.

Ресурсы и ссылки

Краткое резюме

Важно: mod_auth_mysql даёт быстрый способ интеграции аутентификации с MySQL, но модуль и используемые хеши могут быть устаревшими. Для новых проектов рекомендуется рассмотреть современные методы аутентификации и безопасное хранение паролей. Следуйте чек-листам, тестируйте в стенде и используйте HTTPS.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро