Защита веб-директорий Apache с mod_authn_dbd и MySQL на Debian 8
Для кого эта инструкция
Администраторы Linux/Apache и разработчики, которые хотят управлять учётными записями через SQL вместо плоских htpasswd-файлов. Требуется базовое знание командной строки и прав root.
Ключевая цель
Показать безопасный и повторяемый способ аутентификации пользователей Apache с хранением учётных записей в MySQL/MariaDB, используя модуль mod_authn_dbd.
1 Предварительная заметка
В примере используется виртуальный хост http://www.example.com с конфигурацией в /etc/apache2/sites-available/example.com.vhost и корнем документов /var/www/www.example.com/web. В этой инструкции мы защитим каталог /var/www/example.com/web/protecteddir (URL: http://www.example.com/protecteddir/).
Если на сервере ещё не установлен стек LAMP, эта инструкция покроет только часть, связанную с Apache и базой данных. Остальное настраивайте по своему стандарту.
Важно: конфигурация mod_authn_dbd должна быть включена в файл виртуального хоста, а не в .htaccess.
2 Установка MySQL / MariaDB
Я использую MariaDB (форк MySQL), но вы можете использовать MySQL без изменений в логике.
Установите сервер и клиент:
apt-get -y install mariadb-server mariadb-clientВас попросят задать пароль для root-пользователя MariaDB:
New password for the MariaDB “root” user: <– yourrootsqlpassword Repeat password for the MariaDB “root” user: <– yourrootsqlpassword
Установите DBD-модуль для MySQL (APR-util DBD):
apt-get install libaprutil1-dbd-mysqlВключите модули Apache, необходимые для работы mod_authn_dbd:
a2enmod dbd
a2enmod authn_dbd
authn_socacheПерезапустите Apache:
service apache2 restartПримечание: если вы используете другую версию ОС или Apache, команды управления сервисом могут отличаться (systemctl вместо service).
3 Конфигурация mod_authn_dbd и создание таблицы пользователей
Официальная документация: http://httpd.apache.org/docs/current/mod/mod_authn_dbd.html
- Создайте базу данных и пользователя, который будет использовать Apache для подключения:
mysqladmin -u root -p create examplecomdbmysql -u root -pGRANT 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 varchar(255) not null,
passwd varchar(255),
groups varchar(255),
primary key (username)
);Вы можете расширить таблицу дополнительными полями, например active для включения/отключения учётной записи.
- Добавьте тестового пользователя. Пароль нужно хранить в виде хеша. Для SHA1 можно использовать htpasswd:
htpasswd -bns test testРезультат будет выглядеть так:
test:{SHA}qUqP5cyxm6YcTAhz05Hph5gvu9M=Вставьте хеш в базу:
INSERT INTO `mysql_auth` (`username`, `passwd`, `groups`) VALUES('test', '{SHA}qUqP5cyxm6YcTAhz05Hph5gvu9M=', 'testgroup');Затем выйдите из MySQL-консоли:
quit- Добавьте конфигурацию mod_authn_dbd в файл виртуального хоста. Откройте конфигурацию:
nano /etc/apache2/sites-available/example.com.vhostИ в конце файла добавьте (пример):
[...]
# mod_dbd configuration
DBDriver mysql
DBDParams "dbname=examplecomdb user=examplecom_admin pass=examplecom_admin_password"
DBDMin 4
DBDKeep 8
DBDMax 20
DBDExptime 300
# mod_authn_core and mod_auth_basic configuration
# for mod_authn_dbd
AuthType Basic
AuthName "My Server"
# To cache credentials, put socache ahead of dbd here
AuthBasicProvider socache dbd
# Also required for caching: tell the cache to cache dbd lookups!
AuthnCacheProvideFor dbd
AuthnCacheContext my-server
# mod_authz_core configuration
Require valid-user
# mod_authn_dbd SQL query to authenticate a user
AuthDBDUserPWQuery "SELECT passwd FROM mysql_auth WHERE username = %s"
Перезагрузите Apache:
service apache2 reload- Уточнения по запросу SQL
- Если в таблице есть поле active, ограничьте запрос:
AuthDBDUserPWQuery "SELECT passwd FROM mysql_auth WHERE username = %s and active = 'yes'"- Чтобы разрешить только конкретных пользователей, используйте:
require user jane joe- Чтобы разрешить только группы:
require group testgroup4 Проверка доступа и скриншоты
Откройте в браузере: http://www.example.com/protecteddir/ — появится диалог для ввода имени и пароля. При успешной аутентификации вы попадёте в защищённую директорию.


Полезные советы по безопасности и надёжности
- Используйте современный хеш паролей. SHA1 устарел для хранения паролей — рассмотрите более стойкие алгоритмы (bcrypt/argon2) и соответствующие инструменты для генерации хешей. Если используете htpasswd, изучите его опции по генерации разных хешей.
- Доступ к базе данных для Apache ограничьте только нужными привилегиями (SELECT минимально; INSERT/UPDATE/DELETE нужны, только если вы планируете управлять записями из приложения).
- Храните пароли подключения к БД (DBDParams) вне публичного доступа и с правами только для root.
- Настройте TLS для сайта, чтобы учётные данные передавались по HTTPS.
- Логи: не храните хеши и пароли в общих логах. Проверьте политику логирования Apache и MySQL.
Отладка — что делать, если не работает
- Ошибка 500 после изменений: проверьте синтаксис конфигурации Apache:
apachectl configtestилиapache2ctl -t. - Не удаётся подключиться к MySQL: проверьте DBDParams и права пользователя examplecom_admin. Попробуйте подключиться от имени этого пользователя вручную.
- Пароли не совпадают: убедитесь, что в таблице хранится хеш в формате, который ожидает mod_authn_dbd ({SHA}…, {MD5}…, префикс зависит от схемы).
- Кэш аутентификации: если вы включили socache, очистите кэш при проверке изменений или перезагрузите Apache.
Критерии приёмки
- При переходе на URL защищённой директории появляется окно Basic Auth.
- Ввод корректных учётных данных (существующий пользователь и правильный пароль) даёт доступ.
- Некорректные данные или неактивный пользователь — доступ запрещён.
- Конфигурация не использует .htaccess и находится в файле виртуального хоста.
Чек-листы по ролям
Администратор:
- Установить MariaDB/MySQL и libaprutil1-dbd-mysql.
- Создать базу, таблицу и пользователя БД с минимальными правами.
- Включить модули Apache и перезагрузить службу.
DevOps:
- Добавить конфигурацию в vhost и настроить AuthDBDUserPWQuery.
- Настроить caching (socache) при необходимости.
- Настроить мониторинг ошибок и логов.
Разработчик приложения:
- Обеспечить админ-интерфейс для управления пользователями (если требуется).
- Обрабатывать группы и поля active при создании пользователей.
Мини-методология (шаги)
- Установить MariaDB/MySQL и DBD-модуль.
- Создать БД и таблицу mysql_auth.
- Создать пользователя БД для Apache.
- Добавить хешированные пароли в таблицу.
- Включить модули Apache и добавить конфигурацию в vhost.
- Перезагрузить Apache и проверить доступ.
Краткий глоссарий (1 строка каждый)
- mod_authn_dbd — модуль Apache для аутентификации через базу данных через механизм DBD.
- DBD — абстракция драйвера базы данных в Apache для подключения к SQL.
- socache — механизм кэширования аутентификационных данных в Apache.
- vhost — виртуальный хост Apache (файл конфигурации сайта).
- htpasswd — утилита для создания/хеширования паролей для HTTP Basic Auth.
Ссылки
- Apache: http://httpd.apache.org/
- Debian: http://www.debian.org/
- mod_authn_dbd: http://httpd.apache.org/docs/current/mod/mod_authn_dbd.html
Конец — краткое резюме
Приведённая конфигурация переводит хранение пользователей из файлов в базу данных и даёт гибкость SQL-запросов для аутентификации и авторизации. Используйте сильные хеши паролей, ограничьте привилегии БД и применяйте HTTPS для защиты учётных данных в пути.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента