Подключение к CheckPoint с помощью strongswan и libreswan
Подключение к CheckPoint с помощью strongswan и libreswan
Евгений Мисник
1 Сертификаты для подключения
Для подключения к CheckPoint потребуются следующие сертификаты:
- CA сертификат CheckPoint “internal_ca.pem”. Этот сертификат можно получить, подключившись к шлюзу CheckPoint на порт 18264:
$ wget http://<checkpoint gw address>:18264/internal_ca.cer
$ openssl x509 -inform DER -outform PEM -in internal_ca.cer -out internal_cap.pem
- Сертификат сервера “checkpoint-cert.pem”. Его можно получить с адреса шлюза:
$ openssl s_client -connect <checkpoint gw address>:443
- CRL сертификат:
$ wget http://<checkpoint gw address>:18264/ICA_CRL1.crl
$ openssl crl -in ICA_CRL1.crl -inform DER -outform PEM -out ICA_CRL1.crl
Срок действия сертификата “ICA_CRL1.crl” несколько дней. Поэтому “strongswan” будет пытаться обновить этот сертификат с CheckPoint шлюза.
- openssl crl -in /etc/strongswan/ipsec.d/crls/ICA_CRL1.crl -text -noout
Certificate Revocation List (CRL):
Version 2 (0x1)
Signature Algorithm: sha256WithRSAEncryption
Issuer: /O=smartcenter..i6sh4u
Last Update: Jan 10 06:04:27 2021 GMT
Next Update: Jan 17 06:04:27 2021 GMT
CRL extensions:
X509v3 Issuing Distrubution Point: critical
Full Name:
URI:http://smartcenter.example.org:18264/ICA_CRL1.crl
DirName: O = smartcenter..i6sh4u, CN = ICA_CRL1
Подключаться “strongswan” будет к сайту “smartcenter”. Так как адреса для этого имени нет, то в файле “/etc/hosts” надо принудительно прописать IP-адрес:
- cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
<checkpoint gw ip-address> smartcenter smartcenter.example.org
Лог в файле “/var/log/messages” может выглядеть так:
Jan 19 17:46:13 kvm charon: 16[CFG] using trusted ca certificate "O=smartcenter..i6sh4u"
Jan 19 17:46:13 kvm charon: 16[CFG] checking certificate status of "O=smartcenter..i6sh4u, CN=smart VPN Certificate"
Jan 19 17:46:13 kvm charon: 16[CFG] fetching crl from ’O=smartcenter..i6sh4u, CN=ICA_CRL1’ ...
Jan 19 17:46:13 kvm charon: 16[LIB] unable to fetch from O=smartcenter..i6sh4u, CN=ICA_CRL1, no capable fetcher found
Jan 19 17:46:13 kvm charon: 16[CFG] fetching crl from ’http://smartcenter:18264/ICA_CRL1.crl’ ...
Кроме этих сертификатов потребуется сертификат клиента, зарегистрированного на CheckPoint, “cpuser.p12”. Из этого сертификата надо получить сертификат клиента “cpuser.pem” и сертификат ключа “cpuser-key.pem”:
$ openssl pkcs12 -in cpuser.p12 -nocerts -out cpuser-key.pem
$ openssl pkcs12 -in cpuser.p12 -nokeys -out temp.pem
Сертификат “temp.pem” содержит в себе сертификат пользователя и CA сертификат. С помощью редактора сертификат надо разделить на части, сохранить их как отдельные pem-файлы и с помощью openssl посмотреть содержимое сертификатов. Сертификат клиента будет содержать в себе что-то вроде этого: “Subject: O=smartcenter..i6sh4u, OU=users, CN=cpuser”.
2 Настройка strongswan
Расположение настроек strongswan в каждом дистрибутиве может отличаться. В CentOS 7, OL7 или RHEL 7 настройки располжены в каталоге “/etc/strongswan”:
- tree -d /etc/strongswan
/etc/strongswan
_ ipsec.d
__ aacerts
__ acerts
__ cacerts
__ certs
__ crls
__ ocspcerts
__ private
__ reqs
_ strongswan.d
__ charon
_ swanctl
__ bliss
__ conf.d
__ ecdsa
__ pkcs12
__ pkcs8
__ private
__ pubkey
__ rsa
__ x509
__ x509aa
__ x509ac
__ x509ca
__ x509crl
__ x509ocsp
Файлы “internal_ca.pem”, “checkpoint-cert.pem” и “cpuser.pem”,
“ICA_CRL1.crl”, “cpuser-key.pem” надо разместить в каталогах
“/etc/strongswan/ipsec.d/cacerts”, “/etc/strongswan/ipsec.d/certs”,
“/etc/strongswan/ipsec.d/crls” и в “/etc/strongswan/ipsec.d/private” соответственно.
Файл “cpuser-key.pem” должен имет права “0600” и владельцем всех вышеуказанных файлов должен быть “root:root”.
2.1 Файл конфигурации “ipsec.conf”
Файл конфигурации “ipsec.conf” расположен в каталоге “/etc/strongswan”:
- ipsec.conf - strongSwan IPsec configuration file
# basic configuration
config setup
# strictcrlpolicy=yes
# uniqueids = no
# charondebug=1
# charondebug="cfg 2, dmn 2, ike 2, net 2, lib 3, knl 4"
# Add connections here.
conn %default
# Left side is strongSwan - RoadWarrior
left=%defaultroute
leftcert=cpuser.pem # Cert of user - from /etc/strongswan/certs
leftid="/O=smartcenter..i6sh4u/OU=users/CN=cpuser"
leftrsasigkey=%cert
auto=route
conn remote
# Right side is CheckPoint
right=<checkpoint gw ip-address>
rightcert=checkpoint-cert.pem # Cert of FW - from /etc/strongswan/certs
rightid=<checkpoint gw ip-address>
# config
ike=aes256-sha1-modp1024 # check if IKE P1 are allowed under Global Prop.
esp=aes256-sha1 # check if IKE P2 are allowed
type=tunnel
keyexchange=ikev1 # use IKE v1
keyingtries=3
authby=rsasig
ikelifetime=8h # Lifetime for IKE Phase 1
lifetime=1h # Lifetime for IKE Phase 2
conn net-192.168.xx.0
also=remote
rightsubnet=192.168.xx.0/24
auto=start
conn net-192.168.yy.0
also=remote
rightsubnet=192.168.yy.0/24
auto=start
2.2 Файл “ipsec.secrets”
Файл расположен в каталоге “/etc/strongswan”:
- ipsec.secrets - strongSwan IPsec secrets file
: RSA cpuser-key.pem "key file password"
2.3 Запуск “strongswan”
Создание “IPsec VPN” между клиентом и CheckPoint выполняется несколькими командами:
- strongswan start
Starting strongSwan 5.7.2 IPsec [starter]...
# strongswan up remote
generating QUICK_MODE request 2566461280 [ HASH SA No ID ID ]
sending packet: from local.ip.address[4500] to checkpoint.gw.ip[4500] (204 bytes)
received packet: from checkpoint.gw.ip[4500] to local.ip.address[4500] (156 bytes)
parsed QUICK_MODE response 2566461280 [ HASH SA No ID ID ]
selected proposal: ESP:AES_CBC_256/HMAC_SHA1_96/NO_EXT_SEQ
detected rekeying of CHILD_SA bank{3}
CHILD_SA bank{4} established with SPIs c3789495_i 55115f06_o and TS local.ip.address/32 === checkpoint.gw.ip/32
generating QUICK_MODE request 2566461280 [ HASH ]
sending packet: from local.ip.address[4500] to checkpoint.gw.ip[4500] (60 bytes)
connection ’remote’ established successfully
3 Настройка libreswan
В RHEL 7, OEL 7 или CentOS 7 файлы настроек находятся к каталогах “/etc” и “/etc/ipsec.d”.
/etc/ipsec.conf
/etc/ipsec.secrets
/etc/ipsec.d/ipsec.conf
/etc/ipsec.d/ipsec.secrets
/etc/ipsec.d/cert9.db
/etc/ipsec.d/key4.db
/etc/ipsec.d/nsspassword
3.1 База данных “nssdb”
Сертификаты клиента и сервера для “libreswan” хранятся в базе данных “nss”. Исходно база данных находится в “/etc/ipsec.d”. Для использования базы данных её надо инициализировать:
- ipsec initnss
Пароль для базы данных надо будет сохранить в файле “nsspassword”:
- cat /etc/ipsec.d/nsspassword
NSS Certificate DB:<Here is my strong NSS password>
Вместо команды “ipsec initnss” можно воспользоваться командой “certutil”:
- certutil -N -d sql:/etc/ipsec.d
В базу данных надо занести сертификаты сервера и клиента (файл .p12):
- ipsec import cpuser.p12
Содержимое базы данных можно увидеть, используя “certutil”:
- certutil -L -d sql:/etc/ipsec.d
Certificate Nickname Trust Attributes
SSL,S/MIME,JAR/XPI
checkpoint-cert.pem P,,
internal_ca.pem CT,,
cpuser u,u,u
3.2 Конфигурационные файлы
Исходный файл конфигурации “libreswan” - это “/etc/ipsec.conf”. В нём можно определить местонахождение логфайла, отладку:
- /etc/ipsec.conf - Libreswan IPsec configuration file
#
# see ’man ipsec.conf’ and ’man pluto’ for more information
#
# For example configurations and documentation, see https://libreswan.org/wiki/
config setup
# Normally, pluto logs via syslog.
logfile=/var/log/pluto.log
#
# Do not enable debug options to debug configuration issues!
#
# plutodebug="control parsing"
# plutodebug="all crypt"
plutodebug=none
#
# NAT-TRAVERSAL support
# exclude networks used on server side by adding %v4:!a.b.c.0/24
# It seems that T-Mobile in the US and Rogers/Fido in Canada are
# using 25/8 as "private" address space on their wireless networks.
# This range has never been announced via BGP (at least up to 2015)
virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12,%v4:25.0.0.0/8,%v4:100.64.0.0/10,%v6:fd00::/8,%v6:fe80::/10
# if it exists, include system wide crypto-policy defaults
# include /etc/crypto-policies/back-ends/libreswan.config
# It is best to add your IPsec connections as separate files in /etc/ipsec.d/
include /etc/ipsec.d/*.conf
В каталоге “/etc/ipsec.d/” размещаются файлы соединений, например “/etc/ipsec.d/ipsec.conf”:
- cat /etc/ipsec.d/ipsec.conf
conn home
# Right side is libreswan
right=%defaultroute
rightcert=cpuser
# rightid="/O=smartcenter..i6sh4u/OU=users/CN=cpuser"
rightid=%fromcert
rightrsasigkey=%cert
# Left side is CheckPoint
left=<checkpoint gw ip-address>
# leftsubnet=192.168.xx.0/24
leftcert=checkpoint-cert.pem
# leftid=<checkpoint gw ip-address>
leftid=%fromcert
# Config
vti-interface=ip_vti0
type=tunnel
keyingtries=3
disablearrivalcheck=no
authby=rsasig
ike=aes256-sha1;modp1024
phase2=esp
phase2alg=aes256-sha1
pfs=no
ikelifetime=8h
salifetime=1h
ikev2=no
keyexchange=ike
auto=route
conn net-192.168.xx.0
also=home
leftsubnet=192.168.xx.0/24
#auto=start
3.3 Запуск “libreswan”
Запуск сервиса возможен как напрямую, так и через “systemctl”:
- ipsec start
Redirecting to: systemctl start ipsec.service
# ipsec auto --up home
au002 "home" #1: initiating Main Mode
104 "home" #1: STATE_MAIN_I1: initiate
106 "home" #1: STATE_MAIN_I2: sent MI2, expecting MR2
002 "home" #1: I am sending my cert
002 "home" #1: I am sending a certificate request
108 "home" #1: STATE_MAIN_I3: sent MI3, expecting MR3
002 "home" #1: Peer ID is ID_IPV4_ADDR: ’<checkpoint gw ip-address>’
002 "home" #1: certificate verified OK: CN=smart VPN Certificate,O=smartcenter..i6sh4u
003 "home" #1: Authenticated using RSA
004 "home" #1: STATE_MAIN_I4: ISAKMP SA established {auth=RSA_SIG cipher=aes_256 integ=sha group=MODP1024}
002 "home" #2: initiating Quick Mode RSASIG+ENCRYPT+TUNNEL+UP+IKEV1_ALLOW+SAREF_TRACK+IKE_FRAG_ALLOW+ESN_NO {using isakmp#1 msgid:c80d7f54 proposal=AES_CBC_256-HMAC_SHA1_96 pfsgroup=no-pfs}
117 "home" #2: STATE_QUICK_I1: initiate
004 "home" #2: STATE_QUICK_I2: sent QI2, IPsec SA established tunnel mode {ESP/NAT=>0xcfeff49e <0xb0d447b9 xfrm=AES_CBC_256-HMAC_SHA1_96 NATOA=none NATD=<checkpoint gw ip-address>:4500 DPD=passive}
3.4 Проверка “libreswan”
Проверить настройки “libreswan” можно с помощью команды “ipsec verify”:
- ipsec verify
Verifying installed system and configuration files
Version check and ipsec on-path [OK]
Libreswan 3.25 (netkey) on 5.4.17-2036.102.0.2.el7uek.x86_64
Checking for IPsec support in kernel [OK]
NETKEY: Testing XFRM related proc values
ICMP default/send_redirects [OK]
ICMP default/accept_redirects [OK]
XFRM larval drop [OK]
Pluto ipsec.conf syntax [OK]
Two or more interfaces found, checking IP forwarding [OK]
Checking rp_filter [OK]
Checking that pluto is running [OK]
Pluto listening for IKE on udp 500 [OK]
Pluto listening for IKE/NAT-T on udp 4500 [OK]
Pluto ipsec.secret syntax [OK]
Checking ’ip’ command [OK]
Checking ’iptables’ command [OK]
Checking ’prelink’ command does not interfere with FIPS [OK]
Checking for obsolete ipsec.conf options [OK]
4 Фаервол
В настройках фаервола надо добавить “NAT masquerading”, протоколы аутентификации IPsec (AH) и энкапсуляции (ESP):
- firewall-cmd --zone=public --permanent --add-rich-rule=’rule protocol value="esp" accept’
# firewall-cmd --zone=public --permanent --add-rich-rule=’rule protocol value="ah" accept’
# firewall-cmd --zone=public --permanent --add-masquerade
А также добавить “UDP” порты и сервис “ipsec”:
- firewall-cmd --zone=public --permanent --add-port=500/udp
# firewall-cmd --zone=public --permanent --add-port=4500/udp
# firewall-cmd --zone=public --permanent --add-service="ipsec"
# firewall-cmd --reload
Посмотреть, что всё вышеуказанное включено в фаервол, можно с помощью команды “firewall-cmd --list-all”:
- firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: wlo1
sources:
services: ipsec rpc-bind ssh
ports: 500/udp 4500/udp
protocols:
masquerade: yes
forward-ports:
source-ports:
icmp-blocks:
rich rules:
rule protocol value="esp"accept
rule protocol value="ah"accept
5 Sysctl
В дополнение к исходным настройкам strongswan, надо дополнительно внести изменения в сетевые настройки ядра. Для этого надо добавить следующие строки в файл “/etc/sysctl.conf”:
- sysctl settings are defined through files in
# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
#
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#
# For more information, see sysctl.conf(5) and sysctl.d(5).
net.ipv4.ip_forward = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.eno1.rp_filter = 0
net.ipv4.conf.wlo1.rp_filter = 0
net.ipv4.conf.ip_vti0.rp_filter = 0
Наименования интерфейсов “eno1”, “wlo1”, “ip_vti0” могут отличаться, а также могут присутствовать и другие интерфейсы, например “virbr0”, “virbr0-nic”. Посмотреть все имеющиеся интерфейсы можно с помощью команды “ip a”.