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

Введение

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


Используется двухфакторная аутентификации пользователя:


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


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

sudo apt install strongswan libstrongswan-extra-plugins



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

На сервере и клиенте:

  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-pki libtss2-tcti-tabrmd0



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

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

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

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

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

sudo ipsec pki --pub --in /etc/ipsec.d/private/server.key.pem --type rsa \
  | sudo ipsec 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-адрес_сервера>" --san="<IP-адрес_сервера>" --flag serverAuth --flag ikeIntermediate --outform pem \
  | sudo tee /etc/ipsec.d/certs/server.cert.pem

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

Примечание: параметр --san в последней команде надо действительно указывать дважды, это не ошибка !


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

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

sudo ipsec pki --pub --in /etc/ipsec.d/private/client.key.pem --type rsa \
  | sudo ipsec 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-адрес_клиента>" --san="<IP-адрес_клиента>" --flag clientAuth --flag ikeIntermediate --outform pem \
  | sudo tee /etc/ipsec.d/certs/client.cert.pem

где <IP-адрес_клиента> – IP-адрес strongSwan-клиента.

Примечание: параметр --san в последней команде надо действительно указывать дважды, это не ошибка !

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


(Настроить доступ по сертикату на сервере) указать местоположение закрытого ключа strongSwan-сервера в файле /etc/ipsec.secrets:

: RSA "/etc/ipsec.d/private/server.key.pem"



Настроить strongSwan-сервер, разместив в файле /etc/ipsec.conf:

config setup
        #charondebug="all"
        charondebug= ike 4, cfg 2
##         uniqueids=no
conn server
        type=tunnel
        auto=add
        keyexchange=ikev2
        ike=aes256-sha1-modp1024!
        esp=aes256-sha1!

#        left=${MY_HOST_IP}
    left=%any
        leftid=${MY_HOST_IP}
        leftcert=server.cert.pem
# # #  leftsubnet=10.1.1.0/24
        leftauth=pubkey
#    leftsendcert=always

        rightsourceip=10.1.1.0/24
        rightauth=pubkey
        right=%any
        rightid=%any
#    rightdns=8.8.8.8,8.8.4.4
#    rightsendcert=always

        keyingtries=%forever
        ikelifetime=28800s
        lifetime=3600s
#        dpddelay=30s
        dpdtimeout=120s
#        dpdaction=restart

    forceencaps=yes
    dpdaction=clear
    dpddelay=300s
    rekey=no

    eap_identity=%identity

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

<Подсеть_виртуальных_IP-адресов_для_клиентов> – . Например, 10.1.1.0/24





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

sudo ipsec restart



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

Предполагается, установлена интерфейсная библиотека от производителя токена (ключевого носителя) по статье: Ключевые носители (токены) PKCS в Astra Linux

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


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

sudo apt install strongswan libstrongswan-extra-plugins



Скопировать с сервера файл /etc/ipsec.d/cacerts/ca.cert.pem и положить туда же на клиенте (настроить права?)

Скопировать с сервера файлы /etc/ipsec.d/private/client.key.pem и /etc/ipsec.d/certs/client.cert.pem в домашнюю папку



Записать на токен файлы с закрытым ключом и сертификатом клиента.

Для примера, команды для РУтокена (TODO: поменять аргументы  на длинные):

pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -l -y cert --id 45 -w ./client.cert.pem

pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -l -y privkey --id 45 -w ./client.key.pem




2) Настроить использование pkcs11 для RuToken ЭЦП на клиенте

В файл /etc/strongswan.d/charon/pkcs11.conf привести к виду:

pkcs11 {
  load = yes

  modules {
    rutoken {
      path = /usr/lib/librtpkcs11ecp.so
    }
  }
}


3)

Настроить доступ по закрытому ключу клиента, на который хранится на токене, в файле /etc/ipsec.secrets:

# : PIN <smartcard selector> <pin code> | %prompt
# <smartcard selector> format: %smartcard[<slotnr>[@<module>]]:<keyid>
: PIN %smartcard0@rutoken:45 12345678




Настроить strongSwan-клиента, разместив в файле /etc/ipsec.conf:

config setup
        #charondebug="all"
        charondebug= ike 4, cfg 2
##     uniqueids=no
conn client
        type=tunnel
        auto=start
        keyexchange=ikev2
        ike=aes256-sha1-modp1024!
        esp=aes256-sha1!

#   left=${MY_HOST_IP}
        leftsourceip=%config
        leftauth=pubkey
        leftcert=%smartcard0@rutoken:45
#        leftcert=/home/user/client.cert.pem
   leftsubnet=10.1.1.0/24

        right=${PEER_HOST_IP}
     rightid=${PEER_HOST_IP}
##     rightsubnet=0.0.0.0/0
         rightauth=pubkey
   rightsubnet=10.1.1.0/24

#        keyingtries=%forever
#        ikelifetime=28800s
#        lifetime=3600s
#        dpddelay=30s
#        dpdtimeout=120s
#        dpdaction=restart

    eap_identity=%identity