5 IPSec开源项目strongSwan
5.1 保护网络
strongSwan是一套完整的IPsec开源实现方案,用来提供服务端和客户端之间的加密和认证。strongSwan 可用于保护与远程网络的通信,因此远程连接与本地连接相同。常见的保护网络场景如图5.1所示。
图5.1 常见保护网络场景
5.1.1 网关
网关通常是防火墙,但也可以是网络中的任何主机。通常,网关还能够使用 DHCP 和 DNS 服务于小型网络。在上图中,主机和moon分别sun用作内部主机alice、venus和bob的网关。
5.1.2 远程连接/访客
通常访客是笔记本和其他移动设备,通过网关来远程连接到你的网络。图中的carol和dave代表了一个访客想要连接分别在两个网关后面的两个网络。
5.1.3 远程主机/主机到主机
远程主机可以是远程 Web 服务器或备份系统。在图5.1中为主机winnetou和任一网关moon或sun,两台主机之间的连接通常可以由其中任何一台发起。
5.1.4 远程站点/站点到站点
位于不同位置的两个或多个子网中的主机应该能够相互访问。如图5.1中,两个子网10.1.0.0/16 和10.2.0.0/24网关后面的moon和sun可能分别连接,以便主机alice和bob可以彼此安全地通信。
5.2 IKE和IPSec基础
strongSwan本质上是一个密钥守护进程,它使用 Internet 密钥交换版本 2 (IKEv2) 协议在两个对等方之间建立安全关联(SA)。一些应用程序仍支持IKEv1,但出于稳定性和某些安全原因,建议使用IKEv2。IKE提供了端与端之间彼此的强认证并且获取唯一的加密会话密钥。像这样的一个IKE会话(IKE session)经常用 IKE_SA(Security Association) 来表示。除了身份验证和密钥之外,IKE还提供了交换配置信息(例如虚拟 IP地址)和协商 IPsec SA(通常称为CHILD_SA)的方法。IPsec SAs 定义要保护哪些网络流量以及如何对其进行加密和身份验证。其中,CHILD_SA 由两个组件组成:
1、实际的IPsec SAs(有两个,每个方向一个)描述了用于加密和验证流量的算法和密钥。
2、策略(至少两条)定义了哪种网络传输可以使用这样的SA策略。
策略是双向的,即只有匹配入站策略的流量被解密后才被允许。策略来源于建立CHILD_SA时通过IKE协商的TS (traffic selectors)。内核接收到且没有匹配入站IPsec策略的未保护流量将被丢弃,这是由安全特性决定的。
实际的IPSec 流量不由strongSwan处理,而是降级到操作系统内核的网络和 IPSec 堆栈。strongSwan通过平台相关的内核接口将协商好的IPSec SAs和SPs安装到内核中。
strongSwan使用平台依赖的内核接口来下发协商好的IPsec SAs(Security Association,安全联盟)和SPs(Security Policy,安全策略),这两类信息都需要存放在内核XFRM。核XFRM使用netns_xfrm这个结构来组织这些信息,它也被称为xfrm instance(实例)。
上述提到的策略和SAs之间的区别,经常导致误解。 例如,在图5.1中,如果主机moon与主机sun之间有site-site类型的隧道连接(连接两个网段10.1.0.0./16和10.2.0.0/24),主机carol有个远程私有连接到主机sun(carol的虚拟IP地址是10.3.0.10),然而carol并不能与alice通信,尽管在主机sun上转发是可以的。这是因为在carol和alice之间没有IPsec策略允许他们通信。建立另一条在moon和sun之间的SA来连接虚拟子网10.3.0.0/24与10.1.0.0/24之间的通信,将是一个可行的方案。
5.3 身份验证基础
为确保建立 IKE_SA 的对等方确实是其声称的身份,必须对其进行身份证。strongSwan 提供了几种方法来做到这一点:
5.3.1 公钥认证
(1)证书可以是自签名的(在这种情况下,它们必须安装在所有对等端上),也可以由公共证书颁发机构(CA)签名。后者大大简化了部署和配置,因为网关只需要CA证书来验证所有提供由该CA签名的有效证书的对等端。
(2)CRLs(Certificate Revocation Lists)或OCSP (Online Certificate Status Protocol)可以用来验证证书的有效性。
(3)为了安全地存储私钥,智能卡可以通过pkcs11插件使用。
(4)为了防止中间人攻击,对等方声称的身份必须通过证书确认,可以通过subjectDn或subjectAltName扩展名。
5.3.2 预共享密钥认证(PSK)
预共享密钥是一种易于部署的选项,但它需要强大的机密 才能确保安全。如果许多用户都知道 PSK(这通常是带有 PSK 的 IKEv1 XAuth 的情况),任何知道秘密的用户都可以冒充网关。因此,不建议将此方法用于大规模部署。
5.3.3可扩展认证协议(EAP)
这涵盖了几种可能的身份验证方法,其中一些基于基于用户名/密码的身份验证(EAP-MD5、EAP-MSCHAPv2、EAP-GTC)或 X.509 证书(EAP-TLS)。有些甚至可以通过隧道传输其他 EAP 方法(EAP-TTLS、EAP-PEAP)。
(1)用户的实际认证可以通过eap-radius插件委托给RADIUS服务器。
(2)EAP认证仅适用于IKEv2版本,部分IKEv1版本使用Xauth-eap插件进行认证。
5.3.4 扩展认证(XAuth)
XAuth在IKEv1中提供了一个灵活的认证框架。主要用于基于用户名/密码的认证。此外,它通常用作基于X.509证书或PSK的相互身份验证之后的第二种身份验证方法。然而,使用IKEv1混合认证时,可以使用证书验证网关,并只使用XAuth验证客户端。
对于IKEv2,可以使用多轮身份验证(RFC 4739),例如首先使用X.509证书对机器进行身份验证,然后使用基于用户名/密码的身份验证方案对用户进行身份验证(例如EAP-MSCHAPv2)。也可以使用非对称认证,例如在第一轮认证中使用证书对网关进行认证,使用基于用户名/密码的EAP方法对客户端进行认证。请注意,并不是所有的IKEv2实现都支持RFC 4739扩展。
5.4 配置文件
配置strongswan的时候建议通过强大的vici接口和swanctl命令行工具。swanctl使用的swanctl.conf配置文件与证书及对应的私钥一起存放在swanctl目录下。全局的strongSwan设置以及特定于插件的配置都在strongSwan .conf中定义。
5.5 使用与维护
在现代发行版中,strongSwan通常使用swanctl命令管理,而IKE charon则由systemd控制。在传统安装中,strongSwan由ipsec命令控制,其中ipsec start将启动starter守护进程,后者依次启动并配置键控charon守护进程。
swanctl.conf中定义的IKE Connections和CHILD sa可以通过三种不同的方式启动:
(1)传输时建立
如果使用start_action = trap,将为配置的流量(通过local_ts/remote_ts定义)安装IPsec trap策略,匹配这些策略的流量将触发获取事件,导致守护进程建立所需的IKE/IPsec sa。这也用于pass - through/drop IPsec策略,让特定的流量绕过其他策略/ sa或完全丢弃它。
(2)启动时建立
使用start_action = start配置的child_sa将在守护进程启动时自动建立。由于某些原因,当它们下降时,不会自动重新启动。需要指定其他配置设置(dpd_action和/或close_action)来自动重启它们,但即使这样,设置也不是防弹的,可能会泄漏数据包。
(3)手动建立
没有使用start_action的连接必须使用swanctl --initiate手动建立,或者被动地作为响应器等待peer/roadwarrior连接。根据配置的不同,还可以使用swanctl --install为此类连接手动安装策略,例如start_action = trap将在启动时执行此操作。
建立安全联盟后,可以使用swanctl --terminate拆除IKE_SA或单独的child_sa。当swanctl.conf文件或swanctl目录中的凭证被更改时,它们可能会被不同的swanct --load-…命令更改。已经建立的连接不受这些命令的影响(除非使用start_action = start)。如果需要更新配置,则必须重新启动sa甚至守护进程。使用不同的swanctl --list-…命令将提供有关已加载或缓存的证书、支持的算法和已加载的插件的信息。
5.6 日志和监测
如果遇到问题,增加日志级别可以了解究竟哪里出了问题。不同的日志记录选项在单独的文档或strongswan.conf手册页中进行了描述。
每当遇到类似于received…error notify where the占位符…的日志消息时,例如NO_PROPOSAL_CHOSEN或ts_不可接受,应该咨询远程对等点的日志,以便找出为什么错误通知会首先产生。
swanctl --list. .命令将提供关于已建立和配置的连接的信息。
在Linux中,iproute2包提供ip xfrm state和ip xfrm policy命令,以请求关于在内核中安装的IPsec sa和策略的详细信息。添加-s选项将显示大量的统计信息,比如传输的包或无效包的数量。在其他平台上,ipsec-tools包中的setkey命令可以提供类似的信息。
tcpdump和wireshark在调试问题时也很有用。
当使用ping测试连接时,请确保选择本地流量选择器中包含的源IP地址(使用-I选项)
5.7 PKI(public-key infrastructure,公钥基础设施)
要使用基于证书的身份验证,需要创建自签名证书或设置完整的公钥基础设施(PKI),其中包括证书颁发机构(CA)、可选的中间CA和终端实体证书以及证书撤销列表(crl)或其他验证证书有效性的方法,如OCSP。生成证书的最简单的方法之一是使用PKI工具。
OpenSSL也是一种广泛使用的生成证书的替代方法,还有一些基于GUI的CA管理实用程序。微软的活动目录证书服务(AD CS)也可以用于大规模的PKI。
5.8 路由
在Linux上,strongSwan默认将路由安装到路由表220中,因此要求内核支持基于策略的路由。
可以让charon守护进程将路由安装到任何表中,也可以完全禁用它们。基于这些原因,在strongswan.conf里的charon.install_routes, charon.routing_table和charon.routing_table_prio这些设置将会被使用。当两个子网之间建立隧道时,charon会在隧道建立的本端子网中寻找本端IP。这样的IP必须配置为全局作用域,以便能够进行查找。如果找到一个有效的IP, charon将安装一个指向远端子网的路由,其中源IP被设置为找到的IP。这样会产生如下路由:
10.1.0.0/24 via 10.2.0.1 src 10.2.0.2
在这个示例中,本地IP将是10.2.0.2。远端子网将是10.1.0.0/24。这样,发送到远端子网的数据包就带有正确的源IP。因此,IPsec策略将会匹配,并且从本地机器到远端子网的流量将被IPsec保护。
5.9 远程访问配置
IKEv2配置
Windows客户端的三个strongSwan网关配置可能适用于所有IKEv2客户端:
(1)基于证书的身份验证(https://docs.strongswan.org/docs/5.9/interop/windowsMachineServerConf.html)
(2)基于证书EAP-TLS身份验证(https://docs.strongswan.org/docs/5.9/interop/windowsUserServerConf.html)
(3)基于密码的EAP认证(https://docs.strongswan.org/docs/5.9/interop/windowsEapServerConf.html)
在所有三个用例中,网关通过证书进行身份验证,而客户端要么基于证书(1,2),要么基于用户名/密码方案(3)进行身份验证。通用EAP用例(3)包含EAP- tls用例(2),因此只有两个配置(1,3)必须在strongSwan VPN网关上并行实现,让VPN客户端选择上述三种身份验证方法中的任何一种。
5.10 Site-to-Site配置
与远程访问情况最重要的区别是,发起者不会请求一个虚拟IP地址,而是使用local_ts从一个或多个本地子网隧道传输流量。IKEv2支持在以逗号分隔的local_ts/remote_ts后面添加多个子网(CIDR格式)。如果采用IKEv1协议,则需要单独的子协议。小节必须为本地和远程子网的每个组合添加,因为只有local_ts/remote_ts中的第一个子网将被使用。
5.11 主机到主机配置
主机到主机的连接非常容易设置。将remote_addr设置为对等体的主机名或IP地址,并配置所需的身份验证。local_ts和remote_ts流量选择器都不需要显式设置。
版权归原作者 _深蓝. 所有, 如有侵权,请联系我们删除。