KsI-wiki online documents

Openvpn static

Материал из Ksimute

Перейти к: навигация, поиск

Коробанов Сергей
Ноябрь 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 бит. Ломать сложно.

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

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

  1. ------------------------

Защищаемся мы от снифирения. Т.к., если передаваемый 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
    	<pre>
    
    </ol>
    <p>
    <strong>remote</strong> - IP - адрес хоста, представляющего из себя дальнюю сторону туннеля. Если его не указать, то openvnp 
    будет пассивно принимать все входящие соединения, не пытаясь самостоятельно соединяться с удаленной машиной
    </p>
    <p>
    <strong>dev </strong>- тип виртуального устройства туннеля. Может принимать значение tun или tap. Тun позволяет создавать 
    только соединения типа точка-точка, tap виртуальные сегменты Еthernet.
    </p><p>
    <strong>ifconfig </strong>- назначает виртуальному tun/tap интерфейсу IP - адрес. Указывает адрес удаленного интерфейса. 
    Это необходимо, потому что туннель работает как стандартное соединение "точка - точка".
    </p><p>
    <strong>cipher </strong>- алгоритм, используемый для шифрования пакетов
    </p><p>
    <strong>secret </strong>- указывает имя файла, в котором хранится статический ключ, используемый для шифрования потока
    
    </p><p>
    <strong>keepalive </strong>- контроль за состоянием соединений. В случае если по туннелю не передаются данные, через некоторое 
    время посылается ping, для того чтобы соединение не разрывалось.
    </p>
    <p>
    <strong>ping-timer-rem </strong>- позволяет обрабатывать директиву keepalive только в случае, если имеется параметр remote. 
    (если remote не указывать, сервер будет принимать пакеты от любых ip адресов, но не будет реагировать на пакеты, 
    до тех пор, пока они не пройдут все аутентификационные тесты)
    </p>
    <p>
    <strong>persist-tun  </strong>- не позволяет закрывать/открывать tun/tap интерфейс при рестарте соединения (keepalive)
    </p><p>
    <strong>persist-key </strong>- не дает перечитывать ключ с файловой системы при рестарте соединения (keepalive)
    </p><p>
    <strong>daemon </strong>- работа в режиме сервиса (демона)
    
    </p>
    
    Стартуем демонов:
    <br>
    Перед установлением туннеля необходимо включить поддержку tun интерфейса в ядре или собрать модуль.
    verb 4 необходим только на этапе отладки это debug level.
    
    Первый пошел:
    <pre>
    plast openvpn # openvpn --config /etc/openvpn/server.conf --verb 4
    plast openvpn # ip a l
    
    9: tun0: <POINTOPOINT,MULTICAST,NOARP,UP> 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: <POINTOPOINT,MULTICAST,NOARP,UP> 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
    

    Формат пакета для туннеля без шифрования:

    </td> </td> </td> </td> </td> </td> </td> </td>
    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 <strong>af1f 0191 edae 4145 ceed 0b00</strong>
    0x0040   <strong>0809 0a0b 0c0d 0e0f 1011 1213 1415 1617</strong>
    0x0050   <strong>1819</strong>
    


    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 <strong>af1f 0191 edae 4145 ceed 0b00</strong>
    0x0040   <strong>0809 0a0b 0c0d 0e0f 1011 1213 1415 1617</strong>
    0x0050   <strong>1819</strong>
    

    Как видно, поле "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'
    

    Формат пакета для туннеля с шифрованием:

    </td> </td> </td> </td> </td> </td> </td> </td> </td>
    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 <strong>9c5b 0221 e748 c121 274e 3732</strong>
    
    0x0040   <strong>f3c9 607b d3d7 d674 da1e 6022 9783 65b7</strong>
    0x0050   <strong>d545</strong>
    
    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 <strong>908b abd5 2b58 4c45 78a2 15b3</strong>
    0x0040   <strong>c848 69b8 c3ba 20c4 36ec 2715 39dd 933a</strong>
    0x0050   <strong>4bac</strong>                          
    
    


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

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

    Ссылки

    http://openvpn.net/