Настройка авторизации пользователей в БД используя libnss MySQL
Постановка задачи
Задача: Настроить FTP сервер и квоты на дисковое пространство выделяемое каждому из пользователей.
Решение: В связи с тем, что количество пользователей достаточно велико (нескольких сотен), то заводить их как локальных пользователей я посчитал нецелесообразным.
После нескольких экспериментов pam_mysql был отвергнут т.к. квоты можно настроить только локальным пользователям, т.е. встала задача найти инструмент, который бы позволял хранить учетные записи пользователей в БД, и при этом чтобы система не видела разницы между локальным пользователем и пользователем из БД.
На просторах Интернет был найден проект libnss_mysql (Домашняя страница), который и позволяет проделать описанный выше фокус.
Сборка RPM пакета, установка
Скачем пакет с исходными текстами, например так:
wget http://sourceforge.net/project/showfiles.php?group_id=56073&release_id=354053.
Скопируем полученный файл в /usr/src/redhat/SOURCES.
cp libnss-mysql-1.5.tar.gz /usr/src/redhat/SOURCES
Нам необходимо извлечь из данного архива файл libnss-mysql.spec и внести в него некоторые изменения (дело в том, что spec содержащийся в архиве неработоспособен, т. к. содержит ошибку).
Распаковываем архив:
tar -zxvf /usr/src/redhat/SOURCES/libnss-mysql-1.5.tar.gz
Копируем SPEC файл в положенное ему место:
cp /usr/src/redhat/SOURCES/libnss-mysql-1.5/libnss-mysql.spec /usr/src/redhat/SPECS/
Подредактируем файл /usr/src/redhat/SPECS/libnss-mysql.spec поставив после строки
%attr(0755,root,root) /lib/*.so*
еще одну строку
%attr(0755,root,root) /lib/*.la*
Теперь сборка RPM пакета пройдет успешно.
Собираем пакет:
rpmbuild -ba libnss-mysql.spec
После сборки пакет будет записан в каталог /usr/src/redhat/RPMS/i386/.
Установим пакет libnss_mysql:
rpm -ihv /usr/src/redhat/RPMS/i386/libnss-mysql-1.5-1.i386.rpm
Настройка
Настройка MySQL
Если MySQL у Вас еще не запущен, сделайте это командой
service mysqld start.
Перейдите в каталог /usr/share/doc/libnss-mysql-1.5/sample/linux и скопируйте оттуда файл sample_database.sql в свой каталог:
cp sample_database.sql $HOME
В данном файле содержится набор SQL команд для создания необходимых таблиц в БД MySQL.
Отредактируйте данный файл в своем домашнем каталоге.
Вам необходимо поправить в нем строки которые создают тестовую группу и тестового пользователя.
INSERT INTO users (username,gecos,homedir,password) VALUES ('cinergi', 'Ben Goodwin', '/home/cinergi', ENCRYPT('cinergi')); INSERT INTO groups (name) VALUES ('foobaz'); INSERT INTO grouplist (gid,username) VALUES (5000,'cinergi');
Поправим следующим образом:
INSERT INTO users (username,gecos,homedir,password) VALUES ('testftp', 'Test FTP USER', '/home/testftp', ENCRYPT('pass')); INSERT INTO groups (name) VALUES ('ftpuser'); INSERT INTO grouplist (gid,username) VALUES (5000,'ftpuser');
Также необходимо поправить строки задающие пароли для доступа к БД, вместо rootpass и userpass поставьте «адекватные» пароли для доступа.
GRANT USAGE ON *.* TO `nss-root`@`localhost` IDENTIFIED BY 'rootpass'; GRANT USAGE ON *.* TO `nss-user`@`localhost` IDENTIFIED BY 'userpass';
После этого выполните:
mysql <sample_database.sql
Создастся БД Auth и необходимые таблицы.
Настройка libnss_mysql
В каталоге /etc находятся 2 файла
- libnss-mysql.cfg
- libnss-mysql-root.cfg
Отредактируйте данные файлы, сменив в них параметр password на пароли которые Вы задали в файле sample_database.sql.
Отредактируйте файл nsswitch.conf заменив в нем строки
passwd: files shadow: files
на строки:
passwd: files mysql shadow: files mysql
Приступим к настройке квот для пользователей.
Отредактируйте файл /etc/fstab следующим образом:
Вместо строки
LABEL=/home /home ext3 defaults 1 2
поставьте строку:
LABEL=/home /home ext3 nosuid,noexec,usrquota 1 2
Перемонтируйте раздел /home
mount -o remount /home
Создадим каталог нашего тестового пользователя testuser:
mkdir /home/testftp chown testftp.ftpusers /home/testftp chmod 700 /home/testftp
Нам необходимо создать в файловой системе файлы квот, делается это командой:
quotacheck -cug /home
Строим таблицу таблицу текущего использования диска:
quotacheck -avug
Правим квоты для пользователя testftp командой
edquota testftp
откроется текстовый редактор (по умолчанию vi), Вам необходимо отредактировать значения полей soft и hard задающие мягкое и жесткое ограничение на число блоков для пользователя в данной файловой системе.
После правки данного файла, проверьте, что квоты для пользователя установлены:
quota testftp
Настройка vsftpd
Отредактируйте файл настроек vsFTPd следующим образом:
max_clients=200 max_per_ip=4 listen_address=10.0.0.1 anonymous_enable=NO local_enable=YES write_enable=YES local_umask=222 dirmessage_enable=YES connect_from_port_20=YESchown_uploads=YES xferlog_enable=YES xferlog_file=/var/log/vsftpd.log xferlog_std_format=YES idle_session_timeout=600 data_connection_timeout=120 ftpd_banner=Welcome to FTP service. chroot_list_enable=NO pam_service_name=vsftpd listen=YES tcp_wrappers=YES chroot_local_user=YES
Перезапустите vsftpd командой:
service vsftpd restart
Тестирование
С клиентского компьютера выполните команду:
ftp 10.0.0.1 Connected to 10.0.0.1. 220 Welcome to FTP service. 530 Please login with USER and PASS. Name: testftp 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files.
Подключение прошло успешно. Теперь попытайтесь закачать на ftp несколько файлов общим размером больше, чем то значение в которое вы выставили квоты.
Заключение
Для создания нового пользователя нам надо:
- Создать пользователя в БД
- Создать ему домашний каталог
- Назначить пользователя владельцем каталога
- Назначить права доступа на каталог пользователя
- Установить квоты для пользователя
Данные задачи можно автоматизировать написанием простого скрипта который и будет выполнять указанные действия.
Если Вы хотите назначить пользователю такие же квоты такие же как и у другого пользователя выполните: edquota -p testftp2 testftp.
Может распространяться свободно при указании авторства.
Автор: Фролов Денис
