Настройка взаимодействия pure-ftpd с MySQL

()

Полтора года назад мы рассматривали настройку взаимодействия ftp-сервера pure-ftpd с CMS Joomla. Сейчас же попробуем рассмотреть другой случай: хранение ftp-аккаунтов в MySQL-базе, но без привязки к чему либо.

Для начала пару слов о том, зачем же собственно это нужно: ну хотя бы для того, чтобы разные пользователи имели возможность заливать файлы в разные директории, но при этом на самом сервере файлы должны иметь одни и те же uid/gid.

Разворачивать решение мы будем на сервере под управлением Ubuntu Server 9.04. Сначала нужно установить необходимые пакеты:

apt-get install pure-ftpd-mysql mysql-server

В процессе установки вам будет предложено задать пароль для вашего mysql-сервера. Задайте по своему усмотрению, но главное - не забудьт его потом:)

Теперь подключимся к нашему MySQL-серверу с помощью mysql-клиента:

mysql -u root -p 

И создадим базу данных для для pure-ftpd:

mysql> CREATE DATABASE `pureftpd`;

Создадим пользователя pureftpd с правом выполнять запрос SELECT на эту базу и паролем "p4ssw0rd" (Для примера. В реальной конфигурации рекоммендуется придумать свой пароль):

mysql> GRANT SELECT ON `pureftpd`.* to `pureftpd`@`localhost` identified by 'p4ssw0rd';

Почему только SELECT? Потому что этого более чем достаточно для проверки пароля, но в случае обнаружения уязвимостей в pure-ftpd с последующим его взломом не даст возможности создать новых (потенциально опасных) пользователей.

Используем новую базу данных:

mysql> USE pureftpd;

Создаём таблицу, в которой будут храниться пользовательские аккаунты:

mysql> CREATE TABLE `users` (
    ->  `id` int(11) NOT NULL auto_increment,
    ->  `login` varchar(32) NOT NULL default '',
    ->  `password` varchar(32) NOT NULL default '',
    ->  `homedir` varchar(255) NOT NULL default '',
    ->  `uid` int(11) NOT NULL default '-1',
    ->  `gid` int(11) NOT NULL default '-1',
    ->  PRIMARY KEY  (`id`),
    ->  UNIQUE KEY `id` (`id`)
    -> ) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;

Сразу создадим пользователя. Допустим что у нас есть пользователь moose с uid:gid 1000:1000 и домашним каталогом /home/moose. Нужно дать пользователю с логином friend и паролем secret доступ к директории /home/moose/Films. Для этого выполним следующий запрос:

mysql> INSERT INTO `users` (`login`, `password`, `uid`, `gid`, `homedir`) VALUES ('friend', md5('secret'), 1000, 1000, '/home/moose/Films');

Теперь завершим работу с MySQL:

mysql> quit

И перейдём к настройке pure-ftpd.

Теперь открываем в редакторе файл /etc/pure-ftpd/db/mysql.conf и приводим его к следующему виду:

# Адрес MySQL-сервера
MYSQLServer     127.0.0.1

# Порт MySQL-сервера
MYSQLPort       3306

# Пользователь на MySQL-сервере
MYSQLUser       pureftpd

# Пароль
MYSQLPassword   p4ssw0rd

# Имя базы данных
MYSQLDatabase   pureftpd

# Способ хэширования пароля. Мы будем использовать md5
MYSQLCrypt      md5

# Этот запрос используется для получения хэша пароля из базы.
# Здесь и далее вместо "\L" будет подставлен логин.
MYSQLGetPW      SELECT password FROM users WHERE login="\L"

# Запрос для получения uid пользователя
MYSQLGetUID     SELECT uid FROM users WHERE login="\L"

# Запрос для получения gid пользователя
MYSQLGetGID     SELECT gid FROM users WHERE login="\L"

# Запрос для получения домашнего каталога пользователя
MYSQLGetDir     SELECT homedir FROM users WHERE login="\L"

Дальше нам нужно запереть пользователей в их домашний директориях:

echo yes >> /etc/pure-ftpd/conf/ChrootEveryone

Перезапускаем ftp-сервер:

invoke-rc.d pure-ftpd-mysql restart

После чего остаётся только попробовать подключиться к ftp-серверу. Следует отметить что по умолчанию разрешено так же использование системных аккаунтов. Если это не нужно (потенциальная дыра в безопасности), то эту возможность можно отключить следующимей командой:

echo no > /etc/pure-ftpd/conf/PAMAuthentication && invoke-rc.d pure-ftpd-mysql restart

На этом всё. Приятной работы!

Ключевые слова: pure-ftpd, mysql, pureftpd.

Подписаться на обновления: RSS-лента Канал в TamTam Telegram канал Канал в ICQ

Комментарии:

kobel 2009-07-07 18:53:25 (#)

Ubuntu server 9.04 (iso взял с ОФ. сайта)
Установил пакет pure-ftpd-mysql mysql-server
Все сделано по выше описанной инструкции,
за исключением запрета системных акаунтов.
с системныйм акаунтом подключается а с акаунтом из базы НЕТ!
----------
Connect to: (07.07.2009 20:11:07)
hostname=192.168.0.111
220---------- Welcome to Pure-FTPd [privsep] [TLS] ----------
220-You are user number 1 of 50 allowed.
220-Local time is now 20:11. Server port: 21.
220-This is a private system - No anonymous login
220-IPv6 connections are also welcome on this server.
220 You will be disconnected after 15 minutes of inactivity.
USER bobik
331 User bobik OK. Password required
PASS ***********
530 Login authentication failed
QUIT

пароль пробывал в базу и текстом и md5 (в конфиге параметр при этом менял).

Помогите понять в чем дело ?

MooSE 2009-07-08 11:37:51 (#)

там есть куча тонких оговорок. опиши подробнее следующие моменты:

1. какая директорктия и какие права у твоего виртуального пользователя
2. не является ли эта директория частью домашней директории другого пользователя
3. отличаются ли uid из 1 от uid из 2?

Я стоял уже на таких граблях, когда в был user с домашней директорией /home/user1 и пытался создать виртуального пользователя user2 с правами www-data и домашней директорией /home/user1/www. Тут я получал такую же ошибку как и у тебя и пока не придумал как с ней бороться.

Anonymous 2011-04-12 12:12:22 (#)

У меня подобная ситуация. Есть анонимный пользователь ftp. Его каталог /data/ftp. Я добавил другого пользователя на этот же каталог, в итоге та эе ошибка как в 1-м комментарии.

Так как с ней бороться?

MooSE 2011-04-14 00:44:52 (#)

У меня подобная ситуация. Есть анонимный пользователь ftp. Его каталог /data/ftp. Я добавил другого пользователя на этот же каталог, в итоге та эе ошибка как в 1-м комментарии.

Так как с ней бороться?


Какой идентификатор у пользователя ftp и какой у добавленного?

Anonymous 2011-04-28 16:49:23 (#)

Итак:
аноним ftp: 1002
новый добавленый: 1001 (пробовал 1002 ставить толку = 0)
Домашняя директория для добавленного сделал директорию анонима, может в этом косяк?!

tom.cat 2011-04-28 16:58:02 (#)

Зарегился :) Предыдущий коммент от меня. Ситуация напрягла с фтп доступом. Как-то странно ведет себя фтп и в логах к сожалению ничего путного не отображается.

MooSE 2011-04-29 02:02:01 (#)

В логах авторизации что? А если сделать для анонимного ftp домашней одну директорию, а для нового созданного - поддиректорию?

tom.cat 2011-05-05 10:40:05 (#)

May 5 10:34:25 server pure-ftpd: (?@95.27.159.28) [INFO] New connection from 95.27.159.28
May 5 10:34:42 server pure-ftpd: (?@95.27.159.28) [WARNING] Authentication failed for user [olya]

Это в логах при авторизации.
Сделал поддиректорию, та же ошибка как и предыдущая.

MooSE 2011-05-06 14:53:09 (#)

Хм.... Какой uid Ты даёшь пользователю olya и какой uid у владельца её домашней директории?

tom.cat 2011-05-10 17:11:33 (#)

olya: был 1002 и 1001(пробовал менять)
ftp(владелец хомячка): 1002

MooSE 2011-05-11 10:45:08 (#)

Ты так часто отвечаешь что я забываю предмет беседы. К тому же итак тяжело разбираться не видя проблему перед собой.

Вобщем складывается ощущение что ты не очень-то и хочешь решить задачу.

tom.cat 2011-05-14 16:53:29 (#)

К сожалению уведомления не приходят на почту об ответах. Перепробовал несколько вариантов и решения пока не нашел.
Новый комментарий

Жирный текстКурсивный текстПодчёркнутый текстЗачёркнутый текстПрограммный кодСсылкаИзображение




© 2006-2024 Вадим Калинников aka MooSE
Политика конфиденциальности