[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Форум » FreeBSD » Установка » FTP (Поднимаем ftp сервер...)
FTP
xrsxДата: Воскресенье, 04.12.2011, 13:30 | Сообщение # 1
Подполковник
Группа: Администраторы
Сообщений: 117
Статус: Offline
Постановка задачи

ProFTPd достаточно удобный и конфигурируемый FTP сервер обладающий множеством возможностей. В данном случае рассматривается FTP сервер внутри локальной сети, с целью предоставить доступ только для чтения любому анонимному пользователю и предоставляющий полный доступ нескольким авторизированным пользователям выполняющих функции операторов.
Говоря простым языком - рассмотрим некий кабинет информатики в котором компьютеры учеников и учителя объеденены в простейшую сеть, в сети имеется FTP сервер, на котором доступен каталог, из которого ученики скачивают на свои компьютеры файлы заданий. Ученики могут только считать файл из этого каталога, изменить или удалить файл они не могут. Учитель же, авторизировашись на FTP сервере - имеет полные права на работу с файлами в этом каталоге, т.е. может закачивать файлы на сервер, удалять их и т.д. Подобную схему с последующими усложнениями и описывает эта статья.

Стандарт использования FTP протокола не предусматривает кодировку имен файлов отличную от латинской, однако существующие условия эксплуатации FTP серверов привели к тому, что на данный момент использование разнообразных кодировок фактически стало необходимостью. Для того чтобы FTP сервер смог корректно работать с русскими именами файлов, при сборке ProFTPd из портов следует убедиться что mod_lang включен.

Логика работы

Принцип работы FTP сервера достаточно прост и понятен. FTP сервер прослушивает 21 порт на наличие входящих запросов. После обоботки запроса и если авторизация клиента успешна - служба выполняет передачу данных клиенту. Авторизация на FTP сервере состоит из передачи от клиента логина и пароля. Публичный (или анонимный) доступ к серверу осуществляется при получении логина с именем anonymous и любого пароля (или совсем без пароля), либо при отстутвии логина и пароля. Фактически гибкость настройки сервера позволяет создать любые формы авторизированного и анонимного доступа.

Установка из портов

ProFTPd рекомендется собрать из портов, по причине того, что при сборке можно указать какие модули собирать. При установке пакета соответсвенно такой возможности не будет.

Переходим в каталог порта proftpd:

# cd /usr/ports/ftp/proftpd

Затем выполняем настройку конфигурации:

# make config

Убеждаемся что параметр NLS - Use nls (builds mod_lang) активен, нажимаем OK и выполняем сборку:

# make install clean

После окончания процесса сборки FTP сервер готов к использованию.

Настройка анонимного доступа

Для начала нам следует создать каталог, который будет являться корневым каталогом для FTP сервера:

# mkdir -p /usr/ftp/pub

Ключ -p означает - создать все промежуточные каталоги при необходимости. Затем следует задать владельца каталога pub. В нашем случае это будет пользователь nobody с аналогичной группой, не имеющий никаких фактических прав в системе. Данное действие - дань безопасности.

# chown nobody:nobody /usr/ftp/pub

После чего сформируем простейший конфигурационный файл, при помощи которого мы будет осуществлять только публичный (анонимный) доступ к нашему FTP серверу. Конфигурационный файл находится в каталоге /usr/local/etc и называется proftpd.conf. После установки по этому пути будет находиться конфигурационный файл идущий в комплекте с proftpd, и его копия, которая называется proftpd.conf.sample.

Переходим в каталог /usr/local/etc:

# cd /usr/local/etc

Обнуляем дефолтный proftpd.conf:

# cat /dev/null > proftpd.conf
 
xrsxДата: Воскресенье, 04.12.2011, 13:32 | Сообщение # 2
Подполковник
Группа: Администраторы
Сообщений: 117
Статус: Offline
Затем открываем его на редактирование:

# ee proftpd.conf

И вписываем в него следующее содержимое:

Содержимое файла /usr/local/etc/proftpd.conf:
ServerName "FTP server"
ServerType standalone
DefaultServer on
MaxLoginAttempts 20
UseReverseDNS off
IdentLookups off
DefaultRoot ~
RequireValidShell off

AuthUserFile /usr/local/etc/proftpd.pass
AuthGroupFile /usr/local/etc/proftpd.grp

SystemLog /var/log/proftpd/system.log
TransferLog /var/log/proftpd/transfer.log
ExtendedLog /var/log/proftpd/extended.log

ScoreboardFile /var/run/proftpd/proftpd.scoreboard

Port 21
Umask 022
MaxInstances 30

User nobody
Group nobody

LangEngine on
UseEncoding koi8-r cp1251

AccessDenyMsg "Access Denied"
AccessGrantMsg "Welcome to FTP server"

<Limit LOGIN>
DenyAll
</Limit>

<Anonymous /usr/ftp>
User anonftp
Group anonftp
UserAlias anonymous anonftp
MaxClients 20 "Sorry, SERVER OVERLOADED."
MaxClientsPerHost 2 "Sorry, You can't connect more than TWO times from ONE host"
ShowSymlinks on
<Limit WRITE>
DenyAll
</Limit>
<Limit LOGIN>
Order deny,allow
Allow from all
</Limit>
</Anonymous>
 
xrsxДата: Воскресенье, 04.12.2011, 13:37 | Сообщение # 3
Подполковник
Группа: Администраторы
Сообщений: 117
Статус: Offline
Теперь нужно создать два файла - proftpd.pass и proftpd.grp, которые потребуются для аутентификации пользователей. Более подробно принцип аутентификации будет описан чуть ниже. Находясь в каталоге /usr/local/etc открываем эти файлы на редактирование (редактор ee автоматически их создаст при отсутствии). Выполняем:

# ee proftpd.pass

Вписываем в этот файл следующую строку:

Содержимое файла /usr/local/etc/proftpd.pass:
anonftp:*:65534:65534::/usr/ftp:/usr/sbin/nologin

И сохраняем файл. Затем редактируем proftpd.grp

# ee proftpd.grp

В этот файл вписываем строку:

Содержимое файла /usr/local/etc/proftpd.grp:
anonftp:x:65534:

Сохраняем. После чего потребуется создать каталог для логов сервера:

# mkdir /var/log/proftpd

Запуск

Фактически все готово для запуска FTP сервера, поместим в каталог /usr/ftp/pub какие либо файлы и попробуем запустить proftpd.

# proftpd

На дисплее не должно появиться никаких сообщений об ошибках. Проверим работает ли FTP сервер:

# sockstat -4 | grep proftpd

На дисплее должен появиться следующий ответ:

nobody proftpd 3952 0 tcp4 *:21 *:*

Для того чтобы FTP сервер автоматически запускался вместе с системой следует поместить в /etc/rc.conf строку proftpd_enable="YES":

# echo 'proftpd_enable="YES"' >> /etc/rc.conf

Обратите внимание, для помещения строки в конец файла rc.conf мы воспользовались командой echo, которая всего лишь выводит текстовое значение находящиеся в кавычках. В нашем случе мы воспользовались перенаправлением вывода в файл при помощи символов ">>" и последующим указанием файла в который произвести вывод. Два символа ">>" означают что вывод будет добавлен к содержимому файла. Если же использовать один символ ">" то содержимое файла будет удалено и перезаписано выводом, поэтому следует выполнять подобные перенаправления осторожно.
Теперь после перезагрузки компьютера FTP сервер будет запущен автоматически. Так же можно будет управлять работой FTP сервера через скрипт в /usr/local/etc/rc.d.
 
xrsxДата: Воскресенье, 04.12.2011, 13:37 | Сообщение # 4
Подполковник
Группа: Администраторы
Сообщений: 117
Статус: Offline
Административный доступ

В нашем случае, при авторизации пользователя, proftpd проверяет его наличие в файле proftpd.pass (строка в конфиге: AuthUserFile /usr/local/etc/proftpd.pass) и сверяет идентификатор группы пользователя в файле proftpd.grp (строка в конфиге: AuthGroupFile /usr/local/etc/proftpd.grp). Если данные пользователя находятся в этих файлах, то происходит авторизация и выделяется доступ. Параметры пользователя в файле proftpd.pass записаны одной строкой, на примере anonftp - "anonftp:*:65534:65534::/usr/ftp:/usr/sbin/nologin", где параметры разделены двоеточиями ":". Первый параметр "anonftp" - означает имя пользователя. Второй параметр "*" означает пароль пользователя. Тут следует обратить внимане на то, что символ "*" означает, что пользователь не имеет пароля в системе, и авторизироваться по паролю не может. В случае с anonftp это оправдано, т.к. в конфигурационном файле proftpd описана секция с участием этого пользователя для доступа к серверу без пароля. Третий и четвертый параметры - это идентификаторы пользователя и группы соответствующие системному пользователю "nobody", который никаких существенных прав в системе не имеет. Пятый параметр - пустой, в случае с proftpd он никакого значения не имеет, в системе же этот параметр отвечат за тип локали пользователя. Шестой параметр, это путь к домашнему каталогу. Соответсвенно он должен указывать на тот каталог в системе, к которому будет предоставлен доступ после авторизации пользователя на сервере. Седьмой параметр указывает на командный процессор пользователя, в случае с profpd он значения не имеет, но в целях безопасности лучше указывать /usr/sbin/nologin - это означает что пользователь не сможет получить управление командным процессором, даже при успешной авторизации.
Эти файлы (proftpd.pass и proftpd.grp) подменяют собой общесистемные файлы аналогичного содержания. Цель такой подмены заключается в том, чтобы сервер proftpd не использовал для авторизации большое к-во реальных системных пользователей, а оперировал только теми пользователями которых специально создали для этих целей. Фактически суть этого метода заключается в создании псевдопользователей имеющих один и тот же идентификатор 65534 - nobody и одинаковые права на файлы лежаще в каталогах FTP сервера. Формат файла proftpd.pass предусматривает кодирование пароля пользователя при помощи специального алгоритма на базе md5. Поэтому для добавления пользователя потребуется вписать пароль в файл proftpd.pass в кодированном виде.
Для создания кодированного пароля нам потребуется модуль Crypt::PasswdMD5 для последующего написания скрипта. Установим его из портов:

# cd /usr/ports/security/p5-Crypt-PasswdMD5
# make install clean
 
xrsxДата: Воскресенье, 04.12.2011, 13:39 | Сообщение # 5
Подполковник
Группа: Администраторы
Сообщений: 117
Статус: Offline
Затем следует создать скрипт htpass.pl (данный скрипт я нашел в интернете - www.hilik.org.ua/скрипт-для-замены-htpasswd/).
Создадим файл, отредактируем его и назначим выполняемым:

# touch /usr/local/bin/htpass.pl
# ee /usr/local/bin/htpass.pl

Содержимое файла /usr/local/bin/htpass.pl:
#!/usr/bin/perl -wl
use strict;
use Crypt::PasswdMD5 qw(unix_md5_crypt);
my @salt = ( '.', '/', 0 .. 9, 'A' .. 'Z', 'a' .. 'z' );
my $password = shift || die "usage: htpass.pl password";
my $encrypted = unix_md5_crypt( $password, gensalt(8) );
print "Crypted pass $password:$encrypted";

sub gensalt {
my $count = shift;
my $salt;
for (1..$count) {
$salt .= (@salt)[rand @salt];
}
return $salt;
}

После сохранения файла, следует установить для него права на выполнение:

# chmod 0755 /usr/local/bin/htpass.pl

И собственно производим генерацию пароля 12345:

# htpass.pl 12345

В ответ получим строку:

Crypted pass 12345:$1$ygAg5c4h$pjfLl9Tt0cZMlYZljrAvS0

Символы, которые начинаются после "Crypted pass 12345:" фактически и являются закодированным md5 паролем, который пригоден для вставки в proftpd.pass. Добавим в файл proftpd.pass пользователя "admin" с данным паролем:

# ee /usr/local/etc/proftpd.pass

Приводим файл к следующему виду:

Содержимое файла /usr/local/etc/proftpd.pass:
anonftp:*:65534:65534::/usr/ftp:/usr/sbin/nologin
admin:$1$ygAg5c4h$pjfLl9Tt0cZMlYZljrAvS0:65534:65534::/usr/ftp:/usr/sbin/nologin
 
xrsxДата: Воскресенье, 04.12.2011, 13:41 | Сообщение # 6
Подполковник
Группа: Администраторы
Сообщений: 117
Статус: Offline
Фактически мы добавили пользователя "admin" с паролем "12345", но этот пользователь имеет аналоничные идентификаторы 65534, равные системному пользователю nobody, и по сути сможет лишь получить полный доступ к папке "/usr/ftp". Однако добавления пользователя в proftpd.pass в нашем случе недостаточно для подключения. Следует произвести изменения в proftpd.conf.
Откроем его не редактирование и добавим разрешение доступа для пользователя "admin":

# ee /usr/local/etc/proftpd.conf

Изменения выделены желтым цветом:

Содержимое файла /usr/local/etc/proftpd.conf:
ServerName "FTP server"
ServerType standalone
DefaultServer on
MaxLoginAttempts 20
UseReverseDNS off
IdentLookups off
DefaultRoot ~
RequireValidShell off

AuthUserFile /usr/local/etc/proftpd.pass
AuthGroupFile /usr/local/etc/proftpd.grp

SystemLog /var/log/proftpd/system.log
TransferLog /var/log/proftpd/transfer.log
ExtendedLog /var/log/proftpd/extended.log

ScoreboardFile /var/run/proftpd/proftpd.scoreboard

Port 21
Umask 022
MaxInstances 30

User nobody
Group nobody

LangEngine on
UseEncoding koi8-r cp1251

AccessDenyMsg "Access Denied"
AccessGrantMsg "Welcome to FTP server"

<Limit LOGIN>
DenyAll
AllowUser admin
</Limit>

<Anonymous /usr/ftp>
User anonftp
Group anonftp
UserAlias anonymous anonftp
MaxClients 20 "Sorry, SERVER OVERLOADED."
MaxClientsPerHost 2 "Sorry, You can't connect more than TWO times from ONE host"
ShowSymlinks on
<Limit WRITE>
DenyAll
</Limit>
<Limit LOGIN>
Order deny,allow
Allow from all
</Limit>
</Anonymous>

Теперь достаточно перезапустить FTP сервер при помощи стартового скрипта (в случае если произведено добавление соотв. строки в rc.conf):

# sh /usr/local/etc/rc.d/proftpd restart

И сервер готов авторизировать как анонимного пользователя, так и пользователя admin, который имеет полный доступ к содержимому FTP сервера. Если в proftpd.pass добавлено несколько пользователей подобным образом, то соответсвенно вписывать их в proftpd.conf следует через запятую типа "AllowUser admin, user1, user2" и т.д.
Авторизация пользователя осуществляется через любой FTP клиент позволяющий ввести логин и пароль, либо явным образом по ссылке типа "ftp://admin:12345@192.168.60.2". Где admin - имя пользователя, 12345 - пароль, 192.168.60.2 - адрес FTP сервера.
 
Форум » FreeBSD » Установка » FTP (Поднимаем ftp сервер...)
Страница 1 из 11
Поиск:

Storm Troopers © 2017