Безопасность Linux. Удаленные атаки

Безопасность Linux. Удаленные атаки 

В этой статье преобладает теория о том, как что-то устроено(хотя присутствуют и практические советы). Она больше ориентирована на администраторов(начинающих). 

Я не буду описывать то, что пароль может быть просто подобран или увиден на листочке, который вы забыли на работе. Пароли следует делать легкими для запоминания, однако наиболее сложными для подбора(использовать цифры, буквы разных регистров и спецсимволы; длинной от 9 до 14 символов). Так же лучше запретить подключение с помощью пользователя root с удаленного компьютера (файл etc/security) 

Default

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

Для получения подробной информации настроек "по умолчанию" лучше смотреть в мануал используемого Вами ОП. 

DoS и DDoS

Скажу честно, что когда я впервые услышал эти аббревиатуры, то подумал, что имелась в виду операционная система. Нет, это атаки на отказ в обслуживании. Действительно большого вреда они не принесут, однако сервер может перестать отвечать пользователям, обращающимся к нему. Атаки такие действуют методом "в лоб". Компьютер отсылает много пакетов на удаленный сервер, пока тот не отправит все свои ресурсы на "разгребание" такой атаки. Обычно в адресе "from:" указывают тот же сервер, что и для получателя. Таким образом организуется цикл, что и приводит к отказу в обслуживании. 

Сканирование мною специально для этой статьи 100 сравнительно крупных сайтов показало, что 92 из них подвержены "легкому" (достаточно даже небольшого кол-ва компьютеров, а иногда даже одного) Dos. 

Я также хочу упомянуть о том, что существует атака-smurf: компьютер отправляет запрос(ping) на несколько крупных серверов с подложным адресом отправителя(адрес жертвы), после чего каждый компьютер отправляет ответ жертве. Легко понять, что таким образом жертву очень легко вывести из строя. Программу для использования могу посоветовать nemesis. 

Лично я советую отключать службы echo, chargen и парочку других служб. Для этого закомментируйте несолько строк в etc/inetd.conf 

Желательно также поставить firewall и ограничить кол-во возможных запросов с удаленных компьютеров. 

Противостоять нескольким сотням компьютеров, засылающих сервер практически невозможно (даже при недавней атаке novarg на www.microsoft.com последний не отвечал на запросы) 

Sniffers

По сети, как известно, передаются пакеты. Задача снифферов их перехватывать и анализировать. При захвате информации легко получить пароль или любую другую конфиденциальную информацию. У каждого пакета существует свой MAC-адрес. При получении пакета компьютером он проверяет, принадлежит ли данный пакет ему по данному адресу. И если принадлежит, то анализирует, а если нет - отправляет дальше. Всем этим занимается сетевой адаптер. Он может быть переведен в режим "полного анализа" (неразборчивый режим). В данном режиме он анализирует все данные, передающиеся через него. 

К сожалению (а для кого-то к счастью), многие службы передают информацию в незашифрованном виде. Это относится к таким известным и часто используемым вещам, как telnet, http и ftp. 

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

Приводить примеры и описание снифферов я здесь приводить не буду, т.к. таких статей очень много (www.dago.org, www.xakep.ru и др.). 

Buffer Overflow

Ну это общеизвестная ошибка некомпетентности программистов. 

Если обратиться к какой-то переменной и ввести для нее очень большое(для нее) значение, то произойдет ошибка и адрес возврата в стеке будет замещен указанным адресом. (для более полного понимания советую изучить устройство ПК) 

Единственным спасением, если вы не успели установить заплатку, является постоянный просмотр log файлов, которые ведет ваш сервер. Он запишет туда, что были некорректные обращения к службе. В таком случае службу лучше остановить до лучших времен(появление патча). 

etc/exports и etc/dfs/dfstab

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

В ранних версиях использовался файл etc/exports, в более новых - etc/dfs/dfstab. 

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

root@localhost: mount hostname:file system(nfs for example) directory_he_need 

Убрать возможность подобного взлома можно запретив firewallом порт 2049. Следует так же отредактировать файл экспорта так, чтобы не все компьютеры имели право это сделать, а те, что могли бы, монтировали бы только необходимые им данные (а не папку etc/passwd). 

Кому доверять?

Необходимо запретить всех хостам, кроме указанных подключаться к Вашей машине. Делается это благодаря редактированию файлов etc/hosts.allow и etc/hosts.deny 

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

Сделать ему это иногда может быть просто(подменить refer при обращении). 

Такой же обман может быть применен к NFS и NIS. 

Лучше избегать использование telnet и ftp, а пользоваться современным ssh. Данный протокол лучше защищен криптографически и его процесс идентификации оставит злоумышленнику намного меньше шансов обмануть вас. NFS лучше заменить AFS, а NIS использовать как можно меньше. 

Маршрутизатор, через который будет проходить весь трафик от интернета должен запрещать запросы от имени тех компьютеров, которые находятся с сервером в одной локальной сети(зачем им обращаться к серверу через интернет?). 

Желательно поставить firewall. 

Теперь о том, как надо настраивать firewall. 

а)Во-первых, необходимо проверить, включен ли tcpd (именно он работает с файлами hosts.allow и hosts.deny). Для этого рассмотрим файл etc/inetd.conf. К каждой строке, где указывается включение службы должен стоять такой фрагмент: 

/usr/sbin/tcpd 

Кстати, расскажу подробнее про inetd. Данный демон запускает различные сетевые службы (telnet и др.) при запросе к ним, он указывает к какому порту они подключены и необходим для работы в сети. 

Файл hosts.allow лучше настроить так: 

All: 127.0.0.01 

All: компьютеры, которым вы доверяете. 

Файл hosts.deny настраивается аналогично. 

В новую версию inet - xinet уже встроен такой проверщик. Для работы с ним лучше почитайте документацию. 

К сожалению, не все службы запускаются через демон inetd. Однако они поддерживают запуск с tcpd. Рассмотрим пример на ssh. Для того, чтобы она запускалась с включенным tcpd необходимо запустить ее configure с ключом -with-tcp-wrappers Осталось только в hosts.allow (.deny) добавить строку: 

sshd: имена_компьютеров_которым_можно_доверять 

Что делать, если программный продукт не поддерживает tcpd? Мы же под linux! А линукс - синоним открытого исходного кода! Лично я бы не смог написать необходимый код, если бы не одна книга. Привожу листинг из нее: 

// В начале заголовка программы необходимо разместить:

#ifdef USE LIBWRAP

#include <tcpd.h>

int allow_severity=LOG_NOTICE;

int deny_severity=LOG_WARNING;

#endif

// В функции, которая управляет соединением, добавим следующую 

// строку при объявлении переменной:

#indef USE_LIBWRAP

struct request_info request;

#endif;

// После установки соединения, но перед выполнением каких-либо действий с данными:

#ifdef  USE_LIBWRAP

request_init(&request, RQ_DAEMON, options.servername, RQ_file, local, 0);

fromhost(&request);

if (!hosts_access(&recuest)) {

log(LOG_WARNING, "Connection from %s:%d REFUSED by libwrap",

inet_ntoa(addr.sin_addr),ntohs(addr.sin_port));

log(log_debug,"See hosts_access(5) for detailes");

goto cleanup_local;

}

#endif;   

// лично я разобрался с этим кодом, однако это заняло много времени, 

// надеюсь это поможет и вам. (ком. автора статьи)

б)Вспомним вышеописанную возможность взлома благодаря dns. Нам необходимо выполнять обратное преобразование по ip: сначала tcpd проверит имя компьютера по адресу, а потом адрес по имени компьютера. Если ip-результат не совпадет с ip, который был указан изначально - злоумышленник не получит доступа. Для такой проверки необходимо скомпилировать tcpd с ключом -dparanoid (обычно он установлен по умолчанию, однако нельзя надеяться на default, надо быть точно уверенным). 

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

г)Вспомним предыдущую статью. Для запрета traceroute и ping можно использовать встроенный набор правил ipchains. 

Строка /sbin/ipchains -A input 0/0 echo-request -d ip.ip.ip.ip -p icmp -j DENY (я не объясняю здесь, что делает каждый параметр этой команды, так как набор правил ipchains достаточно велик, а прочитать его можно в мануале по linux). 

д) Переходим к непосредственному описанию настройки firewall на основе ipchains. 

-)/sbin/ipchains -p input deny //запрет всех входящих пакетов 

-)/sbin/ipchains -a input -s 0/0 -d В.А.Ш.IP www -p tcp -j ACCEPT //разрешает прохождение пакетов на порт 80. 

Вместо www может быть указана другая // служба(ftp,ssh); 

-)/sbin/ipchains -a input -j deny -l //регистрируем то, что пакет был заблокирован. 

Все, кажется, я закончил. Конечно, это все только общие настройки. В каждом случае приходится действовать не по теории и придумывать свои решения, но это уже зависит от вас, а не от меня. Лично я советую как можно чаще читать bugtraq и ставить заплатки как только они выходят. Именно благодаря ошибкам в каком-либо коде происходят взломы, хотя и на долю вышеописанных способов приходится не такой уж маленький процент взлома.