Openvpn static
Материал из Ksimute
Коробанов Сергей
Ноябрь 15, 2006
VPN туннель:
VPN (англ. Virtual Private Network - виртуальная частная сеть) - логическая сеть, создаваемая поверх другой сети. При создании соединений через VPN, основной протокол сети передачи данных используется лишь как транспортная основа, поверх которой создается соединение "точка-точка". Передаваемые данные вначале шифруются, а затем инкапсулируются в IP-пакеты. Протоколы защищенного канала используют в своей работе такой механизм, как туннелирование. Туннель создается между двумя устройствами, где необходимо обеспечить защиту передаваемых данных.
Недавно я принимал участие в разработке одного проекта - небольшое клиент/серверное приложение, на perl mod Net::Server, но об этом в другой статье.
Задача была обеспечить обмен данными между двумя серверами. (проводка платежей через карты предоплаты)
Т.к. "реальные пацаны всегда на измене... :)", на сервере принимающем платежи, и имеющем Web интерфейс,
не должны храниться учетные записи к биллинговой системе. Это секурная, правильная концепция.
Задача редкая и готовых решений нет :(
Пришлось изобретать велосипед и создавать клиент/серверное приложение, проверяющее введенные данные, проводящее
платеж, и являющееся "прослойкой" между web интерфейсом и абонентской базой.
Существуют два способа обеспечения безопасной передачи данных между клиентской и серверной частью приложения:
- Клиент/Серверное приложение будет осуществлять шифрование всех передаваемых данных.
- Использование VPN туннеля.
Определим, какой из способов наиболее приемлем для данного проекта.
Первый вариант не подходит по следующим причинам:
- Безопасность. Нет преимуществ перед VPN туннелем. При обнаружении уязвимостей алгоритмов шифрования в первом
случае требуется модификация кода приложения, что повлечет за собой материальные и временные затраты. В случае
использования шифрованного туннеля смена алгоритма может быть произведена в короткий промежуток времени, с меньшими
финансовыми затратами.
- Стоимость реализации. Использование туннеля позволит снизить материальные затраты на разработку и дальнейшую поддержку проекта. При использовании VPN туннеля имеется незначительное уменьшение скорости передачи данных, что не критично в связи с небольшими объемами передаваемых данных. Таким образом, выбор остался за VPN туннелем, как за наиболее экономичным и безопасным способом.
OpenVPN
OpenVPN - это демон для поддержки сетей VPN (Virtual Private Network) с гибкими возможностями конфигурирования. Может использоваться для объединения защищенным образом двух и более частных сетей посредством создания шифрованного туннеля "поверх" WAN или LAN сети. Сильными сторонами OpenVPN являются кроссплатформенность, стабильность, поддержка динамических IP-адресов и NAT, адаптивное сжатие данных в соединении, использование одного TCP/UDP-порта, модульное построение, которое позволяет передать все криптографические задачи библиотеке OpenSSL, и относительно простая установка, обычно не требующая специального модуля ядра.
Красиво они в мануале загнули... Ерунда насчет модулей. tun tap собрать все равно надо. В остальном правда. Работает через NAT и другой туннель (pptp например), проксируется, конфигурируется легко, вообщем достойный демон!
OpenVPN поддерживает два метода аутентификации:
- Статический ключ. В этом случае используется общий статический ключ.
- 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 бит. Ломать сложно.
- -------- Цитата ------
Как только появится, об этом будут шуметь очень долго и по всем
каналам. Но и это не обязательно будет означать, что шифр нестойкий.
Реальная возможность взлома в ближайшие 25 лет (а на столько он примерно и
расcчитан) будет если только удастся снизить вычислительные затраты до уровня
примерно 2^80.
- ------------------------
Защищаемся мы от снифирения. Т.к., если передаваемый pin код будет перехвачен, можно реализовать скрипт,
который разрывает соединение абонента (например послав в down интерфейс снифера если он включен в режиме
моста в разрыв линии ethernet) и активирует карту через web интерфейс на "левый" счет.
Это маловероятная скоре "гипотетическая" атака, но лучше перепараноить, чем потом расстраиваться!...
Рассмотрим поэтапно процедуру создания vpn туннеля между 2-мя серверами под управлением Linux:
- Генерация ключа:
ksi openvpn # openvpn --genkey --cipher AES-256-CBC --secret ksi_key
Ключ записывается в файл ksi_key
Для установления туннеля необходимо файл с секретным ключом перенести на второй сервер (любым доступным способом т.е. ножками, но проще по sftp).
- Конфигурационные файлы:
Конфигурация первого сервера:
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>IP HEADER 20 bytes </td>UDP HEADER 8 bytes </td>Original IP HEADER 20 bytes </td>Original TCP HEADER 32 bytes </td>HMAC 20 bytes </td>IV 1 byte </td>Sequence number 8 bytes </td>DATA 5 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>IP HEADER 20 bytes </td>UDP HEADER 8 bytes </td>Original IP HEADER 20 bytes </td>Original TCP HEADER 32 bytes </td>HMAC 20 bytes </td>IV 1 byte </td>Sequence number 8 bytes </td>DATA 5 bytes </td>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/