Данная статья применима к:
Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.8).
Введение
strongSwan – это программное обеспечение для создания виртуальной частной сети (VPN) на основе IPsec-протокола. Домашняя страница ПО: https://strongswan.org/.
Используется двухфакторная аутентификации пользователя:
- первый фактор –
пара: открытый ключ (сертификат) изакрытый ключ; - второй фактор – токен, принадлежащий пользователю.
Сертификат изакрытый ключ пользователя хранятся на токене.
Общая статья по работе с токенами: Ключевые носители (токены) PKCS в Astra Linux.
Настройка сети
На сервере и клиенте:
- Разрешить пересылку сетевых пакетов: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.pempki --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:где <IP-адрес_сервера> – IP-адрес strongSwan-сервера.sudo ipsec pki --gen --size 4096 --type rsa --outform pem \
| sudo tee /etc/ipsec.d/private/server.key.pemsudo 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
Примечание: параметр --san в последней команде надо действительно указывать дважды, это не ошибка. - Создать для клиента закрытый ключ
client.key.pemи сертификатclient.cert.pem:где <IP-адрес_клиента> – IP-адрес strongSwan-клиента.sudo ipsec pki --gen --size 4096 --type rsa --outform pem \
| sudo tee /etc/ipsec.d/private/client.key.pemsudo 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
Примечание: параметр --san в последней команде надо действительно указывать дважды, это не ошибка.
Настройка strongSwan-сервера
Установить пакеты с 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-сервер для применения настроек:
Настройка strongSwan-клиента
Предполагается, установлена интерфейсная библиотека от производителя токена (ключевого носителя) по статье: Ключевые носители (токены) PKCS в Astra Linux
Предполагается, что по статье настроен: Единый доступ к ключевым носителям разных производителей.
Установить пакеты с strongSwan:
Скопировать с сервера файл /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