Данная статья применима к:
Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.8).
Введение
strongSwan – это программное обеспечение для создания VPN-соединений на основе IPsec-протокола. Домашняя страница ПО: https://strongswan.org/.
Используется двухфакторная аутентификации клиента:
- первый фактор –закрытый ключ клиента, созданный вместе с сертификатом клиента;
- второй фактор – ключевой носитель (токен) клиента. Закрытый ключ и сертификат хранятся на токене.
Настройка сети
На серверном и клиентском узлах:
- Разрешить пересылку сетевых пакетов: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/:
- Установить программы для работы с сертификатами:sudo apt install strongswan strongswan-pki libtss2-tcti-tabrmd0
- Создать для удостоверяющего центра закрытый ключ
ca.key.pemи самоподписанный сертификатca.cert.pem:pki --gen --size 4096 --type rsa --outform pem \
| sudo tee /etc/ipsec.d/private/ca.key.pemsudo 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 - Создать для сервера закрытый ключ
server.key.pemи сертификатserver.cert.pem:где <IP-адрес_сервера> – IP-адрес сервера.pki --gen --size 4096 --type rsa --outform pem \
| sudo tee /etc/ipsec.d/private/server.key.pemsudo 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 --flag ikeIntermediate --outform pem \
| sudo tee /etc/ipsec.d/certs/server.cert.pem - Создать для клиента закрытый ключ
client.key.pemи сертификатclient.cert.pem:где <IP-адрес_клиента> – IP-адрес клиента.pki --gen --size 4096 --type rsa --outform pem \
| sudo tee /etc/ipsec.d/private/client.key.pemsudo pki --pub --in /etc/ipsec.d/private/client.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 clientAuth --flag ikeIntermediate --outform pem \
| sudo tee /etc/ipsec.d/certs/client.cert.pem
Настройка VPN-сервера
На серверном узле:
- Установить пакеты с strongSwan:sudo apt install strongswan libstrongswan-extra-plugins
- Если УЦ был создан на сервере с помощью команд из раздела "Создание удостоверяющего центра и сертификатов", то сертификаты уже расположены в нужном месте, а этот пункт пропускается.
Скопировать из УЦ на серверный узел:
- ca.cert.pem (сертификат УЦ) в каталог /etc/ipsec.d/cacerts/;
-server.cert.pem(сертификат сервера) в каталог/etc/ipsec.d/certs/;
-server.key.pem(закрытый ключ сервера) в каталог/etc/ipsec.d/private/. - Указать закрытый ключ strongSwan-сервера в файле
/etc/ipsec.secretsв виде строки:: RSA server.key.pem
- Задать настройки 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 - Перезапустить strongSwan для применения настроек:sudo ipsec restart
Настройка VPN-клиента
Настройка strongSwan-клиента
На клиентском узле:
- Установить пакеты с strongSwan:sudo apt install strongswan libstrongswan-extra-plugins
- Скопировать из УЦ на клиентский узел:
-ca.cert.pem(сертификат УЦ) в каталог/etc/ipsec.d/cacerts/;
-client.cert.pem(сертификат пользователя) иclient.key.pem(закрытый ключ пользователя) в домашний каталог пользователя. - Задать настройки 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".
- Подключить ключевой носитель к клиентскому узлу.
- Записать на ключевой носитель сертификат и закрытый ключ клиента:где
p11tool --login --write --load-certificate="<путь_к_клиентскому_сертификату>" --id=<идентификатор_ключевой_пары> --label="<метка_ключевой_пары>"
p11tool --login --write --load-privkey="<путь_к_клиентскому_закрытому_ключу>" --id=<идентификатор_ключевой_пары> --label="<метка_ключевой_пары>"
- <идентификатор_ключевой_пары> – идентификатор, с которым сертификат и ключ будут храниться на токене;
- <метка_ключевой_пары> – название, с которым сертификат и ключ будут храниться на токене.
Пример команд:p11tool --login --write --load-certificate="client.cert.pem" --id=45 --label="mykey"
p11tool --login --write --load-privkey="client.key.pem" --id=45 --label="mykey"
- Включить поддержку токенов в 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 # } } } - Настроить 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
- Перезапустить strongSwan для применения настроек:sudo ipsec restart
Для просмотра состояния установленного VPN-соединения используется команда:
Команда для вывода более подробной информации о VPN-соединении: