Конфигурирование сервера wu-ftpd

По моим наблюдениям, самым распространенным на настоящий момент FTP-сервером является wu-ftp (Washington University FTP Server), потому что он поставляется с основными дистрибутивами Linux, в том числе Red Hat и его клонами. Если у вас именно такой дистрибутив, то с установкой проблем не будет. Остается только правильно сконфигурировать сервис. Но даже если сейчас в системе нет FTP-сервера, его легко установить из RPM пакета (для Red Hat-систем) или другого архива. 

Конфигурация FTP-сервера содержится в шести файлах: 

ftpaccess — права доступа к серверу, круг пользователей FTP и основные настройки безопасности;

ftpservers — виртуальные FTP-серверы;

ftpusers — пользователи, которым явно запрещен доступ к FTP-серверу;

ftphosts — права доступа к серверу с определенных хостов. Можно как запрещать, так и разрешать доступ;

ftpgroups — группы FTP;

ftpconversion — настройка преобразования файлов "на лету". 

Основные настройки сервера wu-ftp

Основным конфигурационным файлом сервера wu-ftp является ftpaccess. Его содержимое можно увидеть в листинге 10.2. 

Листинг 10.2. Пример конфигурационного файла ftpaccess

# This file was generated by the KDE wu-ftpd configurator.

# (c) 2000 by Bernhard Rosenkränzer (bero@redhat.com)

class all anonymous,guest,real  *

noretrieve

loginfails 5

private no

banner /welcome.msg

email root@localhost

message          /welcome.msg  LOGIN

message          .message      CWD=*

readme           README*       LOGIN

readme           README*       CWD=*

chmod              no          anonymous,guest

delete             no          anonymous

overwrite          no          anonymous

rename             no          anonymous

passwd-check       rfc822  warn

log transfers anonymous,guest,real inbound

log transfers anonymous,guest,real outbound

anonymous-root /home/flenov

 

При настройке FTP-сервера существует множество директив, для которых администраторы сохраняют исходные значения, потому что их работа не влияет на производительность или безопасность. Хотя некоторые из них помогают предотвратить неправильное или неэффективное использование сервера (например, время ожидания timeout XXXX способствует освобождению ресурсов), значений по умолчанию достаточно, и напротив, изменение некоторых из них может наоборот сделать работу менее комфортной. 

Давайте рассмотрим основные директивы этого файла. Чтобы впоследствии с ними легче было работать, я разбил все команды по категориям.

О дополнительных возможностях, которые мы не упоминаем, вы можете получить подробную информацию из страниц руководства, выполнив команду man ftpaccess. 

Доступ

Такие директивы определяют основные права доступа к FTP-серверу. Вот основные из них:

class имя тип адреса — позволяет организовать классы пользователей по их типу и адресу. В нашем конфигурационном файле указана следующая строка:

class all anonymous,guest,real  *

В качестве имени класса здесь указано all. После этого идет перечисление через запятую типов пользователей, которые будут отнесены к этому классу. В данном случае перечислены все категории: anonymous, guest и real (анонимные, гости и авторизованные пользователи). Последний параметр — это шаблон адреса, на месте которого стоит звездочка, то есть любой адрес. Получается, что к классу all относятся любые пользователи с произвольными адресами. 

Классы — очень удобная вещь, схожая с группами. Вы объединяете определенных пользователей и можете назначать им права. Например, можно создать класс пользователей, у которых IP-адрес относится к зоне вашей компании, офиса или страны. Затем только этому классу открываете полноценный доступ к FTP, а всем остальным — запрещаете или ограничиваете использование. Назначить права сразу целому классу намного удобнее, чем расписывать разрешения каждому пользователю в отдельности; 

noretrieve тип класс файл — запрещает чтение указанного файла. Параметр тип указывает на абсолютную (absolute) или относительную (relative) адресацию файла (путь к нему). Далее идет определение класса в формате class=имя, к которому относится данный запрет. Можно явно указать описанный выше класс all или вообще его опустить, и тогда запрет будет относиться ко всем пользователям. Если в качестве файла указан конкретный путь, то доступа не будет только к этому файлу. Если в параметре указано только имя (например, passwd), то будет закрыт доступ ко всем файлам с таким именем в любой директории.

Рассмотрим пример, запрещающий доступ к любым файлам с именем passwd:

noretrieve relative passwd

Попробуйте добавить эту строку в свой конфигурационный файл. Теперь подключитесь к серверу с помощью FTP-клиента. Для тестирования из X Window я в графическом режиме Linux использовал программу gftp. Подключившись к серверу, я создал файл passwd в директории /home и попытался его скачать в каталог /home/flenov. В ответ на это FTP-клиент только создал пустой файл, но скачать ничего не смог, из-за установленного запрета программа завершилась аварийно. Такое окончание — это, конечно же, особенность gftp, а другой FTP-клиент должен правильно обработать ошибку и сохранить работоспособное состояние. 

Если FTP-сервер находится на одном физическом сервере с WEB-сервером, то вполне логичным будет запретить чтение файла .htaccess, в котором прописываются права доступа на директории для WEB-сервера. Пользователи FTP не должны иметь права даже смотреть их. Лучше прописать разрешение только конкретным клиентам, чтобы каждый из них мог работать только со своими файлами .htaccess, или предоставить другой способ редактирования прав. 

Работу с системными каталогами можно вообще отменить. Например, следующая строка запретит получение любого файла из директории /etc: 

noretrieve /etc

После этого нельзя будет скачать ни один файл не только из директории /etc, но и из ее поддиректорий; 

loginfails число — количество неудачных попыток входа на сервер, после которого в журнале будет создана соответствующая запись. В нашем примере стоит число 5. Если пользователь не смог войти на сервер 5 раз, то это говорит о попытке взломщика подобрать пароль случайным образом или по словарю (атака brute force); 

private параметр — режим использования команд сервера wu-ftp SITE GROUP и SITE GPASS (в других FTP-серверах этих команд может и не быть) для смены группы (значение yes разрешает их использование). Если пользователь укажет верную группу и пароль, то он получит права группы из файла ftpgroups; 

deny адрес файл — запрет доступа клиентов с указанного адреса. В случае попытки подключения выводится сообщение из текстового файла, указанного в качестве последнего параметра. Адреса могут указываться в виде шаблона; 

defumask mask — маска прав доступа, используемая при создании новых файлов. О маске umask для ОС Linux мы говорили в разд. 4.1; 

limit-time тип минуты — ограничение времени сессии. Например, вы хотите, чтобы определенные пользователи не засиживались на вашем FTP-сервере. В этой директиве первым параметром нужно указать имена пользователей, звездочку (*) для всех пользователей, anonymous или guest, а в вторым — продолжительность сессии. По прошествии указанного времени соединение будет разорвано; 

file-limit направление число класс — ограничение на число передаваемых файлов. В качестве направления можно указать in (входящие), out (исходящие) и total (всего). Чтобы запретить работу более чем с 10 файлами, воспользуйтесь командой file-limit total 10; 

byte-limit направление число класс — ограничение на число передаваемых байт. Работа директивы схожа с file-limit;

anonymous-root каталог — корневая директория для анонимных пользователей. У них не может быть собственного каталога, в отличие от реального пользователя, для которого при подключении к системе корнем является его домашняя директория; 

guest-root каталог — корневая директория для всех гостей. Директива необходима, если вы хотите, чтобы все гости могли работать с одной и той же директорией. Если у каждого гостя должен быть свой каталог, то лучше явно создавать гостевую учетную запись (см. разд. 10.6). 

passwd-check тип сообщение — тип проверки правильности пароля для анонимных пользователей, то есть E-mail-адреса, который используют анонимные пользователи. В качестве типа может указываться одно из трех значений: none (нет проверки), trivial (простая проверка на содержания в адресе символа "@)" или rfc882 (полная проверка на соответствие стандарту RFC 822). Параметру сообщение можно присваивать значение warn (выводить предупреждение, но продолжать работу) или enforce (отказать в доступе); 

deny-email адрес — отказ в доступе, если в качестве пароля используется указанный адрес. Если вас интересует действительный E-mail, то можно попытаться запретить все часто используемые клиентами E-mail адреса. Но даже это не будет гарантировать, что анонимный пользователь указал именно свой E-mail в качестве пароля; 

deny-uid идентификаторы — запрещает доступ к FTP пользователям с указанными идентификаторами. Те же самые функции выполняет файл ftpusers, который мы рассмотрим в разд. 10.5. Удобство этой команды в том, что можно задать диапазоны. Например, директива deny-uid %-500 запретит доступ всем пользователям, у которых идентификатор менее 500;

deny-gid идентификаторы — запрещает доступ к FTP пользователям группы с указанными идентификаторами. Те же самые функции выполняет файл ftpusers; 

restricted_uid идентификаторы — разрешает гостевому пользователю с указанным ID получать доступ к директориям вне его домашнего каталога; 

restricted_gid идентификаторы — дает право группе пользователей с указанным ID получать доступ к директориям вне домашнего каталога;

unrestricted_uid идентификаторы — запрещает гостевому пользователю с указанным ID получать доступ к директориям вне его домашнего каталога; 

unrestricted_gid идентификаторы — запрещает группе пользователей с указанным ID получать доступ к директориям вне домашнего каталога;

dns refuse_no_reverse файл override — требует выдать сообщение из файла файл, если клиент не имеет обратного адреса. При отсутствии параметра override соединение будет завершено; 

dns refuse_mismatch файл override — требует выдать сообщение из файла файл, если прямой и обратный адреса не совпадают. Если не указать параметр override, то соединение будет завершено. По умолчанию я всегда включаю эту опцию, а отключаю, только если у известных мне пользователей возникают проблемы при работе с сервером. Это необходимо для того, чтобы взломщик не мог подделать IP-адрес для входа в систему и обхода соответствующей проверки. 

Контроль загрузки файлов

Загрузка файлов — самая опасная возможность для сервера. Каждый пользователь должен иметь право обращаться только к своей директории. А что делать, чтобы анонимные пользователи тоже могли работать с файлами? В этом случае нужно по возможности запретить загрузку в уязвимые с точки зрения безопасности директории, куда злоумышленник может поместить скрипты и выполнить их. 

upload параметры — команда позволяет настроить права на загрузку файлов в определенные каталоги. Для запрета загрузки в каталог /etc нужно написать следующую строку:

upload /etc       no

Давайте посмотрим, как можно разрешить загрузку в директорию:

upload /home          yes root root 0600 nodir

В данной строке разрешается загрузка файлов в директорию /home. Третий и четвертый параметры определяют владельца и группу, которые будут установлены для файла. В обоих случаях я указал root, чтобы простой смертный после загрузки ничего не смог сделать с документом. Далее идут права доступа на файл — 0600, то есть читать и писать в него сможет только администратор, а все остальные отдыхают. Последний параметр равен nodir, что соответствует запрету на создание директорий. 

Следующий пример разрешает создавать директории:

upload /home/robert   yes root root 0600 dir 0700

Предпоследний параметр равен dir, что позволяет создавать директории. Последний параметр 0700 — это права доступа на каталог (только администратору разрешено все). Изменение этого значения позволяет сделать возможной работу с файлами только администратору root. Даже если злоумышленник загрузит в указанную директорию свою программу, выполнить он ее не сможет, не имея соответствующих прав. 

Запретите загрузку файлов, открытых пользователям для просмотра, в любые системные директории. 

Доступ по операциям

Помимо этого, в файле ftpaccess может быть описание основных операций и прав доступа к ним. В общем виде это выглядит следующим образом:

Действие yes|no пользователь

В качестве действия можно указать одно из следующих значений: chmod, delete, overwrite, rename или umask. Затем идет разрешение (yes) или запрет (no). Потом через запятую могут перечисляться типы пользователей (anonymous, guest или real) или указывается класс (class=имя_класса). 

По умолчанию все действия и для всех пользователей разрешены. Но вполне логичным будет запретить удаление, изменение атрибутов, переименование или перезапись файлов неавторизованным (anonymous) пользователям. 

Например, в листинге 10.2 для запрещения доступа к операциям есть следующие строки:

chmod       no       anonymous,guest

delete      no       anonymous

overwrite   no       anonymous

rename      no       anonymous

Информационные директивы

Эти директивы отвечают за информационные сообщения, которые видит пользователь, работая с вашим FTP-сервером:

banner имя — в качестве имени можно указать текстовый файл, содержимое которого будет передано пользователю во время входа в систему. Этот файл может содержать приветствие, полезную информацию или правила использования вашего FTP-сервера. Вы должны помнить, что баннер виден пользователю еще до авторизации, поэтому здесь не должно быть никаких сведений, которые помогут хакеру при взломе; 

greeting параметр — директива определяет, какую информацию выдавать пользователю о системе после отображения баннера. Это текстовая строка, которая может выглядеть следующим образом: "220 flenovm.ru FTP server (Version wu-2.6.2-5) ready.". Как мы уже говорили ранее (разд. 10.1), эта строка отображается до авторизации, и в ней содержится информация о системе и версии используемого FTP-сервера. Это лишнее, злоумышленник не должен видеть этого, лучше выводить минимум правильной информации или просто неправильную. В качестве параметра можно использовать одно из следующих значений:

•full — полная информация, включающая имена хоста и программы и версия;

•brief — отображать сокращенную информацию, включающую только имя хоста;

•terse — только сообщение о готовности системы к работе;

•text — собственное сообщение.

Больше всего мне нравится последний параметр. При его использовании через пробел нужно указать текст, который будет отображен пользователю, например:

greeting text строка

На собственных серверах я использую сообщения именно этого типа (одно из двух):

greeting text flenovm.ru FTP Server (MS IIS 4.1.0) ready

или

greeting text flenovm.ru FTP Server (cd-ftpd 2.1.9) ready

Увидев любое из этих сообщений, хакер не сможет определить, какой FTP-сервер реально установлен. В первом случае он подумает, что имеет дело с IIS (Internet Information Services, Информационные сервисы Интернета) разработки Microsoft, который может работать только в среде Windows. Это может сбить с толку любого, даже опытного хакера. Лишь проверив сервер специальными утилитами, он увидит, что реально используется Linux (точную версию такие утилиты, чаще всего, не могут определить) и догадается, что его просто обманывают. 

Во втором случае я вообще подставляю имя несуществующего сервера. Взломщик, не зная такого сервера и не найдя нужной программы для проникновения, будет искать другие пути или вообще может уйти восвояси. 

Можно притвориться, что у вас установлен сервер ProFTP, который реально существует и тоже достаточно часто используется администраторами Linux; 

hostname имя — имя локального хоста по умолчанию;

email адрес — адрес электронной почты администратора;

message файл тип — текстовый файл, содержимое которого отображается пользователю в следующих случаях:

•при входе в систему, если в качестве типа задано слово LOGIN;

•при смене директории, если в качестве типа указано CWD=каталог, и пользователь вошел в указанный каталог.

Журналирование

Некоторые администраторы фиксируют только действия анонимных и гостевых пользователей. Это обосновывается тем, что реальные пользователи системы не будут портить сервер, который им нужен для работы или обмена файлами. Это в корне неверное мышление, потому что достаточно много взломов совершается именно реальными пользователями, да и злоумышленники часто используют их учетные записи. 

Навредить серверу через гостевую или анонимную учетную запись слишком сложно, а при правильном распределении прав невозможно (если нет ошибок в программе сервера). В большинстве случаев злоумышленник стремится заполучить доступ к авторизованной учетной записи и использовать ее. 

Если произошло что-то неординарное, то, используя журналы, вы должны получить максимальную информацию о происшедшем и сделать все необходимое, чтобы это не повторилось (к вопросу журналирования мы еще вернемся в главе 12). 

По умолчанию wu-ftp для хранения журнала, который содержит последние записи FTP-сервера, использует файлы /var/log/xferlog. История за предыдущие дни может быть просмотрена в файлах /var/log/xferlog.X, где Х — это число. 

Давайте посмотрим, что можно регистрировать в журналах wu-ftp-сервера:

log commands список — сохранять все команды клиента. В качестве списка можно указать одно из следующих значений: anonymous, guest или real;

log transfers список направление — записывать файлы, которые получает или отправляет пользователь. Последний параметр может содержать одно из двух значений inboard (входящий) и outboard (исходящий);

log security список — регистрировать все нарушения безопасности, попытки выполнить запрещенные команды и др.;

log syslog — использовать системный журнал syslog;

log syslog+xferlog — использовать журналы syslog и xferlog одновременно. 

Создание виртуальных серверов

Поддержка виртуальных серверов для FTP — очень мощное средство. Когда на компьютере крутится 20 виртуальных WEB-серверов, и ими управляют разные люди, то вполне логичным будет для каждого из них поставить в соответствие свой FTP-сервер. В этом случае каждому сайту могут быть назначены свои правила. 

Мы не будем сильно заострять внимание на виртуальных серверах, потому что это выходит за рамки нашей книги. Если вы хотите узнать об их параметрах, то можете обратиться к документации (man ftpaccess). Также для их создания можно воспользоваться графической утилитой управления FTP-сервером. 

Если честно, то мне не очень нравятся возможности wu-ftp по работе с виртуальными серверами. Если вам действительно нужно несколько серверов на одном компьютере, то советую взглянуть сервер ProFTP, который, на мой взгляд, лучше приспособлен для решения данной задачи. Неудобство настройки wu-ftp заключается в разбросе конфигурационных файлов. 

Определение всех виртуальных FTP-серверов происходит в конфигурационном файле ftpservers. Описание выполнено в виде строк, каждая из которых содержит IP-адрес виртуального сервера и каталог, в котором находятся его конфигурационные файлы (дублирующие все указанные ранее файлы сервера wu-ftp). Если какого-либо файла нет, то будет использоваться соответствующий конфигурационный файл из каталога /etc.

Дополнительные настройки

Пока что мы рассматривали только файл ftpaccess. Но мы уже знаем, что в конфигурации используется намного больше файлов. Давайте посмотрим, что еще доступно для настроек в wu-ftp.

Запрет доступа реальным пользователям

Так как сервер wu-ftp работает с учетными записями ОС, которые расположены в файле /etc/passwd, то любой пользователь автоматически сможет работать с FTP-сервером, используя свой аккаунт и права доступа. Но далеко не всем это необходимо. 

Чтобы запретить доступ уже существующему пользователю, есть два метода – старый и новый. Старый способ – добавить имя пользователя в файл /etc/ftpusers. Содержимое этого файла по умолчанию можно увидеть в листинге 10.3. В зависимости от дистрибутива текст может изменяться. 

Листинг 10.3. Содержимое файла /etc/ftpusers

root

bin

daemon

adm

lp

sync

shutdown

halt

mail

news

uucp

operator

games

nobody

 

Обратите внимание, что пользователю root тоже запрещен доступ. Это связано с тем, что у администратора слишком много прав, и если злоумышленник получит возможность пользоваться этой учетной записью, то сможет удаленно уничтожить систему (например, стереть файлы). Никогда не допускайте к FTP пользователей с повышенными привилегиями (администратора root и пользователей группы root). 

Если вам нужно работать с файлами или директориями, которые доступны только администратору с нулевым идентификатором, то не используйте для этого FTP. Лучше производить изменения, сидя непосредственно за компьютером или через промежуточную папку (закачать файлы в свой каталог, а потом локально или через удаленный, но безопасный терминал, корректировать). 

Новый способ запрета – использование файла ftpaccess. В современных версиях FTP сервера файл /etc/ftpusers игнорируется, а вместо него нужно использовать ftpaccess. Чтобы запретить доступ по FTP всем системным учетным записям, ID которых менее 500. Для этого достаточно в файле ftpaccess добавить следующую строку:

deny-uid %-500

В этом случае можно быть уверенным, что никто не забыт. Тем более что с одним идентификатором (например, с ID, равным нулю) может быть несколько пользователей. 

Компьютерам вход запрещен

Как говорит администраторская мудрость — на сетевой экран надейся, а сам не плошай. Firewall позволяет запретить доступ к серверу на определенные порты с конкретных компьютеров. Конфигурационный файл /etc/ftphosts выполняет схожие задачи — разрешает или запрещает доступ с указанных IP-адресов или целой сети. 

По умолчанию файл пуст, потому что разработчики дистрибутива не могут знать, как вы планируете организовать доступ. Вы можете прописать в нем следующие директивы:

allow имя шаблон

deny имя шаблон

Например, если вы хотите запретить доступ анонимным пользователям с адреса 192.168.1.1, то добавьте строку:

deny anonymous 192.168.1.1

Если исходить из нашего принципа "Что не разрешено, то запрещено", то может показаться, что строка с директивой deny не нужна. Это неверно, потому что необходимо закрепить разрешение на доступ с указанного адреса для определенного типа пользователей, чтобы остальным закрыть возможность входа на FTP. 

Группировка

В файле ftpgroups находится описание групп, которые позволяют использовать возможности команд SITE GROUP и SITE GPASS. Эти нестандартные директивы FTP поддерживаются мало кем из производителей, поэтому для пользователей работа с этими командами может оказаться слишком неудобной. 

Файл ftpgroups содержит строки примерно следующего вида:

test:ENCRYPTED PASSWORD HERE:archive

Строка-описание состоит из трех параметров, разделенных двоеточием: имя группы, пароль и реальное (системное) имя группы. 

Гостевые учетные записи

Если сейчас попытаться войти в систему под любым аккаунтом, то вы сможете путешествовать по всей файловой системе. Но в большинстве случаев, пользователям нужно работать только с собственными документами, поэтому для всех своих FTP-пользователей я завожу гостевые учетные записи. Давайте рассмотрим на примере, как это происходит. 

Для начала нужно создать новую учетную запись для пользователя, например robert_ftp. Для этого выполняем команду:

add robert_ftp

Теперь посмотрим на созданную для него строку в файле /etc/passwd. Она должна выглядеть примерно следующим образом:

robert_ftp:x:507:507::/home/robert_ftp:/bin/bash

Это классическая запись для нового пользователя, и через нее можно входить в систему локально, а мы должны ограничиться только FTP-доступом. Изменим командную оболочку (shell) для этого пользователя на /bin/ftponly. Такой оболочки пока нет, и мы ее еще создадим чуть позже. Помимо этого, необходимо сделать директорию /home/robert_ftp корневой. Для этого нужно добавить в конце пути папку с именем в виде точки. 

Отредактируйте соответствующим образом строку, и вы получите такой результат:

robert_ftp:x:507:507::/home/robert_ftp/.:/bin/ftponly

Обратите внимание, что в качестве командной оболочки указан файл /bin/ftponly, который не существует. Давайте создадим /bin/ftponly. Это делается только один раз и потом используется всеми гостевыми учетными записями. Для создания файла можно воспользоваться командой cat:

cat >> /bin/ftponly

Теперь все команды, которые вводятся в консоли, попадут в файл /bin/ftponly. Наберите следующий текст: 

#! /bin/sh

echo 'You are not allowed to log in interactively'

exit 0

Для завершения ввода в файл нужно нажать сочетание клавиш <Ctrl>+<X>, и вы вернетесь в нормальный режим работы. 

В файле /bin/ftponly у нас хранится всего две команды: первая выводит на экран сообщение о том, что нельзя входить в систему интерактивно, вторая — завершает сеанс. 

Теперь необходимо сделать наш скрипт /bin/ftponly исполняемым. Для этого выполните команду:

chmod 755 /bin/ftponly

Итак, у нас создан файл командной оболочки и пользователь, который использует ее. Если сейчас попытаться войти в систему как пользователь robert_ftp, то на секунду появится сообщение "You are not allowed to log in interactively" и произойдет выход из системы. Таким образом, работать под учетной записью robert_ftp нельзя. 

Вместо файла /bin/ftponly можно использовать в качестве командного интерпретатора /dev/null — нулевое устройство, которое не может обрабатывать команды и не позволит входить в систему под этой учетной записью. Нулевое устройство установлено в качестве консоли в файле /etc/passwd для всех системных учетных записей, которые не предназначены для локальной работы. 

Теперь осталась самая малость — сказать серверу FTP, что пользователь с именем robert_ftp является гостем. Для этого в файл ftpaccess добавим строку:

guestuser robert_ftp

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

В моих системах все пользователи работают либо как гости со своими каталогами, либо анонимно с общедоступными папками. Действительные учетные записи устанавливаются только избранным администраторам и только в крайних случаях, потому что ими сложнее управлять.

Для гостевых пользователей достаточно только ограничить доступ определенной директорией, а все остальное защитит сервер. Правда и здесь иногда бывают проблемы. Рассмотрим классическую ошибку программистов. Допустим, что пользователю открыта директория /home/robert, и для обеспечения этого сервер банально проверяет, чтобы путь к каталогу начинался с этой строки. Хакер видит эту директорию как корневую( / ) и выше подниматься не должен. Теперь посмотрите на следующую команду:

cat /home/robert/../../../../../etc/passwd

Она должна выводить на экран файл /home/robert/../../../../../etc/passwd, а на экране вы увидите содержимое /etc/passwd. С точки зрения проверки начала пути все записано верно, но после /home/robert идет множество символов "/..", каждый из которых заставляет подняться на уровень выше. Хакер, не зная, в какой папке он находится, может поставить такую комбинацию раз пять и, скорей всего, поднимется до корня, а потом переместится в системную папку /etc/passwd. 

Несмотря на простоту, такая ошибка встречается довольно часто. А ведь программисту достаточно проверить адрес на вхождение в него символов двоеточия, и если они есть, то принять меры. В сервере wu-ftp такой ошибки нет, но нет гарантии, что она не появится в будущем, когда выйдет обновление, в котором по случайности кто-то отключит проверку или удалит ее. Поверьте мне, такое иногда бывает с любым программным обеспечением, особенно, если над ним работает целая команда, и нет должного контроля. 

Безопасность FTP-сервера

Пока что мы говорили о конфигурации FTP-сервера под Linux. А сейчас нам предстоит разобраться с некоторыми практическими примерами использования сервера не по назначению и методами защиты от этого. 

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

Перехват соединения

Вспомним полный цикл соединения с FTP-сервером и передачи файлов:

1.Клиент соединяется с сервером.

2.Клиент проходит авторизацию.

3.Клиент подает запрос на скачивание файлов.

4.Сервер открывает порт и сообщает его клиенту.

5.Клиент подключается к указанному порту и получает или передает файл. 

Сложно, но вполне возможно направить соединение на себя. Хакеру нужно перехватить пакет, в котором сервер сообщает порт, и раньше авторизованного клиента успеть подключиться к этому порту, после чего передать на сервер свой или получить чужой файл. 

Самое страшное — именно передача файла. Так как хакер вклинивается уже после авторизации, то он без проблем может транслировать данные, а сервер не контролирует, с какого адреса было запрошено соединение, и какой IP реально подключился. Если хакеру удастся перехватить такое соединение, то он сможет закачать свою программу, содержащую вирус или, например, троянскую программу. 

В настоящее время в большинство FTP-серверов уже встроили сравнение IP-адресов, подключенных к 21 порту и каналу для передачи данных. Это усложняет атаку, потому что теперь хакеру необходимо подделывать IP-адрес, что в случае с протоколом TCP не так уж и просто. 

Использование привязки к IP не всегда позволяет решить проблему. Если на пути соединения с FTP-сервером находится анонимный прокси-сервер или сетевой экран, маскирующий IP-адрес, то сервер будет видеть не реальный IP-адрес клиента, а IP-адрес Proxy или Firewall. 

Можно запретить пассивный режим, что решит данную проблему полностью. Но это не является панацеей от всех проблем с безопасностью. В следующем разделе мы увидим, что активный режим тоже далеко небезопасен. А чего ждать? Активное соединение тоже можно перехватить, хотя это сделать немного сложнее. Если хакер получил доступ к компьютеру, который подключен к FTP-серверу, то достаточно дождаться момента, когда пользователь взломанного компьютера запросит передачу данных, и перехватить порт. 

Сканирование портов

В разд. 1.1 мы говорили о том, что на начальном этапе взлома компьютера хакер должен получить как можно больше сведений о жертве. Средством сбора первичной информации является сканирование портов. Делать это с собственного компьютера опасно, поэтому хакеры стараются маскироваться и идут на различные хитрости. 

Одна из уловок — использование сценария на PHP или Perl, который с сервера будет производить сканирование. Но этот метод обладает следующими недостатками:

необходим сервер, который сможет выполнять сценарии, а не всегда есть возможность найти подходящий;

бесплатные серверы с возможностью выполнения сценариев требуют регистрации и обладают хорошей системой журналирования. Если первое можно обойти, указав неверные данные, то второе является большой проблемой. Сервер зафиксирует сканирование, и служба безопасности может быстро найти взломщика. 

Хакеры нашли отличный способ заставить сервер сканировать порты. Для этого всего лишь нужно подключение к FTP-серверу, который работает в активном режиме. 

Вспомним, как происходит прием/передача файлов в активном режиме. Для этого FTP-серверу посылается запрос с указанием порта клиентского компьютера, к которому он должен подключиться. Помимо номера порта передается и IP-адрес. Это значит, что клиент с адреса 192.168.1.1 может запросить соединение с компьютером 192.168.8.2 и любым его портом, и сервером это воспримется нормально. Хакеры научились использовать эту особенность для того, чтобы заставить FTP-сервер сканировать порты удаленного компьютера. 

Таким образом мне удалось один раз удачно произвести атаку DoS на свой сервер. Я заставил FTP-сервис сканировать компьютер с Proxy, через который происходило подключение к Интернету. На прокси-сервере была установлена система обнаружения атак, которая при выявлении попытки сканирования автоматически блокировала любые соединения с компьютером (о таких системах мы поговорим в главе 12). Блокировка прошла удачно, и я со спокойной душой пошел на обед. Вернувшись, услышал от пользователей, что невозможна работа по FTP. Я проверил, сервер работал исправно. Оказалось, что FTP стал недоступен для внешних пользователей, подключающихся через прокси-сервер, который во время сканирования добавил FTP-сервер в черный список. 

Для сканирования через FTP-сервер можно использовать программу nmap:

nmap -b имя_пользователя:пароль@ftpсервер:порт

Как видите, эта запись очень похожа на строку подключения к FTP через WEB-браузер. Если для сканирования будет использоваться анонимный сервер, то имя и пароль указывать не обязательно:

nmap -b ftpсервер:порт

Если сервер работает на порту 21, то можно опустить и этот параметр. 

Для защиты можно исключить активный режим FTP-сервера с помощью сетевого экрана, то есть блокировать работу с портом 20, который чаще всего используется для передачи файлов. В этом случае все соединения инициализируются только со стороны клиента. 

Рассылка файлов

С помощью FTP-сервера можно рассылать E-Mail-сообщения. Для этого создайте на сервере текстовый файл со следующим содержимым:

HALO mailserver.com

MAIL FROM: name@server.com

RCPT TO: recipient@server.com

DATA

Текст письма

.

Рассмотрим, что означают эти строки, которые на самом деле являются командами SMTP-сервера:

HALO mailserver.com — строка приветствия SMTP сервера. Параметр mailserver.com необходимо заменить реальным именем сервера;

MAIL FROM: name@server.com — адрес отправителя письма; 

RCPT TO: recipient@server.com — получатель письма;

DATA — после команды идет содержимое письма.

Последняя строка в файле должна состоять только из одной точки, потому что SMTP-сервер символы <CR> и <LF> (конец строки и перевод каретки) воспринимает как конец письма. Когда вы нажимаете клавишу <Enter>, то в ОС Windows создается как раз такая пара символов. ОС Linux ограничивается только переводом каретки. Для нас главное, чтобы в тексте был переход на новую строку, а какой он, — не имеет значения, потому что файл будет передаваться в ASCII-режиме. 

Этот файл загружаем на FTP-сервер и выполняем следующие две команды: 

PORT 192,168,1,1,25

RETR filename

В первой строке мы просим сервер соединиться с компьютером, имеющим адрес 192.168.1.1. Для этого используется команда PORT, которой необходимо передать 5 чисел: первые 4 — это IP-адрес компьютера, а последний  — это порт. С помощью этой директивы можно производить сканирование портов на сервере вручную, но сейчас у нас другая цель.

Вторая команда посылает на этот сервер файл с именем filename, который содержит команды SMTP. Для SMTP-сервера все выглядит так, как будто FTP-сервер направляет ему директивы для отправки письма, которое он и отошлет. А получатель не сможет определить источник. Все параметры приведут его только к FTP-серверу. Получается, что злоумышленник может анонимно отправить письмо, и найти его будет сложно. 

Таким образом могут рассылаться вирусы, троянские программы или спам. Есть еще один вариант использования почтовых сообщений — поместить на FTP-сервер большой файл и заставить его бесконечно передавать на SMTP-сервер. Если запустить несколько таких процессов, то при слабеньком канале SMTP-сервера получится полноценная DoS-атака. 

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

Дополнительная информация

Я не стал описывать все директивы конфигурационных файлов, которые доступны в сервере wu-ftp. Их слишком много, и мы остановились только на основных. Для получения дополнительной информации можно выполнить команду man файл. В качестве параметра укажите имя конфигурационного файла, о котором вы хотите узнать больше. 

Помимо этого можно почитать документы из директории /usr/share/doc/wu-ftpd-X.X.X, где X.X.X — это номер версии установленного у вас wu-ftp-сервера. 

Все изменения, которые вносятся в конфигурационный файл, вступают в силу немедленно. Единственное



Внимание!!! Если ты копируешь эту статью себе на сайт, то оставляй ссылку непосредственно на эту страницу. Спасибо за понимание

О блоге

Программист, автор нескольких книг серии глазами хакера и просто блогер. Интересуюсь безопасностью, хотя хакером себя не считаю

Обратная связь

Без проблем вступаю в неразборчивые разговоры по e-mail. Стараюсь отвечать на письма всех читателей вне зависимости от страны проживания, вероисповидания на русском или английском языке.

Пишите мне


Я в социальных сетях
Facebook Telegram Youtube Програмысли Instagram