gentoo linux
k s i m u t e
з а м е т к и   о   с и с т е м н о м   а д м и н и с т р и р о в а н и и    
версия v1.3.0
main menu main
Rambler's Top100
  »  WIKI
  »  Заметки (микро-блог)
  »  Smart HDD мониторинг
  »  Linux Software Raid
  »  Windows + Xserver
  »  Pptpd kill
  »  Stress Test pptpd
  »  Консоль на com порту
  »  Cisco 827 h323
  »  Squid + sarg Логи
  »  Squid и 2 канала
  »  arpd
  »  OpenVpn
  »  Perl HTML Parsing
  »  Мониторинг очереди Postfix
  »  Main


Rambler's Top100

Немного про openvpn. VPN
Коробанов Сергей
Ноябрь 15, 2006 VPN туннель:

VPN (англ. Virtual Private Network - виртуальная частная сеть) - логическая сеть, создаваемая поверх другой сети. При создании соединений через VPN, основной протокол сети передачи данных используется лишь как транспортная основа, поверх которой создается соединение "точка-точка". Передаваемые данные вначале шифруются, а затем инкапсулируются в IP-пакеты. Протоколы защищенного канала используют в своей работе такой механизм, как туннелирование. Туннель создается между двумя устройствами, где необходимо обеспечить защиту передаваемых данных.

Недавно я принимал участие в разработке одного проекта - небольшое клиент/серверное приложение, на perl mod Net::Server, но об этом в другой статье.

Задача была обеспечить обмен данными между двумя серверами. (проводка платежей через карты предоплаты)

Т.к. "реальные пацаны всегда на измене... :)", на сервере принимающем платежи, и имеющем Web интерфейс, не должны храниться учетные записи к биллинговой системе. Это секурная, правильная концепция.

Задача редкая и готовых решений нет :(
Пришлось изобретать велосипед и создавать клиент/серверное приложение, проверяющее введенные данные, проводящее платеж, и являющееся "прослойкой" между web интерфейсом и абонентской базой.

Существуют два способа обеспечения безопасной передачи данных между клиентской и серверной частью приложения:
  1. Клиент/Серверное приложение будет осуществлять шифрование всех передаваемых данных.
  2. Использование VPN туннеля.
Определим, какой из способов наиболее приемлем для данного проекта.

Первый вариант не подходит по следующим причинам:
  • Безопасность. Нет преимуществ перед VPN туннелем. При обнаружении уязвимостей алгоритмов шифрования в первом случае требуется модификация кода приложения, что повлечет за собой материальные и временные затраты. В случае использования шифрованного туннеля смена алгоритма может быть произведена в короткий промежуток времени, с меньшими финансовыми затратами.
  • Стоимость реализации. Использование туннеля позволит снизить материальные затраты на разработку и дальнейшую поддержку проекта. При использовании VPN туннеля имеется незначительное уменьшение скорости передачи данных, что не критично в связи с небольшими объемами передаваемых данных. Таким образом, выбор остался за VPN туннелем, как за наиболее экономичным и безопасным способом.

OpenVPN

OpenVPN - это демон для поддержки сетей VPN (Virtual Private Network) с гибкими возможностями конфигурирования. Может использоваться для объединения защищенным образом двух и более частных сетей посредством создания шифрованного туннеля "поверх" WAN или LAN сети. Сильными сторонами OpenVPN являются кроссплатформенность, стабильность, поддержка динамических IP-адресов и NAT, адаптивное сжатие данных в соединении, использование одного TCP/UDP-порта, модульное построение, которое позволяет передать все криптографические задачи библиотеке OpenSSL, и относительно простая установка, обычно не требующая специального модуля ядра.

Красиво они в мануале загнули... Ерунда насчет модулей. tun tap собрать все равно надо. В остальном правда. Работает через NAT и другой туннель (pptp например), проксируется, конфигурируется легко, вообщем достойный демон!

OpenVPN поддерживает два метода аутентификации:
  1. Статический ключ. В этом случае используется общий статический ключ.
  2. TLS.Базируется на протоколе SSL/TLS, сертификатах аутентификации и обмене ключами.

В первом варианте общий сгенерированный ключ передается на оба устройства, до установки туннеля между ними. Этот статический ключ включает в себя четыре независимых ключа: HMAC (Hash-based Message Authentication Code - хешевый код идентифицирования сообщений) запрос, HMAC ответ, шифрования и дешифрования. Оба хоста будут использовать некоторый HMAC ключ и ключ шифрования/дешифрования. Это возможно если эти четыре ключа независимы.

Во втором случае устанавливается SSL сессия с взаимной аутентификацией (т.е. каждый из участников должен предъявить сертификат). Если SSL/TLS сессия успешно установлена, то HMAC ключ и ключ шифрования/дешифрования генерируются случайным образом функцией библиотеки OpenSSL, после чего происходит обмен. Оба участника обмена имеют следующие индивидуальные ключи: HMAC запрос, HMAC ответ, шифрования и дешифрования.

При построении туннеля воспользуемся первым способом аутентификации - методом статического ключа. Т.к. аутентификация уже произошла (привязка по ip клиентской части к серверной).

ksi ~ # openvpn --show-ciphers
DES-CBC 64
IDEA-CBC 128
RC2-CBC 128
DES-EDE-CBC 128
DES-EDE3-CBC 192
DESX-CBC 192
BF-CBC 128
RC2-40-CBC 40
CAST5-CBC 128
RC5-CBC 128
RC2-64-CBC 64
AES-128-CBC 128
AES-192-CBC 192
AES-256-CBC 256

Думаю список увеличится в новых релизах.

Из имеющихся алгоритмов для создания туннеля выбираем AES с длиной ключа 256 бит. Ломать сложно.

# -------- Цитата ------
AES-128 (128 - длина ключа в битах) имеет 10 раундов и под "устойчивостью" мы понимаем, что самым быстрым известным способом взлома является полный перебор 2^128 вариантов. 14 раундов имеет AES-256 (и требование по вычислительной сложности взлома быть не меньше перебора 2^256 вариантов). Пока боле быстрого способа взлома, чем брутефорсить нет.

Как только появится, об этом будут шуметь очень долго и по всем каналам. Но и это не обязательно будет означать, что шифр нестойкий. Реальная возможность взлома в ближайшие 25 лет (а на столько он примерно и расcчитан) будет если только удастся снизить вычислительные затраты до уровня примерно 2^80.
#------------------------

Защищаемся мы от снифирения. Т.к., если передаваемый pin код будет перехвачен, можно реализовать скрипт, который разрывает соединение абонента (например послав в down интерфейс снифера если он включен в режиме моста в разрыв линии ethernet) и активирует карту через web интерфейс на "левый" счет.
Это маловероятная скоре "гипотетическая" атака, но лучше перепараноить, чем потом расстраиваться!...


Рассмотрим поэтапно процедуру создания vpn туннеля между 2-мя серверами под управлением Linux:
  1. Генерация ключа:
    	ksi openvpn # openvpn --genkey --cipher AES-256-CBC --secret ksi_key
    	
    Ключ записывается в файл ksi_key
    Для установления туннеля необходимо файл с секретным ключом перенести на второй сервер (любым доступным способом т.е. ножками, но проще по sftp).
  2. Конфигурационные файлы: Конфигурация первого сервера:
    	ksi openvpn # cat client.conf
    
    	remote 192.168.75.3
    	dev tun
    	ifconfig 192.168.8.2 192.168.8.1
    	cipher AES-256-CBC
    	secret /etc/openvpn/ksi_key
    	keepalive 10 60
    	ping-timer-rem
    	persist-tun
    	persist-key
    	daemon
    	
    Конфигурация второго сервера:
    	plast openvpn # cat server.conf
    
    	remote 192.168.25.70
    	dev tun
    	ifconfig 192.168.8.1 192.168.8.2
    	cipher AES-256-CBC
    	secret /etc/openvpn/ksi_key
    	keepalive 10 60
    	ping-timer-rem
    	persist-tun
    	persist-key
    	daemon
    	

remote - IP - адрес хоста, представляющего из себя дальнюю сторону туннеля. Если его не указать, то openvnp будет пассивно принимать все входящие соединения, не пытаясь самостоятельно соединяться с удаленной машиной

dev - тип виртуального устройства туннеля. Может принимать значение tun или tap. Тun позволяет создавать только соединения типа точка-точка, tap виртуальные сегменты Еthernet.

ifconfig - назначает виртуальному tun/tap интерфейсу IP - адрес. Указывает адрес удаленного интерфейса. Это необходимо, потому что туннель работает как стандартное соединение "точка - точка".

cipher - алгоритм, используемый для шифрования пакетов

secret - указывает имя файла, в котором хранится статический ключ, используемый для шифрования потока

keepalive - контроль за состоянием соединений. В случае если по туннелю не передаются данные, через некоторое время посылается ping, для того чтобы соединение не разрывалось.

ping-timer-rem - позволяет обрабатывать директиву keepalive только в случае, если имеется параметр remote. (если remote не указывать, сервер будет принимать пакеты от любых ip адресов, но не будет реагировать на пакеты, до тех пор, пока они не пройдут все аутентификационные тесты)

persist-tun - не позволяет закрывать/открывать tun/tap интерфейс при рестарте соединения (keepalive)

persist-key - не дает перечитывать ключ с файловой системы при рестарте соединения (keepalive)

daemon - работа в режиме сервиса (демона)

Стартуем демонов:
Перед установлением туннеля необходимо включить поддержку tun интерфейса в ядре или собрать модуль. verb 4 необходим только на этапе отладки это debug level. Первый пошел:
plast openvpn # openvpn --config /etc/openvpn/server.conf --verb 4
plast openvpn # ip a l

9: tun0:  mtu 1500 qdisc pfifo_fast
 qlen 100
    link/[65534]
    inet 192.168.8.1 peer 192.168.8.2/32 scope global tun0
Второй пошел:
ksi# openvpn --verb 4 --config /etc/openvpn/client.conf
ksi openvpn # ip a l

15: tun0:  mtu 1500 qdisc pfifo_fast
 qlen 100
    link/[65534]
    inet 192.168.8.2 peer 192.168.8.1/32 scope global tun0
Проверка работы.
ksi # ping 192.168.8.1
64 bytes from 192.168.8.1: icmp_seq=1 ttl=64 time=102 ms

Сравним работу туннеля без шифрования и с шифрованием.

“В наше время никому нельзя доверять, порой даже самому себе, мне верить можно!”
(с) Борман

Запустим туннель без шифрования (в конфиге на cipher и secret ставим # )
Стартуем openvpn

Сообщения syslog при старте
Oct 27 10:52:42 ksi openvpn[7928]: ******* WARNING *******: all encryption and
 authentication features disabled -- all data will be tunnelled as cleartext
Oct 27 10:52:42 ksi openvpn[7928]: TUN/TAP device tun0 opened
Формат пакета для туннеля без шифрования:
IP HEADER20 bytes
UDP HEADER8 bytes
Original IP HEADER20 bytes
Original TCP HEADER32 bytes
HMAC20 bytes
IV1 byte
Sequence number8 bytes
DATA5 bytes

Запускаем ping.
Сниферим на маршрутизаторе:
11:02:03.306120 192.168.25.70.1194 > 192.168.75.3.1194: udp 84 (DF) (ttl 64, id 0, len 112)
0x0000   4500 0070 0000 4000 4011 73e2 c0a8 fa46        
0x0010   c0a8 4b03 04aa 04aa 005c 2f47 4500 0054        
0x0020   0000 4000 4001 a955 c0a8 0802 c0a8 0801   
0x0030   0800 536a af1f 0191 edae 4145 ceed 0b00
0x0040   0809 0a0b 0c0d 0e0f 1011 1213 1415 1617
0x0050   1819

11:02:03.368788 192.168.75.3.1194 > 192.168.25.70.1194: udp 84 (DF) (ttl 62, id 451, len 112)
0x0000   4500 0070 01c3 4000 3e11 741f c0a8 4b03        
0x0010   c0a8 fa46 04aa 04aa 005c 2f47 4500 0054        
0x0020   eae3 0000 4001 fe71 c0a8 0801 c0a8 0802
0x0030   0000 5b6a af1f 0191 edae 4145 ceed 0b00
0x0040   0809 0a0b 0c0d 0e0f 1011 1213 1415 1617
0x0050   1819

Как видно, поле "Data" не изменилось.

Туннель с шифрованием
Стартует openvpn
Сообщения syslog при старте

Oct 27 11:09:47 ksi openvpn[9180]: Data Channel MTU parms [ L:1560 D:1450 EF:60
 EB:4 ET:0 EL:0 ]
Oct 27 11:09:47 ksi openvpn[9180]: Local Options String: 'V4,dev-type tun,link-mtu
 1560,tun-mtu 1500,proto UDPv4,ifconfig 192.168.8.1 192.168.8.2,cipher AES-256-
CBC,auth SHA1,keysize 256,secret'
Oct 27 11:09:47 ksi openvpn[9180]: Expected Remote Options String: 'V4,dev-type
 tun,link-mtu 1560,tun-mtu 1500,proto UDPv4,ifconfig 192.168.8.2 192.168.8.1,cipher
 AES-256-CBC,auth SHA1,keysize 256,secret'
Формат пакета для туннеля с шифрованием:
IP HEADER 20 bytes
UDP HEADER 8 bytes
Original IP HEADER 20 bytes
Original TCP HEADER 32 bytes
HMAC 20 bytes
IV 1 byte
Sequence number 8 bytes
DATA 5 bytes
Rest 15 bytes

Запускаем ping.

Сниферим на маршрутизаторе:
11:15:32.791610 192.168.25.70.1194 > 192.168.75.3.1194: udp 132 (DF) (ttl 64, id 0, len 160)
0x0000   4500 00a0 0000 4000 4011 73b2 c0a8 fa46        
0x0010   c0a8 4b03 04aa 04aa 008c d258 e70d c208        
0x0020   7a72 5fbf 1191 e713 8492 38eb 90d5 9fd5        
0x0030   e670 5791 9c5b 0221 e748 c121 274e 3732
0x0040   f3c9 607b d3d7 d674 da1e 6022 9783 65b7
0x0050   d545
11:15:32.855201 192.168.75.3.1194 > 192.168.25.70.1194: udp 132 (DF) (ttl 62, id 27, len 160)
0x0000   4500 00a0 001b 4000 3e11 7597 c0a8 4b03        
0x0010   c0a8 fa46 04aa 04aa 008c ac61 c1d5 e4e1        
0x0020   7e52 566c f472 f0e9 f8a7 86b8 ffaa 7431        
0x0030   9a1b 5b22 908b abd5 2b58 4c45 78a2 15b3
0x0040   c848 69b8 c3ba 20c4 36ec 2715 39dd 933a
0x0050   4bac                          

Легко заметить, поле DATA различно, следовательно, туннель шифруется.

«...граница охраняется достойно и народ может спать спокойно»,
(с) первый заместитель Председателя Государственной пограничной службы Украины 2005 г.

Ссылки

http://openvpn.net/
торрент ру Металлические решетки: решетки на окна. Тут выгодно продают и покупают.
назад
на главную
наверх
наверх
далее
другие статьи
на главную | contact | © « 2006, Korobanov Sergey»