klink0v (klink0v) wrote,
klink0v
klink0v

Про vsftpd

Есть такой FTP-сервер под названием "vsftpd". Софтинка весьма симпатичная. Работает хорошо, предсказуемо. Но вот что курил автор, когда придумывал логику и архитектуру своего детища, лично мне неведомо. В отличие от того же nginx, где с первых шагов знакомства хорошо прослеживается чёткая идеология, в случае с vsftpd всё очень "запущено". Что вкупе с путаной документацией очень сильно затрудняет понимание смысла тех или иных директив и многократно усложняет процесс настройки демона под свои задачи.

Возможно, нижеизложенные тезисы кому-то помогут развернуть FTP-сервер с наименьшими мучениями.


  1. Один и тот же термин "Анонимный пользователь" (anonymous) в контексте файла конфигурации (директив) и в контексте мануалов/документации обозначает две разные никак не связанные между собой сущности. Первого следует понимать как "непривилегированный", второго - как "не-предоставивший_пароль". Сколько же я шишек набил, пока до меня не дошло.

  2. Слово "Anonymous" в контексте документации означает пользователя без пароля, который заходит в систему с логинами "ftp" или "anonymous". Далее в этом псто - "беспарольный".

  3. Anonymous в контексте конфигурации и действия директив означает "имеет урезанные привилегии". Далее в этом псто - "лошара".

  4. По правам доступа демон делит всех своих клиентов на три типа: "локальный", "гость", "лошара".

  5. "Локальный" - это тот, чей логин имеется в системной базе данных пользователей и которому сопоставлен уникальный системный UID.

  6. "Гость", он же "виртуальный" - пользователь, у которого нет системного UID-а, но его персональные логин и пароль тем не менее существуют и успешно проходят проверку средствами PAM.

  7. "Лошара" - пользователь, у которого нет ни системного UID-а, ни персонального логина-пароля (см. выше).

  8. В зависимости от значения директивы "virtual_use_local_privs" пользователи типа "гость" квалифицируются либо как "локальные", либо как "лошары". Отдельной настройки прав доступа у пользователей типа "гость" (т.е. "виртуальных") нет.

  9. Директивы настройки прав доступа для пользователей типа "локальный" начинаются с "local_" либо содержат в себе слово "_local_".

  10. Директивы настройки прав доступа для пользователей типа "лошара" начинаются с "anon_" либо содержат в себе слово "_anon_".

  11. Сразу после авторизации удалённого клиента демон vsftpd форкается, после чего сбрасывает привилегии у процесса-потомка. Последний как раз и отвечает за механизмы доступа к файлам и их передачи. Эффективный UID процесса-потомка зависит от настроек и может принимать нижеследующие значения: системный UID конкретного пользователя если он относится к "локальному" типу, "guest_username" если он относится к "гостю" ("виртуальному" типу), "ftp_username" в случае захода "лошары" (смотри значения соответствующих директив в конфиге).

  12. До тех пор, пока пользователь (в том числе и "лошара") не залогинился в системе, он обслуживается потомком vsftpd с эффективным UID "nopriv_user".

  13. Под линуксом директива "chown_uploads" чуть менее чем полностью бесполезна, потому как ядро системы не позволит изменять владельца файла кому-либо помимо root-а. (Use set_gid on directory, Luke.)

  14. Из коробки vsftpd проеряет наличие корректного шелла у подключившегося пользователя. Это отключается в настройках PAM.

  15. Vsftpd последних версий откажется обслуживать пользователя, у которого есть права на запись в его "$HOME". Типа, "из соображений безопасности". Дико бесит.

  16. Автор программы не рекомендует (но технически допускает) chroot-ить (запирать в домашнем каталоге) пользователей "локального" типа и всех к ним приравненных. Тоже "из соображений безопасности". Попахивает паранойей, ага.

  17. Если нужно выдавать тот или иной уровень доступа в зависимости от IP-адреса клиента, нужно использовать tcp_wrappers.

  18. Если хочется сделать а-ля Virtual_Hosts с различной конфигурацией в зависимости от интерфейса подключения (а-ля "внешний-внутренний"), то вопрос тоже о tcp_wrappers.

  19. В качестве самого простого авторизационного PAM-бэкенда для виртуальных пользователей можно использовать "pam_pwdfile.so" (пакет "libpam-pwdfile" в Debian).

  20. Но при этом для генерации хешей паролей утилита "htpasswd" из комплекта поставки Apache2 не годится. Придётся самостоятельно ручками собирать из исходников специальную утилитку под названием "chpwdfile".

Как-то так. Поправки и дополнения приветствуются.

Tags: ftp, linux, администрирование
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 2 comments