|
ANDREY MATVEEV (ANDRUSHOCK@REAL.XAKEP.RU )
ЗАЩИТА СЕТЕВОГО ТРАФИКА ПРОВОДНЫХ И БЕСПРОВОДНЫХ WINXP-КЛИЕНТОВ
ПОД АББРЕВИАТУРОЙ VPN СКРЫВАЕТСЯ СЛОВОСОЧЕТАНИЕ VIRTUAL PRIVATE NETWORK - ВИРТУАЛЬНАЯ ЧАСТНАЯ СЕТЬ. ЭТО ТЕРРИТОРИАЛЬНО-РАСПРЕДЕЛЕННАЯ СЕТЬ ПЕРЕДАЧИ ДАННЫХ, СОСТОЯЩАЯ ИЗ IP-ПОДСЕТЕЙ, СВЯЗАННЫХ МЕЖДУ СОБОЙ ЧЕРЕЗ ОБЩЕДОСТУПНУЮ СЕТЬ (НАПРИМЕР, ЧЕРЕЗ ИНТЕРНЕТ) С ПОМОЩЬЮ ЗАЩИЩЕННЫХ ПРОТОКОЛОВ
Основные цели VPN - обеспечение прозрачного доступа к ресурсам удаленной сети и исключение вероятности утечки конфиденциальной информации за счет использования криптостойкого шифрования передаваемых данных. Посмотрим, как можно защитить сетевой трафик проводных и беспроводных WinXP-клиентов с помощью технологии VPN. Ода IPsec Для создания VPN могут использоваться протоколы IPsec, SSL или PPTP. Тем не менее, подавляющее большинство разработчиков сетевого оборудования отдает предпочтение первому варианту. Во-первых, потому что IPsec был специально создан для обеспечения безопасности в базовых протоколах семейства TCP/IP, а во-вторых, он более гибок и удобен, нежели любой протокол прикладного уровня. Не будем пренебрегать экспертным мнением сетевых специалистов и тоже остановимся на этом стандарте. IP Security - это целый набор протоколов, касающихся вопросов шифрования, аутентификации и обеспечения защиты при транспортировке IP-пакетов. В спецификации IPsec гарантии целостности и конфиденциальности данных обеспечиваются за счет использования механизмов аутентификации и шифрования. Аутентификация выполняется протоколом AH (Authentication Header - заголовок аутентификации), а шифрование - протоколом ESP (Encapsulating Security Payload - инкапсулированные защищенные данные). Оба протокола добавляют собственные заголовки и имеют свой ID (AH имеет ID протокола - 51, ESP - 50), по которому можно определить, что последует за заголовком IP. Логика работы IPsec руководствуется одним из трех способов: компьютер - компьютер, компьютер - сеть, сеть - сеть. Остановимся на первом и третьем сценариях работы. Разведка на местности За последние несколько лет беспроводные сети получили широкое распространение во всем мире. Принимая решение о построении wlan, ты должен четко представлять себе не только достоинства, но и недостатки WiFi-технологий. Сейчас криптографической слабостью WEP может воспользоваться любой желающий: поддержка новых механизмов безопасности WPA/WPA2 присутствует далеко не во всех системах, а стоимость аппаратных VPN-устройств довольно высока. Возникает резонный вопрос: тогда почему бы для защиты передаваемого трафика не воспользоваться программным решением, например, на базе *BSD? Последняя версия (на момент написания статьи - 3.9) ультрасекьюрной OpenBSD как нельзя лучше подойдет для выполнения нашей миссии. Эта операционная система обладает прекрасной реализацией стека TCP/IP и протокола IPsec. Кроме того, в ее состав входят отличный файрвол Packet Filter (pf) и демон isakmpd, который обеспечивает работу по протоколу обмена секретными ключами (ISAKMP). Кстати, настройка FreeBSD, NetBSD и DragonflyBSD будет отличаться несильно. Наша первая схема выглядит следующим образом:
wireless [ Ноутбук ] ---------------------------(ral0)-[ Домашний сервер ]-(fxp0)-----[ Провайдер ] 192.168.2.2 ipsec 192.168.2.1
Здесь ral0 - это сетевой интерфейс, закрепленный за PCI'ной карточкой Gigabyte GN-WPKG 802.11 b/g и осуществляющий работу по спецификации 802.11g (mode 11g) на 11-ом частотном канале (chan 11) в режиме точки доступа (mediaopt hostap) с уникальным идентификатором сети (nwid wlan).
# vi /etc/hostname.ral0 inet 192.168.2.1 255.255.255.0 NONE media autoselect mode 11g \ mediaopt hostap nwid wlan chan 11
Если у беспроводного клиента (тестирование проводилось на ноуте с WinXP SP2) соответствующим образом настроена политика IPsec, весь внутренний трафик будет шифроваться за счет организации IPsec-туннеля с аутентификацией на основе парольной фразы ("preshared key" - будем называть именно так, чтобы избежать путаницы с другими ключами).
Примечание: настройка проводного клиента полностью аналогична настройке беспроводного клиента.
Вернисаж IPsec-туннелей
Демон isakmpd(8) позволяет создавать невероятное количество IPsec-туннелей, используя при этом различные алгоритмы шифрования (3des, idea, cast, blowfish, aes для атрибута esp_enc_alg протокола ESP) и методы аутентификации (на основе парольной фразы, серверных ключей, Keynote и X.509 сертификатов). Мы будем рассматривать метод аутентификации на основе парольной фразы, но в случае внушительного числа wlan-клиентов свой выбор лучше остановить на X.509 auth. Демон просто потрясает своими возможностями, так что будет не просто найти такую задачу построения VPN, с которой он не мог бы справиться.
Для удобства главный конфигурационный файл сервера обмена ключей разбит на секции и содержит директивы с присвоенными значениями (смотри листинг 1).
Теперь необходимо создать isakmpd.policy(5), содержащий политику для всех IPsec-соединений:
KeyNote-Version: 2 Authorizer: "POLICY" Conditions: app_domain == "IPsec policy" && doi == "ipsec" && ah_present == "no" && esp_present == "yes" && (esp_enc_alg == "aes" && esp_auth_alg == "hmac-sha") && esp_encapsulation == "tunnel" && pfs == "yes" -> "true";
Выставляешь корректные права доступа для конфигов:
# chown root:wheel /etc/isakmpd/isakmpd.* # chmod 600 /etc/isakmpd/isakmpd.*
И запускаешь демона на орбиту, предварительно отказавшись от использования протокола IPv6 и реализации NAT-Traversal:
# isakmpd -4T
Для работы IPsec необходимо открыть порт 500/udp, по которому идет обмен сертификатами и ключами, а также разрешить прохождение зашифрованного трафика. Изменяешь правила файрвола, как показано в листинге 2. С помощью зарезервированного макроса ":network" определяется CIDR-нотация сети. В нашем случае конструкция "$int_if:network" будет означать 192.168.2.0/24 (то есть маска подсети 255.255.255.0). И даешь указание штатной утилите pfctl(8) перечитать набор "рулесетов":
# pfctl -f /etc/pf.conf
Клиентская настройка IPsec в WinXP довольно утомительна и напоминает прохождение хитроумного квеста: 1. START-> RUN-> ЗАПУСКАЕШЬ MMC; 2. FILE-> ADD/REMOVE SNAP-IN-> IP SECURITY POLICY MANAGEMENT-> LOCAL COMPUTER-> FINISH-> CLOSE; 3. ACTION-> CREATE IP SECURITY POLICY-> NEXT-> NEXT-> СНИМАЕШЬ ГАЛОЧКУ С ACTIVATE THE DEFAULT RESPONCE RULE-> EDIT PROPERTIES ОСТАВЛЯЕШЬ НЕТРОНУТЫМ-> NEXT-> FINISH; 4. NEW IP SECURITY POLICY-> PROPERTIES-> ADD-> NEXT-> TUNNEL ENDPOINT - THIS RULE DOES NOT SPECIFY A TUNNEL-> NETWORK TYPE - LOCAL AREA NETWORK (LAN)-> AUTHENTICATION METHOD - USE THIS STRING TO PROTECT THE KEY EXCHANGE (PRESHARED KEY) - УКАЗЫВАЕШЬ MYPASSWORD ИЗ ФАЙЛА /ETC/ISAKMPD/ISAKMPD.CONF-> IP FILTER LIST -> ADD-> ADD-> NEXT-> SOURCE ADDRESS - MY IP ADDRESS-> DESTINATION ADDRESS - A SPECIFIC IP ADDRESS - 192.168.2.1-> SELECT A PROTOCOL TYPE - ANY, 0-> УСТАНАВЛИВАЕШЬ ГАЛОЧКУ EDIT PROPERTIES-> FINISH-> ПРОВЕРЯЕШЬ ВВЕДЕННЫЕ НАСТРОЙКИ-> OK; 5. NEW IP FILTER LIST-> NEXT-> FILTER ACTION - REQUIRE SECURITY-> EDIT-> УСТАНАВЛИВАЕШЬ NEGOTIATE SECURITY-> ОТМЕЧАЕШЬ SESSION KEY PERFECT FORWARD SECRECY (PFS)-> OK-> NEXT-> FINISH-> APPLY-> OK 6. CONSOLE1-> FILE-> SAVE; 7. ПЕРЕЗАГРУЖАЕШЬСЯ, ЛИБО ПЕРЕЗАПУСКАЕШЬ СЕРВИС IPSEC SERVICES (ЛУЧШЕ ПЕРЕЗАГРУЗИТЬСЯ); 8. START-> RUN-> MMC-> FILE-> CONSOLE1-> NEW IP SECURITY POLICY-> ASSIGN. В качестве альтернативы можно воспользоваться программами ipsecpol.exe/ipseccmd.exe (из комплекта Win2k/WinXP Support Tools), SSH Sentinel, TheGreenBow VPN Client, либо SafeNet SoftRemoteLT. Проникновение в институтскую сеть Как вариант, можно отказаться от использования isakmpd и посмотреть в сторону ipsecadm(8) - программы управления защищенными соединениями. Чтобы проверить ее работу в действии, рассмотрим сценарий, когда и на институтском, и на домашнем сервере установлена *BSD.
internet [ Сеть ]------------[ Домашний сервер ]----------------[ Институтский сервер ]------------------[ Сеть ] 192.168.2.0/24 81.211.22.22 ipsec 81.211.11.11 192.168.1.0/24
Последовательно создаешь два ключа: один для шифрования трафика (3DES, 192 bit), другой - для аутентификации (SHA1, 160 bit).
# mkdir -m 700 /etc/ipsec # openssl rand 24 | hexdump -e '24/1 "%02x"' > /etc/ipsec/esp-enc-key # openssl rand 20 | hexdump -e '20/1 "%02x"' > /etc/ipsec/esp-auth-key # chmod 600 /etc/ipsec/esp-*-key
Далее, чтобы не изобретать себе лишние сложности, можно воспользоваться шаблоном из каталога /usr/share/ipsec (смотри листинг 3):
# cp /usr/share/ipsec/rc.vpn /etc/ipsec/rc.vpn
На стороне домашнего сервера скрипт будет выглядеть с минимальными правками:
#DEBUG=echo GW_LOCAL=81.211.22.22 GW_REMOTE=81.211.11.11 LOCAL_NETWORKS="192.168.2.0/24" REMOTE_NETWORKS="192.168.1.0/24" ENC=3des AUTH=sha1 # Внимание: здесь значения SPI-индексов меняются местами SPI_OUT=1001 SPI_IN=1000 KEYFILE=/etc/ipsec/esp-enc-key AUTHKEYFILE=/etc/ipsec/esp-auth-key
После того, как с помощью программы безопасного копирования scp(8) ключи /etc/ipsec/esp-enc-key и /etc/ipsec/esp-auth-key будут переданы клиенту, останется только запустить rc.vpn на каждом из хостов:
institut# sh /etc/ipsec/rc.vpn home# sh /etc/ipsec/rc.vpn
И при необходимости добавить его запуск в один из стартовых файлов. Например, так:
[ -f /etc/ipsec/rc.vpn ] && sh /etc/ipsec/rc.vpn
Чтобы запросить у ядра операционной системы перечень действующих IPsec-туннелей и активных записей в базе SADB (Security Association Database - база данных защищенных соединений), можно воспользоваться штатной утилитой ipsecctl(8) (смотри листинг 4). Получить таблицу маршрутизации для инкапсулированных соединений можно с помощью netstat(1) (смотри листинг 5). Для удаления всех IPsec-потоков выполни команду:
# ipsecadm flush
Прослушиваем зашифрованные данные Псевдоустройство enc(4) представляет собой специальный интерфейс обратной петли, позволяющий производить фильтрацию IPsec-трафика и просматривать прохождение входящих/исходящих пакетов (относится только к транспортному режиму) перед тем, как они попадут во власть ESP и AH протоколов. Конечно же, для выполнения этой операции необходимо обладать правами суперпользователя (смотри листинг 6). Несоответствие контрольных сумм вроде "bad cksum 0!" не должно тебя смущать, так как прослушивание - на псевдоинтерфейсе. А то, что мы увидим на внутреннем сетевом интерфейсе ral0, смотри в листинге 7. Вместо постскриптума Приведенная схема работы в сочетании с аутентификационным шлюзом и полупрозрачным мостом, выполняющим фильтрацию на основе IP- и MAC-адресов, сослужит тебе хорошую службу в решении задач обеспечения защиты сетевого трафика проводных и беспроводных WinXP-клиентов.
# vi /etc/isakmpd/isakmpd.conf (с комментариями к ключевым моментам) # Секция общего назначения: количество повторов, продолжительность таймаутов, # IP-адрес прослушиваемого интерфейса, абсолютный путь к файлу с IPsec-политиками General Retransmits= 5 Exchange-max-time= 120 Listen-on= 192.168.2.1 Policy-File= /etc/isakmpd/isakmpd.policy # Перечисляем фазы соединений и создаем список IPsec-туннелей Phase 1 Default=SECUREWLAN-1 SECUREWLAN-1 Phase= 1 Transport= udp Configuration= Default-main-mode Authentication= mypassword [Default-main-mode] DOI= IPSEC EXCHANGE_TYPE= ID_PROT Transforms= AES-SHA Phase 2 Passive-connections= SECUREWLAN-2 SECUREWLAN-2 Phase= 2 ISAKMP-peer= SECUREWLAN-1 Configuration= Default-quick-mode Local-ID= wlan-router # Задаем маршрут для инкапсулированных соединений Wlan-router ID-type= IPV4_ADDR_SUBNET Network= 0.0.0.0 Netmask= 0.0.0.0 # Указываем предпочитаемые протоколы, шифры, устойчивые к коллизиям # хэш-функции, а также использование режима Perfect Forward Secrecy Default-quick-mode DOI= IPSEC EXCHANGE_TYPE= QUICK_MODE Suites= QM-ESP-AES-SHA-PFS-SUITE AES-SHA ENCRYPTION_ALGORITHM= AES_CBC KEY_LENGTH= 128,128:256 HASH_ALGORITHM= SHA AUTHENTICATION_METHOD= PRE_SHARED GROUP_DESCRIPTION= MODP_1024 QM-ESP-AES-SHA-PFS-SUITE PROTOCOL_ID= IPSEC_ESP Transforms= QM-ESP-AES-SHA-PFS-XF QM-ESP-AES-SHA-PFS-XF TRANSFORM_ID= AES KEY_LENGTH= 128,128:256 ENCAPSULATION_MODE= TUNNEL AUTHENTICATION_ALGORITHM=HMAC_SHA GROUP_DESCRIPTION= MODP_1024 # vi /etc/pf.conf # Объявляем макросы enc_if = "enc0" int_if = "ral0" vpn_client = "192.168.2.2/32" # Разрешаем и регистрируем доступ к isakmpd (500/udp) pass in log quick on $int_if inet proto udp from $int_if:network \ to $int_if port isakmp keep state # Разрешаем прохождение зашифрованного трафика pass in on $int_if inet proto esp from $vpn_client to $int_if pass out on $int_if inet proto esp from $int_if to $vpn_client pass in on $enc_if inet proto ipencap all pass in on $enc_if inet from $vpn_client to $int_if:network pass out on $enc_if inet from $int_if:network to $vpn_client institut# vi /etc/ipsec/rc.vpn /* В отладочном режиме команды выводятся на экран без исполнения, комментируем */ #DEBUG=echo /* IP-адреса локального и удаленного компьютеров */ GW_LOCAL=81.211.11.11 GW_REMOTE=81.211.22.22 /* Указываем CIDR-нотации наших подсетей */ LOCAL_NETWORKS="192.168.1.0/24" REMOTE_NETWORKS="192.168.2.0/24" /* Выбранные методы шифрования и аутентификации */ ENC=3des AUTH=sha1 /* Специальные индексы параметров безопасности для создания туннеля */ SPI_OUT=1000 SPI_IN=1001 /* Абсолютные пути к файлам с ключами */ KEYFILE=/etc/ipsec/esp-enc-key AUTHKEYFILE=/etc/ipsec/esp-auth-key
Запрос перечня действующих IPsec-туннелей и активных записей в SADB
# ipsecctl -s all FLOWS: flow esp in from 192.168.2.2 to 0.0.0.0/0 peer 192.168.2.2 srcid 192.168.2.1/32 dstid 192.168.2.2/32 type use flow esp out from 0.0.0.0/0 to 192.168.2.2 peer 192.168.2.2 srcid 192.168.2.1/32 dstid 192.168.2.2/32 type require SAD: esp tunnel from 192.168.2.1 to 192.168.2.2 spi 0x0ebbadc6 auth hmac-sha1 enc aes \ authkey 0xfd16f0b81db91b0774925454d42d55976ecabc8a \ enckey 0xdff666aeb0427784cdf72603a1029fe7 esp tunnel from 192.168.2.2 to 192.168.2.1 spi 0xc7163b7e auth hmac-sha1 enc aes \ authkey 0x263e372620e0eb1b5c72f189e009c8896c90c9be \ enckey 0x6db690dc6b158e32e484705ee7db47ce
Таблица маршрутизации для инкапсулированных соединений
% netstat -nr -f encap Routing tables Encap: Source Port Destination Port Proto SA(Address/Proto/Type/Direction) 192.168.2.2/32 0 default 0 0 192.168.2.2/esp/use/in default 0 192.168.2.2/32 0 0 192.168.2.2/esp/require/out
Прослушивание на псевдоинтерфейсе
# tcpdump -netttvvi enc0 tcpdump: WARNING: enc0: no IPv4 address assigned tcpdump: listening on enc0, link-type ENC Sep 20 22:49:51.844143 (authentic,confidential): SPI 0xc7163b7e: 192.168.2.2 > 192.168.2.1: 192.168.2.2.1452 > 192. 168.2.1.22: . [tcp sum ok] 1696328699:1696328699(0) ack 749361456 win 16560 (DF) (ttl 128, id 43693, len 40) (ttl 128, id 43693, len 60) Sep 20 22:49:51.862522 (authentic,confidential): SPI 0x0ebbadc6: 192.168.2.1 > 192.168.2.2: 192.168.2.1.22 > 192.168.2.2. 1452: P 1:85(84) ack 0 win 17640 [tos 0x10] (ttl 64, id 29061, len 124) [tos 0x10] (ttl 64, id 21941, len 144, bad cksum 0! differs by 9f51)
Прослушивание на внутреннем сетевом интерфейсе
# tcpdump -y ieee802_11_radio -eni ral0 tcpdump: listening on ral0, link-type IEEE802_11_RADIO 22:51:32.024954 0:d:61:7a:4b:12 > 0:13:2:95:be:9c, bssid 0:d:61:7a:4b:12, DS >: 802.11: data: truncated-ip - 90 bytes missing!esp 192.168.2.1 > 192.168.2.2 spi 0x0EBBADC6 seq 257 len 74 [tos 0x10], <radiotap v0, chan 11, 11g> 22:51:32.025841 0:d:61:7a:4b:12 > 0:13:2:95:be:9c, bssid 0:d:61:7a:4b:12, DS >: 802.11: data: truncated-ip - 74 bytes missing!esp 192.168.2.1 > 192.168.2.2 spi 0x0EBBADC6 seq 258 len 74 [tos 0x10], <radiotap v0, chan 11, 11g>
http://www.xakep.ru/magazine/xs/072/024/1.asp>Оригинал статьи
fbsd/posts/isakmpd -- Last updated 2010-06-03 Thursday 17:46:11 Edit
© copyright 2010
Design by: lev