Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #100, АПРЕЛЬ 2007 г.

Доступ повышенной защищенности

Сергей «grinder» Яремчук

Хакер, номер #100, стр. 150

(grinder@ua.fm)

OpenVPN: кроссплатформенный инструмент для создания виртуальных сетей

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

Проект OpenVPN

В настоящее время существует множество различных способов, позволяющих создавать виртуальные частные сети (ВЧС, по-английски - Virtual Private Network, VPN). Остановим свой выбор на OpenVPN (openvpn.net). Это полнофункциональное решение, созданное на основе SSL и дающее возможность довольно просто справляться со всем спектром задач по подключению удаленных пользователей или сетей с четко разграниченными правами доступами, поддержкой беспроводных сетей и балансировкой нагрузки. Имеются реализации для всех популярных сегодня операционных систем: Linux, *BSD, Solaris, Mac OS X, Windows от 2000. Поддерживаются: адаптивная компрессия потока, работа через NAT, использование всех доступных в SSL алгоритмов шифрования, аутентификаций и сертификатов. Клиенты могут иметь как статические, так и динамические IP-адреса, что весьма полезно при dial-up соединениях или перемещении пользователя. OpenVPN может работать в chroot-окружении. В целях безопасности демон после запуска понижает права до минимально необходимых.

OpenVPN является обычным пользовательским приложением, использующим драйверы tun/tap. Tun применяется при туннелировании IP-пакетов, а tap (он же ethertap) — при туннелировании фреймов Etheet. В терминологии OpenVPN такие туннели называются соответственно routed и bridged. Драйвер TUN/TAP позволяет пользовательским программам самостоятельно обрабатывать соответствующие пакеты. OpenVPN оптимизирован для работы с протоколом UDP, который используется по умолчанию, но можно задействовать и TCP.

Установка OpenVPN

OpenVPN находится в репозитариях практически всех дистрибутивов. Поэтому в большинстве случаев достаточно ввести что-то вроде «sudo apt-get install openvpn» или «yum install openvpn». Впрочем, сборка из исходных текстов также несложна. Если ядро собиралось самостоятельно, следует убедиться, что в системе присутствуют устройства tun/tap:

$ sudo modprobe tun

$ lsmod | grep tun

$ ls /dev/net/tun

Если ответ ничего не содержит, следует пересобрать ядро, активировав следующие пункты:

Device Drivers --->

Network device support --->

[*]Network device support

<M> Universal TUN/TAP device driver support

Теперь скачиваем последнюю версию OpenVPN с сайта проекта и набираем:

$ tar -xzvf openvpn-2.0.9.tar.gz

$ cd openvpn-2.0.9

Когда в системе есть все необходимое, для установки хватает и стандартных «./configure; make; sudo make install». Проблемы обычно возникают в случае отсутствия библиотек lzo или ssl. После установки работу компонентов можно протестировать, введя «make check». Если сообщение о том, что «all 2 test passed», покажется мало информативным, следует провести два доступных теста вручную. Система, построенная на основе OpenVPN, может использовать два вида ключевой информации и, соответственно, два алгоритма шифрования: симметричное со статическим ключом и асимметричное с использованием TLS/SSL-сертификатов и ключей. Посмотреть, какие алгоритмы шифрования доступны, можно с помощью команды:

$ sudo openvpn -–show-ciphers

Проверим работу OpenVPN со статическим ключом:

$ sudo openvpn --genkey --secret /etc/openvpn/static.key

И теперь тестируем:

$ sudo openvpn --test-crypto --secret /etc/openvpn/static.key

Результатом должно быть сообщение о том, что «OpenVPN crypto self-test mode SUCCEEDED».

Для проверки работы с асимметричными ключами следует воспользоваться готовыми конфигурационными файлами, которые находятся в подкаталоге sample-config-files архива. В разных консолях выполняем следующие команды:

$ sudo openvpn sample-config-files/loopback-server

$ sudo openvpn sample-config-files/loopback-client

Если в ответ мы получаем «VERIFY OK» и происходит обмен зашифрованными пакетами, то можно смело идти дальше.

Следующим шагом создадим учетную запись, под которой будет работать демон openvpn, понижая свои привилегии после запуска:

$ sudo useradd openvpn

Очень не рекомендую использовать здесь nobody - если несколько серверов работают от имени этого пользователя, он становится не менее всемогущим, чем root.

Создаем каталог, в котором будут храниться настройки и ключи:

$ sudo mkdir /etc/openvpn

Если планируется работа нескольких демонов openvpn, удобнее создать подкаталог для каждого, чтобы затем не путаться в назначении конфигурационных файлов.

Создание ключей сервера и клиентов

Как генерировать статический ключ, показано выше («openvpn -–genkey»). В этом случае на сервере и клиентах используется один ключ. Это удобно, но довольно рискованно. Если ключ попадет к злоумышленнику, тот сможет расшифровывать всю информацию, передаваемую по сети.

Сертификаты и ключи для сервера и клиентов необходимы при асимметричном шифровании. Проще и удобнее создавать их не вручную, а с помощью скриптов, находящихся в подкаталоге easy-rsa (к слову, в подкаталоге Windows имеются и bat-файлы). Их здесь несколько:

*корневой сертификат (CA - Certificate Authority) – build-ca (для подписи сертификатов сервера и клиентов);

*ключ и сертификат сервера – build-key-server;

*ключи для клиентов – простые (build-key) и защищенные паролем (build-key-pass);

*ключи PKCS (Public Key Cryptography Standards) - build-key-pkcs12 (подойдут для хранения на сменных носителях вроде eToken);

*создать ключ и сертификат (простой (build-req) и защищенный паролем (build-req-pass)), если СА не доступен в локальной системе, и подписать их (sign-req).

*создать сертификат и ключ, используя СА, - build-inter;

*создать ключ Diffie Helman - build-dh (используется при установленном соединении для шифрования трафика);

*отозвать сертификат (revoke-crt);

*отозвать с созданием списка отозванных сертификатов (Certificate Revocation List - CRL) - revoke-full.

OpenVPN поддерживает двунаправленную аутентификацию, основанную на сертификатах, поэтому клиент должен идентифицировать сертификат сервера, проверяя, подписан ли он с помощью СА, и наоборот. Затем просматривается информация в заголовке сертификата. Это отлично видно в последнем тесте. Итак, вначале следует создать СА, а затем - сертификат и секретный ключ для сервера и всех клиентов.

Создаем каталог /etc/openvpv/keys и копируем в него все из easy-rsa. Чтобы меньше вбивать вручную, сначала стоит заглянуть в скрипт vars и подправить значения параметров KEY_COUNTRY, KEY_PROVINCE, KEY_CITY=BISHKEK, KEY_ORG, KEY_EMAIL. Кроме того, параметр KEY_CONFIG указывает на файл openssl.cnf, находящийся в этом же каталоге. Он аналогичен одноименному файлу, используемому OpenSSL; в него также стоит заглянуть (либо взять готовый вариант в /etc/ssl). Теперь можно сделать все необходимое:

$ cd easy-rsa

$ sudo ./vars

$ sudo ./clean-all

$ sudo ./build-ca

Если файлы vars и openssl.cnf были подправлены, при создании сертификатов в большинстве ответов можно оставлять значения, предлагаемые по умолчанию. Кроме одного. Поле Common Name, в котором указывается имя хоста, обязательно к заполнению в любом случае, причем для сервера и для каждого клиента оно должно быть уникальным. По окончании работы в каталоге появятся два файла: ca.key и ca.crt. Для проверки сертификатов секретный ключ не нужен, он используется только для подписи. Поэтому, учитывая его значимость, файл ca.key лучше спрятать подальше от чужих глаз.

При вызове следующих скриптов в качестве параметра необходимо указывать имя компьютера, для которого создаются ключ и сертификат. Сначала делаем все необходимое для работы сервера:

$ sudo ./build-key-server server

$ sudo ./build-dh

А затем - для клиентов:

$ sudo ./build-key client1

$ sudo ./build-key-pass client2

Для второго клиента был создан ключ, защищенный паролем. На сервере оставляем файлы ca.crt, dh1024.pem, server.srt и server.key. На компьютеры клиентов, помимо сертификата и ключа, переносим и ca.crt.

Создание конфигурационных файлов - сервер

OpenVPN работает по принципу клиент-серверной архитектуры в одном из двух режимов: «точка-точка» или «сервер-клиенты». Количество клиентов во втором случае ограничивается только мощностью компьютера, играющего роль сервера. Причем на одном компьютере возможен одновременный запуск нескольких процессов openvpn, каждый из которых считывает собственный конфигурационный файл и работает в режиме сервера или клиента. Таким образом без проблем создается несколько виртуальных сетей.

Есть несколько вариантов запуска сервера. Например, вызов openvpn из командной строки со всеми параметрами в придачу. Сервер может также запускаться через xinetd. Традиционным считается вариант с использованием конфигурационного файла в /etc/openvpn и стартового скрипта в /etc/init.d. Его и рассмотрим.

Для создания конфигурационного файла сервера воспользуемся имеющимся шаблоном server.conf, который находится в подкаталоге sample-config-file. Все параметры в нем хорошо прокомментированы. Вариантов описания даже одной конфигурации сети может быть несколько, рассмотрим лишь один из них. Копируем файл в /etc/openvpn и приступаем к редактированию:

# vi /etc/openvpn/server.conf

# Необязательный параметр, указывающий, на каком интерфейсе слушать, без него сервер будет принимать соединения на всех интерфейсах

# local 195.95.95.95

# Если используется несколько серверов, каждый должен работать на своем порту

# port 1194

# Тип виртуального устройства (tun, tap, null), в некоторых случаях необходимо указывать и его номер

dev tun

# По умолчанию используется протокол UDP, возможные варианты - tcp, udp, tcp-server, tcp-client

# proto tcp-server

# Включаем сжатие

comp-lzo

# Отправка icmp-пакетов, чтобы межсетевые экраны не разорвали соединения при их неактивности

ping 15

# Для dial-up, NAT, PPP понадобятся следующие параметры:

# ping-restart 45

# ping-timer-rem

# persist-tun

# persist-key

# Вывод отладочных сообщений, максимальное значение «9» стоит устанавливать только при отладке

verb 3

# Назначаем виртуальному интерфейсу следующие IP-адреса: своему - 10.1.0.1, удаленному - 10.1.0.2; используется при соединении «точка-точка»

ifconfig 10.1.0.1 10.1.0.2

# При установленном «mode server» задается пул клиентских адресов

# mode server

# server 10.1.0.0 255.255.255.0

# Скрипт, содержащий сведения о новом маршруте

up ./server.up

# Удаляем маршрут при остановке

down ./server.down

# Добавляем адреса сетей и ресурсов, которые будут доступны клиентам

push "route 192.168.1.0 255.255.255.0"

# Использование SSL/TLS (только для сервера)

tls-server

# Файлы ключей

ca /etc/openvpn/keys/ca.crt

cert /etc/openvpn/keys/server.crt

key /etc/openvpn/keys/server.key

# Параметры Diffie-Hellman при использовании tls-server

dh /etc/openvpn/keys/dh1024.pem

# Пользователь и группа, от имени которых будет работать программа

user openvpn

group openvpn

Файл server.up содержит информацию о новом маршруте, в простейшем случае запись такая:

route add -net 10.0.1.0 netmask 255.255.255.0 gw 192.168.1.1

Здесь 192.168.1.1 - адрес внутреннего интерфейса сервера OpenVPN.

И server.down:

route del -net 10.0.1.0/24

Когда конфигурационный файл создан, можно проверить работу сервера. Первый раз это лучше сделать из консоли, куда будут выводиться все сообщения:

$ sudo openvpn --config /etc/openvpn/server.conf

Теперь подсоединяемся с помощью telnet:

$ telnet localhost 1194

При получении ответа сервера можно продолжать.

Если OpenVPN устанавливался из исходных текстов, необходимо обеспечить его автоматический запуск при загрузке системы и остановку при выключении. Разработчики заранее подготовили несколько скриптов. В подкаталоге gentoo находится готовый файл openvpn.init для одноименного дистрибутива, а в sample-scripts – файл для запуска и остановки OpenVPN в RedHat/Fedora и других chkconfig-based дистрибутивах. Хотя после небольшой доработки их можно использовать и в любом другом дистрибутиве. В общем случае подойдут простые скрипты – openvpn-startup.sh и openvpn-shutdown.sh. Хотя заглянуть внутрь первого также стоит:

# vi openvpn-startup.sh

#!/bin/sh

# Конфигурационный каталог openvpn

dir=/etc/openvpn

# В этом файле есть готовые правила для iptables на все случаи жизни; если ты планируешь его использовать, то самостоятельную загрузку iptables следует отключить

$dir/firewall.sh

# Подгружаем необходимый модуль

modprobe tun

# Включаем IP forwarding

echo 1 > /proc/sys/net/ipv4/ip_forward

# Оставляем одну запись

openvpn --cd $dir --daemon --config server.conf

# openvpn --cd $dir --daemon --config vpn2.conf

# openvpn --cd $dir --daemon --config vpn2.conf

Теперь копируем сценарий в /etc/init.d, делаем его исполняемым и создаем необходимые символические ссылки на уровнях запуска, помня о том, что OpenVPN желательно загружать после того, как будет поднята сеть:

$ chmod +x openvpn-startup.sh

$ sudo cp openvpn-startup.sh /etc/init.d

$ sudo ls –n /etc/init.d/openvpn-startup.sh /etc/rc3.d/S99openvpn-startup

$ sudo ls –n /etc/init.d/openvpn-startup.sh /etc/rc5.d/S99openvpn-startup

$ chmod +x openvpn-shutdown.sh

$ sudo cp openvpn-shutdown.sh /etc/init.d

$ sudo ls –n /etc/init.d/openvpn-shutdown.sh /etc/rc6.d/K80openvpn-shutdown

Настройки iptables

Конечно, правила для iptables зависят от конкретной конфигурации, но в общем случае они должны выглядеть так:

# vi server.up

/sbin/iptables -I INPUT -p udp --dport 1194 -j LogAccept

/sbin/iptables -I OUTPUT -p udp --sport 1194 -j LogAccept

/sbin/iptables -I FORWARD -s 10.0.1.0/24 -d 192.168.1.0/24 -j LogAccept

/sbin/iptables -I FORWARD -d 10.0.1.0/24 -s 192.168.1.0/24 -j LogAccept

# vi server.down

/sbin/iptables -D INPUT -p udp --dport 1194 -j LogAccept

/sbin/iptables -D OUTPUT -p udp --sport 1194 -j LogAccept

/sbin/iptables -D FORWARD -s 10.0.1.0/24 -d 192.168.1.0/24 -j LogAccept

/sbin/iptables -D FORWARD -d 10.0.1.0/24 -s 192.168.1.0/24 -j LogAccept

Некоторые варианты настройки iptables можно подсмотреть в файле firewall.sh.

Создание конфигурационных файлов – клиент

Для клиентского компьютера также имеется шаблон – client.conf. Конфигурационные файлы клиентов, подключающихся к одному серверу, будут отличаться лишь названиями файлов ключей и некоторыми сетевыми настройками.

# vi client.conf

dev tun

# Для клиента обязательно указываем IP-адрес и порт сервера OpenVPN

remote 195.95.95.95 1194

proto udp

comp-lzo

ping 15

verb 3

# Обрати внимание, что по сравнению с сервером IP-адреса проставлены в обратном порядке

ifconfig 10.1.0.2 10.1.0.1

up ./client.up

down ./client.down

ca /etc/openvpn/keys/ca.crt

cert /etc/openvpn/keys/client1.crt

key /etc/openvpn/keys/client1.key

user openvpn

group openvpn

Клиент и сервер готовы. Можно запускать и пробовать соединение. Команда ifconfig должна показать наличие tun0 на обоих компьютерах. По адресу 10.1.0.2 должен проходить ping. При этом о шифровании будет свидетельствовать то, что захваченный с помощью tcpdump пакет на интерфейсах eth0 и tun0 отличается. Успехов.

Фронтенды для Linux к OpenVPN

Все настройки и управление OpenVPN в Linux совсем не обязательно выполнять путем прямого редактирования конфигурационных файлов. Доступны графические интерфейсы, позволяющие сделать это легко и просто. Самым элементарным является kovpn (www.enlighter.de); с его помощью можно запускать и останавливать демон, не вызывая консоль, при запросе вводить имя и пароль.

Чуть больше возможностей у KVpnc (home.gna.org/kvpnc): создание ключей, импорт и экспорт конфигурационных файлов и сертификатов, работа с несколькими профилями. Он умеет работать и с некоторыми другими VPN-клиентами: Cisco VPN (vpnc), IPSec (FreeS/WAN (OpenS/WAN), racoon), PPTP. Имеет локализованный интерфейс.

OpenVPN-Admin (openvpn-admin.sf.net), написанный на Mono, позволяет создавать сертификаты и управлять ими с помощью понятных мастеров, работать с несколькими профилями.

Есть версии не только для *nix, но и для Windows; в планах вариант для Nokia 770. Также существует OpenVPN Control (openvpn-control.sf.net) - мультиплатформенный фронтенд, написанный на Perl и Tk. С его помощью можно просматривать и управлять подключениями к серверу.

Есть и модуль к Webmin (www.openit.it/index.php/openit_en/software_libero/openvpnadmin), позволяющий в удобном графическом окружении редактировать vars, генерировать все необходимые ключи и сертификаты, создавать серверы и отслеживать активные соединения.

Содержание
ttfb: 34.820079803467 ms