Когда речь заходит о необходимости предоставления авторизированному пользователю доступа к защищенным ресурсам частной сети, на ум сразу приходят примеры построения VPN на базе IPSec, PPTP, L2TP и SSL. Однако если требуется в кратчайшие сроки развернуть бесплатное, кросс-платформенное, полнофункциональное ПО с гибкими возможностями конфигурирования и относительно простой установкой, не требующей вмешательства в ядро ОС, то из всех доступных решений выбор невольно падает на OpenVPN.
OpenVPN является реализацией технологии VPN с использованием протокола SSL/TLS. С его помощью можно поднять надежный, достаточно быстрый и в то же время защищенный от прослушивания и вмешательства злоумышленников криптотуннель поверх общедоступной сети, такой как интернет. В двух словах схему работы этого приложения можно описать следующим образом: любой сетевой трафик, посылаемый или принимаемый сетевым адаптером, инкапсулируется в зашифрованный пакет и доставляется в другой конечный пункт туннеля OpenVPN, где данные расшифровываются и попадают в удаленную сеть.
К числу основных преимуществ применения OpenVPN стоит отнести следующие:
Как видишь, список возможностей впечатляет, но в отличие от других SSL VPN, достоинством которых считается бесклиентская установка (соединение SSL VPN устанавливается через браузер), для OpenVPN необходим специальный клиент (поговорим об этом ниже).
Предположим, одним прекрасным солнечным утром твое высокое начальство впечатлилось идеей создания виртуальной частной сети, и теперь перед тобой стоит задача поднять VPN-сервер для служащих, которым требуется работать с корпоративными ресурсами, находясь вне стен офиса (это могут быть надомные, командированные сотрудники или просто фрилансеры).
Функции шлюза компании, выпускающего сотрудников в интернет, выполняет компьютер с тремя сетевыми картами (213.167.XX.YY, 192.168.1.1, 192.168.2.1) под управлением... хотя это не так важно, настройки в поддерживаемых операционках будут отличаться минимально. В моем случае на сервере заказчика была установлена OpenBSD 3.9. Что касается корпоративной внутренней сети, то она состоит из двух участков: проводного (192.168.1.0/24) и беспроводного (192.168.2.0/24). После рекогносцировки на местности переходим к установке OpenVPN.
OpenVPN без труда можно найти в любом репозитарии или дереве портов:
В случае установки из исходных кодов в некоторых системах может понадобиться отключить поддержку реализации потоков выполнения и указать местоположение библиотек и заголовочных файлов lzo:
Для проверки с помощью следующих команд можно посмотреть, какие дайджесты (применяются для аутентификации каждой получаемой UDP-датаграммы) и алгоритмы шифрования доступны:
Чтобы обеспечить дополнительный уровень защиты и застраховаться от возможного ущерба при взломе, нужно дать указание демону OpenVPN работать с правами непривилегированного пользователя в chroot'ной среде - среде с измененным корневым каталогом. Первый шаг для этого - добавить в систему группу _openvpn и одноименного пользователя:
Проверяем правильность выполнения двух последних команд:
Думаю, ни для кого не секрет, что сертификаты открытых ключей предоставляют удобный и надежный способ аутентификации пользователей, поэтому не будем сейчас тратить время на теоретическую часть и перейдем непосредственно к процедуре генерирования надлежащих сертификатов.
Создаем директорию, где будут лежать конфигурационные файлы, скрипты и сертификаты:
# mkdir -p /etc/openvpn/keys
Копируем комплект скриптов easy-rsa, предназначенный для упрощения создания сертификатов, которые предъявляются в процессе аутентификации для подтверждения валидности клиентов. Теперь о монстроидальных командах openssl можно забыть.
# cp -r /usr/local/share/examples/openvpn/easy-rsa /etc/openvpn
Далее следует экспортировать переменные KEY_*, они необходимы для работы скриптов build-*:
Инициализируем директорию /etc/openvpn/easy-rsa/keys:
# ./clean-all
Создаем корневой и серверный сертификаты:
Для создания файла параметров Диффи-Хелмана, предназначенного для обеспечения более надежной защиты данных при установке соединения клиента с сервером, выполняем:
# ./build-dh
Снизить вероятность успешного проведения DoS-атаки на сервер OpenVPN можно за счет использования клиентом и сервером статического ключа HMAC (так называемый shared secret):
# /usr/local/sbin/openvpn --genkey --secret keys/ta.key
Перемещаем все созданные файлы в подкаталог keys и выставляем для них корректные права доступа:
Процедура создания клиентских сертификатов практически аналогична соответствующей процедуре для сервера:
Теперь подкаталог client1 следует перенести на винт или флешку «географически изолированного» сотрудника.
Конфигурация сервера OpenVPN хранится в файле /etc/openvpn/server.conf. Ниже приведен пример подобного конфига. Все опции детально прокомментированы, поэтому сложностей возникнуть не должно. При настройке старайся «не срезать углы» - за один шаг добавляй/изменяй что-то одно и сразу же тестируй. Все действия в server.conf желательно фиксировать в локальном cvs-репозитории, чтобы можно было быстро просмотреть историю изменений и вернуться к рабочей ревизии.
# vi /etc/openvpn/server.conf
# cp /usr/local/share/examples/openvpn/sample-config-files/server.conf /etc/openvpn
Поднимаем виртуальный интерфейс tun0:
Запускаем сервер OpenVPN командой:
# /usr/local/sbin/openvpn --config /etc/openvpn/server.conf
Для автоматической загрузки OpenVPN достаточно прописать эту строчку в стартовый сценарий /etc/rc.local. Например, так:
# vi /etc/rc.local
Далее смотрим в логи, чтобы убедиться в успешной загрузке нашего демона:
# tail /var/log/openvpn.log
Чтобы проверить состояние псевдоустройства туннелирования, можно воспользоваться утилитой ifconfig:
# ifconfig tun0
Для корректной работы сервера OpenVPN необходимо разрешить прохождение любого трафика через интерфейс OpenVPN, а также входящие подключения на внешний адрес сервера порт 1194/udp:
# vi /etc/pf.conf
Перезагружаем набор рулесетов файрвола:
# pfctl -f /etc/pf.conf
Инсталляция на стороне клиента
Итак, VPN-сервер работает и готов принимать подключения. Развертывание VPN-клиентов для VPN-подключений удаленного доступа состоит из двух действий: установка программы OpenVPN GUI (http://openvpn.se/files/install_packages/openvpn-2.0.9-gui-1.0.3-install.exe) и правка конфигурационного файла client*.ovpn.
C:\Program Files\OpenVPN\config\mycompany_client1.ovpn
Теперь для подключения к VPN-серверу достаточно в трее щелкнуть правой кнопкой мыши на значке с красными мониторчиками, выбрать конфиг mycompany_client1 и нажать Connect.
В BSD-системах, используя связку пакетного фильтра pf и авторизационного шелла authpf, можно контролировать доступ клиентов, подключающихся к VPN-службе и корпоративной сети. Схема работы такой конструкции довольно проста: пользователь логинится по ssh, и, в зависимости от введенных данных (имя и пароль), на сервере вступают в силу персональные правила файрвола, в данном случае разрешающие прохождение UDP-пакетов к порту 1194.
Но прежде чем производить настройку authpf, необходимо переопределить некоторые дефолтные значения переменных демона sshd(8). Так мы усложним потенциальному злоумышленнику успешное проведение атаки с целью перехвата и подмены ssh-сессии.
# vi /etc/ssh/sshd_config
Для того чтобы внесенные изменения вступили в силу, необходимо дать указание демону перечитать свой конфиг:
# kill -HUP `sed q /var/run/sshd.pid`
Authpf представляет собой псевдооболочку, которая назначается пользователю системы в качестве login shell (примечание: запись «/usr/sbin/authpf» в файл /etc/shells добавлять не следует). При авторизации пользователя по ssh к текущим правилам фильтра пакетов с помощью так называемых «якорей» (anchors) будут присоединены правила, указанные в файле /etc/authpf/authpf.rules или в /etc/authpf/users/$USER. В добавляемых правилах допускается использование зарезервированных макросов $user_id и $user_ip, за счет которых будет происходить автоматическая подстановка имени и IP-адреса подключившегося пользователя (значения макросов считываются из переменных окружения ssh автоматически).
В конец файла login.conf(5) заносим сведения о новом классе authpf, пользователи которого в качестве стандартного шелла будут получать authpf:
# vi /etc/login.conf
С помощью штатной утилиты cap_mkdb(8) обновляем хэшированную базу данных /etc/login.conf.db:
# cap_mkdb /etc/login.conf
Мы не будем переопределять умолчальные значения директив anchor и table, поэтому файл authpf.conf оставляем пустым:
# echo -n > /etc/authpf/authpf.conf
Подготавливаем приветственное сообщение authpf.message (аналог /etc/motd):
# vi /etc/authpf/authpf.message
This service is for authorised VPN-clients only. Please play nice.
Создаем нового пользователя, который принадлежит классу authpf, входит в группу authpf и в качестве оболочки получает /usr/sbin/authpf:
Рисуем правило файрвола, разрешающее пользователю client1 доступ к серверу OpenVPN:
Теперь для подключения механизма якорей добавим следующие записи в pf.conf(5):
И перезагрузим набор рулесетов файрвола:
На стороне клиента открываем любой ssh-клиент, например Putty или SecureCRT. Создаем новую сессию, указываем IP-адрес сервера и имя пользователя. Если все настроено правильно, после успешной авторизации правила файрвола на сервере для этого пользователя изменятся и он получит доступ к VPN-службе.
f:\vpn\putty> plink.exe -pw mypassword client1@213.167.XX.YY
А чтобы постоянно не вводить пароль, можно настроить аутентификацию на базе публичного ключа.
Эта статья включает полный набор пошаговых действий, необходимых для внедрения базового VPN-решения удаленного доступа при использовании BSD-системы в качестве VPN-сервера и WinXP/Vista в качестве VPN-клиента. Развернув в 3-4 компаниях подобную конфигурацию, ты сможешь ехать в Египет греть пятки не с пустой кредиткой и кошельком. Удачи.