Поиск по сайту:

Как защитить паролем каталоги с помощью mod_authn_dbd и MySQL на Apache (Debian 8)


Это руководство существует для этих версий ОС

  • Debian 8 (Джесси)
  • Debian 6 (Squeeze)

На этой странице

  1. 1 Предварительное примечание
  2. 2 Установка MySQL или MariaDB
  3. 3. Настройка mod_authn_dbd
  4. 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.