Глава 5. Проблемы с конфигурацией

1. Как мне добавить еще один анонимный логин или гостевой аккаунт?
2. Как мне установить ftp как корень?
3. Как мне приобрести надежное закачивающее устройство?
4. Как мне сделать так, чтобы мои пользователи не использовали свое пространство для пиратского архива данных warez
5. Могу я производить ротацию файлов в директории upload после закачивания в нее файлов?
6. Как мне спрятать директорию от анонимных клиентов.
7. У меня не работает опция "спрятать файл/директорию"!
8. Не хочу, чтобы пользователи получали доступ к спрятанным директориям
9. Как мне настроить виртуальный FTP сервер?
10. Хочу разрешить лишь анонимный доступ к виртуальному серверу.
11. Как работает <Limit LOGIN> и где мне его следует использовать?
12. Как мне ограничить доступ пользователей к конкретному дереву каталогов?
13. Как мне создавать личные анонимные FTP сайты для любых пользователей?
14. Я хочу поддерживать обычный и анонимный логины для определенных пользователей
15. Почему анонимный ftp не работает (550 неправильный логин - login incorrect)?
16. Контроль диапазона частот
17. CHMOD не работает
18. Как мне ограничить размеры закачиваемых файлов?
19. Могу ли я заблокировать анонимные логины?
20. Ограничение соединений через loginID
21. Как мне сконфигурировать proftpd для разрешения возобновления трансфера (для скачиваний и закачиваний)?
22. Когда нужно использовать директиву Bind?

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

Загляните в директорию примерные конфигурации (sample-configurations/) из вашего дистрибутивного tarball. В основном, вам необходимо создать еще одного пользователя в вашей системе для гостевого/анонимного ftp логина. По причинам сохранения безопасности, очень важно для вас проверить, что пользовательский аккаунт либо имеет пароль, либо имеет пароль, который невозможно подобрать. Корневая директория гостевого/анонимного аккаунта не обязательно должна быть директорией пользователя, но есть смысл сделать именно таким образом. После того, как вы создали аккаунт, запишите нечто подобное в свой файл /etc/proftpd.conf (учитывая то, что новое имя пользователя/группы - private/private):

<Anonymous ~private>
AnonRequirePassword off
User private
Group private
RequireValidShell off
<Directory *>
<Limit WRITE>
DenyAll
</Limit>
</Directory>
</Anonymous>
          

Это позволит клиентам ftp логиниться на вашем сайте с именем пользователя "private" и своим e-mail адресом в качестве пароля. Вы можете поменять AnonRequirePassword директиву на "on", если вы хотите, чтобы клиенты сообщали правильный пароль для "частного" аккаунта. Эта пробная конфигурация позволяет клиентам изменять info, просматривать и читать все директории, но запрещает любой доступ для записи.

Следующие отрывки из примерной файла конфигурации иллюстрируют, как защитить "загрузочную" ("upload") директорию (что очень эффективно, если вы не хотите, чтобы пользователи использовали ваш сайт в качестве материала для пиратства ("warez")) :

<Anonymous /home/ftp>
  # All files uploaded are set to username.usergroup ownership
  User username
  Group usergroup
  UserAlias ftp username
  AuthAliasOnly on
  RequireValidShell off

  <Directory pub/incoming/>
     <Limit STOR CWD>
        AllowAll
     </Limit>
     <Limit READ RMD DELE MKD>
        DenyAll
     </Limit>
  </Directory>
</Anonymous>
          

Это отменяет все письменные операции в анонимной корневой директории и под-директориях, за исключением директории "входящие" ("incoming/"), где как раз наоборот, клиент может хранить информацию, но ничего не считывать. Если вы воспользовались <Limit WRITE> вместо <Limit STOR> в <Directory incoming>, ftp клиентам будет разрешено выполнять все письменные операции в под-директории, включая удаление, переименование и создание директорий.

Директива <LOGIN> используется для контроля соединения или доступа к определенному контексту (блок директивы, который его содержит). Когда клиент изначально подсоединяется к ProFTPD, демон (daemon) ищет на дереве конфигурации <Limit LOGIN> директивы и прилагающиеся параметры (такие как Allow, Deny, etc). Если оказывается, что клиент не может получить доступ по каким-либо причинам, появится сообщение "Deny from", без "Allow from" на нижнем уровне, что означает прерывание соединения с клиентом, который в этом случае не имеет возможности передавать имя пользователя и пароль.

Однако, если клиент все же имеет возможность доступа, ProFTPD продолжает работу как обычно, позволяя клиенту логиниться только при указании правильного <Limit LOGIN>. Обычно блоки директивы <Limit> допустимы в server config, <VirtualHost>, <Anonymous> и <Directory> контекстах. Однако, <Limit LOGIN> не должен использоваться в <Directory> контексте, поскольку клиенты не подсоединяются/логинятся к директории (и следовательно, это бесполезно).

В качестве примера, следующие отрывки конфигурации иллюстрируют <Limit LOGIN> ограничение, которое приведет к тому, что любые входящие соединения 10.1.1.x подсети будут немедленно прерваны без предупреждения:

...
<Limit LOGIN>
Order deny,allow
Deny from 10.1.1.
Allow from all
</Limit>
...
          

Затем приведем пример конфигурации с <Limit LOGIN>, при которой соединение не будет сразу же прервано, а сначала вы получите сообщение "Неправильный логин" ("Login invalid") при любой попытке залогиниться (кроме анонимного логина).

...
<Limit LOGIN>
DenyAll
</Limit>
<Anonymous ~ftp>
...
<Limit LOGIN>
AllowAll
</Limit>
...
          

Для общего открытого доступа вы можете использовать контекстный блок директивы <Anonymous>, можно в комбинации с директивой UserPassword/AnonRequirePassword.

Однако, если вы хотите лишить доступа целую группу (или несколько групп) пользователей, вы можете использовать директиву DefaultRoot . DefaultRoot позволяет указать ту директорию, куда будет заключена новая корневая директория (или знак "~", который используется для указания того, что корневыми будут домашние директории пользователей), и дополнительно может быть использован аргумент группового-выражения, с помощью которого можно управлять группами пользователей, для которых необходимо использовать операцию chroot(jail). Например:

...
<VirtualHost myhost.mynet.foo>
DefaultRoot ~
...
</VirtualHost>
          

Это приведет к созданию конфигурации, где все пользователи, которые логинятся на myhost.mynet.foo, "запираются" в своих домашних директориях (т.е. не могут подниматься на более высокие уровни каталога, директории). Также, вы можете:

...
<VirtualHost myhost.mynet.foo>
DefaultRoot /u2/public users,!staff
...
</VirtualHost>
          

В данном примере все пользователи, которые входят в группу "пользователи" ("users"), не входящие в группу "персонал" ("staff"), "запираются" в /u2/public. Если пользователь не соответствует group-expression requirements, он логинится как обычный пользователь (их дом по умолчанию - "незапертая" директория). Вы можете использовать множественные DefaultRoot директивы для создания многочисленных "замков" внутри контекста той же директивы. Если две DefaultRoot директивы применяются к одному пользователю, ProFTPD произвольно выбирает одну из них (основываясь на том, как был проанализирован файл конфигурации).

Использование системы безопасности

Директива DefaultRoot вводится при помощи системного вызова chroot(2). Таким образом, это перемещает "/" (или корневую) директорию в особое место в файловой системе и "запирает" пользователя в этом под-дереве. Однако, даже это не дает нам полной уверенности в безопасности, "замок" chroot может быть взломан, что совсем непросто, но не невозможно. DefaultRoot должен использоваться как часть общей системы безопасности, а не как одна из мер.

Более детально http://www.bpfh.net/simes/computing/chroot-break.html на эту тему и по поводу взлома chroot "замков" писал Simon Burr

Некорневые разделы сервера

Системный вызов chroot() не будет работать при некорневом ftp сервере, для вызова необходимы корневые привилегии. Без них он просто не работает, не происходит проверки кода uid/gid перед вызовом chroot, поэтому использование DefaultRoot с такими настройками приведет к сбою в работе сервера.

Символьные линки (Symlinks)

Symlinks не будут работать из chrooted области. Причина должна быть понятна после краткого осмотра chroot команды. Невозможно иметь символьный линк к директории, которая является недостижимой, потому что она находится вне текущего chroot. Для того, чтобы получить доступ к другим частям файловой системы, необходимо экспортировать нужную часть системы файлов так, чтобы к ней был доступ из chroot, и смонтировать ее через NFS, используя линки жесткого файла или (на Solaris) lofs для создания директории через loopback.

mount -Flofs /home/data1 /ftp/data1
mount -Flofs /home/data2 /ftp/data2
          

Что касается базового дерева 2.4.x Linux, то здесь есть возможность создавать системы файлов множество раз и создавать под-директории файловых систем в любом месте системы файлов.

Существует по крайней мере два способа. Во-первых, вы можете создать структуру директории внутри вашей анонимной корневой директории FTP, создав отдельную директорию для каждого пользователя и соответственно настроив право собственности/ другие права. Затем, либо создайте symlink из домашней директории каждого пользователя на сайт FTP, либо проинструктируйте ваших пользователей по поводу того, как получить доступ к этой директории.

Другой способ (кстати, более универсальный) создания анонимного FTP для каждого пользователя FTP - это использовать команду AnonymousGroup в сочетании с DefaultRoot директорией. Возможно, вам захочется сделать это внутри <VirtualHost>, в противном случае ни один из ваших пользователей не сможет получить доступ к вашей системе без зависания на своем FTP сайте. Вдобавок к этому, вам потребуется использовать задержанный блок <Directory>, чтобы ограничить доступ извне к сайту каждого пользователя.

  1. Создайте в вашей системе новую unix группу под именем `anonftp". Пожалуйста, включите в эту группу всех пользователей, имеющих свой анонимный FTP.

  2. Создайте директории `anon-ftp" и `anon-ftp/incoming" в домашней директории каждого пользователя.

  3. Модифицируйте ваш /etc/proftpd.conf файл, чтобы он выглядел примерно следующим образом (возможно, вам захочется переделать его для ваших нужд):

     <VirtualHost my.per-user.virtual.host.address>
     
     # следующая строка ограничивает все логины к данному виртуальному хосту, чтобы могли коннектиться только anonftp пользователи 
     
     <Limit LOGIN>
     DenyGroup !anonftp
     </Limit>
     
     # ограничить доступ любому пользователю в корневую директорию анонимного пользователя (anon-ftp directory), мы хотим предоставить 
     только возможность чтения пользователям, зашедшим в архив анонимно, за исключением директории incoming
     
     <Directory ~/anon-ftp>
     
     <Limit WRITE>
     DenyAll
     </Limit>
     
     </Directory>
     
     # позволяет сохранить доступ к директории anon-ftp/incoming каждого пользователя, но запрещает все другие операции
     
     <Directory ~/anon-ftp/incoming>
     
     <Limit STOR>
     AllowAll
     </Limit>
     <Limit READ WRITE>
     DenyAll
     </Limit>
     
     </Directory>
     
     # предусматривает корень по умолчанию для всех логинов к этому виртуальному хосту.
     DefaultRoot ~/anon-ftp
     # И наконец, сделайте все логины анонимными для anonftp группы
     AnonymousGroup anonftp
     
     </VirtualHost>
                  

Вы можете использовать директиву AuthAliasOnly для того, чтобы контролировать, как и где определяются реальные имена пользователей (в отличие от псевдонимов, посредством директивы UserAlias). Обратите внимание, что все еще невозможно иметь два идентичных псевдонима для логина к разным анонимным сайтам; для чего вам понадобится <VirtualHost>.

Example:

...
<Anonymous ~jrluser>

 User jrluser
 Group jrluser
 UserAlias ftp jrluser
 UserAlias anonymous jrluser
 AuthAliasOnly on
 ...
 
</Anonymous>
          

Здесь, конфигурация <Anonymous> для ~jrluser настроена так, чтобы позволить только аутентификацию псевдонима. Таким образом, если клиент пытается идентифицироваться как "jrluser", анонимная конфигурация будет проигнорирована и клиент будет идентифицирован как обычный пользователь (естественно, `jrluser" сможет логиниться как обычный пользователь). Однако, если клиент использует псевдоним `ftp" или `anonymous", применяется блок anonymous.

Что проверить

Проверьте прежде всего следующее:

  • Убедитесь в том, что пользователь/группа, которые вы указали в <Anonymous> блоке, действительно существует. Это должны быть реально существующие пользователь и группа, как это используется для контроля того, что запускает daemon и как это аутентифицируется

  • Если RequireValidShell специально не выключен, убедитесь, что ваш "ftp user" (как указано в User директиве в <Anonymous> блоке), имеет верный командный процессор (shell), указанный в /etc/shells. Если вы не хотите выдавать пользователю верный shell, вы всегда можете воспользоваться "RequireValidShell off" для отключения данной проверки.

  • Если UseFtpUsers специально не выключен, убедитесь, что ваш "ftp user" не указан в списке /etc/ftpusers.

Если все остальное не работает, вам необходимо проверить ваш системный журнал (syslog). Когда по какой-либо причине аутентификация не удастся, ProFTPD использует механизм syslog для того, чтобы зарегистрировать причину неполадки; это производится при помощи AUTH (или AUTHPRIV) функции. Если вам нужна дальнейшая помощь, вы можете послать email, включив в него syslog отрывки, связанные с интересующим вас вопросом, а также ваш файл конфигурации, на лист рассылки ProFTPD, указанный в данном FAQ.