Как установить безопасный и
надёжный FTP сервер
В этом документе идет
речь о том, как установить безопасный и
надёжный FTP сервер. Как известно для
передачи незаконных файлов чаще всего
используются именно FTP сервера. Также
довольно часто хакерам удается получить
доступ к системам с неправильно
установленными FTP серверами.
В этом FAQ изложены
рекомендации для системных
администраторов, которые помогут им
правильно настроить FTP сервер, и свести к
минимуму угрозу проникновения в систему
злоумышленников через этот вид сервиса.
Содержание:
Общие принципы установки
анонимных FTP серверов.
Установка FTP сервера с
переназначаемым корневым каталогом
(chrooted FTP server).
Информация специфищеская для
различных операционных систем.
Старые SVR2 и SVR3 системы, RTU 6.0
(Masscomp, нинешний Concurrent Real Time UNIX), и
AT&T 3B1 и 3B2
HPUX
Solaris 2.x
SunOS
Где можно найти другие FTP
демоны
Как узнать, является ли FTP
сервер безопасным
Archie
1. Общие принципы установки
анонимных FTP серверов.
Создайте пользователя ftp в /etc/passwd. Он
может принадлежать к любой группе,
например arhciv (если группа не
определена то пропишите ее в файле
/etc/group). Домашний каталог должен быть
~ftp, где ~ftp это полный путь к каталогу,
который будет "корневым", для
всех публичных (anonymous) пользователей.
Создание этого пользователя "запускает"
публичный FTP сервер.
Используйте неправильный пароль и
shell для этого пользователя. Строка из
passwd файла для этого пользователя
должна быть подобной этой:
ftp:*:400:400:Anonymous FTP:/home/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) == ' ' ) 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 /home/ftp/pub/linux nfs ro,noquota,nosuid,intr,bg 1
0
По этой записи смотнируется в каталог
/home/ftp/pub/linux диск с машины 'other' без
дисковой квоты (noquota), без поддержки suid
программ, "прерываемым" - на
случай если хост 'other' не работает.
2. Установка FTP сервера с
переназначаемым корневым каталогом
(chrooted FTP server).
Это раздел вставлен Marcus J Ranum <mjr@tis.com>
Пререкомпилируйте ваш ftpd без
использования динамических библиотек
и попестите его в каталог ~ftp/bin.
Влажельцем должен быть root.
Скомпилируйте без использования
динамических библиотек программу ls и
поместите ее тоже в каталог ~ftp/bin. Для
Sun, можно использовать портированную
из BSD версию комманы ls. Ее можно найти
на ftp://ftp.tis.com/pub/firewalls/toolkit/patches/ls.tar.Z
Владельцем для ls должет быть root.
Владельцем для каталога ~ftp сделайте
root и права доступа установите в 0755 (ЭТО
ОЧЕНЬ ВАЖНО!)
Создайте копии файлов ~ftp/etc/passwd и
~ftp/etc/group (незабудьте убрать пароли),
владельцем должен быть root.
Создайте программу враппер
("wrapper") (один из вариантов
приведен ниже) и пропишите ее в
/etc/inetd.conf
/*
** Программа подразумевает, что вы
выбрати в катестве базоваго каталога
/var/ftp
** Если у вас другой каталог, то
замените во всем тексте /var/ftp на полный
путь
** к выбранному вами каталогу
** Прим: Не используйте для ftp катагог '/'
(корневой)!
*/
main()
{
if(chdir("/var/ftp")) {
perror("chdir /var/ftp");
exit(1);
}
if(chroot("/var/ftp")) {
perror("chroot /var/ftp");
exit(1);
}
/* optional: seteuid(FTPUID); */
execl("/bin/ftpd","ftpd","-l",(char
*)0);
perror("exec /bin/ftpd");
exit(1);
}
Options:
Вы можете использовать 'netacl' из toolkit
или tcp_wrappers для достижения такого же
эффекта.
Также вы можете в исходных текстах
ftpd найти все места где вфзфвается ф-ция
seteuid() убрать эти вызовы, и в программе
"враппере" вставить вызов setuid(ftp)
перед вызовом ftpd. Это предотвратит
возможность подучения root привелегий,
если в вашем ftpd будет найдена "дырка".
Проследите, что бы во всей иерархии
каталогов на FTP сервере были правильно
устаеовленны права доступа и
владельцы файлов, и никогда не
размещайте на FTP исполняемые файлы (с
установленным флагом executed).
Теперь файл ~/dtp/etc/passwd полностью
отдельный и независимый от системного
файла /etc/passwd.
ЗАПОМНИТЕ:
Если через ваш ftpd кто то сможет
получить привелегии "root" то это
может закончиться очень печально. В
связи с этим очень хорошей
рекомендацией является следующее -
старайтесь не запускать "демонов"
от пользователя root. Многие так
стартуют, но не всем им нужны root'овые
привелегии. Вы можете проверить с
какимы правами работают программы с
помощью комманды 'ps uax'
3. Информация специфищеская для
различных операционных систем.
Некоторым системам требуется
устройство /dev/tcp:
Старые SVR2 и SVR3 системы
RTU 6.0 (Masscomp, now Concurrent Real Time UNIX),
AT&T 3B1 и 3B2
[dev/tcp]
Некоторые реализации ftpd требуют
наличия ~ftp/dev/tcp для обеспечения работы
анонимного FTP сервера.
Вы можете создать это устройство (man
mknod) в катадоге ~ftp/dev/ c такими же major и minor
номерами, как и у системного /dev/tcp.
~ftp/dev - это каталог, ~ftp/dev/tcp - символьное
устройство. Владелец м группа для него
'root'. Права доступа для ~ftp/dev должны быть
read/write/exec для владельца и read/exec для
группы, для ~ftp/dev/tcp права владельца
read/write, права для группы read.
HPUX
[Logging] Если вы используете ftpd от HP, то для
включения долее подробного
протоколирования в файле /etc/inetd.conf для
ftpd нужно указать ключ '-l'.
Solaris 2.x
[Script] В ОС Solaris содержится скрипт для
установки анонимного FTP сервера. Его
описание вы можете найти в мане для ftpd
(man ftpd). Мы вам рекомендуем просмотреть,
что этот скрипт делает, на предмет
возможных ошибок в конфигурации
связанных с безопастностью.
SunOS
[Libraries] Для обеспечения работы в SunOS с
динамическими библиотеками,
необходимо выполнить следующее:
Создать каталог ~ftp/usr. Владелец root,
права доступа 0555.
Создать каталог ~ftp/usr/lib. Владелец root,
права доступа 0555.
Скопировать загрущик ld.so в каталог
~ftp/usr/lib. Владелец root, права доступа 0555.
Скопируйте файлы libc.so.* в каталог
~ftp/usr/lib
Для libc.so.* - владелец root, права
доступа 0555.
Note: Для версий 4.1.2 или более ранних,
вам понадобиться скопировать еще
файлы /usr/lib/libdl.so.* в каталог ~ftp/lib.
Создайте каталог ~ftp/dev. Владелец root,
права доступа 0111.
Для работы загрущика необходим
~ftp/dev/zero. Перейдите в каталог ~ftp/dev и
создайте его с помощью команды:
mknod zero c 3 12
Владелец для ~ftp/dev/zero - root. Права
доступа на чтение (0444).
Внимание: Для новичков: Не
пытайтесь скопировать /dev/zero в
~ftp/dev/zero! /dev/zero это безконечный файл,
который будет копироваться пока не
заполнит весь ваш диск.
Если вы не хотите переносить
библиотеки, то вы можете
воспользоваться версией команды ls,
которая скоипилированна без
использования динамических
библиотек. На CD-ROM с SunOS вы можете ее
найти, причем уже скомпилированную. В
этом случае вам нужно произвести
действия описанные в пунктах #5-6.
[Logging]Стандартный сановский ftpd
протоколирует *всю* информацию о
паролях. Для исправления этого, вам
нужно установить патч:
101640-03 SunOS 4.1.3: in.ftpd
logs password info when -d option is used.
В файле /etc/inetd.conf найдите строку,
которая начинается с "ftp". В
конце этой строки вы найдете
"in.ftpd". Исмените это на "in.ftpd
-dl". В /etc/syslog.conf, добавте строку типа
этой:
daemon.*
/var/adm/daemonlog
Протоколируемая информация может
быть разделена (что особенно нужно
для SunOS4.1.1, которая не обрабатывает
запись вида daemon.*), например:
daemon.info
/var/adm/daemon.info
daemon.debug
/var/adm/daemon.debug
daemon.err
/var/adm/daemon.err
Примечание, колонки должны
разделяться символами табуляции, а
не пробелами, иначе это работать не
будет.
Для создания лог файла выполните
команду touch /var/adm/daemonlog, и
перезагрузите ваши inetd и syslogd. Если у
вас не установлен патч, то
обязательно сделайте зладельцем лог
файла root и установите права доступа в
0600, иначе любой сможет прочитать этот
файл и выбрать из него пароли
пользователей.
Внимание: Вы можете все свои файлы
протоколов сделать доступными
только для root. Это защитит от
возможности вычислить пароль
пользователя, если он его ввел вместо
своего имени.
4. Где можно найти другие FTP
демоны
Wuarchive FTP 2.4- A хороший FTP демон, с
расширенным управлением доступом,
системой протоколирования, и
многогранной конфигурацией.
Его можно найти на FTP сервере ftp.uu.net в
каталоге "/networking/ftp/wuarchive-ftpd". Вы
можете проверить контрольные суммы
для архивов, что бы убедиться в том,
что вы получили именно ту версию, что
нужно. (Внимание: в старых версиях Wu-FTP
есть ошибки по части безопастности!)
BSD
SVR4
File
Checksum Checksum MD5 Digital Signature
----------------- --------
--------- --------------------------------
wu-ftpd-2.4.tar.Z 38213 181
20337 362 cdcb237b71082fa23706429134d8c32e
patch_2.3-2.4.Z
09291 8 51092 16
5558a04d9da7cdb1113b158aff89be8f
DECWRL ftpd version 5.93, можно получить на
сервере gatekeeper.dec.com в каталоге
"/pub/misc/vixie" directory.
BSD
SVR4
File
Checksum Checksum MD5 Digital Signature
----------------- --------
--------- --------------------------------
ftpd.tar.gz 38443
60 1710 119 ae624eb607b4ee90e318b857e6573500
Public Domain Sources:
ftp.uu.net ~ftp/systems/unix/bsd-sources/libexec/ftpd
gatekeeper.dec.com ~ftp/pub/DEC/gwtools/ftpd.tar.Z
5. Как узнать, является ли FTP
сервер безопасным
В этом разделе приведен небольшой
список действий необходимых для
проверки надежности вашего FTP сервера.
Проверьте, не обрабатывает ли ваш
сервер комманду SITE EXEC при соединении
через телнет на 21 порт с приследующим
набором команды SITE EXEC. Если ваш сервер
обрабатывает эту команду, то
убедитесь, что у вас стоит ftpd
последней версии, так как в старых
версиях была возможность в такой
ситуации получить доступ к shell через 21'й
порт.
Убедитесь, что никто не может создать
файл или записать файл расположенный
в основном каталоге FTP сервера. Если
кто нибуть зайдет и создаст файлы .rhosts
и .forward с определенным содержимым, то
это даст возможность вторгнуться в
вашу систему любому злоумышленнику.
Убедитесь, что на FTP сервере нет
файлов или каталогов принадлежащих
пользователю ftp (основной каталог
особенно). Несоблюдение этого также
открывает возможность проникновения
в систему.
Убетитесь, что у вас стоит FTP демон
последних версии.
6. Archie
Поиск программ на FTP серверах. Войдите
на один из этих серверов как archie, или
воспользуйтесь соответствующей
программой-клиентом.
archie.ac.il
132.65.20.254 (Israel server)
archie.ans.net
147.225.1.10 (ANS server, NY (USA))
archie.au
139.130.4.6 (Australian Server)
archie.doc.ic.ac.uk
146.169.11.3 (United Kingdom Server)
archie.edvz.uni-linz.ac.at
140.78.3.8 (Austrian Server)
archie.funet.fi
128.214.6.102 (Finnish Server)
archie.internic.net
198.49.45.10 (AT&T server, NY (USA))
archie.kr
128.134.1.1 (Korean Server)
archie.kuis.kyoto-u.ac.jp
130.54.20.1 (Japanese Server)
archie.luth.se
130.240.18.4 (Swedish Server)
archie.ncu.edu.tw
140.115.19.24 (Taiwanese server)
archie.nz
130.195.9.4 (New Zealand server)
archie.rediris.es
130.206.1.2 (Spanish Server)
archie.rutgers.edu
128.6.18.15 (Rutgers University (USA))
archie.sogang.ac.kr
163.239.1.11 (Korean Server)
archie.sura.net
128.167.254.195 (SURAnet server MD (USA))
archie.sura.net(1526)
128.167.254.195 (SURAnet alt. MD (USA))
archie.switch.ch
130.59.1.40 (Swiss Server)
archie.th-darmstadt.de
130.83.22.60 (German Server)
archie.unipi.it
131.114.21.10 (Italian Server)
archie.univie.ac.at
131.130.1.23 (Austrian Server)
archie.unl.edu
129.93.1.14 (U. of Nebraska, Lincoln
(USA))
archie.univ-rennes1.fr
(French Server)
archie.uqam.ca
132.208.250.10 (Canadian Server)
archie.wide.ad.jp
133.4.3.6 (Japanese Server)
|