Linux обеспечивает безопасность в сети.


Автор: Андрей Матвеев
andrushock@fromru.com
Опубликовано: 11.09.2001
Оригинал:http://www.softerra.ru/freeos/12192/


Введение

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

Основными типами нападений являются: несанкционированный доступ, т.е. злоумышленник, которому не разрешается использовать сервисы вашего хоста, сможет подключиться и работать с ними; использование "багов" в сетевых службах, которые оказываются уязвимыми из внешней сети; Denial of Service (отказ в обслуживании) √ такие нападения приводят к выходу из строя аппаратного и/или программное обеспечение хоста, в результате чего система становится недоступной для пользователей, при атаке на службы цель атакующего проста √ выбить хост из сети; мистификация √ когда атакующий имитирует подключение к системе с хоста, пользующегося доверием; прослушивание трафика √ злоумышленник настраивает сетевой интерфейс таким образом, чтобы получать все пакеты, проходящие в сети, а не только его системе с целью извлечения имен и паролей пользователей.

Надежными путями борьбы с подобными нападениями являются: повышение безопасности ядра и IP-стека; построение брандмауэра (firewall); выявление сканирования, определения типа и версии используемой операционной системы, вторжения; журналирование, с максимальным уровнем подробности; защита от подслушивания; полное отключение всех небезопасных служб или замена альтернативами. В цикле статей "Обеспечиваем безопасность OS Linux в сети на примере дистрибутива Red Hat Linux 7.0" попробуем разобраться с такими способами борьбы против направленных деструктивных действий злоумышленников.

1. Перекомпилируем ядро

По умолчанию ядро осуществляет недостаточный уровень безопасности. Включаем в ядро все опции 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

2. Правим /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

3. Поиграем с цепочками

Фильтрация IP √ механизм, являющийся средством сетевого уровня, т.е. он ничего не знает о приложениях, использующие сетевые соединения, определяет, что нужно делать с принятым или отправленным пакетом: обработать "нормально" или проигнорировать. Набор правил фильтрации IP состоит из комбинации критериев, которые определяют пакеты, подлежащие фильтрации: тип протокола TCP, UDP, ICMP и т.д., номер сокета, тип пакета (флаги, данные, эхо-запрос ┘), адреса отправителя и получателя пакетов.

В состав Red Hat 7.0 входит программа администрирования ipchains, для построения и управления брандмауэра. Она обладает упрощенным синтаксисом команд по сравнению с ipfwadm, гибкостью, а также механизмом сцепления, позволяющим создавать наборы правил и их объединения.

Некотрые параметры ipchains:
-N - создает новую цепочку
-A - добавляет правило к концу цепочки
-I - включает правило в начало цепочки
-X - удаление цепочки
-F - удаление правил из всех цепочек
-i - сетевой интерфейс (eth0, eth1, ppp0, lo)
-p - протокол TCP/IP, возможны записи tcp, udp, icmp, all
-y - проверка состояния флагов SYN и ACK при установке TCP- соединения (SYN установлен, ACK сброшен)
!-y - проверка состояния флага ACK в ответе на запрос на установление TCP-соединения (ACK установлен)
-s - адрес источника и порт
-d - адрес назначения и порт
-j - действие над пакетом (ACCEPT, REJECT, DENY)
-l - производится запись пакета, удовлетворяющего правилу в лог (KERN_INFO)

В ipchains существует три встроенные цепочки: input (входная цепочка), forward (цепочка перенаправления) и output (выходная цепочка). Пакеты продвигаются по созданным цепочкам в этом порядке до тех пор, пока не обнаружится совпадение, затем определяется действие над пакетом, указанное в составе правила (приводятся чаще всего используемые правила):
ACCEPT √ результат сопоставления положительный;
DENY √ происходит отброс пакета;
REJECT √ тоже самое, что и DENY, только высылается сообщение ICMP типа 3 √ destination host unreachable (один из маршрутизаторов не может доставить пакет на следующий узел);
MASQ √ маскарадинг (маскировка), применяется только в цепочке forward.
Примечание: действие над пакетом можно и не определять, например, для учета трафика: ipchains √A forward √i eth0 √p tcp √d 0/0

Внешний вид:
-ipchains √A|I [цепочка] [-i интерфейс] [-p протокол] [ [!] √y] [-s адрес [порт]] [-d адрес[порт]] √j действие над пакетом [l]

Имеем адрес сети 192.168.5.0, маску сети 255.255.255.0, широковещательный адрес 192.168.5.255, IP-адрес 192.168.5.21, сетевой интерфейс eth0.
Нужно запретить подключения к нашему компьютеру к любым портам, кроме 137-139 (для работы протокола SMB), 80 (для работы www- сервера), 22 (для работы SSH), 20, 21 (FTP-сервера) и разрешить подключения к удаленным узлам со службами WWW, SMTP, POP3, AUTH, FTP, SSH.

Создаем сценарий для ipchains:
cd /etc touch ipchains.rules

В удобном для Вас текстовом редакторе создаем цепочки. Подробный файл конфигурации ipchains с комментариями можно (даже нужно) взять здесь.

Теперь:
chmod +x /etc/ipchains.rules
и в /etc/rc.d/rc.local для автоматического запуска нашего сценария прописываем путь к /etc/ipchains.rules:
sh /etc/ipchains.rules

Проверить работу нашего скрипта можно выполнив команду:
/etc/rc.d/init.d/ipchains status

4. Фильтруем порты

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,57 42,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


5. Смотрим в логи

Для этого качаем программку с freshmeat.net iplog, которая отслеживает TCP, UDP, ICMP траффик через сетевой интерфейс, определяет некоторые виды сетевых атак и сканирования портов. Распаковываем:
tar zxvf iplog-2.2.3.tar.gz
Переходим в созданный каталог и:
./configure
make
make install

Для автоматической загрузки теперь в /etc/rc.d/rc.local прописываем путь к iplog:
/usr/local/sbin/iplog -l /var/log/iplog

Как дополнение к PortSentry и iplog можно использовать программу scanlogd, которая выявляет и записывает с помощью syslogd в /var/log/messages IP адреса хостов, которые посылают пакеты на разные порты нашей системы в короткое время.
Качаем отсюда
Распаковываем:
tar zxvf scanlogd-2.2.tar.gz
Переходим в созданный каталог и устанавливаем:
make -f Makefile
make linux

В текущем каталоге будет создан исполняемый файл scanlogd, но запускать его еще рано. Для его работы требуется создание пользователя scanlogd в системе:
adduser scanlogd
вводим и подтверждаем пароль.
Так как смотреть в /var/log/messages и отыскивать там записи этой программы удовольствие не из приятных, то облегчим себе работу:
Создадим каталог /etc/cron.security
В нем создадим файл scanlogd.cron с таким содержанием:
#!/bin/sh
cat /var/log/messages | grep scanlogd | mail root

Установим для этого файла атрибут исполнения и добавим записи в файл /etc/crontab:
#scanlogd
00 21 1-31 * 0-6 root run-parts /etc/cron.security

Теперь каждый день в девять часов вечера будет приходить отчет scanlogd суперпользователю по почте.

Формат сообщений scanlogd выглядит так: IP адрес сканирующего хоста┘IP адрес сканируемого хоста┘порты┘ флаги┘время жизни пакета┘когда было выявлено сканирование. Пример:
Aug 16 16:55:40 midian scanlogd: 192.168.5.23 to 192.168.5.21 ports 686, 666, 446, 89, 302, 410, ..., fSrpauxy, TOS 00, TTL 64 @16:55:40

Для автоматической загрузки теперь в /etc/rc.d/rc.local прописываем путь к scanlogd. У меня это выглядит так:
/root/DOWNLOAD/SCANLOGD/scanlogd-2.2/scanlogd

Также не лишним будет записывать все сообщения ядра в файл /var/log/messages. Для этого в /etc/syslog.conf прописываем строчку:
kern.* /var/log/messages .

6. Отключение несущественных сервисов.

Нужно определится, для каких целей будет использоваться хост. По умолчанию в OS Linux загружается много служб, такие как sendmail, pop3, wu-ftpd, finger, nfs, rpc, R services, telnet, SMB и другие. В дистрибутив Red Hat Linux входит удобная программа ntsysv для управления загрузкой служб. Единственное неудобство: для каждого режима работы придется загружать ntsysv. Необходимо определить назначение хоста, оценить полезность, преимущества и риск загружаемых сервисов.

7. Оберегаем демонов

Samba
Samba √ это набор программ для реализации протокола Session Message Block в никсах. Позволяет совместно использовать файловые системы *nix в Windows и файловую систему FAT в *nix, а также принтеры, подключенные либо к компьютерам, с операционной системой *nix, либо к компьютерам с системой WindowsX. Лучше взять с www.ru.samba.org последнюю версию этого пакета 2.2.1а, где исправлены баги с безопасностью, улучшена совместимость с Win2000 и много еще все разного. Распаковываем архив tar zxvf samba-2.2.1a.tar.gz
переходим в созданный каталог и конфигурируем:
./configure --prefix=/usr/local/samba --with-smbmount --with-msdfs --with-mmap
make
make install

Теперь внесем коррективы в файл /usr/local/samba/lib/smb.conf для повышения уровня защиты и быстродействия:

Эти параметры определяют возможность обращения к ресурсу с определенных хостов или подсетей:
hosts deny = ALL
hosts allow = 192.168.5 127.

Параметр guest ok= определяет, будет ли иметь доступ к ресурсу пользователь без регистрационной записи. Синоним этого параметра public= guest ok=no

Параметр wide links= при значении no говорит Samba не следовать по символическим ссылкам вне экспортируемой области √ это позволяет получить некоторые бонусы с точки зрения защиты, но в то же время это замедлит работу Samba примерно на 30 %, так как эта операция добавляет шесть дополнительных системных вызовов на каждое обращение к именам файлов. Значение yes или no выбираем сами┘

Разрешаем шифрованные пароли:
encrypt passwords = yes

Устанавливаем права на файлы и директории, создаваемые или копируемые из виндовс в никсы:
create mask = 0644
directory mask = 0755
Ну и расставляем нужные пермишенсы на smb.conf и ресурсы.

Для увеличения производительности Samba, прописываем в smb.conf :
socket options = TCP_NODELAY IPTOS_LOWDELAY SO_RCVBUF=8192
SO_SNDBUF=8192
wide links = yes
read raw = no

Изменяем параметры виртуальной памяти в sysctl.conf :
vm.bdflush=100 1200 128 512 15 5000 500 1884 2
vm.buffermem=60 80 80

Для того, чтобы изменения в sysctl.conf вступили в силу:
/etc/rc.d/init.d/network restart

Apache Apache √ это свободно распространяемый Web-сервер, разработанный по принципу открытой модели исходного кода. В настоящее время по обзорам различных компаний Apache является самым популярным веб-сервером в интернете.

Скачиваем дистрибутивный пакет отсюда распаковываем и инсталлируем:
tar zxvf apache_1.3.19rusPL30.4.tar.gz
./confugure --prefix=/usr/local/apache
make
make install

По умолчанию сервер Apache устанавливается с оптимальными опциями защиты. Так, что, например, для разрешения работы CGI и SSI прийдется в /usr/local/apache/conf/httpd.conf прописать:
Options ExecCGI
AddHandler cgi-script .cgi
Options IncludesNOEXEC
Последняя опция включает поддержку директив включения SSI, но не разрешает исполнение директивы exec, чтобы нельзя было вставить злоумышленнику вставить свои команды и послать форму.

Разрешаем доступ к нашему веб-серверу только с авторизированной подсети: order deny, allow
allow from 192.168.5
deny from all

Также с помощью брандмауэра можно предоставить доступ к веб-серверу (192.168.5.1) только из своей сети:
ipchains -A input -i eth0 -p tcp -s 192.168.5.0/255.255.255.0 1024:65535 -d
192.168.5.1 80 -j ACCEPT
ipchains -A output -i eth0 -p tcp ! -y -s 192.168.5.1 80 -d
192.168.5.0/255.255.255.0 1024:65535 -j ACCEPT

Если на странице содержатся важные данные, то можно их защитить средствами апача:
<Location /secure>
AuthName secure
AuthType basic
AuthUserFile /www/secure/.htpasswd
Require valid-user
order deny, allow
allow from 192.168.5
deny from all
</Location>

Для создания парольного файла:
htpasswd √c /www/secure/.htpasswd username
Потом вводим и подтверждаем пароль.

Теперь при попытке зайти на http://www.blablabla.ru/secure придется ввести имя пользователя и пароль.

Создать свои html файлы для директивы ErrorDocument с различными ошибками. Не стоит включать разрешение просмотра содержимого каталогов (директиву построения индексов Options Indexes). Можно заставить демона httpd прослушивать другой порт, например, 8080
Port 8080 Так как злоумышленники при сканировании сетей обычно сканируют только привилигированные порты.
Кроме аутентификации типа basic, сервер апачи поддерживает криптографическую аутентификацию с помощью алгоритма MD5. Аутентификацию на базе MD5 можно добавь с помощью утилиты htdigest.


wu-ftpd FTP √ File Transfer Protocol. Стандартный метод передачи файлов из одной системы в другую. В дистрибутиве Red Hat Linux используется бесплатный сервер wu-ftpd.

Редактируем файл /etc/ftpaccess :
Отключаем клиента после достижения им определенного числа неудачных попыток регистрации :
loginfails 1
Разрешаем обращаться к нашему фтп-серверу (192.168.5.1) только из пределов нашей сети, пользователь anonymous не имеет доступа :
class localclass guest,real 192.168.5.*/255.255.255.0
guestuser username
Пользователя username необходимо зарегистрировать в системе.
Ограничить доступ можно и с помощью firewall :
ipchains -A input -i eth0 -p tcp -s 192.168.5.0/255.255.255.0 1024:65535 -d
192.168.5.1 21 -j ACCEPT
ipchains -A output -i eth0 -p tcp ! √y -s 192.168.5.1 21 -d 192.168.5.0/255.255.255.0 1024:65535 -j ACCEPT
ipchains -A output -i eth0 -p tcp -s 192.168.5.1 20 -d 192.168.5.0/255.255.255.0 1024:65535 -j ACCEPT
ipchains -A input -i eth0 -p tcp ! √y -s 192.168.5.0/255.255.255.0 1024:65535 - d 192.168.5.1 20 -j ACCEPT
ipchains -A output -i eth0 -p tcp -s 192.168.5.1 1024:65535 -d 192.168.5.0/255.255.255.0 1024:65535 -j ACCEPT
ipchains -A input -i eth0 -p tcp ! √y -s 192.168.5.0/255.255.255.0 1024:65535 - d 192.168.5.1 1024:65535 -j ACCEPT

Делаем проверку по rfc822 (самая строгая из трех возможных) :
passwd-check rfc822 warn

Все кидаем в логи :
log commands guest,real
log transfers guest,real inbound,outbound

И расставляем permissions :
delete no guest,real
overwrite no guest,real
rename no guest,real
chmod no guest,real
umask no guest,real
upload /var/ftp * no nodirs
upload /var/ftp /bin no
upload /var/ftp /etc no
upload /var/ftp /pub no
upload /var/ftp /upload yes * * 0600 nodirs

И в файле /etc/ftpusers прописываем пользователей, которые НЕ имеют доступа к локальному ftp-серверу.

Secure Shell SSH √ это защищенная система регистрации, приходящая на замену telnet, rlogin, rsh и других. Аутентификация и шифрование сеанса выполняется незаметно для пользователя, а инициализация практически также проста, как и у telnet. Установка дистрибутива ssh стандартная: tar , ./configure, make, make install. При первом запуске автоматически произойдет создание необходимых ключей. Редактируем /etc/ssh/sshd_config :
Указываем, с каких хостов возможно подключение к нашему sshd (192.168.5.1)
AllowHosts 192.168.5.2

Или создаем правила ipchains :
ipchains -A input -i eth0 -p tcp -s 192.168.5.2 1024:65535 -d 192.168.5.1 22 -j ACCEPT
ipchains -A output -i eth0 -p tcp ! -y -s 192.168.5.1 22 -d 192.168.5.2 1024:65535 -j ACCEPT
ipchains -A input -i eth0 -p tcp -s 192.168.5.2 1020:1023 -d 192.168.5.1 22 -j ACCEPT
ipchains -A output -i eth0 -p tcp ! -y -s 192.168.5.1 22 -d 192.168.5.2 1020:1023 -j ACCEPT

Указываем группы, которые могут получать доступ к службе : AllowGroups sshadmin

Ведем тщательные логи :
FascistLogging yes

Запрещаем регистрацию с пустым паролем :
PasswordAuthentication yes
PermitEmptyPasswords no

Под учетной записью root зарегистрироваться нельзя :
PermitRootLogin no

Также можно заставить sshd прослушивать другой порт(по умолчанию 22), например, 1022
Port 1022
и включить параметр, определяющий по истечению какого времени простаивающее подключение будет разорвано (например, один час):
IdleTimeout -h 1

Ранние версии ssh имели существенные проблемы с защитой (склонность к переполнению буфера и т.д.). От использования версий ssh до и включительно SSH-1.5-OpenSSH-1.2.3 необходимо отказаться по причине возможного перехвата и расшифровки злоумышленником с помощью анализаторов пакетов посредством методов man in the middle и decrypt ваших зашифрованных паролей. Всегда старайтесь использовать последнюю версию ssh.

8. Установка нового ядра на примере Red Hat Linux 7.0

Переход с 2.2.16 на 2.4.8 необходимость? Решать вам. Вот краткий список (с полным можно ознакомиться на www.kernel.org) исправлений, улучшений и нововведений: поддержка нового оборудования, оптимизация, повышение уровня безопасности, исправление ошибок, улучшенная поддержка SMP, порты на другие архитектуры, поддержка различных файловых систем, iptables и т.д.

Итак загружаем архив с http://ftp.kernel.org/pub/linux/kernel/v2.4/
Распаковываем:
tar zxvf linux-2.4.8.tar.gz
cd linux
make mrproper

и смотрим в Changes, что же нам требуется обновить:

o Gnu C 2.91.66
o Gnu make 3.77
o binutils 2.9.1.0.25
o util-linux 2.10o
o modutils 2.4.2
o e2fsprogs 1.19
o reiserfsprogs 3.x.0j
o pcmcia-cs 3.1.21
o PPP 2.4.0
o isdn4k-utils 3.1pre1

Качаем, если чего то нет. Но обычно в свежих дистрибутивах все это есть и гораздо более новые версии.

В данном случае pcmcia-cs, PPP, isdn4k-utils я не использую.

Устанавливать лучше всего перезагрузившись в single mode, когда практически ничего не загружено (в приглашении lilo boot: указать загрузчику linux single или linux 1). Быстрее все скомпилируется.

Для всего перечисленного для инсталляции подходит правило:
./configure
make
make install

За исключением ksymoops - ./configure не нужен и e2fsprogs после make сделать make check, а потом make install.

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

Снова переходим в новый каталог linux и:
make xconfig

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

Вырабатываем файл зависимостей:
make dep

Убираем лишний исходный код:
make clean

Делаем сжатый модуль ядра:
make bzImage

Устанавливаем модули:
make modules
make modules_install

Копируем новое ядро в /boot и прописываем новое ядро в /etc/lilo.conf:

boot = /dev/hda
map = /boot/map
timeout = 50
prompt
 message = /boot/message
 default = kernel-2.2.16
 vga = normal
 read-only
install=/boot/boot.b
image = /boot/bzImage
 label = kernel-2.2.16
 root = /dev/hda3
image = /boot/kernel-2.4.8
 label = kernel-2.4.8
 root = /dev/hda3
other = /dev/hda1
 label = dos
 

Даем лило перечитать свой конфигурационный файл:
lilo

Все. reboot
Если загрузилось все нормально, проверяем версию ядра : uname -r
Должна появиться версия: 2.4.8
и не забываем создать загрузочный диск нового ядра:
mkbootdisk --device /dev/fd0 2.4.8



Наш баннер
Вы можете установить наш баннер на своем сайте или блоге, скопировав этот код:
RSS новости