| Секция | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
Введение
strongSwan StrongSwan – это программное обеспечение для создания виртуальной частной сети (VPN) VPN-соединений на основе IPsec-протокола. Домашняя страница ПО: https://strongswan.org/.
Используется двухфакторная аутентификации пользователя:
- первый фактор –
пара: открытый ключ (сертификат) изакрытый ключ; - второй фактор – токен, принадлежащий пользователю.
Сертификат изакрытый ключ пользователя хранятся на токене.
Общая статья по работе с токенами: Ключевые носители (токены) PKCS в Astra Linux.
Предварительная настройка
На сервере и клиентском узле настроить маршрутизацию пакетов, задав значения параметрам в файле /etc/sysctl.conf:
...
При установке VPN-соединения производится аутентификация как strongSwan-сервера, так и strongSwan-клиента. Данные между сервером и клиентом передаются в зашифрованном виде.
В статье описана настройка аутентификации сервера и клиента с помощью закрытых ключей. Для клиента дополнительно используется второй фактор аутентификации в виде ключевого носителя (токена).
Настройка сети
На серверном и клиентском узлах:
- Разрешить пересылку сетевых пакетов:
Command 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/:
- Установить программы для работы с сертификатами:
Для Astra Linux SE 1.8 дополнительно установить:Command sudo apt install strongswan strongswan-pki
Command sudo apt install
Применить заданные параметрами настройки:
| Command |
|---|
sudo sysctl -p |
Настройка strongSwan-сервера
Сгенерировать сертификаты на сервере:
Установить пакеты с strongSwan:
| Command |
|---|
sudo apt install strongswan libstrongswan-extra-plugins |
Установить пакеты для создания сертификатов:
...
libtss2-tcti-tabrmd0
- Создать для удостоверяющего центра закрытый
...
- ключ
ca.key.pemи самоподписанный сертификат
...
ca.cert.pem:Command
...
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:Command
...
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 --
...
где <IP-адрес_сервера> – IP-адресoutform pem \
| sudo tee /etc/ipsec.d/certs/server.cert.pem
...
- сервера.
Настройка VPN-сервера
...
На серверном узле:
- Установить пакеты с strongSwan:
Для Astra Linux SE 1.8 дополнительно установитьCommand sudo apt install strongswan libstrongswan-extra-plugins
Примечание: параметр --san в последней команде надо действительно указывать дважды, это не ошибка !
...
- :
Command sudo
...
apt install libtss2-
...
tcti-tabrmd0
- Если УЦ был создан на сервере с помощью команд из раздела "Создание удостоверяющего центра и сертификатов", то сертификаты уже расположены в нужном месте, а этот пункт пропускается.
Скопировать из УЦ на серверный узел:
- ca.cert.pem (сертификат УЦ) в каталог /etc/ipsec.d/
...
- cacerts/;
-server.cert.pem(сертификат сервера) в каталог/etc/ipsec.d/
...
certs/;
-server.key.pem(закрытый ключ сервера) в каталог/etc/ipsec.d/private/
...
где <IP-адрес_клиента> – IP-адрес strongSwan-клиента.
Примечание: параметр --san в последней команде надо действительно указывать дважды, это не ошибка !
(Настроить доступ по сертикату на сервере) указать местоположение закрытого ключа strongSwan-сервера в файле /etc/ipsec.secrets:
| Блок кода |
|---|
: RSA "/etc/ipsec.d/private/server.key.pem" |
Настроить strongSwan-сервер, разместив в файле /etc/ipsec.conf:
...
- .
- Указать закрытый ключ 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
...
...
где <IP-адрес_сервера> – IP-адрес strongSwan-сервера
...
rightsourceip=<диапазон_виртуальных_
...
адресов_для
...
_выдачи_клиентам> # Например: 10.1.1.0/24 rightdns=<IP-адреса_DNS-серверов__передаваемые_клиентам> # Например: 10.1.1.250,10.1.1.240
- Перезапустить strongSwan
...
- для применения настроек:
Command sudo ipsec restart
Настройка
...
VPN-клиента
Предполагается, установлена интерфейсная библиотека от производителя токена (ключевого носителя) по статье: Ключевые носители (токены) PKCS в Astra Linux
Настройка strongSwan
На клиентском узле:Предполагается, что по статье настроен: Единый доступ к ключевым носителям разных производителей.
- Установить пакеты с strongSwan:
Command sudo apt install strongswan libstrongswan-extra-plugins
...
- Для Astra Linux SE 1.8 дополнительно установить:
Command sudo apt install libtss2-tcti-tabrmd0
- Скопировать из УЦ на клиентский узел:
-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
...
Записать на токен файлы с закрытым ключом и сертификатом клиента.
Для примера, команды для РУтокена (TODO: поменять аргументы на длинные):
| Command |
|---|
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))))
3)))) TODO - токен!!!!!!
(Настроить доступ по сертикату на клиенте) указать местоположение закрытого ключа strongSwan-сервера в файле /etc/ipsec.secrets:
| Блок кода |
|---|
: RSA "/etc/ipsec.d/private/client.key.pem" |
Настроить strongSwan-клиента, разместив в файле /etc/ipsec.conf:
...
...
leftauth=
...
pubkey
...
leftcert=<токен_и_закрытый_ключ>
...
...
...
...
...
# Например: %smartcard0@rutoken:45
...
или %smartcard: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:Command openssl genrsa -out client1.key.pem 4096
- Создать запрос на подписание клиентского сертификата
client1.cert.csr:
где <IP-адрес_клиента> – IP-адрес клиентского узла.Command openssl req -key client1.key.pem -new -out client1.cert.csr \
-subj "/CN=<IP-адрес_клиента>" -addext "subjectAltName=IP.1:<IP-адрес_клиента>" - Отправить файл с запросом
client1.cert.csrна узел УЦ.
На удостоверяющем центре:
- Подписать запрос
client1.cert.csrс помощью сертификата УЦ и сохранить подписанный сертификат клиентаclient1.cert.pemв каталоге/etc/ipsec.d/certs/:Command sudo pki --issue --cacert /etc/ipsec.d/cacerts/ca.cert.pem --cakey /etc/ipsec.d/private/ca.key.pem \
--in client1.cert.csr --lifetime 3650 --type pkcs10 --flag clientAuth --outform pem \
| sudo tee /etc/ipsec.d/certs/client1.cert.pem - Скопировать сертификат клиента
client1.cert.pemна клиентский узел в домашний каталог пользователя.
На клиентском узле в домашнем каталоге пользователя:
- Подключить ключевой носитель к клиентскому узлу.
- Записать на ключевой носитель сертификат и закрытый ключ клиента:
гдеCommand p11tool --login --write --load-certificate="<путь_к_клиентскому_сертификату>" --id=<идентификатор_ключевой_пары> --label="<метка_ключевой_пары>"
p11tool --login --write --load-privkey="<путь_к_клиентскому_закрытому_ключу>" --id=<идентификатор_ключевой_пары> --label="<метка_ключевой_пары>"
- <идентификатор_ключевой_пары> – идентификатор, с которым сертификат и ключ будут храниться на токене;
- <метка_ключевой_пары> – название, с которым сертификат и ключ будут храниться на токене.Предупреждение Перед записью необходимо убедиться, что на токене отсутствуют какие-либо объекты с идентификатором, с которым будут храниться сертификат и ключ.
Пример команд:Command p11tool --login --write --load-certificate="client1.cert.pem" --id=45 --label="mykey"
p11tool --login --write --load-privkey="client1.key.pem" --id=45 --label="mykey"
- Для безопасности удалить файл с закрытым ключом клиента
client1.key.pemиз домашнего каталога пользователя.
Закрытый ключ следует хранить только на ключевом носителе.
Использование активного ключевого носителя
При использовании активного ключевого носителя:
- средствами токена:
- на токене создаются неизвлекаемый закрытый и извлекаемый открытый ключи (ключевая пара); - средствами ОС:
- с помощью открытого ключа создаётся сертификат клиента;
- сертификат клиента подписывается в УЦ;
- подписанный сертификат клиента записывается на токен.
На клиентском узле в домашнем каталоге пользователя:
- Подключить ключевой носитель к клиентскому узлу.
- Создать на токене ключевую пару:
гдеCommand p11tool --login --generate-rsa --bits=<длина_ключа> --id=<идентификатор_ключевой_пары> --label="<метка_ключевой_пары>"
- <длина_ключа> – длина создаваемых ключей в битах.
Если поддерживается токеном, то задать 4096 бит. Иначе задать максимально возможную длину ключей, поддерживаемую токеном;
- <идентификатор_ключевой_пары> – с этим идентификатором ключи будут храниться на токене;
- <метка_ключевой_пары> – с этим названием ключи будут храниться на токене.Предупреждение Перед созданием необходимо убедиться, что на токене отсутствуют какие-либо объекты с идентификатором, с которым будут храниться ключи.
Пример команды:Command p11tool --login --generate-rsa --bits=4096 --id=45 --label="mykey"
- Создать запрос на подписание клиентского сертификата
client1.cert.csr:
гдеCommand openssl req -new -engine pkcs11 -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/:Command sudo pki --issue --cacert /etc/ipsec.d/cacerts/ca.cert.pem --cakey /etc/ipsec.d/private/ca.key.pem \
--in client1.cert.csr --lifetime 3650 --type pkcs10 --flag clientAuth --outform pem \
| sudo tee /etc/ipsec.d/certs/client1.cert.pem - Скопировать сертификат клиента
client1.cert.pemна клиентский узел в домашний каталог пользователя.
На клиентском узле в домашнем каталоге пользователя:
- Записать сертификат клиента на ключевой носитель:
гдеCommand p11tool --login --write --load-certificate="<путь_к_клиентскому_сертификату>" --id=<идентификатор_ключевой_пары> --label="<метка_ключевой_пары>"
- <идентификатор_ключевой_пары> – идентификатор, указанный при создании ключевой пары;
- <метка_ключевой_пары> – название, указанное при создании ключевой пары.
Пример команды:Command p11tool --login --write --load-certificate="client1.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-код будет вводиться пользователем в командной строке:Блок кода : PIN <токен_и_закрытый_ключ> <pin-код>
гдеБлок кода : PIN <токен_и_закрытый_ключ> %prompt
- <токен_и_закрытый_ключ> – задаётся по формату: %smartcard[<номер_слота_с_токеном>[@<название_модуля>]]:<идентификатор_ключевой_пары>
где
- <название_модуля> – название модуля в файле/etc/strongswan.d/charon/pkcs11.conf, в котором указана интерфейсная библиотека для работы с токеном;
- <идентификатор_ключевой_пары> – идентификатор, с которым закрытый ключ записан на токен.
Например:%smartcard0@rutoken:45
- <pin-код> – пользовательский pin-код токена для доступа к объектам на токене.Примечание Если к компьютеру подключается только один ключевой носитель, то достаточно использовать укороченный формат параметра <токен_и_закрытый_ключ>: %smartcard:<идентификатор_ключевой_пары>
Например:
%smartcard:45
Примеры файла/etc/ipsec.secrets:
- для Рутокена с pin-кодом, указанным в файле:
- для Рутокена с pin-кодом, вводимым пользователем:Блок кода : PIN %smartcard0@rutoken:45 12345678
- при подключении к компьютеру единственного токена, поддержка которого включена в strongSwan, и с pin-кодом, вводимым пользователем:Блок кода : PIN %smartcard0@rutoken:45 %promptБлок кода : PIN %smartcard:45 %prompt - Перезапустить strongSwan для применения настроек:
Command sudo ipsec restart
- Если в файле
/etc/ipsec.secretsуказана опция%prompt, то после каждого запуска (перезапуска) strongSwan необходимо вручную вводить pin-код токена.
Для этого выполнить команду:
Если strongSwan-сервер ещё не успел запуститься, то команда завершится без вывода какой-либо информации. Необходимо подождать 5-10 секунд и повторить команду "Command sudo ipsec rereadsecretssudo ipsec rereadsecrets".
Появится приглашение для ввода pin-кода:
Ввести пользовательский pin-код токена, нажать клавишу <ENTER>.Блок кода Login to '%smartcard0@rutoken:45' required PIN:
Выполнить команду, чтобы strongSwan перезагрузил настройки и установил соединение с VPN-сервером:Command sudo ipsec reload
Для просмотра состояния установленного VPN-соединения используется команда:
| Command |
|---|
sudo ipsec status |
| Раскрыть | ||
|---|---|---|
| ||
|
Команда для вывода более подробной информации о VPN-соединении:
| Command |
|---|
sudo ipsec statusall |
| Раскрыть | ||
|---|---|---|
| ||
|
Возможные проблемы и способы их решения
При использовании САВЗ Касперского не устанавливается соединение с VPN-сервером
На компьютере пользователя САВЗ Касперского создаёт таблицу маршрутизации, из-за которой strongSwan-клиент не может установить соединение с strongSwan-сервером.
Диагностика.
На компьютере пользователя:
- В выводе команды
ip ruleприсутствует таблица с номером 101:Блок кода 0: from all lookup local 32764: from all fwmark 0x200/0x200 lookup 101 32765: from all fwmark 0x100/0x100 lookup 101 32766: from all lookup main 32767: from all lookup default - При неуспешной попытке соединения в журнал
/var/log/syslogвыводится сообщение:Блок кода 04[NET] error writing to socket: Invalid argument
Решение.
На компьютере пользователя:
- Исключить таблицу маршрутизации 101 из используемых strongSwan-клиентом.
Для этого в файле/etc/strongswan.d/charon.confв блокеcharonприсвоить параметруignore_routing_tablesзначение101:Блок кода charon { ... # A space-separated list of routing tables to be excluded from route # lookups. # ignore_routing_tables = ignore_routing_tables = 101 ... } - Перезагрузить операционную систему.
В аплете NetworkManager не доступен ключевой носитель для VPN-соединения IPsec
Решение.
На компьютере пользователя:
- Установить strongSwan-расширение для работы с NetworkManager:
Command sudo apt install strongswan-nm
- Включить поддержку ключевого носителя для NetworkManager.
Для этого создать файл (если он не создан)/etc/strongswan.d/charon-nm.confи добавить в него блок параметров, содержащих путь до интерфейсной библиотеки используемого токена:
Например, для Рутокена ЭЦП файлБлок кода charon-nm { plugins { pkcs11 { modules { <название_модуля_1> { path = <путь_к_интерфейсной_библиотеке_токена_1> } } } } }/etc/strongswan.d/charon-nm.confможет выглядеть так:Блок кода charon-nm { plugins { pkcs11 { modules { rutoken { path = /usr/lib/librtpkcs11ecp.so } } } } } - Перезагрузить операционную систему.
- Настроить в аплете NetworkManager VPN-соединение IPsec:
- Отключить уведомления в аплете NetworkManager.
- Запустить в аплете NetworkManager настроенное VPN-соединение IPsec.
Появится уведомление об успешном соединении:
Также появится сообщение об успешном соединении в Журнале системных событий:
Не устанавливается соединение между strongSwan-сервером и strongSwan-клиентом
Возможным решением проблемы может быть двойное указание IP-адреса в сертификатах узлов в расширении subjectAltName.
Для этого для создания сертификата сервера и запроса на сертификат клиента необходимо использовать команды:
- для создания сертификата сервера
server.cert.pem:Command 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-адрес_сервера>" --san "<IP-адрес_сервера>" --flag serverAuth --outform pem \
| sudo tee /etc/ipsec.d/certs/server.cert.pem - для создания запроса на сертификат клиента
client1.cert.csr:
- при использовании пассивного ключевого носителя:
- при использовании активного ключевого носителя:Command openssl req -new -key client1.key.pem -out client1.cert.csr \
-subj "/CN=<IP-адрес_клиента>" -addext "subjectAltName=IP.1:<IP-адрес_клиента>, IP.2:<IP-адрес_клиента>"Command openssl req -new -engine pkcs11 -keyform engine -out client1.cert.csr \
-key pkcs11:id="%<идентификатор_ключевой_пары>" \
-subj "/CN=<IP-адрес_клиента>" -addext "subjectAltName=IP.1:<IP-адрес_клиента>, IP.2:<IP-адрес_клиента>"
Не доступны ресурсы локальной сети при настройке strongSwan-клиента: rightsubnet=0.0.0.0/0
Если в настройках strongSwan-клиента (раздел 5.1) параметру rightsubnet присвоено значение 0.0.0.0/0 и при этом ресурсы локальной сети стали недоступны, то, возможно, решением проблемы будет присвоение параметру rightsubnet значения 0.0.0.1/0.



