Защита каталогов паролем через mod_auth_mysql на Apache2 (Debian Squeeze)
Кратко: этот пошаговый гид показывает, как использовать модуль 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 examplecomdbmysql -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 reload4 Пример .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-запросы. Минусы: устаревший модуль, ограниченная поддержка современных хешей и сложность управления паролями и политиками безопасности.
Мини-методология внедрения (шаги)
- Подготовьте тестовую среду, не делайте изменений сразу в продакшене.
- Установите модуль и создайте отдельно БД/таблицу в тестовой базе.
- Протестируйте аутентификацию с минимальной конфигурацией (.htaccess).
- Оцените необходимость переносить конфигурацию в vhost (лучше для производственной среды).
- Настройте мониторинг и проверку логов ошибок.
- Планируйте переход к более безопасному хешированию паролей.
Роль-ориентированные чеклисты
Системный администратор:
- Установить пакеты и включить модуль.
- Создать 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: алгоритм хеширования пароля, используемый в примере.
Ресурсы и ссылки
- Apache: http://httpd.apache.org/
- Debian: http://www.debian.org/
- mod_auth_mysql: http://modauthmysql.sourceforge.net/
Краткое резюме
Важно: mod_auth_mysql даёт быстрый способ интеграции аутентификации с MySQL, но модуль и используемые хеши могут быть устаревшими. Для новых проектов рекомендуется рассмотреть современные методы аутентификации и безопасное хранение паролей. Следуйте чек-листам, тестируйте в стенде и используйте HTTPS.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента