Доступ повышенной защищенностиСергей «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) — при туннелировании фреймов Ethernet. В терминологии 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, генерировать все необходимые ключи и сертификаты, создавать серверы и отслеживать активные соединения. |