Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Сертификаты и микропрактикум по OpenSSL
Для работы OpenVPN потребуются сертификаты: сертификат удостоверяющего центра (УЦ, CA), сертификат узла доступа, по одному сертификату для каждого клиента. В принципе, дистрибутив OpenVPN содержит пакет скриптов, позволяющих сгенерировать все нужные сертификаты и ключи при помощи OpenSSL. Использование скриптов описано в документации. Но нет ничего сложного в том, чтобы, хотя бы для тренировки и понимания процесса, проделать все операции с OpenSSL самостоятельно. В качестве побочного результата – получим возможность генерировать собственные сертификаты для веб-сайтов, для адресов электронной почты, да для чего угодно. В этот раз станем суперпользователем: $ sudo su Создаём базовую директорию, в которой будет работать наш удостоверяющий центр (УЦ). (Нужно, впрочем, понимать, что настоящие, большие удостоверяющие центры не должны быть устроены таким образом; хотя, в реальности на это остаётся только надеяться. А для наших целей – использование инструментария OpenSSL по описанному сценарию вполне подходит.) Итак, базовая директория: # mkdir -m 755 /etc/VPNCA Внутри неё – структура директорий, необходимых для работы OpenSSL в режиме УЦ (CA): # mkdir -m 0755 \ Потребуется файл с описанием конфигурации, создадим его на базе стандартного, скопировав последний: # cp /etc/pki/tls/openssl.cnf /etc/VPNCA/CA/openssl.vpn.cnf Установим права доступа безопасным образом (впрочем, на отдельном виртуальном сервере это может показаться избыточным): # chmod 0600 /etc/VPNCA/CA/openssl.vpn.cnf В файле конфигурации достаточно исправить пути к директориям в разделе default_ca, вот этот фрагмент, строки, на которые нужно обратить внимание – выделены:
#################################################################### dir =. #!!! - базовая директория. certs = $dir/certs # Where the issued certs are kept #unique_subject = no # Set to 'no' to allow creation of new_certs_dir = $dir/newcerts # default place for new certs. certificate = $dir/certs/vpnca.crt #!!! - файл сертификата УЦ. serial = $dir/serial # The current serial number crl = $dir/crl.pem #!!! - файл с действующим списком отзывов. private_key = $dir/private/vpnca.key #!!! - файл секретного ключа УЦ.
### Нужно задать начальный серийный номер для сертификатов и для списка отзывов: # echo ’1001′ > /etc/VPNCA/CA/serial После этого можно переходить к генерации сертификата удостоверяющего центра. Это самоподписанный сертификат, что является нормальным положением дел для корневого сертификата. Возвращаемся (если ушли) в базовую директорию: # cd /etc/VPNCA/CA/ Генерируем сертификат и секретный ключ: # openssl req -config openssl.vpn.cnf -new -x509 -extensions v3_ca -keyout private/vpnca.key -out certs/vpnca.crt -days 731 OpenSSL потребует ввести некоторое количество параметров, относящихся к создаваемому корневому сертификату. Самое важное: секретный ключ будет сохранён в зашифрованном виде, для этого OpenSSL запросит пароль, который не нужно терять – он потребуется всякий раз, когда вы задумаете подписать или отозвать очередной сертификат. Обратите внимание, использование -x509 обозначает, что генерируется самоподписанный сертификат удостоверяющего центра (в терминологии OpenSSL – CA), а -days – задаёт период валидности: 731 день, примерно два года. В результате мы получили пару важных файлов: vpnca.key – секретный ключ удостовряющего центра, именно с его помощью подписываются сертификаты, это самый важный элемент, поэтому установим для него соответствующие уровни доступа: # chmod 0400 /etc/VPNCA/CA/private/vpnca.key Второй файл – vpnca.crt – является публичным и представляет собой корневой сертификат нашей системы. Он потребуется для работы OpenVPN, как на сервере, так и на всех клиентах. Собственно, удостоверяющий центр заработал, теперь нужно выпустить сертификаты для участников VPN. Начнём с серверного сертификата, хотя процедуры выпуска для сервера и клиентов не отличаются, но нужно обращать внимание на именование узлов. # cd /etc/VPNCA/CA Прежде чем выпустить сертификат, нужно сгенерировать запрос на выпуск – так называемый файл CSR: # openssl req -config openssl.vpn.cnf -new -nodes -keyout private/vpn-node.key -out vpn-node.csr -days 365 Здесь указана опция -nodes, то есть, секретный ключ сохраняется в открытом виде и пароль запрашиваться не будет. Срок действия сертификата – 365 дней. Имя vpn-node указываем и в качестве параметра CN (Common Name) сертификата, это важно и связано с корректной работой клиентов. Выпускам сертификат, используя только что сгенерированный запрос:
# openssl ca -config openssl.vpn.cnf -policy policy_anything -out certs/vpn-node.crt -infiles vpn-node.csr Ключ -policy – задаёт политику, применяемую к данным сертификатов. Policy_anything – самая свободная политика, допускающая запросы, содержащие, например, отличные от корневого сертификата значения в полях Country Name, Locality Name и др. Политики задаются в файле с конфигурацией OpenSSL, в нашем случае – openssl.vpn.cnf. В результате выполнения команд мы получили пару файлов, требуемых для идентификации сервера VPN: vpn-node.crt – сертификат, который требуется распространить на всех клиентов; vpn-node.key – секретный ключ сервера, этот файл сохраняется только на сервере (за исключением, разве что, резервной копии). Разумной практикой является использование ограничений на доступ для файлов секретных ключей: # chmod 0400 /etc/VPNCA/CA/private/vpn-node.key Впрочем, ключ сервера, который требуется для установления соединения, мы позже скопируем в директорию OpenVPN. Ещё раз напомню, что мы установили имя сервера vpn-node, которое является частью сертификата. Именно по этому имени, в нашей конфигурации, клиенты будут узнавать о том, что узел является сервером (а не другим авторизованным клиентом нашей сети, проводящим перехват сессии). Это важный момент! Не менее важно использовать правильную политику именования серверов и клиентов. В нашем случае имена клиентов начинаются с префикса “client-”. Выпускаем сертификаты для каждого из узлов (не обязательно сразу все выпускать). Например, для узла под названием client-pqr, имя указываем в поле Common Name (CN): # openssl req -config openssl.vpn.cnf -new -nodes -keyout private/client-pqr.key -out client-pqr.csr -days 365 Можно взглянуть на то, что получается: # less./certs/client-pqr.crt Файлы.csr – после выпуска сертификата не требуются, их можно удалить. Настройка OpenVPN Теперь всё готово для того, чтобы поднять инфраструктуру OpenVPN. Управляющие файлы размещаются в директории /etc/openvpn. Для начала создаём внутри неё директорию pki, где разместим все необходимые для аутентификации данные. # mkdir /etc/openvpn/pki Копируем ключи и сертификаты, нужные для работы сервера: - сертификат и секретный ключ сервера. # cp /etc/VPNCA/CA/certs/vpnca.crt /etc/openvpn/pki/vpnca.crt - корневой сертификат или сертификат удостоверяющего центра. Создаём файл конфигурации /etc/openvpn/openvpn.conf – привожу типовой файл, который работает у меня, с небольшими комментариями: ### # Порт, тип соединения tcp-server, туннелирование - tun. # Криптографические файлы для аутентификации. # Список отзывов сертификатов # данные для генерации ключа шифрования с использованием протокола Диффи-Хелмана (см. ниже). # адресация в виртуальной сети, соответствует настройкам BIND # опции маршрутизации и DHCP - установка DNS # параметры соединения # пользователь/группа для рабочего потока OpenVPN # логирование ### Осталось сгенерировать исходные данные для файла dh2048.pem и разобраться с отзывом сертификатов. Генерация dh2048.pem:
$ openssl dhparam -out pki/dh2048.pem 2048 Параметр 2048 – обозначает число битов, как несложно догадаться. Механизм отзыва сертификатов требуется для того, чтобы в случае компрометации какого-либо выпущенного клиентского сертификата можно было его заблокировать до истечения срока действия. В противном случае, завладевшая сертификатом сторона получит доступ к использованию нашего VPN (без возможности перехвата, конечно, но всё равно неприятно). OpenSSL позволяет создавать списки отзыва при помощи ключа -gencrl. Для начала можно создать пустой список (без него OpenVPN в указанной конфигурации работать не станет): # cd /etc/VPNCA/CA Отзыв сертификата (вовсе необязательно выполнять при начальной настройке, привожу как пример): # openssl ca -config openssl.vpn.cnf -revoke certs/client-abc.crt Вообще, возможно запустить OpenVPN без поддержки списка отзывов, в таком случае удалите директиву crl-verify. Однако, если потребуется заблокировать сертификат (например, потеряли авторизованное устройство), то директиву нужно вернуть и сгенерировать список crl.pem. Маршруты и NAT Пакеты, приходящие от узлов-клиентов, подключенных через VPN к серверу, должны ходить наружу, а ответы, поступившие из Интернета, попадать обратно к клиентам – иначе мы получим локальную сеть, не более того. То есть, нужен NAT на сервере. Он настраивается штатными средствами, несколькими командами. Редактируем файл /etc/sysctl.conf, изменив значение параметра net.ipv4.ip_forward = 1 (было – 0). Перезапускаем сетевые сервисы: # service network restart Временный вариант, который часто используют: # echo ’1′ > /proc/sys/net/ipv4/ip_forward Он точно так же разрешает IP-форвардинг, но не переживёт рестарт системы. Некий NAT настраивается при помощи iptables. Прежде всего, нужно, опять же, скорректировать настройки в файле /etc/sysconfig/iptables-config, включив параметры IPTABLES_SAVE_ON_STOP=”yes” и IPTABLES_SAVE_ON_RESTART=”yes”. Делается это, например, так: # nano /etc/sysconfig/iptables-config Создаём файл iptables: # touch /etc/sysconfig/iptables Добавляем правило: # iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o eth0 -j MASQUERADE Готово. Убеждаемся, что все нужные сервисы запустятся после перезагрузки, если такая потребуется: # chkconfig named on Перезапускаем/запускаем сервисы: # service iptables restart Всё. Сервер готов. Настройка клиентов Если сравнивать с серверной вознёй, то настройка клиентов – элементарна. На клиенте должны быть три файла из инфраструктуры сертификатов, которую мы завели: 1) файл корневого сертификата, он содержит открытый ключ удостоверяющего центра, который позволяет проверять подлинность сертификата (сертификатов), предъявляемых сервером; 2) собственный сертификат данного узла – выпускается на сервере, потому что там мы держим УЦ; позволяет аутентифицировать узел-клиент перед сервером при наличии на узле подходящего секретного ключа; 3) файл, содержащий этот секретный ключ – в нашем примере ключ генерировался на сервере, откуда может быть скопирован на клиент при соблюдении разумных мер предосторожности. Вообще, ключ можно генерировать на клиенте, той же самой командой openssl, которая использовалась выше, на сервер в таком случае передаётся только файл.csr, на основе которого выпускается сертификат.
Помимо копирования файлов, для линуксов/юниксов – достаточно установить штатными средствами OpenVPN и прописать конфигурацию в файл, в примерно том же формате, что и на сервере. Например: ### remote 10.10.7.11 1194 ca pki/vpnca.crt comp-lzo status openvpn-status.log verb 3 ### Здесь 10.10.7.11 – поменяйте на IP-адрес вашего сервера. Всё заработает. Обратите внимание на директиву tls-remote, задающую имя сервера, указанное в сертификате (vpn-node, в нашем случае). Если не использовать эту директиву, то другие узлы, имеющие валидный сертификат, выданный нашим УЦ VPN, в принципе, могут прикидываться сервером и перехватывать трафик. Конечно, для небольшой закрытой системы VPN эта атака чисто теоретическая, но тем не менее. Самое занятное, что у tls-remote довольно неожиданная “семантика”: эта директива позволяет использовать “префиксы”, поэтому если имя сервера, указанное в сертификате – “vpn-node”, то “vpn-no” также пройдёт авторизацию. (В нашей схеме все клиентские узлы получают имена, начинающиеся со слова client, так что с vpn-node не перепутаются.) Для запуска на линуксах: service openvpn start или аналогичный метод, в зависимости от дистрибутива. Обратите внимание и на DNS! К сожалению, далеко не во всех случаях DNS-сервер правильно устанавливается автоматически, по DHCP. Если всё настроено по этой инструкции, то на клиенте должен использоваться сервер с адресом 192.168.2.1. Если автоматом не получилось, укажите адрес вручную, либо в настройках новомодных Network Managers, либо в /etc/resolv.conf. Понятно, что заработает DNS только после того, как установилось соединение VPN (интерфейс tun). Для Windows существует клиент с графическим интерфейсом. Не могу сказать, работает ли он под Windows 7/Vista: я не использую Windows, поэтому протестировал этот клиент только под XP – и тут всё хорошо, кроме того, что часть DNS-трафика ходит через незащищённый интерфейс. Впрочем, это полечилось при помощи прописывания для незащищённого соединения адреса VPN-овского DNS-сервера вручную (клиент OpenVPN поднимает свой виртуальный интерфейс и создаёт собственное “Сетевое соединение”). Вот конфигурационный файл: ### remote 10.10.7.11 1194 ca c:\\vpn\\pki\\vpnca.crt ###
|
||||||||
Последнее изменение этой страницы: 2016-09-19; просмотров: 347; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.12.36.30 (0.029 с.) |