Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.8).

Введение

StrongSwan – это программное обеспечение для создания VPN-соединений на основе IPsec-протокола. Домашняя страница ПО: https://strongswan.org/.

При установке VPN-соединения производится аутентификация как strongSwan-сервера, так и strongSwan-клиента. Данные между сервером и клиентом передаются в зашифрованном виде.

В статье описана настройка аутентификации сервера и клиента с помощью закрытых ключей. Для клиента дополнительно используется второй фактор аутентификации в виде ключевого носителя (токена).

Настройка сети

На серверном и клиентском узлах:

  1. Разрешить пересылку сетевых пакетов:

    cat << EOF | sudo tee /etc/sysctl.d/10-net-forward.conf >/dev/null
    net.ipv4.ip_forward=1
    net.ipv6.conf.all.forwarding=1
    net.ipv4.conf.all.accept_redirects = 0
    net.ipv4.conf.all.send_redirects = 0
    net.ipv6.conf.all.accept_redirects = 0
    net.ipv6.conf.all.send_redirects = 0
    EOF
    sudo sysctl --system

Создание удостоверяющего центра и выпуск сертификата сервера

Все сертификаты создаются и хранятся в удостоверяющем центре (УЦ), в качестве которого может использоваться любой компьютер. 

Вначале создаётся самоподписанный корневой сертификат УЦ. Затем с помощью сертификата УЦ создаются сертификаты для сервера и клиента. Созданные сертификаты и ключи копируются в определённые каталоги на сервере и клиенте.

Далее рассматривается вариант создания УЦ непосредственно на сервере в подкаталогах каталога /etc/ipsec.d/:

  1. Установить программы для работы с сертификатами:

    sudo apt install strongswan strongswan-pki libtss2-tcti-tabrmd0

  2. Создать для удостоверяющего центра закрытый ключ ca.key.pem и самоподписанный сертификат ca.cert.pem:

    pki --gen --size 4096 --type rsa --outform pem \
      | sudo tee /etc/ipsec.d/private/ca.key.pem

    sudo pki --self --ca --in /etc/ipsec.d/private/ca.key.pem --type rsa --dn "CN=CA" --lifetime 3650 --outform pem \
      | sudo tee /etc/ipsec.d/cacerts/ca.cert.pem

  3. Создать для сервера закрытый ключ server.key.pem и сертификат server.cert.pem:

    pki --gen --size 4096 --type rsa --outform pem \
      | sudo tee /etc/ipsec.d/private/server.key.pem

    sudo pki --pub --in /etc/ipsec.d/private/server.key.pem --type rsa \
      | sudo pki --issue --lifetime 3650 --cacert /etc/ipsec.d/cacerts/ca.cert.pem --cakey /etc/ipsec.d/private/ca.key.pem \
          --dn "CN=<IP-адрес_сервера>" --san "<IP-адрес_сервера>" --flag serverAuth --outform pem \
      | sudo tee /etc/ipsec.d/certs/server.cert.pem

    где <IP-адрес_сервера> – IP-адрес сервера.

Настройка VPN-сервера

На серверном узле:

  1. Установить пакеты с strongSwan:

    sudo apt install strongswan libstrongswan-extra-plugins

  2. Если УЦ был создан на сервере с помощью команд из раздела "Создание удостоверяющего центра и сертификатов", то сертификаты уже расположены в нужном месте, а этот пункт пропускается.
    Скопировать из УЦ на серверный узел:
      - ca.cert.pem (сертификат УЦ) в каталог /etc/ipsec.d/cacerts/;
      - server.cert.pem (сертификат сервера) в каталог /etc/ipsec.d/certs/;
      - server.key.pem (закрытый ключ сервера) в каталог /etc/ipsec.d/private/.
  3. Указать закрытый ключ strongSwan-сервера в файле /etc/ipsec.secrets в виде строки:
    : RSA server.key.pem
  4. Задать настройки strongSwan в файле /etc/ipsec.conf:
    config setup
            charondebug= ike 4, cfg 2
    
    conn server
            type=tunnel
            auto=add
            keyexchange=ikev2
            keyingtries=%forever
            ike=aes256-sha1-modp1024!
            esp=aes256-sha1!
            dpdaction=hold
            dpddelay=300s
            forceencaps=yes
    
            leftid=<IP-адрес_сервера>                                           # Например: 10.192.6.108
            leftauth=pubkey
            leftcert=server.cert.pem                                            # Сертификат сервера
            leftsendcert=always
            leftsubnet=<виртуальная_сеть__предоставляемая_сервером>             # Например: 10.1.1.0/24
    
            rightauth=pubkey
            rightid=%any
            rightsourceip=<диапазон_виртуальных_адресов_для_выдачи_клиентам>    # Например: 10.1.1.0/24
            rightdns=<IP-адреса_DNS-серверов__передаваемые_клиентам>            # Например: 10.1.1.250,10.1.1.240
  5. Перезапустить strongSwan для применения настроек:

    sudo ipsec restart

Настройка VPN-клиента

Настройка strongSwan

На клиентском узле:

  1. Установить пакеты с strongSwan:

    sudo apt install strongswan libstrongswan-extra-plugins

  2. Скопировать из УЦ на клиентский узел:
      - ca.cert.pem (сертификат УЦ) в каталог /etc/ipsec.d/cacerts/.
  3. Задать настройки strongSwan в файле /etc/ipsec.conf:
    config setup
            charondebug= ike 4, cfg 2
    
    conn client
            type=tunnel
            auto=start
            keyexchange=ikev2
            keyingtries=%forever
            ike=aes256-sha1-modp1024!
            esp=aes256-sha1!
            dpdaction=restart
            forceencaps=yes
    
            leftauth=pubkey
            leftcert=<токен_и_закрытый_ключ>                                    # Например: %smartcard0@rutoken:45
                                                                                # Формат значения <токен_и_закрытый_ключ> описан ниже в разделе "Настройка ... токена ...".
            leftsendcert=always
            leftsourceip=%config
    
            right=<IP-адрес_сервера>                                            # Например: 10.192.6.108
            rightid=<IP-адрес_сервера>                                          # Например: 10.192.6.108
            rightauth=pubkey
            rightsubnet=<виртуальная_сеть__предоставляемая_сервером>            # Например: 10.1.1.0/24
                                                                                # Если указать 0.0.0.0/0, то весь сетевой траффик клиента
                                                                                #     будет "заворачиваться" в VPN-соединение (туннель).
                                                                                #     Тогда на сервере параметру leftsubnet тоже 
                                                                                #     необходимо задать значение 0.0.0.0/0.

Выпуск клиентского сертификата и подготовка ключевого носителя

Предполагается, что на клиентском узле настроен единый доступ к ключевым носителям разных производителей (см. статью).

Общая информация по работе с ключевыми носителями дана в статье "Ключевые носители (токены) PKCS в Astra Linux".

Использование пассивного ключевого носителя

При использовании пассивного ключевого носителя средствами ОС: создаются закрытый ключ и сертификат клиента; сертификат клиента подписывается в УЦ; закрытый ключ и подписанный сертификат клиента записываются на токен.

Для этого на клиентском узле в домашнем каталоге пользователя:

  1. Создать закрытый ключ клиента client1.key.pem:

    openssl genrsa -out client1.key.pem 4096

  2. Создать запрос на подписание клиентского сертификата client1.cert.csr:

    openssl req -key client1.key.pem -new -out client1.cert.csr \
      -subj "/CN=<IP-адрес_клиента>"
    -addext "subjectAltName=IP.1:<IP-адрес_клиента>"

    где <IP-адрес_клиента> – IP-адрес клиентского узла.
  3. Отправить файл с запросом client1.cert.csr на узел УЦ.

На удостоверяющем центре:

  1. Подписать запрос client1.cert.csr с помощью сертификата УЦ и сохранить подписанный сертификат клиента client1.cert.pem в каталоге /etc/ipsec.d/certs/:

    sudo pki --issue --lifetime 3650 --cacert /etc/ipsec.d/cacerts/ca.cert.pem --cakey /etc/ipsec.d/private/ca.key.pem \
        --in client
    1.cert.csr --type pkcs10 --flag clientAuth --outform pem \
      | sudo tee /etc/ipsec.d/certs/client1.cert.pem

  2. Скопировать сертификат клиента client1.cert.pem на клиентский узел в домашний каталог пользователя.

На клиентском узле в домашнем каталоге пользователя:

  1. Подключить ключевой носитель к клиентскому узлу.
  2. Записать на ключевой носитель сертификат и закрытый ключ клиента:

    p11tool --login --write --load-certificate="<путь_к_клиентскому_сертификату>" --id=<идентификатор_ключевой_пары> --label="<метка_ключевой_пары>"

    p11tool --login --write --load-privkey="<путь_к_клиентскому_закрытому_ключу>" --id=<идентификатор_ключевой_пары> --label="<метка_ключевой_пары>"

    где
      - <идентификатор_ключевой_пары> – идентификатор, с которым сертификат и ключ будут храниться на токене;
      - <метка_ключевой_пары> – название, с которым сертификат и ключ будут храниться на токене.

    Пример команд:

    p11tool --login --write --load-certificate="client1.cert.pem" --id=45 --label="mykey"

    p11tool --login --write --load-privkey="client1.key.pem" --id=45 --label="mykey"

  3. Для безопасности удалить файл с закрытым ключом клиента client1.key.pem из домашнего каталога пользователя.
    Закрытый ключ следует хранить только на ключевом носителе.

Использование активного ключевого носителя

При использовании активного ключевого носителя необходимо средствами токена создать ключевую пару (закрытый и открытый ключи) на токене, средствами ОС создать сертификат клиента с помощью открытого ключа, подписать сертификат клиента в УЦ, а затем записать  сертификат клиента на токен.

На клиентском узле:

  1. Подключить ключевой носитель к клиентскому узлу.
  2. Создать на токене ключевую пару, скопировать созданный открытый ключ client1.key.pub:

    p11tool --login --generate-rsa --bits=<длина_ключа> --id=<идентификатор_ключевой_пары> --label="<метка_ключевой_пары>"

    где
      - <длина_ключа> – длина создаваемых ключей в битах. Если токен позволяет, то следует создавать ключи длиной 4096 бит. Иначе необходимо задавать максимально возможную длину ключей;
      - <идентификатор_ключевой_пары> – с этим идентификатором ключи будут храниться на токене;
      - <метка_ключевой_пары> – с этим названием ключи будут храниться на токене.
  3. Создать запрос на подписание клиентского сертификата client1.cert.csr:

    openssl req -new -engine pkcs11 -keyform engine -out client1.cert.csr \
      -key pkcs11:id="%<идентификатор_ключевой_пары>" \
      -subj "/CN=<IP-адрес_клиента>" -addext "subjectAltName=IP.1:<IP-адрес_клиента>"

    где
      - <идентификатор_ключевой_пары> – идентификатор, использованный при создании ключевой пары;
      - <IP-адрес_клиента> – IP-адрес клиентского узла.
  4. Отправить файл с запросом client1.cert.csr на узел УЦ.

На удостоверяющем центре:

  1. Подписать запрос client1.cert.csr с помощью сертификата УЦ и сохранить подписанный сертификат клиента client1.cert.pem в каталоге /etc/ipsec.d/certs/:

    sudo pki --issue --lifetime 3650 --cacert /etc/ipsec.d/cacerts/ca.cert.pem --cakey /etc/ipsec.d/private/ca.key.pem \
        --in client
    1.cert.csr --type pkcs10 --flag clientAuth --outform pem \
      | sudo tee /etc/ipsec.d/certs/client1.cert.pem

  2. Скопировать сертификат клиента client1.cert.pem на клиентский узел в домашний каталог пользователя.

На клиентском узле:

  1. Записать на ключевой носитель сертификат клиента:

    p11tool --login --write --load-certificate="<путь_к_клиентскому_сертификату>" --id=<идентификатор_ключевой_пары> --label="<метка_ключевой_пары>"

    где
      - <идентификатор_ключевой_пары> – идентификатор, использованный при создании ключей;
      - <метка_ключевой_пары> – название, использованное при создании ключей.

    Пример команд:

    p11tool --login --write --load-certificate="client1.cert.pem" --id=45 --label="mykey"

Настройка использования ключевого носителя в качестве второго фактора аутентификации

  1. Включить поддержку токенов в strongSwan.
    Для этого в файле /etc/strongswan.d/charon/pkcs11.conf в секции modules указать пути до интерфейсных библиотек используемых токенов:
    pkcs11 {
    
        # Whether to load the plugin. Can also be an integer to increase the
        # priority of this plugin.
        load = yes
    
        ...
    
        # List of available PKCS#11 modules.
        modules {
            <название_модуля_1> {
                path = <путь_к_интерфейсной_библиотеке_токена_1>
            }
             <название_модуля_2> {
                path = <путь_к_интерфейсной_библиотеке_токена_2>
            } 
        }
    }
    Например, для токенов: Рутокен ЭЦП и Аладдин (закомментирован)  – файл /etc/strongswan.d/charon/pkcs11.conf может выглядеть так:
    pkcs11 {
      load = yes
    
      modules {
        rutoken {
          path = /usr/lib/librtpkcs11ecp.so
        }
    #    aladdin { 
    #      path = /usr/lib/libjcPKCS11-2.so
    #    }
      }
    }
  2. Настроить strongSwan на использование закрытого ключа клиента, который находится на токене.
    Для этого в файле /etc/ipsec.secrets указать строку с описанием токена и закрытого ключа:
    : PIN <токен_и_закрытый_ключ> <pin-код>
    где
      - <токен_и_закрытый_ключ> – задаётся по формату: %smartcard[<номер_слота_с_токеном>[@<название_модуля>]]:<идентификатор_ключевой_пары>
                                                                       где
                                                                         - <название_модуля> – название модуля в файле /etc/strongswan.d/charon/pkcs11.conf, в котором указана интерфейсная библиотека для работы с токеном;
                                                                         - <идентификатор_ключевой_пары> – идентификатор, с которым закрытый ключ записан на токен.
                                                                       Например:
    %smartcard0@rutoken:45
      - <pin-код> – pin-код токена для доступа к объектам на токене.

    Пример файла /etc/ipsec.secrets  для вышеприведённого Рутокена:
    : PIN %smartcard0@rutoken:45 12345678
  3. Перезапустить strongSwan для применения настроек:

    sudo ipsec restart


Для просмотра состояния установленного VPN-соединения используется команда:

sudo ipsec status

Routed Connections:
      client{1}:  ROUTED, TUNNEL, reqid 1
      client{1}:   10.192.6.110/32 === 10.1.1.0/24
Security Associations (1 up, 0 connecting):
      client[1]: ESTABLISHED 5 minutes ago, 10.192.6.110[CN=10.192.6.110]...10.192.6.108[10.192.6.108]
      client{2}:  INSTALLED, TUNNEL, reqid 1, ESP in UDP SPIs: cd036fde_i c829d2f1_o
      client{2}:   10.1.1.1/32 === 10.1.1.0/24

Команда для вывода более подробной информации о VPN-соединении:

sudo ipsec statusall

Status of IKE charon daemon (strongSwan 5.9.8, Linux 6.1.141-1-generic, x86_64):
  uptime: 6 minutes, since Sep 25 08:47:09 2025
  malloc: sbrk 3805184, mmap 405504, used 2036464, free 1768720
  worker threads: 10 of 16 idle, 6/0/0/0 working, job queue: 0/0/0/0, scheduled: 2
  loaded plugins: charon test-vectors ldap pkcs11 aes rc2 sha2 sha1 md5 mgf1 random nonce x509 revocation constraints pubkey pkcs1 pkcs7 pkcs12 pgp dnskey sshkey pem openssl gcrypt pkcs8 af-alg fips-prf gmp curve25519 agent chapoly xcbc cmac hmac kdf ctr ccm gcm drbg curl attr kernel-netlink resolve socket-default connmark forecast farp stroke updown eap-identity eap-aka eap-md5 eap-gtc eap-mschapv2 eap-radius eap-tls eap-ttls eap-tnc xauth-generic xauth-eap xauth-pam tnc-tnccs dhcp lookip error-notify certexpire led addrblock unity counters
Listening IP addresses:
  10.192.6.110
Connections:
      client:  %any...10.192.6.108  IKEv2
      client:   local:  [CN=10.192.6.110] uses public key authentication
      client:    cert:  "CN=10.192.6.110"
      client:   remote: [10.192.6.108] uses public key authentication
      client:   child:  dynamic === 10.1.1.0/24 TUNNEL
Routed Connections:
      client{1}:  ROUTED, TUNNEL, reqid 1
      client{1}:   10.192.6.110/32 === 10.1.1.0/24
Security Associations (1 up, 0 connecting):
      client[1]: ESTABLISHED 5 minutes ago, 10.192.6.110[CN=10.192.6.110]...10.192.6.108[10.192.6.108]
      client[1]: IKEv2 SPIs: d770b3aced125439_i* 20eee7bd8ad5d3a6_r, public key reauthentication in 2 hours
      client[1]: IKE proposal: AES_CBC_256/HMAC_SHA1_96/PRF_HMAC_SHA1/MODP_1024
      client{2}:  INSTALLED, TUNNEL, reqid 1, ESP in UDP SPIs: cd036fde_i c829d2f1_o
      client{2}:  AES_CBC_256/HMAC_SHA1_96, 0 bytes_i, 1092 bytes_o (13 pkts, 313s ago), rekeying in 37 minutes
      client{2}:   10.1.1.1/32 === 10.1.1.0/24