OpenVPN: Настройка на собственном сервере. Часть 1 — сертификаты.

Первоначальная настройка успешно завершена и нам необходимо позаботится о безопасности. Т.е. о сертификатах, с которыми будут работать клиенты и сервер.

Для этого нужно три компонента:

  • Корневой сертификат (назовем его для простоты CA), которым будут подписываться ключи клиента и сервере. Крайне желательно чтобы он был на отдельной машине.
  • Сертификат сервера, который будет подписан корневым доверительным сертификатом.
  • Сертификат для каждого из клиентов, который тай жэ будет подписан CA

Корневой сертификат и сертификат сервера

Создаем корневой центр собственной сертификации (лучше делать это не на той машине, где запуен openvpn и там должен быть установлен пакет easy-rsa)

$ cp -R /usr/share/easy-rsa/3.0.0/ ~/CA  
$ cp /usr/share/doc/easy-rsa/vars.example ~/CA/vars  
$ cd ~/CA

Нужно отредактировать vars и поправить те параметры, которые будут вам интересны. Это имя домена, имя сервера и прочее - все подробно прокомментировано в файле.

Инициализировать PKI (Public Key Infrastructure — Инфраструктура открытых ключей):

$ ./easyrsa init-pki

Создать корневой сертификат. Common Name сервера вводить на ваше успотрение. (лучше придумать что-то вроде vpn-server). Сложный пароль ключа обязателе. Не менее 128 бит.

$ ./easyrsa build-ca

Создать ключи Диффи-Хелмана

$ ./easyrsa gen-dh

Создать запрос на сертификат для сервера OVPN. Обращаю внимание, что сертификат будет незапаролен (параметр nopass), иначе при каждом старте OpenVPN будет запрашивать этот пароль.

$ ./easyrsa gen-req vpn-server nopass

Создать и подписать сертификат

$ ./easyrsa sign-req server vpn-server

Скопировать полученные ключи в рабочий каталог openvpn

$ sudo mkdir -p /etc/openvpn/keys  
$ sudo mkdir cp ~/CA/pki/ca.crt /etc/openvpn/keys  
$ sudo mkdir cp ~/CA/pki/issued/vpn-server.crt /etc/openvpn/keys  
$ sudo mkdir cp ~/CA/pki/private/vpn-server.key /etc/openvpn/keys  
$ sudo mkdir cp ~/CA/pki/dh.pem /etc/openvpn/keys

Создать «HMAC firewall» для защиты от DoS аттак и флуда UDP порта.

$ cd /etc/openvpn/keys/  
$ sudo openvpn --genkey --secret ta.key

Генерация пользовательских ключей

Создание запроса запароленного ключа для клиента (потребуется вводить при каждом подключении) с именем User

$ cd ~/CA  
$ ./easyrsa gen-req User

User - это имя пользователя для которого вы генерируете ключ.

При такой генерации при каждом подключении будет запрашиваться пароль.

Если вам не требуется такого уровня. Или авторизация будет осуществляться иными методами, то генерируйте ключ без пароля.

$ ./easyrsa gen-req User nopass

Теперь ключ надо подписать

$ ./easyrsa sign-req client User

Дефолтно ключ выдается на 10 лет. Можно ограничить время. И ключи придется только перевыпускать по завершению работы.

$./easyrsa sign-req client User -days 90

Клиенту потребуется следующий набор файлов

 ~/CA/pki/issued/User.crt  
 ~/CA/pki/private/User.key  
 ~/CA/pki/ca.crt  
 /etc/openvpn/keys/ta.key

Отзывы сертификатов

Герируем файл отозванных ключей

$ cd ~/CA  
$ ./easyrsa gen-crl

Если вы все же сделали центр сертификации на той же машине, на которой у вас сервер, то можете слинковать файл отозванных ключей. Но лучше скопировать. И эту операцию нужно повторять каждый раз при отзыве ключей.

$ sudo cp ~/CA/pki/crl.pem /etc/openvpn/keys

В /etc/openvpn/server.conf добавить строку

crl-verify /etc/openvpn/keys/crl.pem

Отзыв сертификата пользователя User

$ ./easyrsa revoke User

Каждый раз при отзыве сертификата необходимо обновлять crl.pem, чтобы внести в него изменения

$ ./easyrsa gen-crl

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

failed to update database  
Easy-RSA error:  
signing failed (openssl output above may have more detail)

Для исключения возможности mitm атаки, ошибка которого так выглядит в логах клиента как показано ниже служит параметр remote-cert-tls server в конфиге клиента.

WARNING: No server certificate verification method has been enabled. See http://openvpn.net/howto.html#mitm for more info.

Ссылки:

Категории: HowTo