Есть такой FTP-сервер под названием "vsftpd". Софтинка весьма симпатичная. Работает хорошо, предсказуемо. Но вот что курил автор, когда придумывал логику и архитектуру своего детища, лично мне неведомо. В отличие от того же nginx, где с первых шагов знакомства хорошо прослеживается чёткая идеология, в случае с vsftpd всё очень "запущено". Что вкупе с путаной документацией очень сильно затрудняет понимание смысла тех или иных директив и многократно усложняет процесс настройки демона под свои задачи.
Возможно, нижеизложенные тезисы кому-то помогут развернуть FTP-сервер с наименьшими мучениями.
- Один и тот же термин "Анонимный пользователь" (anonymous) в контексте файла конфигурации (директив) и в контексте мануалов/документации обозначает две разные никак не связанные между собой сущности. Первого следует понимать как "непривилегированный", второго - как "не-предоставивший_пароль". Сколько же я шишек набил, пока до меня не дошло.
- Слово "Anonymous" в контексте документации означает пользователя без пароля, который заходит в систему с логинами "ftp" или "anonymous". Далее в этом псто - "беспарольный".
- Anonymous в контексте конфигурации и действия директив означает "имеет урезанные привилегии". Далее в этом псто - "лошара".
- По правам доступа демон делит всех своих клиентов на три типа: "локальный", "гость", "лошара".
- "Локальный" - это тот, чей логин имеется в системной базе данных пользователей и которому сопоставлен уникальный системный UID.
- "Гость", он же "виртуальный" - пользователь, у которого нет системного UID-а, но его персональные логин и пароль тем не менее существуют и успешно проходят проверку средствами PAM.
- "Лошара" - пользователь, у которого нет ни системного UID-а, ни персонального логина-пароля (см. выше).
- В зависимости от значения директивы "virtual_use_local_privs" пользователи типа "гость" квалифицируются либо как "локальные", либо как "лошары". Отдельной настройки прав доступа у пользователей типа "гость" (т.е. "виртуальных") нет.
- Директивы настройки прав доступа для пользователей типа "локальный" начинаются с "local_" либо содержат в себе слово "_local_".
- Директивы настройки прав доступа для пользователей типа "лошара" начинаются с "anon_" либо содержат в себе слово "_anon_".
- Сразу после авторизации удалённого клиента демон vsftpd форкается, после чего сбрасывает привилегии у процесса-потомка. Последний как раз и отвечает за механизмы доступа к файлам и их передачи. Эффективный UID процесса-потомка зависит от настроек и может принимать нижеследующие значения: системный UID конкретного пользователя если он относится к "локальному" типу, "guest_username" если он относится к "гостю" ("виртуальному" типу), "ftp_username" в случае захода "лошары" (смотри значения соответствующих директив в конфиге).
- До тех пор, пока пользователь (в том числе и "лошара") не залогинился в системе, он обслуживается потомком vsftpd с эффективным UID "nopriv_user".
- Под линуксом директива "chown_uploads" чуть менее чем полностью бесполезна, потому как ядро системы не позволит изменять владельца файла кому-либо помимо root-а. (Use set_gid on directory, Luke.)
- Из коробки vsftpd проеряет наличие корректного шелла у подключившегося пользователя. Это отключается в настройках PAM.
- Vsftpd последних версий откажется обслуживать пользователя, у которого есть права на запись в его "$HOME". Типа, "из соображений безопасности". Дико бесит.
- Автор программы не рекомендует (но технически допускает) chroot-ить (запирать в домашнем каталоге) пользователей "локального" типа и всех к ним приравненных. Тоже "из соображений безопасности". Попахивает паранойей, ага.
- Если нужно выдавать тот или иной уровень доступа в зависимости от IP-адреса клиента, нужно использовать tcp_wrappers.
- Если хочется сделать а-ля Virtual_Hosts с различной конфигурацией в зависимости от интерфейса подключения (а-ля "внешний-внутренний"), то вопрос тоже о tcp_wrappers.
- В качестве самого простого авторизационного PAM-бэкенда для виртуальных пользователей можно использовать "pam_pwdfile.so" (пакет "libpam-pwdfile" в Debian).
- Но при этом для генерации хешей паролей утилита "htpasswd" из комплекта поставки Apache2 не годится. Придётся самостоятельно ручками собирать из исходников специальную утилитку под названием "chpwdfile".
Как-то так. Поправки и дополнения приветствуются.