Пошаговая настройка Openconnect server (OCserv) в Альт Linux 8 СП с использованием двухфакторной аутентификации на основе пары имя+пароль + пользовательский сертификата в интеграции с FreeIPA.
Уточнения:
ВМ — виртуальная машина.
vim — текстовый редактор, в командах используется именно он, можно использовать любой удобный вам.
username — имя учётной записи во FreeIPA.
host — FQDN ВМ на которой производится настройка службы Ocserv.
REALM — основная доменная область сервера FreeIPA.
vpn.example.ru — внешнее доменное имя по которому будут подключаться vpn-клиенты.
example-name — название соединения.
Подготовка к установке:
Перед настройкой Openconnect-сервера следует выпустить пользователю сертификат через FreeIPA.
Выпускаем закрытый ключ и генерируем запрос на пользовательский сертификат (CSR):
Генерируем CSR:
openssl req -new -newkey rsa:2048 -nodes -keyout %username%.key -out %username%.csr
При генерации закрытого ключа, на шаге генерации CN, указываем имя пользователя:
Common Name (eg, your name or your server's hostname) []:%username%
Выпускаем через FreeIPA сертификат и сохраняем его себе:
kinit %username%
ipa cert-request --principal=%username% %username%.csr --add && ipa user-show %username% --out=%username%.pem
Объединяем закрытый ключ + сертификат в pfx сертификат с установкой пароля:
openssl pkcs12 -export -out %username%.pfx -inkey %username%.key -in %username%.pem
Перенастройка Openconnect-сервера:
!Если ранее этого не делали, то выпускаем новый сертификат для VPN-сервера openconnect в FreeIPA и добавить в него корневой сертификат, создав связку (для этого пользователь должен обладать необходимыми правами в FreeIPA):
openssl req -new -newkey rsa:2048 -nodes -keyout %host%.key -out %host%.csr
sudo ipa cert-request --principal=OCSERV/%host%@%REALM% %host%.csr --add
sudo ipa service-show OCSERV/%host%@%REALM% --out=%host%.pem
Добавляем в сертификат VPN-сервера корневой сертификат(создаём цепочку):
ipa cert-show 1 --out=ca.pem && cat ca.pem >> %host%.pem
Вносим изменения в файл конфигурации ocserv:
sudo vim /etc/ocserv/ocserv.conf && sudo systemctl restart ocserv
Отредактируем данные записи, указав путь, до нового сертификата
auth = "certificate"
ca-cert = /etc/pki/ocserv/cacerts/%host%.pem
cert-user-oid = 2.5.4.3
cisco-client-compat = true
Настройка профиля Cisco Anyconnect на Windows/Mac/Linux:
Импортируем подготовленный пользовательский PFX сертификат в личное хранилище сертификатов ОС и создаём профиль подключения с расширением .xml:
Для MAC в каталоге:
/opt/cisco/anyconnect/profile
Для Windows в каталоге:
C:\ProgramData\Cisco\Cisco AnyConnect Secure Mobility Client\Profile
Для Linux в каталоге:
/opt/cisco/anyconnect/profile
Следующего содержания:
<?xml version="1.0" encoding="UTF-8"?>
<AnyConnectProfile xmlns="http://schemas.xmlsoap.org/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://schemas.xmlsoap.org/encoding/ AnyConnectProfile.xsd">
<ClientInitialization>
<UseStartBeforeLogon UserControllable="false">false</UseStartBeforeLogon>
<AutomaticCertSelection UserControllable="true">false</AutomaticCertSelection>
<StrictCertificateTrust>false</StrictCertificateTrust>
<RestrictPreferenceCaching>false</RestrictPreferenceCaching>
<RestrictTunnelProtocols>IPSec</RestrictTunnelProtocols>
<BypassDownloader>false</BypassDownloader>
<WindowsVPNEstablishment>AllowRemoteUsers</WindowsVPNEstablishment>
<CertEnrollmentPin>pinAllowed</CertEnrollmentPin>
<AutomaticVPNPolicy>false</AutomaticVPNPolicy>
<CertificateMatch>
<MatchOnlyCertsWithKU>false</MatchOnlyCertsWithKU>
<DistinguishedName>
<DistinguishedNameDefinition Operator="Equal" Wildcard="Disabled" MatchCase="Disabled">
<Name>ISSUER-O</Name>
<Pattern>%REALM%</Pattern>
</DistinguishedNameDefinition>
</DistinguishedName>
</CertificateMatch>
<BackupServerList>
<HostAddress>localhost</HostAddress>
</BackupServerList>
</ClientInitialization>
<ServerList>
<HostEntry>
<HostName>%example-name%</HostName>
<HostAddress>%vpn.example.ru%</HostAddress>
</HostEntry>
</ServerList>
</AnyConnectProfile>
Подключение через openconnect:
При использовании VPN-клиента openconnect требуется указать пусть до PFX сертификата в пунктах сертификата и ключа. Пример подключения к openconnect-серверу(ocserv) через консоль будет выглядеть так:
sudo openconnect %vpn.example.ru% -u %username% -k %username%.pfx -c %username%.pfx