div.main {margin-left: 20pt; margin-right: 20pt}
Безопасность Linux
Если вы их не видели, то это еще не значит, что они за вами не
следят... Сегодня мы поговорим про безопасность вашей Linux-системы. Я
думаю, что это будет актуально, особенно если вспомнить про взлом систем через
Интернет. Итак, что же предпринять для безопасности вашей
системы?
Наверняка почти всем известно, что прежде чем производить
взлом, надо собрать информацию о взламываемой жертве. Например, чтобы удаленно
использовать эксплойт для, скажем, Sendmail, надо узнать версию Sendmail и
найти эксплойт под эту версию. Если взломщик не сможет узнать версию, то ему
придется либо искать другой путь взлома, либо попробовать (о ужас!) все
эксплоиты. Значит, нам нужно сделать так, чтобы взломщик знал как можно меньше
про нашу систему. Ну так сделаем это! В каталоге /etc есть файлы issue и
issue.net, первый выдает приветствие при доступе с локального терминала, а
другой — при доступе с telnetd. Содержимое этих файлов нужно изменить,
например, вместо "Welcome to Linux Mandrake 8.1!" написать "Welcome to
Linux!". Причем, можно еще и ввести взломщика в заблуждение, написав что-то
типа "Welcome to Suse 6.1" Это даже будет гораздо полезней, т.к. при виде
приветствия Suse взломщик будет ориентироваться на то, что на взламываемой
машине стоит Suse, а вот при появлении простого "Welcome" взломщик полезет
дальше, чтобы узнать про вашу систему больше. В том же самом каталоге есть еще
файл shells. Он хранит адрес к вашей оболочке. Ее лучше сменить на
недостоверную информацию, это тоже усложнит взлом системы. При взломе
системы, чтобы определить операционную систему удаленной машины, обычно
используют тулзу queso или ей подобные. Данная утилита посылает запрос на
машину и, получив ответ, анализирует его, в результате чего, в зависимости от
ответа, определяется операционная система. Ваша задача заключается в том,
чтобы настроить свой файрволл таким образом, чтобы тот не отвечал на такие
запросы или давал ложный ответ. Есть еще очень полезная для взломщика
утилита uname. Если ее запустить с опцией "-a", то хакер получит достаточно
информации об атакуемой машине (тип операционной системы, версию ядра и т.д.).
Задача: надо сделать так, чтобы тулза выводила только то, что мы ей скажем, и
этим самым она дожна вводить взломщика в заблуждение. Утилита uname хранится
обычно в каталоге /bin. Лезем в нее и присваиваем этому файлу такие права
доступа: chmod og-rx uname. Дальше лезем в каталог /etc/skel — хранилище
файлов .bashrc, bash_profile и др. Они обычно копируются в домашний каталог
каждого юзера вашей машины при создании для него аккаунта. Открываем файлик
/etc/skel/bash_profile. Данный файл хранит в себе значения переменных и
является чем-то вроде файла инициализации. Для примера, файл содержит
переменную $PATH, которая хранит в себе путь к каталогам с исполняемыми
файлами; стоит упомянуть, что пути к каталогам разделяются символами
двоеточия. Также файл содержит переменную $HOME, которая хранит путь к
домашнему каталогу. А переменная $PS1 хранит вид приглашения, которое, кстати,
можно изменить. Чтобы просмотреть значения какой-либо переменной, используют
команду "echo $имя_переменной". После того, как мы открыли этот файл,
присваиваем переменной $PATH в качестве первого значения /usr/bin. Это даст
нам то, что если будет введена команда uname, то сначала ее будут искать в
/usr/bin, но пока ее там нет. Идем в каталог /usr/bin и создаем файл uname,
после чего пишем в него следующий скрипт, наш аналог команды
uname:
#!/usr/bin/perl while (<@ARGV>) { if ($_ eq '')
{ print "FreeBSDn"; } if ($_ eq '-a')
{ $time=scalar(localtime); print "FreeBSD 4.2.2 localhost.localdomain
2.2.18-11src #1 $time CERT 2000 i586 unknownn"; } if ($_ eq '--help')
{ print qq{ Использование: uname [КЛЮЧ]... Печатает определенные
сведения о системе. По умолчанию КЛЮЧ="-s". -a, — all напечатать всю
информацию -m, — machine напечатать тип машин -n, — nodename напечатать
имя машины в сети -r, — release напечатать номер выпуска операционной
системы -s, — sysname напечатать название операционной системы -p, —
processor напечатать тип процессора -v напечатать версию операционной
системы --help показать эту справку и выйти --version показать
информацию о версии и выйти Об ошибках сообщайте.n};} if ($_ eq '-m')
{ print "i586n";} if ($_ eq '-n') { print
"localhost.localdomainn";} if ($_ eq '-r') { print
"2.2.18-11srcn";} if ($_ eq '-s') { print "FreeBSDn";} if ($_ eq
'-p') { print "unknownn";} if ($_ eq '-v')
{ $time=scalar(localtime); print "#1 $time CERT
2000n";} }
Ставим на этот файл следующие права доступа: chmod og+x
uname. Теперь uname будет всем говорить, что у вас стоит FreeBSD, версия ядра
2.2.18-11src и т.д. Так же вы можете сделать и с другими командами, если
хотите, чтобы они выводили только то, что вам нужно. Идем дальше. Как
известно, в Юникс пароли обычно хранятся в специальных файлах типа passwd,
shadow, master.passwd. В Линухе пароли лежат в shadow, а все остальное — в
passwd, то есть файла master.passwd в системе нет, а мы его сделаем, но не для
системы, а для взломщиков, которые захотят получить ваши пароли и не увидят
файла shadow. Для этого создаем файл master.passwd в папке /etc и пишем что-то
типа
следующего: root:/xDSBsAdco3v.:0:3::/root:/sbin/sh www:N74jZlzME3vI2:201:200:,,,:/www:/usr/bin/false Apedaile,CRC,7392,:/home/apedaid:/usr/bin/rksh bennetg:ral5BQAMbqbRc:208:20:Gary Дальше.
По умолчанию ядро осуществляет недостаточный уровень безопасности. Для
исправления этого включаем в ядро все опции
firewall: CONFIG_FIREWALL=y CONFIG_NET_ALIAS=y CONFIG_INET=y CONFIG_SYN_COOKIES=y CONFIG_RST_COOKIES=y CONFIG_IP_FIREWALL=y CONFIG_IP_FIREWALL_VERBOSE=y CONFIG_IP_ALWAYS_DEFRAG=y CONFIG_IP_ACCT=y CONFIG_IP_ALIAS=m Теперь
его надо перекомпилировать и переустановить. Теперь правим
/etc/sysctl.conf. Эти настройки повышают устойчивость IP-стека к Denial Of
Service атакам, уменьшают время TCP/IP подключения, чтобы можно было
обработать больше соединений за тот же интервал. Также будет уменьшено время,
которое Linux ждет до закрытия соединения, и время, через которое Linux
разрывает устаревшее соединение. Эти настройки отключат некоторые расширения
протокола TCP/IP, которые нам не
нужны. net.ipv4.icmp_ignore_bogus_error_responses=1 net.ipv4.conf.all.log_martians=1 net.ipv4.conf.all.accept_source_route=0 net.ipv4.tcp_syncookies=1 net.ipv4.conf.all.send_redirects=0 net.ipv4.conf.all.accept_redirects=0 net.ipv4.tcp_fin_timeout=30 net.ipv4.tcp_keepalive_time=1800 net.ipv4.tcp_window_scaling=0 net.ipv4.tcp_sack=0 net.ipv4.tcp_timestamps=0 net.ipv4.tcp_max_syn_backlog=1280 net.ipv4.conf.all.forwarding=0 net.ipv4.icmp_echo_ignore_broadcasts=1 Это
еще далеко не все, что можно сделать для безопасности вашей системы. Стоило бы
еще настроить фильтрацию IP, которая поможет фильтровать нежелательные пакеты.
Фильтрация IP — механизм, являющийся средством сетевого уровня, т.е. он ничего
не знает о приложениях, использующих сетевые соединения, определяет, что нужно
делать с принятым или отправленным пакетом: обработать нормально или
проигнорировать. Набор правил фильтрации IP состоит из комбинации критериев,
которые определяют пакеты, подлежащие фильтрации, — тип протокола TCP, UDP,
ICMP и т.д., номер сокета, тип пакета (флаги, данные, эхо-запрос), адреса
отправителя и получателя пакетов. Не помешало бы также открыть несколько
ложных портов и повесить на них ложные данные. Также следует отфильтровать
ваши порты. Для этого воспользуемся PortSentry — это средство для выявления
сканирования портов. Оно практически определяет и блокирует попытки удаленных
атак. Распаковываем скаченный с freshmeat.net архив и устанавливаем: tar
zxvf portsentry-1.1.tar.gz Переходим в созданный каталог и делаем
следующее: make -f Makefile make linux make install Теперь надо
подправить файл конфигурации /usr/local/psionic/ portsentry/portsentry.conf
так:
#задаем прослушиваемые
порты TCP_PORTS="1,11,15,23,25,79,110,111,119,143,540,635,1080,1524,
2000,5742,6667,12345,12346,20034,27665,31337,32771,32772,32773, 32774,40421,49
724,54320" UDP_PORTS="1,7,9,53,69,161,162,513,635,640,641,700,37444,34555,
31335,32770,32771,32772,32773, 32774, 31337,54321" #задаем границу
фильтруемых портов для определения скрытого
сканирования ADVANCED_PORTS_TCP="1024" ADVANCED_PORTS_UDP="1024" #исключаемые
порты ADVANCED_EXCLUDE_TCP="20,21,22,80,139" ADVANCED_EXCLUDE_UDP="138,137" #пути
к файлам IGNORE_FILE="/usr/local/psionic/
portsentry/portsentry.ignore" HISTORY_FILE="/usr/local/psionic/
portsentry/portsentry.history" BLOCKED_FILE="/usr/local/psionic/
portsentry/portsentry.blocked" #не будем резолвить RESOLVE_HOST =
"0" #немедленная блокировка BLOCK_UDP="1" BLOCK_TCP="1" #создадим
правило для ipchains KILL_ROUTE="/sbin/ipchains -I input -s $TARGET$ -j
DENY -l" #так пропишем запись в /etc/hosts.deny KILL_HOSTS_DENY="ALL:
$TARGET$" #при обнаружении сканирования создадим еще один
файл KILL_RUN_CMD="echo PortSentry detect port scanning from $TARGET$ on
$PORT$ > /root/scan.new" #сразу реагируем на сканирование
портов SCAN_TRIGGER="0"
Возможные варианты запуска PortSentry: -tcp,
-udp, -stcp, -sudp, -atcp, -audp. Комбинировать варианты типа -tcp и -stcp
нельзя. Для автоматической загрузки теперь в /etc/rc.d/rc.local прописываем
путь к PortSentry для выявления скрытого
сканирования: /usr/local/psionic/portsentry/ portsentry
-stcp /usr/local/psionic/portsentry/ portsentry -sudp Все. Ваши порты
защищены. Вся вышеприведенная информация не претендует на полноту описания,
а является скорее руководством к дальнейшим действиям. Так что
думайте, делайте и запомните самое главное правило: информация защищена тогда,
когда ее стоимость меньше стоимости взлома системы для ее получения.
X-Stranger xstranger@tut.by http://www.linux4u.narod.ru/
|