Bog BOS: FTP серверы (wu-ftpd)

Washington University at Saint Louis FTP daemon for Unix (wu-ftpd и BeroFTPD)

Ссылки:

Отличия 2.6.1 от 2.6.0

Комплект поставки wu-ftpd для RedHat Linux 6.0 (wu-ftpd-2.5.0-5.6.0.rpm):

Параметры configure при установке (не все, а только полезные):

Процесс установки 2.6.0 для Solaris 2.5 и gcc 2.6.2

Процесс установки 2.6.0/2.6.1 для RedHat Linux 6.0/6.2/7.0

  1. качаем архив и разтариваем его (создается директория wu-ftpd-2.6.0)
  2. ./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 этого не понимает)
  3. make
  4. сохранить старую версию (вместе с RHL 6.0 поставляется 2.5.0)
    • качнуть wu-ftpd...rpm на этот компьютер (так, на всякий случай ;)
    • переименовать в .old
      • /etc: ftpaccess, ftpconversions, ftpgroups, ftphosts, ftpusers
      • /usr/bin: ftpcount, ftpshut, ftpwho
      • /usr/sbin: xferstat, in.ftpd (пусть wu.ftpd и in.wuftpd ссылаются в никуда)
      • /usr/man/man1: ftpwho.1, ftpcount.1
      • /usr/man/man5: ftpaccess.5, ftpconversions.5, ftphosts.5, xferlog.5
      • /usr/man/man8: ftpd.8, ftpshut.8
      • /etc/logrotate.d/ftpd оставить как есть
      • /usr/doc/wu-ftpd-2.5.0 оставить как есть
      • /etc/pam.d/ftp: заменить /etc/ftpusers на /usr/local/etc/ftpd/ftpusers
  5. mkdir /usr/local/etc/ftpd
  6. make install (с правами root)
    • /usr/local/sbin: in.ftpd, ftpshut, ftprestart, ckconfig, privatepw
    • /usr/local/bin: ftpcount, ftpwho
    • /usr/local/man/man8: ftpd.8, ftpshut.8, ftprestart.8, privatepw.8
    • /usr/local/man/man1: ftpcount.1, ftpwho.1
    • /usr/local/man/man5: ftphosts.5, ftpaccess.5, ftpconversions.5, xferlog.5
    • /usr/local/etc/ftpd: ftpaccess, ftpconversions
  7. ftpusers
    • полный доступ для себя, доступ к обихоженной части mirror для своих anonymous, upload в это место для mirror, ящик для входящих факсов
      все имена из /etc/passwd, кроме себя, fax, ftpadmin и ftp
    • ftp/http сервер
      все имена из /etc/passwd, кроме себя, webadmin, ftpadmin, держателей сайтов и ftp
  8. ftphosts
    • полный доступ для себя, доступ к обихоженной части mirror для своих anonymous, upload в это место для mirror, ящик для входящих факсов
      allow для себя, fax, ftpadmin и ftp с локальной сетки и диалапа
    • ftp/http сервер
      allow для себя, ftpadmin, webadmin и владельцев сайтов с локальной сетки и диалапа; ftp - отовсюду
  9. ftpconversions - компрессия/декомпрессия, затаривание, затаривание с компрессией, выдача crc, md5
  10. ftpgroups - должен отсутствовать
  11. 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
  12. если нужен анонимный доступ
    • заводится группа 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
        • ld-2.1.1.so, libc-2.1.1.so, libnsl-2.1.1.so, libnss_files-2.1.1.so (root:root, 555)
        • для RH 6.2 дополнительно libtermcap.so.2.0.8
        • ld-linux.so.2 -> ld-2.1.1.so
        • libc.so.6 -> libc-2.1.1.so
        • libnsl.so.1 -> libnsl-2.1.1.so
        • libnss_files.so.2 -> libnss_files-2.1.1.so
        • для RH 6.2: libtermcap.so.2 -> libtermcap.so.2.0.8
      • директория pub (root:ftp dr-xr-sr-x)
        • внутренние поддиректории, заполняемые вручную, должны иметь те же права, что и pub
        • для каждого наполняющего автомата завести свою поддиректорию с необходимыми правами (hardlink на директории в ext2fs не работает). В любом случае директории должны иметь права на чтение и исполнение для пользователя ftp, файлы - только на чтение.
  13. гостевая группа (пользователи с реальными именами/паролями, но для которых производится chroot)
    • создать группу в /etc/group
    • создать пользователя (/etc/passwd и /etc/shadow)
      • в качестве shell указать /bin/true (внести его в /etc/shells)
      • имя домашней директории имеет вид:
        • путь для chroot
        • строка "/./"
        • домашняя поддиректория
    • директория, в которую делается chroot, должна
      • иметь права: "dr-xr-x--x"
      • принадлежать root:root
      • содержать (кроме домашних поддиректорий) тот же набор, что и для анонимного доступа (bin, etc, lib)
  14. ftpservers - должен отсутствовать
  15. проверяем конфигурацию /usr/local/sbin/ckconfig
  16. в /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)
  17. /etc/pam.d/ftp (?)
  18. послать сигнал HUP процессу inetd/xinetd (с правами root), чтобы перечитал inetd.conf/xinetd.conf
  19. проделать дырки в защите для доступа с LAN, dialup и снаружи

Процесс установки wu-ftpd-2.4.2 для Solaris 2.5 и gcc 2.6.2

  1. качаем архив (я извлек версию 2.4.2-beta-11)
  2. разтариваем его (создается директория wu-ftpd-2.4.2-beta-11)
  3. заходим в нее
  4. сильно меняем src/pathnames.h (отключая условную компиляцию)
    • #define _PATH_EXECPATH "/usr/local/wu-ftpd/ftp-exec"
    • #define _PATH_FTPUSERS "/usr/local/wu-ftpd/etc/ftpusers"
    • #define _PATH_FTPACCESS "/usr/local/wu-ftpd/etc/ftpaccess"
    • #define _PATH_CVT "/usr/local/wu-ftpd/etc/ftpconversions"
    • #define _PATH_PRIVATE "/usr/local/wu-ftpd/etc/ftpgroups"
    • #define _PATH_PIDNAMES "/var/tmp/ftp.pids-%s"
    • #define _PATH_XFERLOG "/usr/local/wu-ftpd/xferlog"
    • #define _PATH_FTPHOSTS "/usr/local/wu-ftpd/etc/ftphosts"
  5. говорим (не забудь /usr/ccs/bin в список поиска) ./build sol
  6. меняем в Makefile /usr/sbin на /usr/local/sbin, а /usr/share/man на /usr/local/man, а то уж очень неприлично получается (/usr/local/man/man1m должен существовать!).
  7. под суперпользователем говорим ./build install
  8. меняем /etc/inetd.conf, чтобы вызывался новый ftpd
    ftp stream tcp nowait root /usr/local/sbin/in.ftpd in.ftpd -a
  9. посылаем сигнал HUP процессу inetd (под суперпользователем), чтобы заново зачитал inetd.conf
  10. копируем 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 генерит адрес [email protected])
    • email [email protected]
      почтовый адрес администратора: выдается в сообщения вместо %E (%T - локальное время, %F - свободное место в килобайтах, %C - текущая директория, %R - имя удаленного хоста, %L - имя локального хоста, %U - как себя назвал пользователь, %u - как показала перепроверка, %N - текущее число пользователь в данном классе, %M - макс. число пользователей в данном классе.
    • разобраться с path-filtr и upload

  11. создаем файл /usr/local/wu-ftpd/etc/ftpusers и заносим в него все имена пользователей, которые есть в /etc/passwd, но которых мы не хотим видеть через ftp (root, uucp и др.)
  12. создаем файл /usr/local/wu-ftpd/etc/ftphosts, в который можно занести для каждого пользователяадреса откуда ему можно заходить и откуда нет (сейчас пустой)
  13. создаем файл /usr/local/wu-ftpd/etc/ftpconversions, который описывает преобразования, который ftp-сервер делает "на лету" (сжатие, затаривание)
  14. файл /usr/local/wu-ftpd/etc/ftpgroups не создаю, т.к. не понимаю для чего эти группы нам нужны.
  15. выполняем bin/ckconfig, чтобы проверить правильность конфигурирования (ух ты сколько сообщений...)
  16. создаем группу ftp с помощью admintool (например, 400) и добавляем в нее члена ftp
  17. создаем пользователя ftp с идентификатор (например, 400) из группы 400(ftp), комментарий: "Anonymous FTP", shell: /bin/true, password: account is locked, создать домашнюю директорию: /usr/local/wu-ftpd/home
  18. директория /usr/local/wu-ftpd/home должна принадлежать суперпользователю и группе ftp, иметь права доступе 555
  19. теперь создаем в ней вспомогательные файлы (все директории с правами 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
  20. не забудь про /etc/shells
  21. теперь разберемся с pub (root ftp 2555), внутренние директории должны иметь те же права
  22. создаем внутреннюю директорию pub/incoming (root ftp 733+t) - если надо - перед этим надо разобраться с директивами upload, path-filtr и научиться ограничивать размер
  23. под суперпользователем
    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 (?)
  24. монтировать NFS внутрь ~ftp только так:
    other:/u1/linux /home/ftp/pub/linux nfs ro,noquota,nosuid,intr,bg 1 0
  25. ну и самое интересное: заполнение pub

Еще раз к вопросу о пассивном ftp : измени права к файлу ~ftp/dev/tcp с crw-rw-rw- на crw-rw-r-- и права на пассивный ftp (команда PASV - например, Microsoft Internet Explorer без нее не живет) будут иметь только пользователи из группы sys (а анонимные пользователи нет).

Программы, входящие в комплект

Аутентификация пользователя:

  1. имя пользователя д.б. в /etc/passwd (или как его там) и иметь непустой пароль и иметь стандартный shell, возвращаемый getusershell (/etc/shells)
  2. это имя не д.б. указано в ftpusers
  3. если клиент предъявляет имя anonymous или ftp, то д.б. пользователь ftp в /etc/passwd. Пароль в этом случае не проверяется. Сервер делает chroot в домашнюю директорию пользователя ftp.

Конфигурационные файлы (root:sys:600):

Формат журнала xferlog (для режима syslog, уровень info)- нет дня недели и года:

  1. сокращенное английское название дня недели (Sat); отсутствует для syslog
  2. сокращенное английское название месяца (Dec)
  3. день месяца
  4. часы:минуты:секунды (время местное)
  5. год (4 цифры); отсутствует для syslog, вместо него:
    • имя хоста, на котором расположен сервер
    • имя процесса и номер в квадратных скобках
    • xferlog
    • (send): или (recv):
  6. продолжительность передачи в секундах
  7. имя удаленного хоста
  8. размер файла в байтах
  9. имя файла (полное или относительно chroot)
  10. тип передачи
    • a - ascii
    • b - binary
  11. действие над файлом в процессе передачи
    • C - сжат
    • U - разжат
    • T - taer-ед
    • _- не было произведено никаких действий
  12. направление передачи
    • o - с сервера
    • i - на сервер
  13. тип пользователя
    • a - анонимный
    • g - guest
    • r - real (из /etc/passwd)
  14. имя реального пользователя или идентификационная строка (вводимая вместо пароля) для анонимного или гостя
  15. имя сервиса (ftp)
  16. способ аутентификации
    • 0 - никакой
    • 1 - ident (rfc931)
  17. аутентифицированный идентификатор пользователя. Если аутентификация не использовалась, то звездочка.
  18. завершенность передачи
    • c - передача была закончена
    • i - не закончена

Поддерживаемые команды:

Изменения от 2.4.2-beta-11 до 2.6.0

Sergey E. Bogomolov