Безопасность Linux
Суббота, 28 февраля 2009 16:09

Безопасность Linux

Оцените материал
(1 Голосовать)
Наверняка почти всем известно, что прежде чем производить взлом, надо собрать информацию о взламываемой жертве. Например, чтобы удаленно использовать эксплойт для, скажем, 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 "FreeBSD\n";
}
if ($_ eq '-a') {
$time=scalar(localtime);
print "FreeBSD 4.2.2 localhost.localdomain 2.2.18-11src \#1 $time CERT 2000 i586 unknown\n";
}
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 "i586\n";}
if ($_ eq '-n') {
print "localhost.localdomain\n";}
if ($_ eq '-r') {
print "2.2.18-11src\n";}
if ($_ eq '-s') {
print "FreeBSD\n";}
if ($_ eq '-p') {
print "unknown\n";}
if ($_ eq '-v') {
$time=scalar(localtime);
print "\#1 $time CERT 2000\n";}
}

Ставим на этот файл следующие права доступа: 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

Все. Ваши порты защищены.

Вся вышеприведенная информация не претендует на полноту описания, а является скорее руководством к дальнейшим действиям.

Так что думайте, делайте и запомните самое главное правило: информация защищена тогда, когда ее стоимость меньше стоимости взлома системы для ее получения.
Прочитано 3862 раз Последнее изменение Среда, 07 января 2015 16:14