On-Line Библиотека www.XServer.ru - учебники, книги, статьи, документация, нормативная литература.
       Главная         В избранное         Контакты        Карта сайта   
    Навигация XServer.ru








 

Общие принципы установки анонимных FTP серверов

  1. Создайте пользователя ftp в /etc/passwd. Он может принадлежать к любой группе, например arhciv (если группа не определена то пропишите ее в файле /etc/group). Домашний каталог должен быть ~ftp, где ~ftp это полный путь к каталогу, который будет "корневым", для всех публичных (anonymous) пользователей. Создание этого пользователя "запускает" публичный FTP сервер.

    Используйте неправильный пароль и shell для этого пользователя. Строка из passwd файла для этого пользователя должна быть подобной этой:

      ftp:*:400:400:Anonymous FTP:/var/www/ftp:/bin/true
    • Создайте каталог ~ftp. Владельцем каталога должен быть root (но не ftp), группа таже, что и у пользователя ftp (например коммандой chown root.archiv ftp). Таким образом права доступа "владельца" принадлежат root, а групповие права принадлежат всем остальным пользователям. Установите права доступа к каталогу ~ftp в 0555 (например коммандой chmod 555 ftp)

      Внимание: В некоторых описания рекомендуют делать владельцем каталога ~ftp пользователя ftp. Если вы хотите спать спокойно то НИКОГДА НЕ ДЕЛАЙТЕ ЭТОГО!.

       

    • Создайте каталог ~ftp/bin. Владелец каталога root, группа wheel. Права доступа 0111 (noread, nowrite, execute).

       

    • Скопируйте программу ls в каталог ~ftp/bin. Назначте владельцем для ls - root. Права доступа 0111 (noread, nowrite, execute). Если вы будете записывать в этот каталог еще программы, то права доступа и владельца назначайте точно также как и для ls.

       

    • Создайте каталог ~ftp/etc. Владелец каталога root, группа wheel. Права доступа 0111 (noread, nowrite, execute).

       

    • Создайте в каталоге ~ftp/etc усеченные версии файлов подобные /etc/passwd и /etc/group. Права доступа к файлам должны быть 0444. В файле ~/ftp/etc/passwd должны быть описаны только пользователи root, daemon, uucp и ftp. Файл ~/ftp/etc/group должен содержать описание группы к которой принадлежит пользователь ftp. Также в файле ~/ftp/etc/passwd вы можете создать описание пользователей, чьи файлы будут находиться в каталогах сервера (это нужно для команды ls). Например, для всех файлов в каталоге ~ftp/pub/linux владельцем является 'balon' c UID=156, в этом случае вы можете записать в ~ftp/etc/passwd файл следующее:
        linux:*:156:120:Kazik Balon::
        Незабудьте удалить из файла ~ftp/etc/passwd *ВСЕ* пароли, записав вместо них символ '*'.
          root:*:0:0:Ftp maintainer::
          ftp:*:400:400: Anonymous ftp::
          Для большей безопасности вы можете вообще не создавать в каталоге ~ftp/etc файлы, passwd и group. В этом случае команда ls не будет показывать имена владельцев и групп файлов. Но учтите, что некоторые из FTP демонов могут использовать информацию из passwd и group файлов в других целях.

           

        • Создайте каталог ~ftp/pub. Сделайте владельцем каталога себя и назначте группу туже, что и пользователя ftp. Права доступа к каталогу должны быть 0555.

          Файли размещенные в этом каталоге будут доступны по чтению для всех "публичных" пользователей. Все каталоги в ~ftp/pub должны иметь права доступа 0555.

          Внимание: Никакие каталоги, подкаталоги или файлы размещенные в каталоге ~ftp не должни принадлежать пользовалелю ftp. Некоторые современные FTP демоны позволяют изменять владельлев файлов и каталогов с помощью команд подобных chown. Это можно запретить в файле конфигурации FTP сервера. Например, для WuFTP вы можете в его файле конфигурации указать следующее:


          # all the following default to "yes" for everybody

          delete          no      guest,anonymous         # delete permission?

          overwrite       no      guest,anonymous         # overwrite permission?

          rename          no      guest,anonymous         # rename permission?

          chmod           no      anonymous               # chmod permission?

          umask           no      anonymous               # umask permission?

           

        • Если вы ходите дать возможность анонимным пользователям записивать файлы на ваш сервер, создайте каталог ~ftp/pub/incoming. Этот каталог должен принадлежать root и иметь права доступа 733. И виполните команду chmod +t ~ftp/pub/incoming. FTP демон обычно не позволяет анонимным пользователям перезаписывать файлы , но обыкновенный пользователь системы может удалить их. Установка прав доступа в 1733 запрещает это. Ниже приведена часть файла конфигурации FTP демона управляющая процессом загрузки файлов на сервер.


          # specify the upload directory information



          upload  /var/spool/ftp  *       no

          upload  /var/spool/ftp  /incoming       yes     ftp     staff   0600    nodirs



          # path filters



          path-filter  anonymous  /etc/msgs/pathmsg  ^[-A-Za-z0-9_\.]*$  ^\.  ^-

          path-filter  guest      /etc/msgs/pathmsg  ^[-A-Za-z0-9_\.]*$  ^\.  ^-

          Здесь запрещена загрузка (upload) файлов во все каталоги сервера, но потом она разрешается для каталога /incoming причем владельцем файлов будет ftp а права доступа 0600.

          Рекомендация: создавайте всю структуру FTP сервера (или только каталог incoming) в другом дисковом разделе. Это поможет предотвратить преднамеренное заполнение всего вашего системного диска всяким мусором.

          Если вы используете WuFTP то вы можете сконфигурировать некоторые дополнительные функции, Например, ахивация/разархивация файлов 'на лету', или создание tar файла с иерархией каталогов. Для этого вам необходимо получить исходные тексты утилит gzip, gnutar, compress м скомпилировать их без использования динамических библиотек. Потом разместите эти файлы в каталог ~ftp/bin и отредактируйте файл /etc/ftpconversions чтобы разрешить эти операции.

          Gary Mills написал небольшую программы реализующую следующее:

          Для выполнения комманд tar и compress, он написал небольшую программу pipe, и скомпилировал без использования динамических библиотек. Его файл /etc/ftpconversions выглядит так:


          #strip prefix:strip postfix:addon prefix:addon postfix:external command:types:options:description



          :.Z:  :  :/bin/compress -d -c %s:T_REG|T_ASCII:O_UNCOMPRESS:UNCOMPRESS

          :-z:  :  :/bin/compress -d -c %s:T_REG|T_ASCII:O_UNCOMPRESS:UNCOMPRESS

          :  :  :.Z:/bin/compress -c %s:T_REG:O_COMPRESS:COMPRESS

          :  :  :.tar:/bin/tar cf - %s:T_REG|T_DIR:O_TAR:TAR

          :  :  :.tar.Z:/bin/pipe /bin/tar cf - %s | /bin/compress -c:T_REG|T_DIR:O_COMPRESS|O_TAR:TAR+COMPRESS

          :  :  :.tar:/bin/gtar -c -f - %s:T_REG|T_DIR:O_TAR:TAR

          :  :  :.tar.Z:/bin/gtar -c -Z -f - %s:T_REG|T_DIR:O_COMPRESS|O_TAR:TAR+COMPRESS

          :  :  :.tar.gz:/bin/gtar -c -z -f - %s:T_REG|T_DIR:O_COMPRESS|O_TAR:TAR+GZIP



          А здесь сама программа:

          -------- CUT HERE ------------




          /* pipe.c: exec two commands in a pipe */

          #define NULL (char *)0

          #define MAXA 16



          main(argc, argv) int argc; char *argv[]; {

          char *av1[MAXA], *av2[MAXA];

          int i, n, p[2], cpid;                                                      



          i = 0; n = 0;

          while ( ++i < argc && n < MAXA ) {

            if ( *argv[i] == '|' && *(argv[i]+1) == '\0' ) break;

            av1[n++] = argv[i];

          }

          if ( n == 0 ) uexit();

          av1[n] = NULL;

          n = 0;

          while ( ++i < argc && n < MAXA )

          av2[n++] = argv[i];

          if ( n == 0 ) uexit();

          av2[n] = NULL;

          if ( pipe(p) != 0 ) exit(1);

          if ( ( cpid = fork() ) == (-1) ) exit(1);

          else if ( cpid == 0 ) {

            (void)close(p[0]);

            (void)close(1);

            (void)dup(p[1]);

            (void)close(p[1]);

            (void)execv(av1[0], av1);

            _exit(127);

          } else {

            (void)close(p[1]);

            (void)close(0);

            (void)dup(p[0]);

            (void)close(p[0]);

            (void)execv(av2[0], av2);

            _exit(127);                                                            

          }



          /*NOTREACHED*/



          }



          uexit() {

          (void)write(2, "Usage: pipe <command> | <command>\n", 34);

          exit(1);

          }



          -------- CUT HERE ------------

           

        • И еще некоторые вещи, которые не помешало бы сделать:

          как root выполнить следующие комманды:

            touch ~ftp/.rhosts
            touch ~ftp/.forward
            chmod 400 ~ftp/.rhosts
            chmod 400 ~ftp/.forward
            тоесть создать файлы .forward и .rhosts нулевой длинны с вдадельцем root и правами доступа 400.

            Если вы в каталог ~ftp или его подкаталоги монтируете диски с других машин, то устанавливайте для них режим read-only (только чтение). Вот пример записи для файла /etc/fstab для машины с запушенным ftp сервером:

              other:/u1/linux /var/www/ftp/pub/linux nfs ro,noquota,nosuid,intr,bg 1 0
              По этой записи смотнируется в каталог /var/www/ftp/pub/linux диск с машины 'other' без дисковой квоты (noquota), без поддержки suid программ, "прерываемым" - на случай если хост 'other' не работает.
Содержание       Вперёд