Сетевая безопасность

Обзор

Защита PPP

Защита TCP-IP

Основные файлы настройки и утилиты

Кто это запустил?

Безопасность маршрутизации

Обзор

Сетевая безопасность довольно широкая тема, так что я разбил ее на пару разделов. В этом я описываю нижние 4 уровня (transport, network, datalink, physical) 7-уровневой модели OSI protocol stack, верхние 3 (application, presentation, session) будут рассмотрены в разделах по сетевым сервисам. Я такэе рассмотрю некоторые базисные файлы конфигурации сети, так как их объяснение всегда полезно.

Защита PPP

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 был создан во времена, когда защита не являлась столь важной, как сейчас. Набор протоколов TCP-IP очень умно построен, но к сожалению не имеет никаких реальных условий для защиты (то есть аутенфикации, проверки, шифрования и так далее). Перехват пакетов, чтение полезного груза данных и тому подобные вещи легко осуществимы в сегодняшней сети Internet.

Имена хостов и их IP-адреса не всегда соответствуют друг другу. Не используйте авторизацию на основании имени хоста, если возможно. Поскольку обман кэша DNS довольно прост, надежней использовать IP-адрес (замечание автора русской версии: лично сталкивался с тем, что кто-то перехватывал IP-адрес доужественной мне фирмы, благодаря чему подставил меня по обвинению в атаке на университетский сервер, к которой я отношения не имел). Не имеется никаких механизмов в широком использовании, чтобы проверить, кто послал данные и кто их получает, за исключением использованием шифрования уровня сеанса или IP (IPSEC/IPV6 и другие VPN-технологии получают хороший импульс, благодаря такому подходу).

Вы можете отбрасывать входящие данные, которые уверяют, что пришли из Вашей сети: здесь ложь очевидна. Также надо запретить все исходящие данные, которые идут не с адресов Вашей сети. Это относительно просто, но огромное число сетей не делает этого (я потратил около года, приставая к моему ISP, прежде, чем они это запустили). Если бы каждая сеть блокировала ложные пакеты, опасности не было бы вовсе, а проследить хакера было бы на порядок проще (замечание автора русской версии: покажите мне админа, которому охота с этим разбираться. Обвинить пользователя ни за что много проще). Вы должны также блокировать зарезервированные сети (127.*, 10.* и им подобные). Я отметил много нападений из Internet с пакетами, помеченными как пришедшие из этих диапазонов IP. Если Вы используете сетевую трансляцию адреса (подобно IPMASQ) и не имеете правильного firewall, Вы можете быть легко атакованы или использованы, чтобы передать нападение третьему лицу.

Если Вы связались надежно с людьми, рассмотрите использование VPN-технологией. Единственная доступная технология, которая имеет широкую поддержку и планируется в качестве стандарта (в IPv6), это IPSec, это открытый стандарт, поддержанный многими разработчиками, и основные разработчики имеют фактические рабочие реализации в их OS (хотя некоторые повреждены, чтобы выполнить экспортные законы США). Пожалуйста см. подробности в приложении B или в разделе "Шифрование сервисов и данных".

IPSec

IPSec посвящена отдельная глава. Я считаю его будущим сетей типа VPN, поскольку на сегодняшний день он поддерживается очень широко и входит в стандарт IPv6).

IPv6

IPv6 сам по себе не имеет мер безопасности, это просто другая форма адресации. Но в стандарт встроены возможности поддержки защиты. Например, там есть IPSec. Подробности об IPv6 есть на http://www.bieringer.de/linux/IPv6. Linux сейчас уже поддерживает IPv6 в полном объеме (одна из немногих OS, которые могут этим похвалиться).

HUNT Project

Проект HUNT представляет собой набор инструментов для управления TCP-IP (обычно в Ethernet LAN), который может перезапускать соединения, наблюдать за ними и делать другие подобнгые вещи. Он также имеет несколько несколько атак, основанных на ARP. Скачать HUNT можно с http://www.cri.cz/kra.

Основные файлы настройки и утилиты

/etc/inetd.conf

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.

/etc/services

Файл 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 существенно облегчает защиту от внешних атак. 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" тоже будет проигнорирована!

What is running and who is it talking to?

Как можно говорить о безопасности, когда Вы не знаете, что работает в системе? Для этой задачи ps и netstat неоценимы; ps сообщит Вам, что в настоящее время работает (httpd, inetd и т.д), а netstat сообщит Вам о состоянии портов (здесь мы заинтересованы портами, которые являются открытыми и слушают, которые ждут подключения). Мы можем смотреть на различные файлы конфигурации, которые управляют сервисами сети.

ps

Программа 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, мы можем узнать какие порты на каких интерфейсах являются активными. Ниже приведен типичной вывод 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

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

routed один из стандартных пакетов маршрутизации для Linux. Он поддерживает RIP (самый старый протокола маршрутизации, все еще используется). RIP очень прост, роутеры просто передают таблицы маршрутизации соседним маршрутизаторам, создавая в результате (в теории) полную таблицу маршрутизации, которая содержит записи для каждого адресата в Internet. Этот метод опасен и очень неэффективен вне маленьких безопасных сетей. Вы можете использовать firewall для портов 520 и 521, которые использует RIP для передачи данных, но атакующие все еще могут применить спуффинг маршрутов.

gated

gated более продвинутый вариант программ маршрутизации, чем routed. Он поддерживает RIP версий 1 и 2, DCN HELLO, OSPF версии 2, EGP версии 2 и BGP версий от 2 до 4. В настоящее время наиболее популярный протокол маршрутизации, кажется, BGP (Border Gateway Protocol), но набирает популярность и OSPF (он имеет встроенную защиту, очень эффективен и лишь немного более сложен).

MRT

MRT (Multi-threaded Routing Toolkit) routing daemon и набор тестовых утилит с поддержкой IPv4 и IPv6. Скачать можно с http://www.mrtd.net.

zebra

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

Security Portal

Written by Kurt Seifried