Виртуальные ftp-сервера
Доступ к виртуальному ftp-серверу (далее просто сервер) осуществляется по протоколу ftp и адресу ftp.domain_name, где domain_name - имя базового домена, к которому привязана услуга ftp-сервера.
Для работы с ftp-сервером, необходимо создать пользователей и при необходимости разграничить им права. Так же есть возможность определять группы пользователей и ограничивать доступ к контенту сервера на основании имени пользователя и групп, в которые он входит.
Управление списком пользователей сервера
Для управления списком пользователей сервера можно использовать Site Manager или редактор и утилиту htpasswd консоли (SSH).
Для добавление пользователя через SiteManager, необходимо пройти по ссылке http://www.domain_name/wmng.html и выбрать Virtual ftp server control (Администрирование виртуального ftp-сервера), после чего авторизоваться используя технический логин и соответствующий пароль. После чего появится возможность добавлять и удалять пользователей.
Список пользователей и их шифрованные пароли лежат в домашней директории владельца сервера в файле .ftppasswd. Каждая строка файла описывает одного пользователя сервера и состоит из имени пользователя и шифрованного пароля, разделенных двоеточием.
Вот пример использования утилиты htpasswd для создания файла со списком пользователей и паролями. Зайдя в shell, введите команду:
htpasswd -cd .ftppasswd user1
где user1 - логин пользователя. После этого система запросит Вас ввести два раза новый пароль:
New password: ***** Re-type new password: ***** Adding password for user user1
С помощью этой команды создается файл .ftppasswd с шифрованным паролем для пользователя user1.
Обратите внимание, что если файл .ftppasswd уже имеется в директории, то для добавления в него нового пользователя и пароля команду htpasswd надо вызывать без ключа -c:
htpasswd -d .ftppasswd user2
Для разрешения анонимного доступа к серверу, необходимо завести пользователя с именем anonymous, а вместо пароля поставить символ '*'. После этого пользователи будут иметь возможность авторизоваться на сервере, используя логины anonymous и ftp без указания пароля.
Список групп лежит в домашней директории владельца сервера в файле .ftpgroup. Каждая строка файла описывает одну группу и состоит из имени группы и списка членов группы. Имя группы от списка членов отделяется двоеточием. Пользователи в списке членов группы перечисляются через запятую.
Вот пример файла .ftpgroup:
group1:user1,user2 mygroup:myuser3,user4
Обратите особое внимание на то, что, если в файле .ftppasswd есть пользователь anonymous, вне зависимости от того, какой у него пароль, этого пользователя будет пускать по FTP всегда. Менять пароль этому пользователю не надо. Если Вы хотите, чтобы такого пользователя не пускало, просто не заводите его в файле .ftppasswd.
Настройки прав доступа к контенту сервера
Так как контент сервера расположен на файловой системе хостинговой машины, права доступа к нему управляются при помощи стандартного механизма прав операционной системы UNIX. При регистрации услуги ftp-сервера в домашней директории владельца сервера создается директория pub. Контент сервера должен располагаться в этой директории. При подключении к серверу пользователям доступна только часть файловой системы, лежащая ниже этой директории, т.е. пользователи видят эту директорию как корневую ('/') и не могут получить доступ к данным, расположенным вне ее.
Существует также другой механизм управления доступом к контенту сервера, позволяющий устанавливать права на выполнение операций чтения, записи, удаления, просмотра директории и т.д. независимо для каждого пользователя сервера.
ВАЖНО: ни в коем случае нельзя наделять пользователей ненужными им правами. Если Вы создаете логин для публичного использования (например, anonymous), нельзя давать такому пользователю лишних прав. Например, прав для загрузки на сервер новых файлов. Злоумышленники таким образом смогут поместить на Ваш сервер ненужные файлы, которые будут занимать оплачиваемое Вами дисковое пространство. Кроме того, пользователи, обладающие лишними правами, смогут стирать и изменять файлы на Вашем сервере, что не всегда нужно. Придерживайтесь так называемого "принципа минимальных прав", когда пользователь или сотрудник получает только тот уровень доступа, который ему реально нужен для работы.
FTP-команды
Во время работы ftp-клиент может посылать ftp-серверу строго определенный набор ftp-команд. Основные ftp-команды перечислены ниже:
CWD (Change Working Directory) - посылается клиентом для смены текущей директории. Ограничение прав на выполнение этой команды также распространяется и на команду CDUP (переход в директорию на один уровень вверх)
MKD (MaKe Directory) - посылается клиентом для создания директории
RNFR (ReName FRom), RNTO (ReName TO) - посылаются клиентом для переименования директории или файла
DELE (DELEte) - посылается клиентом для удаления файла
RMD (ReMove Directory) - посылается клиентом для удаления директории
RETR (RETRieve) - передача файла от сервера к клиенту по протоколу FTP
STOR (STORe) - передача файла от клиента к серверу по протоколу FTP
Классы ftp-команд
Для удобства описания, ftp-команды сгруппированы в следующие классы:
READ - все FTP-команды, связанные с чтением файлов (за исключением команд выдачи листинга содержимого директории), например, RETR, STAT и т.д.
WRITE - все FTP-команды, связанные с созданием, записью или удалением файлов или директорий (включая команды MKD и RMD)
DIRS - все FTP-команды, связанные с выдачей листинга содержимого директории, например, LIST и NLST
ALL - все FTP-команды (включает в себя все три класса READ, WRITE и DIRS)
Установка прав доступа
Права доступа устанавливаются на директорию и по умолчанию распространяются на все поддиректории, но могут быть переопределены. Для того, чтобы установить права доступа на некоторую директорию, необходимо создать в ней файл с именем .ftpaccess. Содержимое этого файла определяет права доступа к директории и поддиректориям. Формат файла:[AllowAll|DenyAll] [<Limit ftp-command-list> [Order allow,deny|deny,allow] [AllowUser users-list] [DenyUser users-list] [AllowGroup group-expression] [DenyGroup group-expression] [Allow hosts] [Deny hosts] [AllowAll|DenyAll] ] [<Limit ftp-command-list2> ... ]
Видно, что файл состоит из секций 'Limit', содержащих команды разрешения/запрещения доступа. Команды AllowAll и DenyAll могут использоваться также вне секций 'Limit'.
Секция 'Limit' начинается со строки '<Limit ftp-command-list>' и заканчивается строкой '</Limit>'. Ftp-command-list является списком ftp-команд и классов ftp-команд, разделенных пробелами. Содержимое секции - команды управления доступом. Они определяют возможность выполнения команд, перечисленных в списке.
Order
Команда 'Order' управляет последовательностью обработки остальных команд управления доступом. По умолчанию действует правило 'allow,deny'. Это значит, что первыми проверяются команды разрешения доступа (список этих команд начинается со слова 'Allow'). Если какая-либо команда отработала успешно, процесс прерывается и пользователю разрешается выполнение ftp-команд, перечисленных в первой строке секции. Иначе обрабатываются команды запрещения доступа (их список начинается со слова 'Deny'). Если какая-либо команда отработала успешно, выполнение ftp-команд запрещается.
Если установить порядок 'deny,allow', обработка команд происходит в обратном порядке, т.е. сначала обрабатываются команды запрещения доступа, потом команды разрешения доступа.
AllowAll/DenyAll
Разрешение или запрещение выполнения ftp-команд всем пользователям со всех хостов.
AllowUser/DenyUser
Разрешение или запрещение выполнения ftp-команд для конкретных пользователей. Аргументом этой команды (users-list) является список имен пользователей (через запятую).
AllowGroup/DenyGroup
Разрешение или запрещение выполнения команд для пользователей, входящих или не входящих в указанные группы. Группы перечисляются через запятую. Знак '!' перед именем группы показывает, что пользователь не должен в нее входить. При проверке данной директивы проверяется наличие (или отсутствие, если использован знак '!') пользователя в каждой из перечисленных групп и условие считается выполненным, только если оно выполнено для всех перечисленных групп.
То есть, если Вы используете директиву вида
AllowGroup group1,group2
то доступ на выполнение соответствующих команд будет только у пользователей, которые одновременно входят в group1 и group2. Если Вы хотите дать доступ всем пользователям, которые входят в группу group1 или group2, то нужно писать отдельную директиву для каждой группы:
AllowGroup group1 AllowGroup group2
Allow/Deny
Разрешение или запрещение выполнения ftp-команд для всех пользователей, если соединение установлено с перечисленных хостов. Хосты перечисляются через запятую. В качестве имени хоста можно указывать доменное имя, IP-адрес или адрес сети с точкой в конце (например, значение '10.0.0.' будет означать разрешение/запрещение доступа со всех хостов подсети 10.0.0.0/24). Вместо списка хостов можно использовать ключевые слова 'all' или 'none'. Таким образом, команда 'Allow all' почти эквивалентна 'AllowAll'. Команда 'Allow none' значит, что адрес хоста не будет влиять на права доступа.
Как изменить директорию по умолчанию
Функциональность услуги "Виртуальный FTP-сервер" можно несколько изменить. Иногда может возникнуть необходимость дать ftp-доступ пользователю не в директорию pub, а в директорию www (типичный пример - Вы хотите дать ftp-доступ к www-директории для вебмастера, разрабатывающего сайт, но не хотите, чтобы ему были доступны все остальные служебные директории на сервере). Это можно реализовать с помощью следующих несложных действий.
1. Сначала необходимо удалить директорию pub из домашнего каталога. Для этого в unix-shell дается команда:
rm -rf pub
2. Но FTP-сервер по-прежнему работает с директорией pub, и поэтому теперь Вам нужно указать, что директория pub - это на самом деле www, т.е. создать так называемую символьную ссылку. Она работает таким образом, что все обращения по ftp к директории pub будут на самом деле пониматься сервером как обращения к www (другими словами, pub теперь будет синонимом www). Это можно сделать с помощью команды ln в unix-shell.
Например, для создания ссылки pub -> www нужно в домашней директории дать команду:
ln -s www pub
Если Вы хотите создать такую ссылку на отдельную директорию внутри www (например, www/images), то команда, соответственно, будет такая:
ln -s www/images pub
Теперь при подключении по FTP к серверу ftp.domain пользователи сразу будут попадать в директорию www (или, во втором случае, в www/images). Права доступа для пользователей в данном случае задаются точно так же, через файл .ftpaccess, только помещать его нужно в директорию www (и соответствующие поддиректории).
Примеры
FTP-сервер для обмена файлам между головным офисом и отделениями компании
Предположим, вашей компании необходимо организовать обмен файлами между головным офисом и отделениями. Необходимо выполнение следующих требований:
- каждый филиал должен иметь свой логин/пароль;
- филиал должен иметь доступ по чтению/записи к данным, предназначенным для него, но не иметь доступа к данным других филиалов;
- должен быть набор общих файлов, к которым имеют доступ по чтению все филиалы;
- должен быть anonymous-доступ по чтению к некоторому набору файлов;
- должен быть anonymous-доступ по записи к директории incoming.
В домашней директории, в поддиректории pub (далее на эту директорию будем ссылаться как на ~/pub) создадим следующие директории:
- users - данные для филиалов
- users/common - данные, доступные для чтения всем филиалам
- public - данные, доступные по чтению всем, в том числе anonymous
- incoming - директория, в которую anonymous может записывать файлы
Создаем файл ~/pub/.ftpaccess следующего содержания:
<Limit WRITE> DenyAll </Limit>
Этой директивой мы запретили всем пользователям выполнение команд, связанных с записью файлов, в директории ~/pub. Необходимо помнить, что действие директив в файле .ftpaccess распространяется также и на все поддиректории, поэтому запись сейчас запрещена для всех директорий, находящихся внутри ~/pub. Для разрешения записи в какой-либо поддиректории в ней необходимо создавать отдельный файл .ftpaccess с разрешением команд записи файлов.
Создаем файл ~/pub/users/.ftpaccess следующего содержания:
<Limit ALL> DenyUser anonymous </Limit>
Этой директивой мы запретили выполнение любых команд в директории ~/pub/users/ для пользователя anonymous.
Создаем файл ~/pub/incoming/.ftpaccess следующего содержания:
AllowOverwrite off <Limit WRITE> AllowAll </Limit> <Limit WRITE DIRS> DenyAll </Limit>
Эти директивы разрешают только запись в директорию ~/pub/incoming/ всем пользователям и запрещают выполнение всех остальных команд (например, чтение уже загруженных файлов). Директива 'AllowOverwrite off' запрещает при загрузке файлов перезапись уже существующих файлов в данной директории (т.к. директория публичная и запись в нее разрешена всем авторизованным пользователям).
Создаем файл ~/pub/users/common/.ftpaccess следующего содержания:
<Limit WRITE> DenyAll </Limit>
Эта директива запрещает запись и изменение файлов в директории ~/pub/users/common для всех пользователей.
Для разрешения доступа новому филиалу необходимо проделать следующие процедуры:
- завести нового пользователя, например, user1
- создать для него директорию ~/pub/users/user1
- создать файл .ftpaccess в этой директории, содержащий:
<Limit ALL> AllowUser user1 DenyAll </Limit>Эти директивы разрешают выполнение любых команд в директории ~/pub/users/user1/ для пользователя user1 и запрещают выполнение любых команд всем другим пользователям.
Таким образом, мы получили следующую структуру каталогов с правами доступа для пользователей:
/pub (сюда запрещена запись для всех) /users (здесь запрещены любые команды для anonymous) /common (сюда запрещена запись для всех) /user1 (здесь разрешены любые команды для user1 и запрещены любые команды остальным пользователям) / public (здесь разрешено чтение для всех пользователей) / incoming (сюда разрешена запись для всех пользователей)