Рейтинг@Mail.ru

Наши друзья и партнеры

купить дешевый 
компьютер родом из Dhgate.com



Mudanzas y portes a Alemania


Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

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

Обзор

Защита 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

Written by Kurt Seifried

Если вам понравилась статья, поделитесь ею с друзьями: