<<< Headline | Index | http | bash | basics | x11 | net | vpn | humor | sles | cXX | php | db | perl | soft | unsorted | hw | ppp | tips | linux | fbsd | mail
[Timeline] [View Photos] [rtfm] [Search] [Index by Title] [Index by Date]
fbsd => isakmpd: == post:fbsd/posts/isakmpd


  Под защитой криптотуннеля

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