Настройка FTP сервера с авторизацией на MySQL

В данном руководстве я использую server1.example.com, как имя хоста, который имеет ip адрес 192.168.0.100. У вас эти настройки могут быть другими, поэтому вам будет надо заменить их, в тех местах, где это необходимо.

 

Убедитесь, что вы работает от имени root:

sudo su

1.1 Изменение оболочки по умолчанию

/bin/sh это символическая ссылка на /bin/dash, однако нам необходимо использовать /bin/bash, а не /bin/dash. Поэтому мы сделаем так

ln -sf /bin/bash /bin/sh

1.2 Отключение AppArmor

AppArmor является расширение безопасности (аналог SELinux), который должен обеспечивать высокую безопасность. По моему мнению он вам не нужен для настройки вашей системы безопасности и в конечном счете вы получите больше проблем при его использовании, чем преимуществ (думаю так, после того как затратив неделю на устранение неисправностей в работе некоторых служб, службы не работали, так как ожидалось, выяснилось, что все было нормально, а все проблемы вызывал AppArmor). Поэтому я отключаю его.

Сделать это можно так:

/etc/init.d/apparmor stop
update-rc.d -f apparmor remove

 

2 Установка MySQL и phpMyAdmin

Все можно установить одной командой

apt-get install mysql-server mysql-client libmysqlclient15-dev phpmyadmin apache2

Вам необходимо будет задать пароль для пользователя root MySQL - это пароль, действителен для пользователей root@localhost, а также root@server1.example.com, поэтому мы не должны указывать пароль администратора MySQL вручную позже (как это было в случае с предыдущими версиями Ubuntu):

New password for the MySQL "root" user: <-- yourrootsqlpassword

Также вам необходимо ответить на следующий вопрос:

New password for the MySQL "root" user: <-- Web server to reconfigure automatically: <-- apache2

3 Установка Proftpd с поддержкой MySQL

В Ubuntu имеется заранее настроенный пакет proftpd-mysql. Установим его в качестве автономного демона.

Сделаем так:

apt-get install proftpd-mysql

Вам будет необходимо ответить на следующий вопрос:

Run proftpd: <-- standalone

Затем мы создаем группу ftp (ftpgroup) и пользователя (ftpuser), для использования всеми виртуальными пользователями. Замените group- и userid 2001 на такое число, которое не занято в вашей системе:

groupadd -g 2001 ftpgroup
useradd -u 2001 -s /bin/false -d /bin/null -c "proftpd user" -g ftpgroup ftpuser

4 Создание базы данных MySQL для Proftpd

Сейчас мы создадим базу данных с называнием ftp и пользователя MySQL с именем proftpd, который в дальнейшем будет использоваться демоном proftpd для подключения к базе данных ftp:

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

Замените password на любой другой пароль, который пользователя proftpd будет использовать для MySQL. Затем в оболочке MySQL, мы создаем в базе данных необходимые таблицы:

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';
quit;

Как вы уже заметили, мы вышли из оболочки MySQL и вернулись в оболочку Linux.

Между прочим, (предполагая что имя вашего ftp-сервера server1.example.com), вы сможете получить доступ phpMyAdmin из вашего браузера набрав http://server1.example.com/phpmyadmin/ (также можно использовать ip адрес вместо server1. example.com) и войти в веб-интерфейс как proftpd. После этого вы сможете взглянуть на базу данных. Позже вы можете использовать phpMyAdmin для управления вашими Proftpd сервером

5 Настройка Proftpd

Откроем /etc/proftpd/proftpd.conf и отключим IPv6 установив параметр UseIPv6 в off:

nano /etc/proftpd/proftpd.conf

 

[...]

UseIPv6 off

[...]

Добавим в этот файл, также следующие строки:

[...]
DefaultRoot ~

SQLBackend mysql
# 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 proftpd 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 each

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-limit
QuotaTallyTable sql:/get-quota-tally/update-quota-tally/insert-quota-tally

RootLogin off

RequireValidShell off

[...]

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

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

/etc/init.d/proftpd restart

6 Заполнения базы данных и ее тестирование

Для заполнения базы данных используем оболочку MySQL:

mysql -u root -p
USE ftp;

Прежде всего, нужно создать запись в таблице ftpgroup. Она содержит groupname, groupid и username. Имя пользователя и группу ftp, мы создали в конце второго шага (вместо groupid=2001 вам необходимо будет подставить реальный, который у вас используется):

INSERT INTO `ftpgroup` (`groupname`, `gid`, `members`) VALUES ('ftpgroup', 2001, 'ftpuser');

Сейчас мы создали таблицу ftpgroup. Нам больше нет необходимости создавать в ней дополнительные записи. При создании новых виртуальных пользователей ftp вы будете пользоваться таблицами ftpquotalimits и ftpuser. Создадим нашего первого пользователя exampleuser с квотой в 15 Мб и паролем 'secret' (мы все еще оставались в оболочке MySQL):

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` (`id`, `userid`, `passwd`, `uid`, `gid`, `homedir`, `shell`, `count`, `accessed`, `modified`) VALUES (1, 'exampleuser', 'secret', 2001, 2001, '/home/www.example.com', '/sbin/nologin', 0, '', '');
quit;

(Не забудьте заменить groud-и userid 2001 в последнем INSERT запросе, на используемые вами!)

Теперь откроем любой клиент FTP на своем десктопе (типа WS_FTP или SmartFTP, если вы находитесь на системы Windows или gFTP на Linux на рабочем столе) и попытаемся установить соединение. Используйте для соединения server1.example.com (или IP-адрес системы) в качестве имени ftp сервера, exampleuser в качестве имени пользователя и пароль в 'secret'.

Если вы смогли подключиться - поздравляем! Если нет, что-то пошло не так :( .

Если мы выполним

ls -l /home/

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

root@server1:~# ls -l /home/
total 12
drwxr-xr-x 2 administrator administrator 4096 2008-04-24 11:56 administrator
drwxr-xr-x 2 ftp nogroup 4096 2008-06-13 15:48 ftp
drwx------ 2 ftpuser ftpgroup 4096 2008-06-13 16:02 www.example.com
root@server1:~#

7 Администрирование баз данных

Для большинства людей легче применять графический интерфейс для работы с MySQL, вы можете использовать phpMyAdmin (в данном примере это http://server1.example.com/phpmyadmin/) для администрирования базы данных ftp.

Всякий раз, когда вы создаете новый пользователь, вам придется создавать записи в таблицах ftpquotalimits и ftpuser поэтому я объясню, значение столбцов этих таблиц:

Таблица ftpuser:

Важными являются эти колонки (другие заполняются MySQL или Proftpd автоматически, поэтому не заполняйте их вручную!):

  • userid: Имя виртуального пользователя Proftpd (напр. exampleuser).

  • passwd: В не зашифрованном виде (например, clear-text) пароль пользователя.

  • uid: Userid пользователя ftp, созданного в конце второго шага (напр. 2001).

  • gid: Groupid группы ftp, сознанного в конце второго шага (напр. 2001).

  • homedir: Если его не существует, он будет создан, когда новый пользователь впервые войдет через FTP. Виртуальный пользователь будет ограничен только своим домашним каталогом, , т.е. он не сможет получить доступ к другим каталогам, в не его домашнего каталога.

  • shell: Будет нормально, если вы будете по умолчанию использовать /sbin/nologin здесь.

Таблица ftpquotalimits:

Важными являются эти колонки (другие заполняются MySQL или Proftpd автоматически, поэтому не заполняйте их вручную!):

  • name: Имя виртуального пользователя Proftpd (напр. exampleuser).

  • quota_type: пользователь или группа. Как правило, здесь используется пользователь.

  • per_session: true или false. True означает, что квота действует только для данной сессии. Например, если пользователь имеет квоту в 15 Мб, и он загрузил 15 MB в течение одной сессии, то он не сможет больше ничего загрузить, но если он откроет новую сессию, он опять сможет загрузить 15 Мб. False означает, что пользователь имеет 15 МБ не учитывая сессии.

  • limit_type: hard или soft. Hard лимит квоты никогда не дает превышать лимит, в то время как soft квоты могут быть временно превышены. Обычно используется hard.

  • bytes_in_avail: Лимит закачки в байтах (например 15728640 для 15 MB). 0 означает неограниченный.

  • bytes_out_avail: Лимит загрузки в байтах. 0 означает неограниченный.

  • bytes_xfer_avail: Лимит передача в байтах. Суммарный лимит закачки и загрузки пользователя. 0 означает неограниченную.

  • files_in_avail: Лимит загрузки в файлах. 0 означает неограниченную.

  • files_out_avail: Лимит закачки в файлах. 0 означает неограниченный.

  • files_xfer_avail: Tranfer limit in files. 0 means unlimited. Лимит передачи в файлах. 0 означает неограниченный.

Ftpquotatallies таблица используется внутри Proftpd для управления квотами так что вам нет необходимости делать записи в нем!

8 Анонимный FTP

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

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

groupadd -g 2002 anonymous_ftp
useradd -u 2002 -s /bin/false -d /home/anonymous_ftp -m -c "Anonymous FTP User" -g anonymous_ftp anonymous_ftp

(Замените 2002 с group-/userid на свободный в вашей системе.)

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

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

открываем /etc/proftpd/proftpd.conf и добавляем следующие директивы в него:

nano /etc/proftpd/proftpd.conf
[...]
<Anonymous ~anonymous_ftp>
User anonymous_ftp
Group nogroup

# We want clients to be able to login with "anonymous" as well as "ftp"

UserAlias anonymous anonymous_ftp

# Cosmetic changes, all files belongs to ftp user

DirFakeUser on anonymous_ftp
DirFakeGroup on anonymous_ftp
RequireValidShell off

# Limit the maximum number of anonymous logins

MaxClients 10

# We want 'welcome.msg' displayed at login, and '.message' displayed
# in each newly chdired directory.

DisplayLogin welcome.msg
DisplayChdir .message

# 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

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

 

 

Оцените блог: 
Средняя: 2.4 (141 оценка)

Задать вопрос