Как защитить паролем каталоги с помощью mod_authn_dbd и MySQL на Apache (Debian 8)
Это руководство существует для этих версий ОС
- Debian 8 (Джесси)
- Debian 6 (Squeeze)
На этой странице
- 1 Предварительное примечание
- 2 Установка MySQL или MariaDB
- 3. Настройка mod_authn_dbd
- 4 ссылки
В этом руководстве объясняется, как защитить паролем веб-каталоги (с пользователями из базы данных MySQL) с помощью mod_authn_dbd на Apache2 на сервере Debian 8 (Jessie). Это альтернатива простым текстовым файлам паролей, предоставляемым mod_auth, и позволяет вам использовать обычный синтаксис SQL для создания/изменения удаленных пользователей. Вы также можете настроить mod_authn_dbd для аутентификации в существующей пользовательской таблице MySQL. Модуль apache mod_authn_dbd является заменой mod_auth_mysql.
1 Предварительное примечание
Здесь я использую виртуальный хост http://www.example.com с файлом конфигурации виртуального хоста /etc/apache2/sites-available/example.com.vhost и корневым каталогом документа /var/www/www.example.com/web. В этом руководстве я хочу защитить паролем каталог /var/www/example.com/web/protecteddir (переводится на http://www.example.com/protecteddir/).
Вы можете использовать это руководство для базового сервера LAMP, если у вас еще не установлен Apache.
2 Установка MySQL или MariaDB
Я буду использовать MariaDB, форк MySQL, вместо MySQL. Но MySQL тоже работает, если вы предпочитаете это. Чтобы установить MariaDB, мы запускаем:
apt-get -y install mariadb-server mariadb-client
Вам будет предложено ввести пароль для пользователя root MySQL:
Новый пароль для пользователя «root» в MariaDB: <-- yourrootsqlpassword
Повторите пароль для пользователя «root» в MariaDB: <-- yourrootsqlpassword
Установите модуль DBD MySQL:
apt-get install libaprutil1-dbd-mysql
После этого включите модуль mod_authn_dbd :
a2enmod dbd
a2enmod authn_dbd
authn_socache
Перезапустите Апач:
service apache2 restart
3 Настройка mod_authn_dbd
Вы можете найти документацию для mod_authn_dbd в документации Apache здесь http://httpd.apache.org/docs/current/mod/mod_authn_dbd.html.
Прочитав эти два файла, мы создаем базу данных MySQL с именем examplecomdb, в которой мы создадим таблицу mysql_auth, которая будет содержать наших пользователей и пароли. В дополнение к этому мы создаем пользователя MySQL examplecom_admin — этот пользователь будет использоваться mod_auth_mysql для подключения к MySQL позже:
mysqladmin -u root -p create examplecomdb
mysql -u root -p
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 varchar(255) not null,
passwd varchar(255),
groups varchar(255),
primary key (username)
);
(Конечно, вы также можете использовать существующие таблицы, содержащие ваши учетные данные пользователя, и вы также можете иметь дополнительные поля в таблице, например, поле, определяющее, активен пользователь или нет.)
Теперь мы вставляем пользовательский тест в нашу таблицу mysql_auth с тестом пароля; этот пользователь принадлежит к группе testgroup.
Пароль должен быть хеширован, здесь я буду использовать хэш SHA1, хеш можно создать с помощью команды htpasswd в оболочке Linux:
htpasswd -bns test test
Результат таков:
test:{SHA}qUqP5cyxm6YcTAhz05Hph5gvu9M=
Первая часть - это имя пользователя \test\, разделенное символом \:\, а затем идет хешированный пароль. Нам нужен хешированный пароль \{SHA}qUqP5cyxm6YcTAhz05Hph5gvu9M=\ только для того, чтобы вставить его в нашу базу данных пользователей. Запрос MySQL таков:
INSERT INTO `mysql_auth` (`username`, `passwd`, `groups`) VALUES('test', '{SHA}qUqP5cyxm6YcTAhz05Hph5gvu9M=', 'testgroup');
Затем мы выходим из оболочки MySQL:
quit
Конфигурация для mod_authn_dbd должна быть включена в файл vhost, она не может быть добавлена в файл .htaccess. Поэтому мы редактируем файл vhost и добавляем следующую конфигурацию в конец файла:
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
<Directory "/var/www/example.com/web/protecteddir">
# 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"
</Directory>
Перезагрузите Апач:
service apache2 reload
Если у вас есть дополнительные поля в вашей таблице MySQL, которые определяют, разрешено ли пользователю входить в систему или нет (например, поле, называемое активным), вы можете добавить его в запрос пользователя SQL следующим образом:
[...] AuthDBDUserPWQuery "SELECT passwd FROM mysql_auth WHERE username = %s and active = 'yes'" [...]
Директива require valid-user делает так, что каждый пользователь, указанный в таблице mysql_auth, может войти в систему, если он/она введет правильный пароль. Если вы хотите, чтобы только определенным пользователям было разрешено входить в систему, вы должны использовать что-то вроде
[...] require user jane joe [...]
вместо. И если вы хотите, чтобы только членам определенных групп было разрешено входить в систему, вы должны использовать что-то вроде этого:
[...] require group testgroup [...]
Вот и все! Теперь попробуйте получить доступ к http://www.example.com/protecteddir/, и вас попросят ввести имя пользователя и пароль:
4 ссылки
- Apache: http://httpd.apache.org/
- Debian: http://www.debian.org/
- mod_authn_dbd: http://httpd.apache.org/docs/current/mod/mod_authn_dbd.html.