LASG - Network security
Сетевая безопасность
Обзор
Защита PPP
Защита TCP-IP
Основные файлы настройки и
утилиты
Кто это запустил?
Безопасность маршрутизации
Сетевая безопасность довольно широкая тема, так что я разбил ее на пару
разделов. В этом я описываю нижние 4 уровня (transport, network, datalink,
physical) 7-уровневой модели OSI protocol stack, верхние 3 (application,
presentation, session) будут рассмотрены в разделах по сетевым сервисам. Я
такэе рассмотрю некоторые базисные файлы конфигурации сети, так как их
объяснение всегда полезно.
PPP предоставляет соеднинения TCP-IP, IPX/SPX и NetBEUI по
последовательным линиям (например, по модему). Это основной способ доступа в
Internet большинства людей, так как все dial-up соединения фактически
используют PPP). PPP-соединение по существу состоит из двух вычислительных
устройств (компьютер, Palm Pilot, терминальный сервер...), связанных
последовательной связью (обычно через модемы). Оба конца вызывают PPP,
выполняют авторизацию (есть разные методы) и устанавливают связь. PPP не
имеет никакой реальной поддержки шифрования, так что если Вы требуете
безопасной связи, Вы должны использовать некоторую форму программного
обеспечения для VPN.
Большинство систем вызывает PPP довольно сложным путем. Вы должны
зарегистрироваться на терминальном сервере или его аналоге и запустить
протокол PPP. Ваш логин и пароль будут переданы по сети в чистом виде, к тому
же, нужен логин и пароль на другом конце линии. В этом случае сам PPP не
обрабатывает авторизацию вообще. Несколько более безопасный метод обработки
состоит в том, чтобы использовать PAP (Password Authentication Protocol).
С PAP авторизация обрабатывается внутренне PPP, так что Вам не требуется
"реального" логина на сервере. Однако, username и пароль все еще представлены
чистым текстом, но по крайней мере система несколько более безопасна из-за
отсутствия логинов пользователей.
Третий (и лучший) метод для аутенфикации: использовать CHAP (Challenge
Handshake Authentication Protocol). Обе стороны обмениваются общими
ключами и используют их, чтобы шифровать данные, посланные в течение
опознавательной последовательности. Таким образом, Ваш username и пароль
передаются относительно безопасно, однако фактически данные передаются как
обычно. Одно замечание про CHAP: реализация Microsoft использует DES вместо
MD5, что разрушает соединение с Linux-клиентом. Есть патчи для исправления
данной ситуации. PPP входит почти во все дистрибутивы Linux, как часть ядра
OS, Linux PPP-HOWTO есть на
http://www.linuxdoc.org/HOWTO/PPP-HOWTO.html.
TCP-IP был создан во времена, когда защита не являлась столь важной, как
сейчас. Набор протоколов TCP-IP очень умно построен, но к сожалению не имеет
никаких реальных условий для защиты (то есть аутенфикации, проверки,
шифрования и так далее). Перехват пакетов, чтение полезного груза данных и
тому подобные вещи легко осуществимы в сегодняшней сети Internet.
Имена хостов и их IP-адреса не всегда соответствуют друг другу. Не
используйте авторизацию на основании имени хоста, если возможно. Поскольку
обман кэша DNS довольно прост, надежней использовать IP-адрес (замечание
автора русской версии: лично сталкивался с тем, что кто-то перехватывал
IP-адрес доужественной мне фирмы, благодаря чему подставил меня по обвинению
в атаке на университетский сервер, к которой я отношения не имел). Не имеется
никаких механизмов в широком использовании, чтобы проверить, кто послал
данные и кто их получает, за исключением использованием шифрования уровня
сеанса или IP (IPSEC/IPV6 и другие VPN-технологии получают хороший импульс,
благодаря такому подходу).
Вы можете отбрасывать входящие данные, которые уверяют, что пришли из
Вашей сети: здесь ложь очевидна. Также надо запретить все исходящие данные,
которые идут не с адресов Вашей сети. Это относительно просто, но огромное
число сетей не делает этого (я потратил около года, приставая к моему ISP,
прежде, чем они это запустили). Если бы каждая сеть блокировала ложные
пакеты, опасности не было бы вовсе, а проследить хакера было бы на порядок
проще (замечание автора русской версии: покажите мне админа, которому охота с
этим разбираться. Обвинить пользователя ни за что много проще). Вы должны
также блокировать зарезервированные сети (127.*, 10.* и им подобные). Я
отметил много нападений из Internet с пакетами, помеченными как пришедшие из
этих диапазонов IP. Если Вы используете сетевую трансляцию адреса (подобно
IPMASQ) и не имеете правильного firewall, Вы можете быть легко атакованы или
использованы, чтобы передать нападение третьему лицу.
Если Вы связались надежно с людьми, рассмотрите использование
VPN-технологией. Единственная доступная технология, которая имеет широкую
поддержку и планируется в качестве стандарта (в IPv6), это IPSec, это
открытый стандарт, поддержанный многими разработчиками, и основные
разработчики имеют фактические рабочие реализации в их OS (хотя некоторые
повреждены, чтобы выполнить экспортные законы США). Пожалуйста см.
подробности в приложении B или в разделе "Шифрование сервисов и данных".
IPSec посвящена отдельная глава. Я считаю его
будущим сетей типа VPN, поскольку на сегодняшний день он поддерживается
очень широко и входит в стандарт IPv6).
IPv6 сам по себе не имеет мер безопасности, это просто другая форма
адресации. Но в стандарт встроены возможности поддержки защиты. Например, там
есть IPSec. Подробности об IPv6 есть на
http://www.bieringer.de/linux/IPv6. Linux сейчас уже поддерживает IPv6 в
полном объеме (одна из немногих OS, которые могут этим похвалиться).
Проект HUNT представляет собой набор инструментов для управления TCP-IP
(обычно в Ethernet LAN), который может перезапускать соединения, наблюдать за
ними и делать другие подобнгые вещи. Он также имеет несколько несколько атак,
основанных на ARP. Скачать HUNT можно с
http://www.cri.cz/kra.
inetd.conf ответственен за запускаемые сервисы, обычно те, которые не
должны выполниться непрерывно, или основаны на сеансе (например, telnet или
ftpd). Для многих сервисов (например, DNS) имеет смысл не держать их
запущенными постоянно. Для многих сервисов трата нескольких секунд на запуск
некритична. man-страница по inetd.conf (man inetd.conf)
рассматривает основы такого управления сервисами. Сам сервис называется inetd
и вызывается при запуске системы, так что Вы можете легко менять форму работы
сервисов, управляя процессом inetd. Всякий раз, когда Вы делаете изменения в
inetd.conf, Вы должны перезапустить inetd, чтобы сделать изменения
эффективными, killall -1 inetd перезапустит его правильно. Строки в
inetd.conf могут быть закомментированы # как обычно (это очень простой и
эффективный путь отключения сервисов подобных rexec). Желательно отключить
так много сервисов в inetd.conf, как возможно, обычно единственные
используемые будут ftp, pop и imap. Telnet и r-сервисы должны быть заменены
на SSH. Доступ к программам, запущенным inetd может легко управляться
использованием TCP_WRAPPERS.
Файл services перечисляет номера портов, протоколы и связанные имена.
Формат его строк:
service-name port/protocol aliases # optional comment
Например:
time 37/udp timserver
rlp 39/udp resource # resource location
name 42/udp nameserver
whois 43/tcp nicname # usually to sri-nic
domain 53/tcp
domain 53/udp
Этот файл используется при запуске 'netstat -a' и не используется при
запуске 'netstat -an'
Использование TCP_WRAPPERS существенно облегчает защиту от внешних атак.
TCP_WRAPPERS управляется двумя файлами:
/etc/hosts.allow
/etc/hosts.deny
hosts.allow проверяется первым, и его правила проверяются сверху вниз.
В случае нахождения правила с разрешением для Вас (то есть, Вашего хоста,
домена, маски подсети или других сетевых параметров), Вы получите доступ к
сервису. Если ничего подходящего не найдено, проверяется hosts.deny в поисках
таких же правил. Этот файл ничем не отличается от предвдущего, кроме того,
что все данные в нем интерпретируются как запреты определенным системам
подключаться к защищаемой системе. Первое же найденное правило приведет к
тому, что доступа Вы не получите. Если ничего не найдено, доступ будет
предоставлен. Если Вы придерживаетесь пессиместичной стратегии защиты,
впишите :
в hosts.deny:
ALL: 0.0.0.0/0.0.0.0
что запретит все услуги для всех, кроме тех услуг, которые явно разрешены
для тех систем, которым явно дано разрешение (помните, что по умолчанию
доступ разрешен). Можно также избрать такой подхож в отношении только
некоторых сервисов, скажем, telnet, а другие, например, ftp, оставить
открытыми всем. Для этого впишите:
в hosts.allow:
in.telnetd: 10.0.0.0/255.255.255.0 # allow access from my internal network
# of 10.0.0.*
in.ftpd: 0.0.0.0/0.0.0.0 # allow access from anywhere in the world
в hosts.deny:
in.telnetd: 0.0.0.0/0.0.0.0 # deny access to telnetd from anywhere
Или если Вы желаете быть действительно безопасными:
ALL: 0.0.0.0/0.0.0.0 # deny access to everything from everywhere
Это может воздействовать и на сервисы типа ssh и nfs, так что будьте
очень внимательны!
Вы можете просто внести в список все услуги, которые Вы используете
отдельно:
in.telnetd: 0.0.0.0/0.0.0.0
ipop3d: 0.0.0.0/0.0.0.0
Если некоторый сервис не упомянут в inetd.conf и не имеет политики запрета
по умолчанию, это не сервис, а дыра в системе. Более безопасное (и немного
больше работы, но в конечном счете меньшее количество работы, чем
восстанавливать сервер) иметь запрет в качестве значения по умолчанию
правил для firewall и TCP_WRAPPERS.
man-страницы для TCP_WRAPPERS очень хорошие, и вызываются командами:
man hosts.allow
man hosts_allow
и/или:
man hosts.deny
man hosts_deny
Один глюк в TCP_WRAPPERS, который недавно выскочил на Bugtraq,
TCP_WRAPPERS интерпретирует в hosts.allow и hosts.deny следующим
способом:
1) Обрезает все символы (продолжение строки), делая все строки полными
(помните также, что максимальная длина строки около 2k, лучше использовать
несколько строк в некоторых случаях).
2) Обрезает все строки, начинающиеся на #, то есть все комментарии.
Таким образом
# this is a test
# in.ftpd: 1.1.1.1
in.telnetd: 1.1.1.1
Это означает, что строка "in.telnetd: 1.1.1.1" тоже будет
проигнорирована!
Как можно говорить о безопасности, когда Вы не знаете, что работает в
системе? Для этой задачи ps и netstat неоценимы; ps сообщит Вам, что в
настоящее время работает (httpd, inetd и т.д), а netstat сообщит Вам о
состоянии портов (здесь мы заинтересованы портами, которые являются открытыми
и слушают, которые ждут подключения). Мы можем смотреть на различные файлы
конфигурации, которые управляют сервисами сети.
Программа ps показывает статус процессов (информацию из файловой системы
/proc). Наиболее используемые параметры ps -xau, которые
показывают практически всю информацию, которую Вы когда-либо хотели бы
узнать. Пожалуйста обратите внимание: эти параметры изменяются в разных
UNIX-системах, Solaris, SCO, и другие ведут себя по-другому (что невероятно
раздражает). Ниже приведен типичный вывод для машины (команда ps
xau).
USER PID %CPU %MEM SIZE RSS TTY STAT START TIME COMMAND
bin 320 0.0 0.6 760 380 ? S Feb 12 0:00 portmap
daemon 377 0.0 0.6 784 404 ? S Feb 12 0:00 /usr/sbin/atd
named 2865 0.0 2.1 2120 1368 ? S 01:14 0:01 /usr/sbin/named -u named -g named -t /home/named
nobody 346 0.0 18.6 12728 11796 ? S Feb 12 3:12 squid
nobody 379 0.0 0.8 1012 544 ? S Feb 12 0:00 (dnsserver)
nobody 380 0.0 0.8 1012 540 ? S Feb 12 0:00 (dnsserver)
nobody 383 0.0 0.6 916 416 ? S Feb 12 0:00 (dnsserver)
nobody 385 0.0 0.8 1192 568 ? S Feb 12 0:00 /usr/bin/ftpget -S 1030
nobody 392 0.0 0.3 716 240 ? S Feb 12 0:00 (unlinkd)
nobody 1553 0.0 1.8 1932 1200 ? S Feb 14 0:00 httpd
nobody 1703 0.0 1.8 1932 1200 ? S Feb 14 0:00 httpd
root 1 0.0 0.6 776 404 ? S Feb 12 0:04 init [3]
root 2 0.0 0.0 0 0 ? SW Feb 12 0:00 (kflushd)
root 3 0.0 0.0 0 0 ? SW Feb 12 0:00 (kswapd)
root 4 0.0 0.0 0 0 ? SW Feb 12 0:00 (md_thread)
root 64 0.0 0.5 736 348 ? S Feb 12 0:00 kerneld
root 357 0.0 0.6 800 432 ? S Feb 12 0:05 syslogd
root 366 0.0 1.0 1056 684 ? S Feb 12 0:01 klogd
root 393 0.0 0.7 852 472 ? S Feb 12 0:00 crond
root 427 0.0 0.9 1272 592 ? S Feb 12 0:19 /usr/sbin/sshd
root 438 0.0 1.0 1184 672 ? S Feb 12 0:00 rpc.mountd
root 447 0.0 1.0 1180 644 ? S Feb 12 0:00 rpc.nfsd
root 458 0.0 1.0 1072 680 ? S Feb 12 0:00 /usr/sbin/dhcpd
root 489 0.0 1.7 1884 1096 ? S Feb 12 0:00 httpd
root 503 0.0 0.4 724 296 2 S Feb 12 0:00 /sbin/mingetty tty2
root 505 0.0 0.3 720 228 ? S Feb 12 0:02 update (bdflush)
root 541 0.0 0.4 724 296 1 S Feb 12 0:00 /sbin/mingetty tty1
root 1372 0.0 0.6 772 396 ? S Feb 13 0:00 inetd
root 1473 0.0 1.5 1492 1000 ? S Feb 13 0:00 sendmail: accepting connections on port 25
root 2862 0.0 0.0 188 44 ? S 01:14 0:00 /usr/sbin/holelogd.named /home/named/dev/log
root 3090 0.0 1.9 1864 1232 ? S 12:16 0:02 /usr/sbin/sshd
root 3103 0.0 1.1 1448 728 p1 S 12:16 0:00 su -root 3104 0.0 1.3 1268 864 p1 S 12:16 0:00 -bash
root 3136 0.0 1.9 1836 1212 ? S 12:21 0:04 /usr/sbin/sshd
Здесь интересны: portmap, named, Squid (и порожденные им процессы
dnsserver, unlinkd и ftpget), httpd, syslogd, sshd, rpc.mountd, rpc.nfsd,
dhcpd, inetd и sendmail (эти серверы предоставляют шлюзовые сервисы, почту и
доступ к файлам по NFS). Самый простой способ понять вывод команды ps, это
почитать ее man-страницу, которая детально все объясняет (многие поля понятны
и так, например %CPU показывает сколько квантов времени процессора занимает
процесс, SIZE сколько 4k страниц памяти использует программа).
Чтобы узнать что делает та или иная программа, наиболее безопасно
использовать man <command_name>; там почти есть вся
необходимая информация о сервисе (например, по httpd). Обратите внимание, что
некоторые сервисы подобные telnet, ftpd, identd и ряд других не
обнаруживаются даже при том, что они включены. Это потому, что они выполнены
из inetd, суперсервера. Чтобы их найти, посмотрите файл
/etc/inetd.conf или вывод команды netstat vat.
netstat сообщает нам практически все связанное с сетью, что Вы можете
воображать. Это особенно хорошо при распечатке активных подключений и
сокетов. Используя netstat, мы можем узнать какие порты на каких интерфейсах
являются активными. Ниже приведен типичной вывод netstat vat.
Active Internet connections (including servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 24.108.11.200:80 205.253.183.122:3661 ESTABLISHED
tcp 0 0 0.0.0.0:1036 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 10.0.0.10:53 0.0.0.0:* LISTEN
tcp 0 0 28.208.55.254:53 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:139 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:2049 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:635 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN
udp 0 0 127.0.0.1:1031 0.0.0.0:*
udp 0 0 0.0.0.0:1029 0.0.0.0:*
udp 0 0 0.0.0.0:800 0.0.0.0:*
udp 0 0 0.0.0.0:1028 0.0.0.0:*
udp 0 0 10.0.0.10:53 0.0.0.0:*
udp 0 0 28.208.55.254:53 0.0.0.0:*
udp 0 0 127.0.0.1:53 0.0.0.0:*
udp 0 0 10.1.0.1:138 0.0.0.0:*
udp 0 0 10.1.0.1:137 0.0.0.0:*
udp 0 0 10.0.0.10:138 0.0.0.0:*
udp 0 0 10.0.0.10:137 0.0.0.0:*
udp 0 0 0.0.0.0:138 0.0.0.0:*
udp 0 0 0.0.0.0:137 0.0.0.0:*
udp 0 0 0.0.0.0:2049 0.0.0.0:*
udp 0 0 0.0.0.0:635 0.0.0.0:*
udp 0 0 0.0.0.0:514 0.0.0.0:*
udp 0 0 0.0.0.0:111 0.0.0.0:*
raw 0 0 0.0.0.0:1 0.0.0.0:*
raw 0 0 0.0.0.0:6 0.0.0.0:*
Числовой вывод, по-моеему, читать легче (как только Вы запомните
/etc/services). Интересные поля для нас: первое поле, тип сервиса, четвертое
поле, которое является адресом IP-интерфейса и порта, внешний адрес (если не
0.0.0.0.*, кто-то активно общается с этим портом) и состояние порта. Первая
строка: удаленный пользователь, работающий с web-сервером на этой машине
(порт 80). Дальше виден www-серевер, слушающий на 0.0.0.0:80, что значит все
интерфейсы, порт 80, затем сервер DNS на всех 3 интерфейсах, сервер samba
(139), сервер почты (25), NFS-сервер (2049) и так далее. Обратите внимание на
ftp-сервер (21) перечисленный, даже при том, что запускается из inetd и не
используется в настоящее время (то есть, никто не работает с ftp сейчас). Он
перечислен в выводе netstat. Это делает netstat особенно полезным для
выяснения, что является активным на машине, делая опись активного и
неактивного сетевого программного обеспечения на сервере намного проще.
lsof удобная программа, подобная ps, за исключением того, что она выдает
какие файлы и прочие ресурсы используются, включая сетевые сокеты. К
сожалению, lsof выводит много информации, так что Вы будете должны
использовать grep или переназначать вывод через less (lsof|less),
чтобы прочитать его.
squid 9726 root 4u inet 78774 TCP localhost:2074->localhost:2073 (ESTABLISHED)
squid 9726 root 5u inet 78777 TCP localhost:2076->localhost:2075 (ESTABLISHED)
squid 9726 root 6u inet 78780 TCP localhost:2078->localhost:2077 (ESTABLISHED)
squid 9726 root 7w CHR 1,3 6205 /dev/null
squid 9726 root 14u inet 78789 TCP host1:3128 (LISTEN)
squid 9726 root 15u inet 78790 UDP host1:3130
squid 9726 root 16u inet 78791 UDP host1:3130
squid 9726 root 12u inet 167524 TCP host1:3128->host2:3630 (ESTABLISHED)
squid 9726 root 17u inet 167528 TCP host1:3424->www.example.org:http (SYN_SENT)
Этот пример показывает, что мы имеем Squid, слушающий порты 3128 и 3130,
последние две строки показывают открытое соединение внутреннего хоста с
сервером Squid и то, что Squid выполняет запрос (в данном случае на
www.example.org). host1 является сервером Squid, а host2 является клиентом,
создавшим запрос. Это неоценимый инструмент для получения точного картины
ситуации с сетью на Вашей системе. Вы можете получить lsof со многими
дистрибутивами. Пожалуйста обратите внимание, что версии lsof для ядер версии
2.0.x не будут работать с ядрами 2.2.x и наоборот, так как имеется слишком
много изменений. Главный сайт lsof:
ftp://vic.cc.purdue.edu/pub/tools/unix/lsof.
Есть несколько программ маршрутизации (routing) для Linux. Многие из них
поддерживают новые протоколы маршрутизации, которые имеют хорошие возможности
защиты, наравне со старыми протоколами, например, RIP.
routed один из стандартных пакетов маршрутизации для Linux. Он
поддерживает RIP (самый старый протокола маршрутизации, все еще используется).
RIP очень прост, роутеры просто передают таблицы маршрутизации соседним
маршрутизаторам, создавая в результате (в теории) полную таблицу
маршрутизации, которая содержит записи для каждого адресата в Internet. Этот
метод опасен и очень неэффективен вне маленьких безопасных сетей. Вы можете
использовать firewall для портов 520 и 521, которые использует RIP для
передачи данных, но атакующие все еще могут применить спуффинг маршрутов.
gated более продвинутый вариант программ маршрутизации, чем routed. Он
поддерживает RIP версий 1 и 2, DCN HELLO, OSPF версии 2, EGP версии 2 и BGP
версий от 2 до 4. В настоящее время наиболее популярный протокол
маршрутизации, кажется, BGP (Border Gateway Protocol), но набирает
популярность и OSPF (он имеет встроенную защиту, очень эффективен и лишь
немного более сложен).
MRT (Multi-threaded Routing Toolkit) routing daemon и набор тестовых
утилит с поддержкой IPv4 и IPv6. Скачать можно с
http://www.mrtd.net.
zebra еще более продвинутый пакет, чем gated и поддерживает хороший
интерфейс командной строки стиля Cisco. Выполняется как daemon и поддерживает
многопоточность для эффективности, каждый протокол (RIP, OSPF, и другие)
имеет собственную конфигурацию, и Вы можете выполнять много протоколов
одновременно (хотя это может привести к беспорядку и проблемам). Имеется
главный порт конфигурации и порт для каждого протокола:
zebrasrv 2600/tcp # zebra service
zebra 2601/tcp # zebra vty
ripd 2602/tcp # RIPd vty
ripngd 2603/tcp # RIPngd vty
ospfd 2604/tcp # OSPFd vty
bgpd 2605/tcp # BGPd vty
ospf6d 2606/tcp # OSPF6d vty
Я советовал бы прикрыть с помощью firewall эти порты. Доступ управляется
паролем входа в систему, а доступ к функциям команды требует другого пароля
(использован тот же самый синтаксис как и Cisco, enable). Скачать
zebra можно с http://www.zebra.org.
Back
|