Данная статья применима к:
Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.8).
Введение
StrongSwan – это программное обеспечение для создания VPN-соединений на основе IPsec-протокола. Домашняя страница ПО: https://strongswan.org/.
При установке VPN-соединения производится аутентификация как strongSwan-сервера, так и strongSwan-клиента. Данные между сервером и клиентом передаются в зашифрованном виде.
В статье описана настройка аутентификации сервера и клиента с помощью закрытых ключей. Для клиента дополнительно используется второй фактор аутентификации в виде ключевого носителя (токена).
Настройка сети
На серверном и клиентском узлах:
- Разрешить пересылку сетевых пакетов: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 --outform pem \
| sudo tee /etc/ipsec.d/certs/server.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/. - Задать настройки 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".
Использование пассивного ключевого носителя
При использовании пассивного ключевого носителя необходимо средствами ОС создать закрытый ключ и сертификат клиента, подписать сертификат клиента в УЦ, а затем записать закрытый ключ и сертификат клиента на токен.
На клиентском узле в домашнем каталоге пользователя:
- Создать закрытый ключ клиента
client1.key.pem:openssl genrsa -out client1.key.pem 4096 - Создать запрос на подписание клиентского сертификата
client1.cert.csr:openssl req -key client1.key.pem -new -out client1.cert.csr \где <IP-адрес_клиента> – IP-адрес клиентского узла.
-subj "/CN=<IP-адрес_клиента>" -addext "subjectAltName=IP.1:<IP-адрес_клиента>" - Отправить файл с запросом
client1.cert.csrна узел УЦ.
На удостоверяющем центре:
- Подписать запрос
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 client1.cert.csr --type pkcs10 --flag clientAuth --outform pem \
| sudo tee /etc/ipsec.d/certs/client1.cert.pem - Скопировать сертификат клиента
client1.cert.pemна клиентский узел в домашний каталог пользователя.
На клиентском узле в домашнем каталоге пользователя:
- Подключить ключевой носитель к клиентскому узлу.
- Записать на ключевой носитель сертификат и закрытый ключ клиента:где
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"
- Для безопасности удалить файл с закрытым ключом клиента
client1.key.pemиз домашнего каталога пользователя.
Закрытый ключ должен храниться только на ключевом носителе.
Использование активного ключевого носителя
При использовании активного ключевого носителя необходимо средствами токена создать ключевую пару (закрытый и открытый ключи) на токене, средствами ОС создать сертификат клиента с помощью открытого ключа, подписать сертификат клиента в УЦ, а затем записать сертификат клиента на токен.
На клиентском узле:
- Подключить ключевой носитель к клиентскому узлу.
- Создать на токене ключевую пару, скопировать созданный открытый ключ
client1.key.pub:p11tool --login --generate-rsa --bits=<длина_ключа> --id=<идентификатор_ключевой_пары> --label="<метка_ключевой_пары>"где
- <длина_ключа> – длина создаваемых ключей в битах. Если токен позволяет, то следует создавать ключи длиной 4096 бит. Иначе необходимо задавать максимально возможную длину ключей;
- <идентификатор_ключевой_пары> – идентификатор, с которым ключи будут храниться на токене;
- <метка_ключевой_пары> – название, с которым ключи будут храниться на токене. - Создать запрос на подписание клиентского сертификата
client1.cert.csr:openssl req -engine pkcs11 -new -keyform engine -out client1.cert.csr \где
-key pkcs11:id="%<идентификатор_ключевой_пары>" \
-subj "/CN=<IP-адрес_клиента>" -addext "subjectAltName=IP.1:<IP-адрес_клиента>"
- <идентификатор_ключевой_пары> – идентификатор, использованный при создании ключей;
- <IP-адрес_клиента> – IP-адрес клиентского узла. - Отправить файл с запросом
client1.cert.csrна узел УЦ.
На удостоверяющем центре:
- Подписать запрос
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 client1.cert.csr --type pkcs10 --flag clientAuth --outform pem \
| sudo tee /etc/ipsec.d/certs/client1.cert.pem - Скопировать сертификат клиента
client1.cert.pemна клиентский узел в домашний каталог пользователя.
На клиентском узле:
- Записать на ключевой носитель сертификат клиента:p11tool --login --write --load-certificate="<путь_к_клиентскому_сертификату>" --id=<идентификатор_ключевой_пары> --label="<метка_ключевой_пары>"где
- <идентификатор_ключевой_пары> – идентификатор, использованный при создании ключей;
- <метка_ключевой_пары> – название, использованное при создании ключей.
Пример команд:p11tool --login --write --load-certificate="client.cert.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-соединении: