1
Openconnect server (ocserv) + пользовательский сертификат FreeIPA
Артемий Красильников edited this page 2023-06-30 13:12:11 +03:00

Пошаговая настройка 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