Настрока ftp сервера Proftpd c хранением пользователей в Mysql » IT FOundation – Поваренная книга системного администратора.
Только нужная и полезная документация. Регистрируйтесь, пишите, комментируйте!
30 апреля 2009

Настрока ftp сервера Proftpd c хранением пользователей в Mysql

опубликовано в FTP |


Установим на систему  ftp сервер ptoftpd

Для linux gentoo:
# USE=”acl mysql ncurses nls pam tcpd  softquota” emerge -av proftpd

Аутентифицироваться пользователи будут через mysql,  а работать с файлами от физических пользователей существующих в системе.

Если нет необходимости разграничивать пользователей – то можно завести одного системного пользователя от которого будет производиться работа – к примеру пользователь “ftpuser” и группа “ftpgtoup”
Если пользователи  не должны иметь прав работать с файлами других пользователей -
заведите необходимо количество пользователей в системе.

Рассмотрим случай работы от одного пользователя

Создадим группу для пользователя работающего с ftp:
# groupadd -g 3000  ftpgroup

Создадим системного пользователя ftpuser
# useradd -u 3000 -s /bin/false -d /dev/null -c “ftp user” -g ftpgroup ftpuser

Вместо идентификатора пользователя  и группы 3000 используйте свободные значения в вашей  системе.

Создадим базу данных ftp и пользователя MySql, назовем его
proftpduser,  proftpd cервер  будет использовать его позже, чтобы
соединиться с базой данных ftp.

# mysql -u root -p
create database ftp;
GRANT SELECT, INSERT, UPDATE, DELETE ON ftp.* TO ‘proftpduser’@'localhost’ IDENTIFIED BY ‘password’;
FLUSH PRIVILEGES;

Не забудьте указать свой пароль вместо “password”

Далее создадим базу ftp  c таблицами ftpgroup, ftpquotalimits, ftpquotaallies и ftpusers

USE ftp;
CREATE TABLE ftpgroup (
groupname varchar(16) NOT NULL default ”,
gid smallint(6) NOT NULL default ’5500′,
members varchar(16) NOT NULL default ”,
KEY groupname (groupname)
) TYPE=MyISAM COMMENT=’ProFTP group table’;

CREATE TABLE ftpquotalimits (
name varchar(30) default NULL,
quota_type enum(‘user’,'group’,'class’,'all’) NOT NULL default ‘user’,
per_session enum(‘false’,'true’) NOT NULL default ‘false’,
limit_type enum(‘soft’,'hard’) NOT NULL default ‘soft’,
bytes_in_avail int(10) unsigned NOT NULL default ’0′,
bytes_out_avail int(10) unsigned NOT NULL default ’0′,
bytes_xfer_avail int(10) unsigned NOT NULL default ’0′,
files_in_avail int(10) unsigned NOT NULL default ’0′,
files_out_avail int(10) unsigned NOT NULL default ’0′,
files_xfer_avail int(10) unsigned NOT NULL default ’0′
) TYPE=MyISAM;

CREATE TABLE ftpquotatallies (
name varchar(30) NOT NULL default ”,
quota_type enum(‘user’,'group’,'class’,'all’) NOT NULL default ‘user’,
bytes_in_used int(10) unsigned NOT NULL default ’0′,
bytes_out_used int(10) unsigned NOT NULL default ’0′,
bytes_xfer_used int(10) unsigned NOT NULL default ’0′,
files_in_used int(10) unsigned NOT NULL default ’0′,
files_out_used int(10) unsigned NOT NULL default ’0′,
files_xfer_used int(10) unsigned NOT NULL default ’0′
) TYPE=MyISAM;

CREATE TABLE ftpuser (
id int(10) unsigned NOT NULL auto_increment,
userid varchar(32) NOT NULL default ”,
passwd varchar(32) NOT NULL default ”,
uid smallint(6) NOT NULL default ’5500′,
gid smallint(6) NOT NULL default ’5500′,
homedir varchar(255) NOT NULL default ”,
shell varchar(16) NOT NULL default ‘/sbin/nologin’,
count int(11) NOT NULL default ’0′,
accessed datetime NOT NULL default ’0000-00-00 00:00:00′,
modified datetime NOT NULL default ’0000-00-00 00:00:00′,
PRIMARY KEY (id),
UNIQUE KEY userid (userid)
) TYPE=MyISAM COMMENT=’ProFTP user table’;

Выйдем из mysql введя
quit;

Комментарии к таблице ftpgroup

groupname: имя группы
gid: идентификатор группы
members: пользователи состоящие в группу

Комментарии к таблице users

username: имя виртуального пользователя
passwd: незашифрованный пароль

uid: uid пользователя которому будут принадлежать файлы
gid: gid пользователя которому будут принадлежать файлы
homedir: Начальный каталог виртуального пользователя Proftpd (напр./home/exampleuser). Если его не существует, он будет создан, когда новый пользователь пройдет первую авторизацию через FTP. Виртуальныйпользователь будет заключен в chroot окружение начального каталога,т.е., он не может обращаться к другим директориям за пределами егоначального каталога.
shell: по умолчанию /sbin/nologin

Комментарии к таблице quotalimits

name: имя виртуального пользователя
quota_type: тип ограничения по (user,qroup,class или all – для всех)

per_session: true – использовать квоту только на текущую сессию, в этом случае ни куда не записывается размер использованной квоты и для каждой новой сессии используется указанная квота. Например, если пользователь имеет квоту 15 МБ, и он
переслал 15 МБ в течение текущей сессии, затем он не может пересылать
что-либо еще. Но если он регистрируется опять, то он опять имеет
доступных 15 МБ. false, пользователь имеет 15 МБ и безразлично если он регистрируется опять.
false – в этом случае использование квоты заноситься в базу данных.
limit_type: soft – возможно некоторое превышение квоты
hard – жостко заданная квота, превышение невозможно
bytes_in_avail лимит загрузки в байтах ( если 150 Мб то 157286400 байт) 0 = нет лемита
bytes_out_avail лимит скачивания в байтах. 0 = нет лимита
bytes_xfer_avail: Лимит передачи в байтах.0 = нет лимита
files_in_avail: Лимит количества загружаемых файлов. 0 = нет лимита
files_out_avail: Лимит количесва скачиваемых файлов. 0 = нет лимита
files_xfer_avail: Лимит количесва передачи файлов. 0 = нет лимита

Таблица ftpquotatallies используется Proftpd внутри, чтобы управлять
квотами, так что вам не придется делать записей там!

Далее описано содержимое конфигурационного файла proftd.conf

ServerName                  “FTP server”
ServerAdmin                 admn@example.com
ServerType                   standalone
DefaultServer                on
ServerIdent                 on
Port                             21
Umask                          022
MaxClients                    10 “Sorry, the maximum number of allowed users are already connected (%m)”
MaxClientsPerHost       10  “Sorry, you may not connect more than one time. %m allowed users already connected”
MaxLoginAttempts        3
User                            proftpd
Group                          proftpd
SyslogLevel                  debug
UseReverseDNS             off
IdentLookups                off
SystemLog                   /var/log/proftpd/proftpd.log
TransferLog                  /var/log/proftpd/proftpd-tranfer.log
ExtendedLog                /var/log/proftpd/proftpd-extended.log read,write
ExtendedLog               /var/log/proftpd/proftpd-auth.log AUTH  auth
LogFormat                   default “%h %l %u %t \”%r\” %s %b”
LogFormat                   auth    “%v [%P] %h %t \”%r\” %s”
LogFormat                   write   “%h %l %u %t \”%r\” %s %b”
TimeoutIdle                 300
TimeoutLogin             300
TimeoutNoTransfer       360
TimeoutStalled          640
DefaultTransferMode     binary
AllowForeignAddress     off

DisplayConnect            /etc/proftpd/ftp_connect.msg
DisplayLogin                /etc/proftpd/ftp_login.msg
AccessDenyMsg         “ATTENTION!!! ALL CONNECTIONS LOGED”
AccessGrantMsg        “Now upload/download files”
DisplayGoAway         “Go Away”
PersistentPasswd       off

AllowOverwrite on

DefaultRoot ~

# The passwords in MySQL are encrypted using CRYPT
SQLAuthTypes            Plaintext Crypt
SQLAuthenticate         users* groups*

# used to connect to the database
# databasename@host database_user user_password
SQLConnectInfo  ftp@localhost proftpduser password

# Here we tell ProFTPd the names of the database columns in the “usertable”
# we want it to interact with. Match the names with those in the db
SQLUserInfo     ftpuser userid passwd uid gid homedir shell

# Here we tell ProFTPd the names of the database columns in the “grouptable”
# we want it to interact with. Again the names match with those in the db
SQLGroupInfo    ftpgroup groupname gid members

# set min UID and GID – otherwise these are 999
SQLMinID        500

# create a user’s home directory on demand if it doesn’t exist
CreateHome on

# Update count every time user logs in
SQLLog PASS updatecount
SQLNamedQuery updatecount UPDATE “count=count+1, accessed=now() WHERE userid=’%u’” ftpuser

# Update modified everytime user uploads or deletes a file
SQLLog  STOR,DELE modified
SQLNamedQuery modified UPDATE “modified=now() WHERE userid=’%u’” ftpuser

# User quotas
# ===========
QuotaEngine on
QuotaDirectoryTally on
QuotaDisplayUnits Mb
QuotaShowQuotas on
SQLNamedQuery get-quota-limit SELECT “name, quota_type, per_session, limit_type, bytes_in_avail, bytes_out_avail, bytes_xfer_avail, files_in_avail, files_out_avail, files_xfer_avail FROM ftpquotalimits WHERE name = ‘%{0}’ AND quota_type = ‘%{1}’”
SQLNamedQuery get-quota-tally SELECT “name, quota_type, bytes_in_used, bytes_out_used, bytes_xfer_used, files_in_used, files_out_used, files_xfer_used FROM ftpquotatallies WHERE name = ‘%{0}’ AND quota_type = ‘%{1}’”
SQLNamedQuery update-quota-tally UPDATE “bytes_in_used = bytes_in_used + %{0}, bytes_out_used = bytes_out_used + %{1}, bytes_xfer_used = bytes_xfer_used + %{2}, files_in_used = files_in_used + %{3}, files_out_used = files_out_used + %{4}, files_xfer_used = files_xfer_used + %{5} WHERE name = ‘%{6}’ AND quota_type = ‘%{7}’” ftpquotatallies
SQLNamedQuery insert-quota-tally INSERT “%{0}, %{1}, %{2}, %{3}, %{4}, %{5}, %{6}, %{7}” ftpquotatallies
QuotaLimitTable sql:/get-quota-limitQuotaTallyTable sql:/get-quota-tally/update-quota-tally/insert-quota-tally
RootLogin     off
RequireValidShell off

Убедитесь в том что вы заменили строку password, на реальный пароль
для MySQL пользователя proftpd в строке SQLConnectInfo!

Перезапускаем Proftpd:

# /etc/init.d/proftpd restart

Далее заполним базы данных.

Для заполнения базы данных вы можете использовать оболочку MySql

# mysql -u root -p
USE ftp;

Для начала мы добавим запись в таблицу ftpgroup. Она содержит поля
groupname, groupid и username. Группу/пользователя ftp мы создали в начале
(замените groupid, на тот который вы указанный при
создании пользователя):

INSERT INTO `ftpgroup` (`groupname`, `gid`, `members`) VALUES
(‘ftpgroup’, 3000, ‘ftpuser’);

Сейчас мы закончили с таблицей ftpgroup. Нам не придется создавать
дальнейших записей здесь. Каждый раз, когда вы создаете нового
виртуального пользователя ftp, вы делаете это в таблицах
ftpquotalimits и ftpuser.
Создадим запись в таблиц о ктотах для пользователя:

INSERT INTO `ftpquotalimits` (`name`, `quota_type`, `per_session`, `limit_type`,
`bytes_in_avail`, `bytes_out_avail`, `bytes_xfer_avail`, `files_in_avail`,
`files_out_avail`, `files_xfer_avail`) VALUES (‘exampleuser’, ‘user’, ‘true’, ‘hard’, 15728640, 0, 0, 0, 0, 0);

И непосредственно создадим самого пользователя:

INSERT INTO `ftpuser` (`userid`, `passwd`, `uid`, `gid`, `homedir`, `shell`, `count`, `accessed`, `modified`)
VALUES (‘exampleuser’, ‘password’, 3000, 3000, ‘/home/exampleuser’, ‘/sbin/nologin’, 0, ”, ”);
quit;

(Не забывайте заменить groud- и userid 3000 на укзанные в последнем
INSERT, если вы используете другие значения, чем используемые в этой документации)

Попробуйте соедениться с серврерос с другого компьютера, к примеру

# ftp “имя хоста”
В качесте имени хоста вы можете использовать IP адрес сервера, или имя данное ему в днс,
имя пользователя -” exampleuser”, и пароль “password”.

Если соединение прошло успешно – значит все правильно настроено.

Сейчас, если вы выполните

# ls -l /home

вы должны увидеть, что директория /home/exampleuser (домашний каталог exampleuser’s)автоматически создана, и она принадлежит ftpuser и ftpgroup (пользователя/группу мы создали в конце шага два).

Если вы хотите создать анонимный ftp аккаунт (аккаунт ftp, к которому
каждый может получить доступ без логина и пароля), вам необходимо сделать следующее

Для начала мы создаем пользователя и группу с именем anonymous_ftp.
Пользователь имеет начальный каталог /home/anonymous_ftp:

# groupadd -g 3001 anonymous_ftp
# useradd -u 30001 -s /bin/false -d /home/anonymous_ftp -m -c “Anonymous FTP User” -g anonymous_ftp anonymous_ftp

(Замените 3001 на GID/UID, который свободен на вашей системе.)

Затем мы создаем директорию /home/anonymous_ftp/incoming, которая
позволит анонимному пользователю переслать файлы:

# mkdir /home/anonymous_ftp/incoming
# chown anonymous_ftp:nogroup /home/anonymous_ftp/incoming

И добавить следующие изменения в конфигурационный файл proftpd.conf :

# Limit WRITE everywhere in the anonymous chroot
<Directory *>
<Limit WRITE>
DenyAll
</Limit>
</Directory>

# Uncomment this if you’re brave.
<Directory incoming>
# Umask 022 is a good standard umask to prevent new files and dirs
# (second parm) from being group and world writable.
Umask 022 022
<Limit READ WRITE>
DenyAll
</Limit>

<Limit STOR>
AllowAll
</Limit>
</Directory>
</Anonymous>

Перезапустите Proftpd:

# /etc/init.d/proftpd restart

Сейчас анонимные пользователи могут входить на сервер, и они могут
загрузить файлы с /home/anonymous_ftp, но upload ограничен в
/home/anonymous_ftp/incoming (и как только файл загруже в
/home/anonymous_ftp/incoming, он не может быть ни прочитан ни
загруженный оттуда; администратору придется переместить его в
/home/anonymous_ftp сразу, чтобы сделать фаил доступным другим).

(Внимани : Вы можете создать только один анонимный ftp акаунт на один IP адрес !)



Написать комментарий


пять × = 40