источник (ftp.wu-ftpd.org/pub, ftp.wu-ftpd.org/pub/wu-ftpd, ftp.wu-ftpd.org/pub/BeroFTPD, ftp.wu-ftpd.org/pub/support)
ftp://ftp.academ.com/pub/wu-ftpd - полуофициальное место, где его берут (там еще есть закрытая директория, из которой можно извлечь beta-версию) - разработка здесь уже закрыта
Параметры configure при установке (не все, а только полезные):
--with-etc-dir=PATH (по умолчанию - /etc, но лучше поставить /usr/local/etc/ftpd)
--disable-upload (не будет поддержки строки upload в ftpaccess)
--disable-overwrite (не будет поддержки строки overwrite в ftpaccess)
--disable-hostxs (не будет поддержки строк allow и deny в ftpaccess)
--disable-private (не будет поддержки site group/site gpass)
--enable-paranoid (отключить потенциально опасные функции: DELETE, SITE (umask, chmod, group, exec, newer), overwrite (put и rename), запрет доступа пользователям с неправильной домашней директорией)
--enable-quota (поддержка quota)--enable-quota
--enable-chmod (расширенная команда chmod: флаги t и x - надеюсь не понадобится)
--disable-rfc931 (обязательно отключить ident)
--disable-daemon (работать только через inetd)
--disable-throughput (не контролировать толщину потока)
--disable-count (не вести счетчики переданных байт и т.п.)
--enable-noop
--disable-log-rp (журнализовать относительные имена файлов, а не настоящие)
--disable-virtual
--disable-dns
--disable-port (запретить команду PORT)
--disable-pasv (запретить команду PASV)
--disable-plsm (не выдавать в журнал так достающие сообщения о lock sleep)
--disable-pasvip (не требовать совпадения управляющего соединения и соединения данных в режиме PASV; менее безопасно, но firewall будет счастливее)
--disable-anonymous
--enable-ls (внутренний ls, пока есть ошибки)
--disable-mail (отключить возможность посылки письма при загрузке файла)
--enable-badclients (обязательно, иначе половина клиентов не сможет работать; увы надо еще ручками добавлять define SUPPORT_BROKEN_CLIENTS в config.h после configure)
Процесс установки 2.6.0 для Solaris 2.5 и gcc 2.6.2
качаем архив и разтариваем его (создается директория wu-ftpd-2.6.0)
./configure с соответствующими параметрами
сервер под себя, чтобы можно было забирать файлы с компьютера
--with-etc-dir=/usr/local/etc/ftpd
--disable-upload
--disable-private
--enable-paranoid
--disable-rfc931
--disable-daemon
--disable-throughput
--enable-noop
--disable-virtual
--disable-plsm
--disable-anonymous
--disable-mail
--enable-badclients
сервер для себя и администраторов, временно: закачки домашних страниц клиентами и владельцами хостируемых доменов с локальных линий, ящики для обмена файлами для клиентов с локальных линий (группы: webadmin, webusers; пользователи: я, администраторы (только ftp?), webadmin (только ftp)
--with-etc-dir=/usr/local/etc/ftpd
--disable-private
--enable-quota (не компилируется extension.c)
--disable-rfc931
--disable-daemon
--disable-throughput
--enable-noop
--disable-virtual
--disable-plsm
--disable-anonymous
--disable-mail
--enable-badclients
который создает
Makefile (меняем /usr на /usr/local)
src/Makefile
support/Makefile (заменить gar на ar)
util/privatepw/Makefile (меняем /usr на /usr/local)
src/pathnames.h
config.h (define SUPPORT_BROKEN_CLIENTS)
src/config.h (define FACILITY LOG_LOCAL3, вместо DAEMON для перенаправления syslog)
добавляем /usr/ccs/bin в PATH и make
что-то сделать со старой версией (переименовать или удалить)
/usr/local/bin или sbin (ftpcount, ftpwho, ftpshut, ftprestart, in.ftpd/ftpd, ckconfig) - в разных версиях по-разному
директория с файлами конфигурации
возможно придется ручками создать директории (mkdir /usr/local/etc/ftpd)
make install (с правами root)
ftpusers
сервер под себя - все имена из passwd, кроме себя
сервер для себя и администраторов, временно: закачки домашних страниц - все имена из passwd, кроме себя, администраторов и клиентов с домашними страницами
ftphosts
сервер под себя - allow для себя с локальной сетки и диалапа
сервер для себя и администраторов, временно: закачки домашних страниц -прописать allow для каждого
ftpconversions - компрессия/декомпрессия, затаривание, затаривание с компрессией, выдача crc (заменить /bin на /usr/local/bin и убрать md5, которого в Solaris нет)
ftpgroups - должен отсутствовать
ftpaccess
сервер под себя
классы: LAN_real, dialup_real
предупреждение при входе, больше никаких сообщений
побольше журнализации (и на syslog)
deny-uid для всех и allow-uid только для себя (на всякий случай)
сервер для себя и администраторов, временно: закачки домашних страниц
классы: LAN_real, dialup_real, LAN_guest, dialup_guest, world_guest (при наличии неприкрытого squid-a, dialup ничем не отличается от LAN)
guestgroup все (все пользователи являются гостями; см. про гостевые группы)
realuser настоящие-пользователи (т.е. я и администраторы)
defumask 027
предупреждение при входе о назначении сервера (greeting и banner)
hostname, подходящий для самых частых посетителей
email ответственного за сервер
побольше журнализации (и на syslog). Сообщения о пересылках копировать на xferlog для локальной обработки.
разрешить tar и compress всем (на этом сервере нет больших архивов)
chmod/delete/overwrite/rename/umask - запретить для анонимных пользователей
chmod/umask - запретить для guest (пытаюсь навязать политику прав доступа)
ограничить номер порта, открываемого по команде PASV: passive ports 0.0.0.0/0 начало конец (интервал д.б. согласован с правилами firewall)
path-filter из примера для guest и anon (проверка имени файла на корректность)
запретить гостям запись кроме как в домашнюю директорию (для каждого отдельно)
deny-uid - запретить доступ всем, allow-uid - разрешить конкретным пользователям и группам
restricted-uid - запретить доступ всем (кроме себя и администраторов) вовне домашних директорий (глюк - не дает ничего делать в ПОДДИРЕКТОРИЯХ)
dns refuse_mismatch и dns refuse_no_reverse
если нужен анонимный доступ
гостевая группа (пользователи с реальными именами/паролями, но для которых производится chroot)
создать группу в /etc/group
создать пользователя (/etc/passwd и /etc/shadow)
в качестве shell указать /bin/true (внести его в /etc/shells)
имя домашней директории имеет вид:
путь для chroot
строка "/./"
домашняя поддиректория
директория, в которую делается chroot, должна
иметь права: "dr-xr-x--x"
принадлежать root:root
содержать (кроме домашних поддиректорий) тот же набор, что и для анонимного доступа (bin, dev, etc, usr)
bin (root:root:111)
ls (root:root:111)
dev (root:root:111)
tcp (root:sys:666) - char 11, 42
zero (root:sys:444) - char 13,12
etc (root:root:111)
passwd (root:root:444) - можно пустой
usr (root:root:111)
lib (root:root:111)
ld.so.1 (root:root:555)
libc.so.1
libdl.so.1
libintl.so.1
libw.so.1
local (root:root:111)
bin (root:root:111)
compress (root:root:111)
gzip (root:root:111)
tar (root:root:111)
share/lib/zoneinfo/Europe (root:root:111)
Moscow(root:root:444)
ftpservers - должен отсутствовать
проверяем конфигурацию /usr/local/sbin/ckconfig
в /etc/inetd.conf
ftp stream tcp nowait root /usr/local/sbin/in.ftpd in.ftpd -a -l -I -W
послать сигнал HUP процессу inetd (с правами root), чтобы перечитал inetd.conf
почистить /etc/group, /etc/passwd
Процесс установки 2.6.0/2.6.1 для RedHat Linux 6.0/6.2/7.0
качаем архив и разтариваем его (создается директория wu-ftpd-2.6.0)
./configure с соответствующими параметрами
полный доступ для себя, доступ к обихоженной части mirror для своих anonymous, upload в это место для mirror, ящик для входящих факсов (специальный пользователь fax, группа fax и имя хоста fax-holder); софт из нашей библиотеки для доступа к интернет /software/internet с возможностью изменений (специальный пользователь ftpadmin, группа ftpadmin)
--with-etc-dir=/usr/local/etc/ftpd
--disable-private
--disable-rfc931
--disable-daemon
--disable-throughput
--enable-noop
--disable-virtual
--disable-plsm
--enable-badclients
ftp/http сервер (специальный пользователь ftpadmin, группа ftpadmin; специальный пользователь webadmin, группа webadmin; владельцы сайтов, группа webusers)
--with-etc-dir=/usr/local/etc/ftpd
--disable-private
--disable-rfc931
--disable-daemon
--disable-throughput
--enable-noop
--disable-virtual
--disable-plsm
--enable-badclients
--enable-quota
который создает
Makefile (меняем /usr на /usr/local)
src/Makefile
support/Makefile
util/privatepw/Makefile (меняем /usr на /usr/local)
src/pathnames.h
config.h (define SUPPORT_BROKEN_CLIENTS)
src/config.h (define FACILITY LOG_LOCAL3, вместо FTP для перенаправления syslog, я бы оставил FTP, но Solaris этого не понимает)
make
сохранить старую версию (вместе с RHL 6.0 поставляется 2.5.0)
качнуть wu-ftpd...rpm на этот компьютер (так, на всякий случай ;)
полный доступ для себя, доступ к обихоженной части mirror для своих anonymous, upload в это место для mirror, ящик для входящих факсов
все имена из /etc/passwd, кроме себя, fax, ftpadmin и ftp
ftp/http сервер
все имена из /etc/passwd, кроме себя, webadmin, ftpadmin, держателей сайтов и ftp
ftphosts
полный доступ для себя, доступ к обихоженной части mirror для своих anonymous, upload в это место для mirror, ящик для входящих факсов
allow для себя, fax, ftpadmin и ftp с локальной сетки и диалапа
ftp/http сервер
allow для себя, ftpadmin, webadmin и владельцев сайтов с локальной сетки и диалапа; ftp - отовсюду
ftpconversions - компрессия/декомпрессия, затаривание, затаривание с компрессией, выдача crc, md5
ftpgroups - должен отсутствовать
ftpaccess
полный доступ для себя, доступ к обихоженной части mirror для своих anonymous, upload в это место для mirror, ящик для входящих факсов
классы: LAN_real, dialup_real, LAN_guest, dialup_guest, LAN_anon, dialup_anon (при наличии неприкрытого squid-a, dialup ничем не отличается от LAN)
guestgroup все-кроме-ftp (все пользователи - кроме анонимных - по умолчанию являются гостями; см. про гостевые группы)
realuser настоящие-пользователи (т.е. я)
defumask 027
предупреждение при входе о назначении сервера (greeting и banner)
hostname, подходящий для самых частых посетителей
email ответственного за сервер
отдельные message для отдельных классов пользователей с описанием что, где и как для выдачи при входе в систему и при переходах в некоторые директории (вместо стандартного .message выбрать какое-нибудь специфичное имя, чтобы не пересекаться с отмирроренными сайтами). readme в основном дублирует те же самые функции, но пусть пока будет.
побольше журнализации (и на syslog). Сообщения о пересылках копировать на xferlog для локальной обработки.
запретить tar и compress для анонимных пользователей (зрелище затаривания 2-гигабайтной директории неразумным клиентом меня раздражает)
chmod/delete/overwrite/rename/umask - запретить для анонимных пользователей
chmod/rename/umask - запретить для guest
ограничить номер порта, открываемого по команде PASV: passive ports 0.0.0.0/0 начало конец (интервал д.б. согласован с правилами firewall)
path-filter из примера для guest и anon (проверка имени файла на корректность)
запретить анонимным пользователям запись куда бы то ни было с помощью upload
запретить гостям запись кроме как в домашнюю директорию (для fax - без поддиректорий)
deny-uid - запретить доступ всем, allow-uid - разрешить конкретным пользователям (в т.ч. ftp)
restricted-uid - запретить доступ всем (кроме себя) вовне домашних директорий
dns refuse_mismatch и dns refuse_no_reverse
ftp/http сервер
классы: LAN_real, dialup_real, LAN_guest, dialup_guest, LAN_anon, dialup_anon, world_anon (при наличии неприкрытого squid-a, dialup ничем не отличается от LAN)
guestgroup все-кроме-ftp (все пользователи - кроме анонимных - по умолчанию являются гостями; см. про гостевые группы)
realuser настоящие-пользователи (т.е. я)
defumask 027
ограничить число внешних анонимных пользователей (не забыть файл с текстом сообщения)
предупреждение при входе о назначении сервера (greeting и banner)
hostname, подходящий для самых частых посетителей
email ответственного за сервер
отдельные message для отдельных классов пользователей с описанием что, где и как для выдачи при входе в систему
побольше журнализации (и на syslog). Сообщения о пересылках копировать на xferlog для локальной обработки.
разрешить tar и compress всем (на этом сервере нет больших архивов)
chmod/delete/overwrite/rename/umask - запретить для анонимных пользователей
chmod/umask - запретить для guest (пытаюсь навязать политику прав доступа)
ограничить номер порта, открываемого по команде PASV: passive ports 0.0.0.0/0 начало конец (интервал д.б. согласован с правилами firewall)
path-filter из примера для guest и anon (проверка имени файла на корректность)
запретить анонимным пользователям запись куда бы то ни было с помощью upload
запретить гостям запись кроме как в домашнюю директорию (для каждого отдельно)
deny-uid - запретить доступ всем, allow-uid - разрешить конкретным пользователям (в т.ч. ftp)
restricted-uid - запретить доступ всем (кроме себя) вовне домашних директорий
dns refuse_mismatch и dns refuse_no_reverse
если нужен анонимный доступ
заводится группа ftp (/etc/group)
заводится пользователь ftp (/etc/passwd). В качестве домашней директории указывается место, где будут лежать файлы, доступные анонимным пользователям. В это место будет делаться chroot, так что если предполагается делать линки, то это надо иметь в виду. Можно добавить в конец "/./pub", чтобы пользователь сразу попадал туда (некоторые клиенты этого не любят - MS IE). Поле пароля в /etc/shadow - забить.
Создать саму домашнюю директорию (root:root 551). MS IE ("мать, мать, мать" - привычно откликнулось эхо) пытается посмотреть листинг корневой директории и выдает пользователю пустой список файлов. Пришлось поменять права на 555, что слегка уменьшает безопасность, но делает любителей мелкомягких счастливее.
внутри нее
директория bin (и директория и файлы внутри с правами root:root 111): compress, cpio, gzip, ls, sh, tar, zcat (зачем нужны sh и cpio?)
директория etc (директория с правами root:root 111, файлы внутри root:root 444)
passwd, group - можно пустые
welcome*, banner*
ld.so.cache (root:root 644)
директория lib (root:root 111), для RH 6.2 - 2.1.3, для RH 7.0 - 2.2 вместо 2.1.1
для RH 6.2: libtermcap.so.2 -> libtermcap.so.2.0.8
директория pub (root:ftp dr-xr-sr-x)
внутренние поддиректории, заполняемые вручную, должны иметь те же права, что и pub
для каждого наполняющего автомата завести свою поддиректорию с необходимыми правами (hardlink на директории в ext2fs не работает). В любом случае директории должны иметь права на чтение и исполнение для пользователя ftp, файлы - только на чтение.
гостевая группа (пользователи с реальными именами/паролями, но для которых производится chroot)
создать группу в /etc/group
создать пользователя (/etc/passwd и /etc/shadow)
в качестве shell указать /bin/true (внести его в /etc/shells)
имя домашней директории имеет вид:
путь для chroot
строка "/./"
домашняя поддиректория
директория, в которую делается chroot, должна
иметь права: "dr-xr-x--x"
принадлежать root:root
содержать (кроме домашних поддиректорий) тот же набор, что и для анонимного доступа (bin, etc, lib)
ftpservers - должен отсутствовать
проверяем конфигурацию /usr/local/sbin/ckconfig
в /etc/inetd.conf (нужен ли tcpd на самом деле?)
ftp stream tcp nowait root /usr/sbin/tcpd /usr/local/sbin/in.ftpd -a -l -I -W (для RH 7.0: /etc/xinetd.d/wu-ftpd: stream,nowait,root,/usr/local/sbin/in.ftpd,-l -a -I -W)
/etc/pam.d/ftp (?)
послать сигнал HUP процессу inetd/xinetd (с правами root), чтобы перечитал inetd.conf/xinetd.conf
проделать дырки в защите для доступа с LAN, dialup и снаружи
Процесс установки wu-ftpd-2.4.2 для Solaris 2.5 и gcc 2.6.2
качаем архив (я извлек версию 2.4.2-beta-11)
разтариваем его (создается директория wu-ftpd-2.4.2-beta-11)
заходим в нее
сильно меняем src/pathnames.h (отключая условную компиляцию)
говорим (не забудь /usr/ccs/bin в список поиска) ./build sol
меняем в Makefile /usr/sbin на /usr/local/sbin, а /usr/share/man на /usr/local/man, а то уж очень неприлично получается (/usr/local/man/man1m должен существовать!).
под суперпользователем говорим ./build install
меняем /etc/inetd.conf, чтобы вызывался новый ftpd
ftp stream tcp nowait root /usr/local/sbin/in.ftpd in.ftpd -a
копируем doc/ftpaccess в /usr/local/wu-ftpd/etc/ftpaccess и правим:
class localreal real *.deol.ru 194.84.39.*
класс честных людей
class localanon anonymous *.deol.ru 194.84.39.*
местные конспираторы (в том числе и через PPP)
class remoteanon anonymous *
удаленные конспираторы
class allguest guest *
для наших дилеров псевдопользователь
guestgroup guest
где guest - это имя группы из /etc/group
в /etc/passwd заводим пользователя
dealer:x:401:600:ftp for dealer:/usr/local/wu-ftpd/home/./4dealers:/bin/true
заметьте выражение /./ - это необходимо: wu-ftpd делает какие-то заключения из этого
/bin/true вместо командного интерпретатора необходимо сами понимаете (не забудь добавить в /etc/shells)
директория 4dealers должна быть с правами:
dr-xrwx--- 2 dealer <имя группы администраторов>
внутри директорию upload с правами
drwxrwx--- dealesr <имя группы администраторов>
limit localreal -1 Any
себя не ограничиваем ни в чем
limit localanon 40 Any /usr/local/wu-ftpd/msgs/msg.local.dead
местных конспираторов не более 40 (не забудь создать файл сообщений)
limit remoteanon 10 Any /usr/local/wu-ftpd/msgs/msg.remote.dead
удаленных конспираторов не более 10 (не забудь создать файл сообщений)
limit allguest 10 Any /usr/local/wu-ftpd/msgs/msg.remote.dead
псевдопользователей (дилеров) не более 10
noretrieve core
не разрешать извлекать файлы с именем core
private no
я не понял зачем это надо, но на всякий случай выключил
banner /usr/local/wu-ftpd/msgs/banner
приветствие, выдаваемое перед вводом имени пользователя (можно разнести по виртуальным хостам)
readme README login
readme README cwd=*
информация о файле README (когда был создан и когда последний раз изменен) будет выдаваться при входе на сервер и при переходе в директорию
message /etc/welcome.msg login localanon remoteanon
при входе конспираторов им выдается сообщение (реальное имя файла /usr/local/wu-ftpd/home/etc/welcome.msg)
message /usr/local/wu-ftpd/home/etc/welcome.msg login localreal
тоже самое сообщение для честных людей
message .message cwd=*
при входе в директорию будет выдаваться файл .message
compress yes *
tar yes *
разрешать сжатие и затаривание всем (реальное описание процессов в файле /usr/local/wu-ftpd/etc/ftpconversions
log commands real,anonymous
все команды должны попадать в журнал, но я что-то не заметил их там
log transfers anonymous,real inbound,outbound
весь трафик должен попадать в журнал: /usr/local/wu-ftpd/xferlog, формат xferlog.5
сообщение по окончанию сеанса я отключил (где оно должно лежать?)
chmod no guest,anonymous
delete no guest,anonymous
overwrite no guest,anonymous
rename no guest,anonymous
umask no guest,anonymous
разрешать конспираторам подобные вещи - самоубийство
passwd-check rfc822 warn
делаем полную проверку формата адреса e-mail для конспираторов и ругаемся если что не так (запрещать вход нельзя, т.к. Netscape генерит адрес Mozilla@)
email [email protected]
почтовый адрес администратора: выдается в сообщения вместо %E (%T - локальное время, %F - свободное место в килобайтах, %C - текущая директория, %R - имя удаленного хоста, %L - имя локального хоста, %U - как себя назвал пользователь, %u - как показала перепроверка, %N - текущее число пользователь в данном классе, %M - макс. число пользователей в данном классе.
разобраться с path-filtr и upload
создаем файл /usr/local/wu-ftpd/etc/ftpusers и заносим в него все имена пользователей, которые есть в /etc/passwd, но которых мы не хотим видеть через ftp (root, uucp и др.)
создаем файл /usr/local/wu-ftpd/etc/ftphosts, в который можно занести для каждого пользователяадреса откуда ему можно заходить и откуда нет (сейчас пустой)
создаем файл /usr/local/wu-ftpd/etc/ftpconversions, который описывает преобразования, который ftp-сервер делает "на лету" (сжатие, затаривание)
файл /usr/local/wu-ftpd/etc/ftpgroups не создаю, т.к. не понимаю для чего эти группы нам нужны.
выполняем bin/ckconfig, чтобы проверить правильность конфигурирования (ух ты сколько сообщений...)
создаем группу ftp с помощью admintool (например, 400) и добавляем в нее члена ftp
создаем пользователя ftp с идентификатор (например, 400) из группы 400(ftp), комментарий: "Anonymous FTP", shell: /bin/true, password: account is locked, создать домашнюю директорию: /usr/local/wu-ftpd/home
директория /usr/local/wu-ftpd/home должна принадлежать суперпользователю и группе ftp, иметь права доступе 555
теперь создаем в ней вспомогательные файлы (все директории с правами 111, исполняемые файлы 111, тексты 444, кроме явно именованных):
bin/ls
dev/tcp - права 666 (mknod dev/tcp c 11 42 для Solaris)
dev/zero - права 444 (mknod dev/zero c 13 12 для Solaris)
etc/passwd - можно пустой
etc/group - можно пустой
etc/welcome.msg
usr/lib/ld.so.1 - права 555
usr/lib/libc.so.1 - права 555
usr/lib/libdl.so.1 - права 555
usr/lib/libintl.so.1 - права 555
usr/lib/libw.so.1 - права 555
usr/local/bin/compress
usr/local/bin/gzip
usr/local/bin/tar
usr/share/lib/zoneinfo/Europe/Moscow
не забудь про /etc/shells
теперь разберемся с pub (root ftp 2555), внутренние директории должны иметь те же права
создаем внутреннюю директорию pub/incoming (root ftp 733+t) - если надо - перед этим надо разобраться с директивами upload, path-filtr и научиться ограничивать размер
под суперпользователем
cd /usr/local/wu-ftpd/home
touch .forward;chmod 400 .forward
touch .rhosts;chmod 400 .rhosts
touch /usr/spool/mail/ftp; chmod 400 /usr/spool/mail/ftp (?)
Еще раз к вопросу о пассивном ftp : измени права к файлу ~ftp/dev/tcp с crw-rw-rw- на crw-rw-r-- и права на пассивный ftp (команда PASV - например, Microsoft Internet Explorer без нее не живет) будут иметь только пользователи из группы sys (а анонимные пользователи нет).
Программы, входящие в комплект
ftpd - собственно сервер (нужны -a -l -I -X -W)
-d или -v (записывать отладочную информацию на syslog)
-l (каждую сессию - кто и откуда зашел к нам - записывать на syslog, уровень info)
-t секунд (inactive timeout, по умолчанию - 900, может быть изменен клиентом)
-T секунд (максимальный inactive timeout)
-a (использовать ftpaccess)
-A (не использовать ftpaccess - по умолчанию)
-L (записывать все команды клиента на syslog, можно поменять в ftpaccess, уровень info)
-i (делать запись о полученных файлах в xferlog, можно поменять в ftpaccess)
-I (запрещает использовать протокол ident)
-o (делать запись о переданных файлах в xferlog, можно поменять в ftpaccess)
-X (делать записи о полученных и переданных файлах в syslog, а не xferlog; можно поменять в ftpaccess, уровень info)
-u umask (маска по умолчанию)
-w (записывать заходы в wtmp, по умолчанию)
-W (не записывать заходы в wtmp)
-s (запуск в самостоятельный полет, а не через inetd)
-S (запуск в самостоятельный полет, а не через inetd, отсоединиться от терминала)
-p порт (управляющий порт, по умолчанию ftp из /etc/services; при работе через inetd не используется)
-P порт (порт данных, по умолчанию ftp-data из /etc/services или на единицу меньше управляющего)
-q (по умолчанию, использовать файлы для хранения номеров процессов)
-Q (не использовать эти файлы; не будет работать ограничение на количество пользователей в классе)
-r rootdir (сделать chroot немедленно после запуска, не дожидаясь ввода имени пользователя; для параноиков)
ftpwho - показывает информацию о каждом клиенте (в Solaris 2.5 вызывает ps с неправильными параметрами)
ftpcount - показывает текущее и максимальное количество пользователей для каждого класса
ftpshut - аккуратное завершение работы ftp-серверов -l за-сколько-минут-запрещать-дальнейшие-соединения -dза-сколько-минут-разрывать-текущие-соединениявремя-завершения [ форматированное-сообщение ]
где время-завершения:
now
+минут - через сколько минут
HHMM - абсолютное время
ftprestart - разрешить запуск ftp-сервера, если он был завершен по ftpshut (удаляет записанные им сообщения о завершении работы)
имя пользователя д.б. в /etc/passwd (или как его там) и иметь непустой пароль и иметь стандартный shell, возвращаемый getusershell (/etc/shells)
это имя не д.б. указано в ftpusers
если клиент предъявляет имя anonymous или ftp, то д.б. пользователь ftp в /etc/passwd. Пароль в этом случае не проверяется. Сервер делает chroot в домашнюю директорию пользователя ftp.
Конфигурационные файлы (root:sys:600):
ftpservers - определяет набор файлов конфигурации для каждого виртуального сервера. Каждая строка описывает виртуальный сервер и содержит два поля:
имя/IP-адрес хоста
имя директории, содержащей файлы конфигурации. Имена файлов фиксированны: ftpaccess, ftpusers, ftpgroups, ftphosts, ftpconversions. Если определенный файл отсутствует, то используется соответствующий файл из конфигурации основного сервера (из той же директории, в которой лежит сам файл ftpservers).
ftpaccess
управление правами доступа
autogroup имя-группыкласс ...
если анонимный пользователь является членом одного из указанных классов, то сервер переходит в группу (из /etc/group) с указанным именем, что позволяет дать анонимным пользователям из разных классов доступ к различным директориям
class классtypelistшаблон-адресов ...
позволяет отнести клиента в указанный класс исходя из IP-адреса и типа клиента, где: typelist - список из ключевых слов anonymous (клиенты, зашедшие под именами ftp или anonymous), guest (гостевая группа) и real (зарегистрированные на локальном хосте - /etc/passwd) через запятую; шаблон-адресов - шаблон имени или адреса хоста клиента или адрес:маска или адрес/cidr или имя файла (должно начинаться со слеша и содержать шаблоны адресов); восклицательный знак перед шаблоном отрицает действие шаблона; несколько шаблонов в строке образует логическое ИЛИ.
Если клиент м.б. отнесен к нескольким классам, то используется первая строка class. Если клиента нельзя отнести ни к одному классу, то доступ запрещается.
deny шаблон-адресовфайл-с-текстом-сообщения
запретить доступ клиентов с указанного адреса с выдачей текста сообщения. В качестве шаблона м.б. указана строка !nameserved, что запрещает доступ с хостов, имя которых не определяется по адресу. Можно также указывать имя файла, начинающееся со слеша.
guestgroup имя-группы ...
если РЕАЛЬНЫЙ пользователь является членом указанной группы (из /etc/group), то с ним поступают так же как с анонимным (chroot, запрет на команды USER и PASS). Домашняя директория такого пользователя д.б. оформлена также как для анонимного доступа (строка делится на две части, разделяемые "/./", первая часть используется для chroot, вторая является его собственной директорией относительно нового корня). Вместо имени группы можно использовать номер, перед которым надо поставить процент, или интервал номеров или звездочку для всех групп.
guestuser имя-пользователя ...
аналогично guestgroup, но используется имя РЕАЛЬНОГО пользователя
realgroup имя-группы ...
ревертирует действие guestgroup и guestuser
realuser имя-пользователя ...
ревертирует действие guestgroup и guestuser
nice дельта [ класс ] - изменение приоритета процесса
defumaskumask [ класс ] - задание umask, применяемой при создании демоном файлов
tcpwindowбайт [ класс ] - для диалапных пользователей надо поменьше
keepalive { yes | no } - установить TCP SO_KEEPALIVE (и какой будет эффект?)
timeout accept секунд - сколько ждать входного соединения для передачи данных (PASV) (120)
timeout connect секунд - сколько ждать установления выходного соединения для передачи данных (PORT) (120)
timeout data секунд - максимальный период неактивности на соединении для передачи данных (1200)
timeout idle секунд - сколько ждать следующей команды (900)
timeout maxidle секунд - клиент имеет возможность установить idle самостоятельно. Maxidle устанавливает верхний предел для клиента (1200)
timeout RFC931 секунд - максимальное время ожидания ответа для протокола ident. Если 0, то не использовать ident вовсе (10).
file-limit [ raw ] { in | out | total } число [ класс ]
ограничить число передаваемых файлов. raw ограничивает число любых передач, а не только файлов данных (а какие еще бывают? оглавления?)
byte-limit [ raw ] { in | out | total } число [ класс ]
ограничить число передаваемых байт. raw ограничивает любые передачи, а не только файлов данных. Текущая операция не прерывается.
limit-time { * | anonymous | guest } минут
ограничение времени сессии. Реальные пользователи не ограничиваются никогда.
guestserver [ имя-серверного-хоста ]
гостевой и анонимный доступ предоставляется только к указанному хосту (хостам). Клиенту при неудачном доступе сообщается имя первого хоста, куда он может обратиться. Имеет смысл, если сервер обслуживает несколько виртуальных доменов.
limit классчисловременной-интервалимя-файла-с-сообщением
ограничение на число одновременно работающих клиентов из данного класса. Временной-интервал определяется как в UUCP (например Any или Mo 0900-1800). Проверка производится только в момент входа. Если к сеансу применимо несколько команд limit, то используется первая.
noretrieve [ absolute | relative ] { class=класс } имя-файла ...
запретить клиенту читать указанные файлы. Если имя начинается со слеша, то только этот файл, иначе любой файл с соответствующим именем. Если указана директория, то любой файл из этой директории или любой ее поддиректории. Можно также указывать шаблоны в стиле shell. По умолчанию имена воспринимаются как абсолютные (relative - относительно chroot).
loginfails число
после указанного числа неудачных попыток зайти на сервер делать запись в журнале и разрывать соединение (5)
private { yes | no }
Нестандартные команды SITE GROUP и SITE GPASS позволяют пользователю поменять текущую группу (д.б. перечислены в ftpgroups). Не понял: private - это разрешить менять группу или запретить?
выдача сообщений клиенту
greeting { full | brief | terse | textстрока }
какой текст будет выдаваться в строке приветствия:
full - имя хоста и версия сервера
brief - имя хоста
terse - ничего, кроме факта готовности к обслуживанию
text - произвольная строка текста
banner имя-файла
определяет текст сообщения, выдаваемого клиенту до ввода имени/пароля. Не совместим с клиентами, не умеющими обрабатывать многострочные сообщения. Имя файла - абсолютное.
hostname имя-хоста
определяет имя хоста по умолчанию (если не используется механизм виртуальных серверов), которое подставляется в приветствие и в строки вместо %L. По умолчанию - имя локального хоста.
email адрес
адрес администратора. Подставляется в строки вместо %E.
messageимя-файла { LOGIN | CWD=имя-директории { класс } }
содержимое файла выдается клиенту (однократно) при входе или смене директории. Имя файла - относительно chroot. Макроподстановки:
%T - местное время (Thu Nov 15 17:12:42 1990), без названия зоны. В 2.5.0/2.6.0 (RH Linux 6.0) иногда выдается GMT.
%F - свободное место в разделе (КБ). В 2.5.0/2.6.0 (RH Linux 6.0) не работает.
%C - текущая директория
%E - email адрес администратора
%R - имя удаленного хоста
%L - имя данного хоста
%u - имя пользователя, полученное от ident
%U - имя, указанное клиентом при регистрации
%M - максимальное число пользователей в данном классе
%N - текущее число пользователей в данном классе
%B - дисковых блоков. В 2.5.0/2.6.0 (RH Linux 6.0) не работает.
%b - предпочтительный предел числа дисковых блоков. В 2.5.0/2.6.0 (RH Linux 6.0) не работает.
%Q - текущее число блоков. В 2.5.0/2.6.0 (RH Linux 6.0) не работает.
%I - максимальное число inode-ов
%i - предпочтительный предел числа inode-ов
%q - текущее число inode-ов
%H - лимит времени на использование чрезмерного дискового пространства
%h - лимит времени на использование чрезмерного числа файлов
readmeимя-файла { LOGIN | CWD=имя-директории { класс } }
в соответствующий момент (при входе или смене директории) сервер информирует клиента (однократно) о наличии этого файла и когда он был создан/изменен. Имя файла - относительно chroot. Макроподстановки аналогично директиве message.
Журнализация
log commands список-типов
выводить в журнал все команды клиента, где список-типов - список через запятую слов real, guest и anonymous.
log transfers список-типовсписок-направлений
выводить в журнал пересылки файлов, где список-типов - список через запятую слов real, guest и anonymous; список-направлений - список через запятую слов incoming и outbound.
logsecurityсписок-типов
выводить в журнал нарушения правил безопасности, где список-типов - список через запятую слов real, guest и anonymous.
log syslog - перенаправлять сообщения о пересылках в syslog (уровень info) вместо файла xferlog.
log syslog+xferlog - направлять сообщения о пересылках в syslog и файл xferlog.
разное
alias строка имя-директории
позволяет переходить в данную директорию по команде "cd алиас" из любой директории. Имя относительное или абсолютное? Показывается ли оно в листинге?
cdpath имя-директории
добавляет директорию к cdpath, которая используется в качестве списка поиска для команды cd
compress { yes | no } шаблон-классов ...
разрешить/запретить компрессию/декомпрессию для классов, подпадающих под шаблон(ы) или слово all.
tar { yes | no } шаблон-классов ...
разрешить/запретить использование tar для классов, подпадающих под шаблон(ы) или слово all.
shutdown имя-управляющего-файла
файл содержит описание грядущей остановки сервера. Текущие пользователи извещаются, новые не принимаются и т.д. Можно использовать ftpshut для генерации этого файла.
passive address возвращаемый-ip-адресcidr-шаблон
если клиент выдает команду PASS, то сервер определяет вовращаемый адрес исходя из соответствия ip-адреса клиента cidr-шаблону. Прислушивается он к своему обычному адресу. Используется, если сервер находится позади firewall с NAT. firewall должен пропускать SYN-пакеты на указанные порты.
pasiveportscidr-шаблонminmax
определяется интервал портов, из которых сервер выбирает порт для прослушивания случайным образом и передает его номер клиенту
pasv-allow классшаблон-адресов
Обычно сервер после получения команды PASV разрешает соединяться только с того же адреса, что и управляющее соединение. Данная директива позволяет пользователям указанного класса соединяться не только с исходного адеса, но и с этих адресов.
port-allow классшаблон-адресов
Обычно сервер не позволяет указывать в команде PORT адреса, отличные от адреса управляющего соединения. Данная директива позволяет пользователям данного класса указывать в команде порт адрес, подходящий под шаблон.
lslong команда [ параметры ] - какую команду и параметры использовать для генерации листинга директории (пробелы в параметрах недопустимы).
lsshort команда [ параметры ] - какую команду и параметры использовать для генерации листинга директории (пробелы в параметрах недопустимы).
lsplain команда [ параметры ] - какую команду и параметры использовать для генерации листинга директории (пробелы в параметрах недопустимы).
incmail email-адрес
кого извещать в случае анонимного upload. Если указано несколько адресов, то каждый получит извещение.
mailserver имя-хоста
какой почтовый сервер использовать для рассылки сообщений об анонимном upload. Если указано несколько, то пробовать по очереди. По умолчанию - localhost.
mailfromemail-адрес
какой обратный адрес подставлять при рассылке сообщений об анонимном upload. По умолчанию - wu-ftpd.
виртуальные сервера (лучше использовать ftpservers)
daemonaddress ip-адрес - прислушиваться к соединениям только на этот адрес
virtualip-адрес { root | banner | logfile } имя-файла
определить соответственно: корень файловой системы, банерный файл и журнал для указанного виртуального сервера
virtualip-адрес { hostname | email } строка
определить имя хоста (показываемое в приветствии) и адрес администратора для указанного виртуального сервера
virtualip-адресincmail email-адрес
кого извещать в случае анонимного upload. Если указано несколько адресов, то каждый получит извещение.
virtualip-адресmailfromemail-адрес
какой обратный адрес подставлять при рассылке сообщений об анонимном upload. По умолчанию - wu-ftpd.
defaultserver { deny | allow } имя-пользователя ...
по умолчанию доступ разрешен всем. Вместо имени пользоваттеля можно указывать звездочку (т.е. для всех0
defaultserverprivate - закрыть анонимный доступ
defaultserverincmail email-адрес
кого извещать в случае анонимного upload. Если указано несколько адресов, то каждый получит извещение.
defaultservermailfromemail-адрес
какой обратный адрес подставлять при рассылке сообщений об анонимном upload. По умолчанию - wu-ftpd.
права доступа
{ chmod | delete | overwrite | rename | umask } { yes | no } список-типов
разрешить/запретить пользователям выполнять соответствующее действие. По умолчанию - все разрешено. Список-типов - список через запятую слов anonymous, guest, real или class=имя-класса.
passwd-check { none | trivial | rfc822 } ( { enforce | warn } )
уровень проверки правильности вводимых анонимными пользователями в качестве пароля email-адресов и реакция сервера в случае ошибки:
none - никакой проверки
trivial - строка д. содержать @
rfc822 - полная проверка
warn - если обнаружена ошибка, то выдавать предупреждение
enforce - если обнаружена ошибка, то не впускать
deny-email email-адрес
считать данный email-адрес неправильным
path-filterсписок-типовимя-файла-сообщенияшаблон-допустимых-именшаблон-недопустимых ...
когда пользователь типа из списка типов (слова real, guest и anonymous через запятую) пытается загрузить файл на сервер, то сервер проверяет что имя файла соответствует регулярному выражению, указанному в шаблоне-допустимых и не соответствует ни одному из регулярных выражений в шаблонах недопустимых. В противном случае выдается сообщение из файла.
upload [ absolute | relative ] [ class=имя-класса ]... [ - ] кореньшаблон-директории { yes | no } ownergroupmode [ dirs | nodirs ] [ dir_mode ]
определяет директории, в которые разрешено/запрещено записывать файлы пользователям из указанного класса. Все вновь создаваемые файлы будут иметь соответствующие права доступа и принадлежность. Выбирается самый длинный подходящий шаблон. dirs/nodirs разрешает/запрещает создание поддиректорий (по умолчанию - разрешено). Применяется только к пользователям, домашняя директория которых (chroot-ed) совпадает с корень (можно указывать звездочку). В качестве owner и/или group можно указывать звездочку. В этом случае владелец/группа вновь создаваемого файла наследуются от директории, в которой он создается. См. upload.configuration.HOWTO
throughput - позволяет задать скорость передачи определенных файлов (директорий) на определенные хосты (в т.ч. экспоненциальное уменьшение скорости для "навязчивых").
anonymous-root корень [ класс ] ...
Определяет корневую директорию (chroot) для анонимных пользователяй указанного класса и их домашнюю директорию (используется домашняя директория пользователя ftp в корень/etc/passwd) . Если класс не указан, то определяет корневую директорию для анонимных пользователей из всех прочих классов. Если и этого нет, то используется старый механизм (специальная форма записи домашней директории пользователя ftp в настоящем /etc/passwd).
guest-rootкорень [ интервал-uid ] ... корень определяет аргумент chroot для гостевых пользователей и их домашнюю директорию (используется домашняя директория пользователя в корень/etc/passwd) . Можно задавать отдельные uid (имена или номера со знаком процента перед ними) или интервалы через дефис (границы включаются, нижняя или верхняя гранцы могут быть опущены). Если uid опущен, то данная строка определяет корень для тех гостевых пользователей, для которых не нашлось более конкретного описания. Если guest-root вообще не задан, то используется старый метод (специальная форма записи домашней директории пользователя в настоящем /etc/passwd).
deny-uidинтервал ... deny-gidинтервал ... allow-uidинтервал ... allow-gidинтервал ...
Можно задавать отдельные uid (имена или номера со знаком процента перед ними) или интервалы через дефис (границы включаются, нижняя или верхняя границы могут быть опущены). Данная команда запрещает/разрешает доступ к серверу определенным пользователям и может использоваться вместо файла ftpusers. deny проверяется до allow и до любых других проверок. Нельзя смешивать uid и gid в одном конфигурационном файле.
restricted-uidинтервал ... restricted-gid интервал ... unrestricted-uidинтервал ... unrestricted-gidинтервал ...
Давать/не давать реальному или гостевому пользователю (на анонимных не действует) доступ вовне его домашней директории.
site-exec-max-linesчисло [ класс ] ...
ограничивает число строк посылаемых командой SITE EXEC (0 - без ограничений). По умолчанию - 20 строк.
dns refuse_mismatchфайл-с-сообщением [ override ]
выдавать сообщение, если прямой и обратный адреса клиента не совпадают. Если не указано override, то прекращать сеанс.
dns refuse_no_reverseфайл-с-сообщением [ override ]
выдавать сообщение, если клиент не имеет обратного адреса. Если не указано override, то прекращать сеанс.
dns resolveroptions [options]
флаги из resolver(3), без префикса RES_, предварюемые плюсом или минусом.
ftpconversions - каждая строка описывает возможное преобразование файлов "на лету" и состоит из 8 полей, разделенных двоеточиями (только одно преобразование при каждом запросе):
удаляемый префикс (не работает)
удаляемый суффикс
добавляемый префикс (не работает)
добавляемый суффикс
исполняемая при этом внешняя программа и ее параметры; вместо %s подставляется временное имя файла; должна работать как pipe; для Solaris поменять /bin на /usr/local/bin и убрать md5sum, которого нет :.Z: : :/usr/local/bin/compress -d -c %s:T_REG|T_ASCII:O_UNCOMPRESS:UNCOMPRESS
: : :.Z:/usr/local/bin/compress -c %s:T_REG:O_COMPRESS:COMPRESS
:.gz: : :/usr/local/bin/gzip -cd %s:T_REG|T_ASCII:O_UNCOMPRESS:GUNZIP
: : :.gz:/usr/local/bin/gzip -c %s:T_REG:O_COMPRESS:GZIP
: : :.tar:/usr/local/bin/tar -c -f - %s:T_REG|T_DIR:O_TAR:TAR
: : :.tar.Z:/usr/local/bin/tar -c -Z -f - %s:T_REG|T_DIR:O_COMPRESS|O_TAR:TAR+COMPRESS
: : :.tar.gz:/usr/local/bin/tar -c -z -f - %s:T_REG|T_DIR:O_COMPRESS|O_TAR:TAR+GZIP : : :.crc:/usr/local/bin/cksum %s:T_REG::CKSUM однако tar+gzip почему-то не работает (tar+compress работает!), рекоментации насчет --use-compress-programm не помогают
типы файла (входного или выходного) - по-моему путаница - T_REG (обычный файл), T_ASCII (текстовый), T_DIR (директория) или сочетание
опции - O_COMPRESS, O_UNCOMPRESS,O_TAR или сочетание
описание
ftpgroups - нестандартные команды SITE GROUP и SITE GPASS позволяют пользователю поменять текущую группу. Такие группы д.б. перечислены в ftpgroups: вводимое-клиентом-имя-группы:шифрованный-пароль:настоящее-имя-группы
ftphosts - ограничивает доступ под определенными именами пользователей с указанных хостов (по умолчанию: доступ открыт отовсюду). Формат: allowимя-пользователяшаблон-IP-адреса ... (доступ из других мест будет закрыт) denyимя-пользователяшаблон-IP-адреса ...
где шаблон-IP-адреса
IP-адрес
шаблон в формате shell
адрес/cidr
адрес:маска
ftpusers - список имен пользователей, которые есть в /etc/passwd, но которым не надо давать ftp-доступ.
Формат журнала xferlog (для режима syslog, уровень info)- нет дня недели и года:
сокращенное английское название дня недели (Sat); отсутствует для syslog
сокращенное английское название месяца (Dec)
день месяца
часы:минуты:секунды (время местное)
год (4 цифры); отсутствует для syslog, вместо него:
имя хоста, на котором расположен сервер
имя процесса и номер в квадратных скобках
xferlog
(send): или (recv):
продолжительность передачи в секундах
имя удаленного хоста
размер файла в байтах
имя файла (полное или относительно chroot)
тип передачи
a - ascii
b - binary
действие над файлом в процессе передачи
C - сжат
U - разжат
T - taer-ед
_- не было произведено никаких действий
направление передачи
o - с сервера
i - на сервер
тип пользователя
a - анонимный
g - guest
r - real (из /etc/passwd)
имя реального пользователя или идентификационная строка (вводимая вместо пароля) для анонимного или гостя
имя сервиса (ftp)
способ аутентификации
0 - никакой
1 - ident (rfc931)
аутентифицированный идентификатор пользователя. Если аутентификация не использовалась, то звездочка.
завершенность передачи
c - передача была закончена
i - не закончена
Поддерживаемые команды:
ABOR - прервать предыдущую команду (должна быть предварена сигналами telnet IP и Synch)
APPE - добавить к файлу
CDUP/XCUP - подняться на директорию вверх
CWD /XCWD- поменять текущую директорию
DELE
HELP
LIST (ls -lgA)
MKD /XMKD- создать директорию
MDTM - показать время последнего изменения файла
MODE - задать режим пересылки
NLST - ls
NOOP
PASS - задать пароль
PASV - вход в "пассивный" режим передачи
PORT - указать порт для последующей передачи
PWD/XPWD
QUIT
REST - продолжить прерванную ранее передачу
RETR - взять файл
RMD/XRMD - удалить директорию
RNFR - исходное имя переименовываемого файла
RNTO - новое имя переименовываемого файла
SITE - нестандартные команды
UMASK - задать umask
IDLE - задать inactive timeout
CHMOD
HELP
NEWER - показать список файлов более новых, чем указанная дата (по умолчанию выключено)
MINFO - аналогично NEWER, но выдает больше информации
GROUP - сменить группу
GPASS - предъявить пароль группы
EXEC - запустить программу
SIZE - показать размер файла
STAT - показать состояние сервера (Можно запрашивать в процессе передачи, предварив сигналами IP и Synch протокола telnet)
STOR - записать файл
STOU - записать файл с уникальным именем
STRU - задать структуру передачи
SYST - показать тип операционной системы, на которой работает сервер
TYPE - задать тип передачи
USER - задать имя пользователя
Изменения от 2.4.2-beta-11 до 2.6.0
улучшено соответствие с RFC. "Побочным" эффектом является невозможность работы с некоторыми клиентами (зависание после передачи первого же файла - и клиент и сервер ждут, кто же первый закроет соединение данных):
libwww (Lynx, SQUID, Midnight Commander)
mirror до и включая 2.9
Разработчики утверждают, что давится конфигурированием с ключом --enable-badclients. Увы... Надо еще после configure ручками добавлять define SUPPORT_BROKEN_CLIENTS в config.h
исправление ошибок, в частности:
отлавливается больше таймаутов по неактивности
усиление безопасности
email-on-upload feature from BeroFTPD
privatepw
управление timeout в ftpaccess
управление DNS в ftpaccess
управление PORT и PASV при несовпадении IP адресов с управляющим соединением
keepalive
журнализация через syslog: daemon (define FACILITY в src/config.h - LOCAL3)
byte-limit, file-limit, throughput, limit-time
множество улучшений в настройке
возможность работы в PASV позади NAT
отдельные корневые директории для различных классов анонимных и гостевых пользователей
SITE CHECKMETHOD [CRC|POSIX|MD5|RFC1321]
SITE CHECKSUM
New ftpconversions: .crc and .md5
noretrieve/allow-retrieve
QUOTA
ограничение доступа пользователей и/или групп только к их домашним директориям ("soft" chroot)
при обновлении файла его права и принадлежность не меняются