系统管理指南:IP 服务

第 21 章 IP 安全体系结构(参考)

本章包含以下参考信息:

有关如何在网络中实现 IPsec 的说明,请参见第 20 章。有关 IPsec 的概述,请参见第 19 章

IPsec 服务管理工具

服务管理工具 (service management facility, SMF) 为 IPsec 提供以下服务:

有 SMF 的信息,请参见《系统管理指南:基本管理》中的第 18  章 “管理服务(概述)”。另请参见 smf(5)svcadm(1M)svccfg(1M) 手册页。

ipsecconf 命令

您可以使用 ipsecconf 命令为主机配置 IPsec 策略。当运行此命令来配置策略时,系统会在内核中创建 IPsec 策略项。系统使用这些项来检查所有传入和外发 IP 数据报的策略。转发的数据报不受使用此命令添加的策略检查的约束。ipsecconf 命令也可配置安全策略数据库 (security policy database, SPD)。

您必须成为超级用户或承担等效角色,才能调用 ipsecconf 命令。此命令接受保护双向通信的项,同时也接受仅保护单向通信的项。

具有本地地址和远程地址格式的策略项可以借助单个策略项保护双向通信。例如,如果没有为指定的主机指定方向,则包含模式 laddr host1raddr host2 的项会保护双向通信。因此,对于每台主机,只需一个策略项。

具有源地址到目标地址格式的策略项仅保护单向通信。例如,模式为 saddr host1 daddr host2 的策略项只保护传入通信或外发通信,不同时保护这两个方向的通信。因此,要保护双向通信,需要向 ipsecconf 命令传递另一个项,即 saddr host2 daddr host1

要确保 IPsec 策略在引导计算机时处于活动状态,可以创建一个 IPsec 策略文件 /etc/inet/ipsecinit.conf。此文件在网络服务启动时读取。有关如何创建 IPsec 策略文件的说明,请参见使用 IPsec 保护通信(任务列表)

从 Solaris 10 4/09 发行版开始,借助 -c 选项,ipsecconf 命令可检查作为参数提供的 IPsec 策略文件的语法。

ipsecconf 命令添加的策略项在系统重新引导后不会保留。要确保 IPsec 策略在系统引导时保持活动状态,请将策略项添加到 /etc/inet/ipsecinit.conf 文件。在当前发行版中,请刷新或启用 policy 服务。在 Solaris 10 4/09 发行版之前的发行版中,请重新引导或使用 ipsecconf 命令。例如,请参见使用 IPsec 保护通信(任务列表)

ipsecinit.conf 文件

要在启动 Solaris 操作系统 (Solaris Operating System, Solaris OS) 时调用 IPsec 安全策略,请创建一个配置文件以通过特定的 IPsec 策略项来初始化 IPsec。此文件的缺省名称为 /etc/inet/ipsecinit.conf。有关策略项及其格式的详细信息,请参见 ipsecconf(1M) 手册页。配置策略之后,您可以使用 ipsecconf 命令来查看或修改现有配置。从 Solaris 10 4/09 发行版开始,可刷新 policy 服务来修改现有配置。

ipsecinit.conf 文件样例

Solaris 软件包含一个 IPsec 策略文件样例 ipsecinit.sample。您可以使用此文件作为模板来创建自己的 ipsecinit.conf 文件。ipsecinit.sample 文件包含以下示例:


#
# For example,
#
#	 {rport 23} ipsec {encr_algs des encr_auth_algs md5}
#
# will protect the telnet traffic originating from the host with ESP using
# DES and MD5. Also:
#
#	 {raddr 10.5.5.0/24} ipsec {auth_algs any}
#
# will protect traffic to or from the 10.5.5.0 subnet with AH 
# using any available algorithm.
#
#
# To do basic filtering, a drop rule may be used. For example:
#
#	 {lport 23 dir in} drop {}
#	 {lport 23 dir out} drop {}
# will disallow any remote system from telnetting in.
#
# If you are using IPv6, it may be useful to bypass neighbor discovery
# to allow in.iked to work properly with on-link neighbors. To do that,
# add the following lines:
#
#        {ulp ipv6-icmp type 133-137 dir both } pass { }
#
# This will allow neighbor discovery to work normally.

ipsecinit.confipsecconf 的安全注意事项

在网络中传输 ipsecinit.conf 文件副本时请格外小心。入侵者可能会在系统读取网络挂载的文件时也读取此文件。例如,在从 NFS 挂载的文件系统中访问或复制 /etc/inet/ipsecinit.conf 文件时,入侵者可能会更改此文件中包含的策略。

请确保在启动任何通信之前已设置了 IPsec 策略,因为新添加的策略项可能会影响现有连接。同样,不要在通信期间更改策略。

特别要指出的是,不能针对在其上发出 connect()accept() 函数调用的 SCTP、TCP 或 UDP 套接字更改 IPsec 策略。其策略不能更改的套接字称为锁定的套接字。新策略项不保护已锁定的套接字。有关更多信息,请参见 connect(3SOCKET)accept(3SOCKET) 手册页。

保护您的名称系统。如果发生以下两种情况,则您的主机名不再值得信任:

安全漏洞通常是由工具使用不当造成的,而并非由工具本身引起。应慎用 ipsecconf 命令。请将控制台或其他硬连接的 TTY 用作最安全的操作模式。

ipsecalgs 命令

Solaris 加密框架为 IPsec 提供验证和加密算法。ipsecalgs 命令可以列出每个 IPsec 协议支持的算法。ipsecalgs 配置存储在 /etc/inet/ipsecalgs 文件中。通常,不需要修改此文件。但是,如果需要修改此文件,请使用 ipsecalgs 命令。决不能直接编辑此文件。在当前发行版中,系统引导时会通过 svc:/network/ipsec/ipsecalgs:default 服务使支持的算法与内核同步。

有效的 IPsec 协议和算法由 RFC 2407 中介绍的 ISAKMP domain of interpretation, DOI(解释域)进行说明。通常,DOI(解释域)定义数据格式、网络通信交换类型,以及命名安全相关信息的约定。安全策略、加密算法和加密模式都属于安全相关信息。

具体而言,ISAKMP DOI 为有效的 IPsec 算法及其协议(PROTO_IPSEC_AHPROTO_IPSEC_ESP)定义命名约定和编号约定。每个算法都仅与一项协议相关联。这些 ISAKMP DOI 定义位于 /etc/inet/ipsecalgs 文件中。算法和协议编号由 Internet 编号分配机构 (Internet Assigned Numbers Authority, IANA) 定义。使用 ipsecalgs 命令,可以针对 IPsec 扩展算法列表。

有关算法的更多信息,请参阅 ipsecalgs(1M) 手册页。有关 Solaris 加密框架的更多信息,请参见《系统管理指南:安全性服务》中的第 13  章 “Solaris 加密框架(概述)”

IPsec 的安全关联数据库

有关 IPsec 安全服务加密材料的信息保留在安全关联数据库 (SADB) 中。安全关联 (security association, SA) 保护传入包和外发包。SADB 可能由某个用户进程维护,也可能由多个协作进程(以特定类的套接字发送消息)维护。这种维护 SADB 的方法类似于 route(7P) 手册页中介绍的方法。只有超级用户或承担等效角色的用户才能访问此数据库。

in.iked 守护进程和 ipseckey 命令使用 PF_KEY 套接字接口维护 SADB。有关 SADB 如何处理请求和消息的更多信息,请参见 pf_key(7P) 手册页。

用于在 IPsec 中生成密钥的实用程序

IKE(Internet 密钥交换)协议提供自动执行的 IPv4 和 IPv6 地址密钥管理。有关如何设置 IKE 的说明,请参见第 23 章。手动加密实用程序是 ipseckey 命令,在 ipseckey(1M) 手册页中对其进行了介绍。

可使用 ipseckey 命令手动填充安全关联数据库 (security associations database, SADB)。通常,由于某种原因而无法使用 IKE 时,会使用手动 SA 生成。但是,如果 SPI 值是唯一的,可以同时使用手动 SA 生成和 IKE。

ipseckey 命令可用于查看系统识别的所有 SA,无论密钥是手动添加的还是由 IKE 添加的。从 Solaris 10 4/09 发行版开始,借助 -c 选项,ipseckey 命令可检查作为参数提供的密钥文件的语法。

ipseckey 命令添加的 IPsec SA 在系统重新引导后不会保留。在当前发行版中,要在系统引导时启用手动添加的 SA,请将相应的项添加到 /etc/inet/secret/ipseckeys 文件,然后启用 svc:/network/ipsec/manual-key:default 服务。有关过程,请参见如何手动创建 IPsec 安全关联

虽然 ipseckey 命令只有有限的常规选项,但是此命令支持丰富的命令语言。您可以指定使用专用于手动加密的程序接口发送请求。有关其他信息,请参见 pf_key(7P) 手册页。

ipseckey 的安全注意事项

超级用户或拥有网络安全或网络 IPsec 管理权限配置文件的角色可以使用 ipseckey 命令输入敏感的密钥加密信息。如果入侵者获得对此文件的访问权,便会威胁 IPsec 通信的安全。

当处理加密材料和使用 ipseckey 命令时,您应该考虑以下问题:

安全漏洞通常是由工具使用不当造成的,而并非由工具本身引起。应慎用 ipseckey 命令。请将控制台或其他硬连接的 TTY 用作最安全的操作模式。

其他实用程序的 IPsec 扩展

ifconfig 命令具有用来管理隧道接口上的 IPsec 策略的选项。snoop 命令可以解析 AH 头和 ESP 头。

ifconfig 命令和 IPsec

在 Solaris 10、Solaris 10 7/05、Solaris 10 1/06 和 Solaris 10 11/06 发行版中: 为了支持 IPsec,ifconfig 命令提供以下安全选项。在 Solaris 10 7/07 发行版中,这些安全选项由 ipsecconf 命令处理。

必须在一次调用中为隧道指定所有 IPsec 安全选项。例如,如果只使用 ESP 保护通信,则一次使用两个安全选项配置隧道 ip.tun0,如下所示:


# ifconfig ip.tun0 encr_algs aes encr_auth_algs md5

同样,ipsecinit.conf 项将使用两个安全选项一次性配置隧道,如下所示:


# WAN traffic uses ESP with AES and MD5.
   {} ipsec {encr_algs aes encr_auth_algs md5}

auth_algs 安全选项

此选项使用指定的验证算法为隧道启用 IPsec AH。auth_algs 选项的格式如下所示:


auth_algs authentication-algorithm

对于算法,您可以通过指定一个数字或一个算法名称(包括参数 any)来表示没有特定的算法首选项。要禁用隧道安全性,请指定以下选项:


auth_algs none

要获得可用验证算法的列表,请运行 ipsecalgs 命令。


注 –

auth_algs 选项不能用于 NAT 遍历。有关更多信息,请参见IPsec 和 NAT 遍历


encr_auth_algs 安全选项

此选项使用指定的验证算法为隧道启用 IPsec ESP。encr_auth_algs 选项的格式如下所示:


encr_auth_algs authentication-algorithm

对于算法,您可以通过指定一个数字或一个算法名称(包括参数 any)来表示没有特定的算法首选项。如果指定一个 ESP 加密算法,但是未指定验证算法,则 ESP 验证算法的缺省值为参数 any

要获得可用验证算法的列表,请运行 ipsecalgs 命令。

encr_algs 安全选项

此选项使用指定的加密算法为隧道启用 IPsec ESP。encr_algs 选项的格式如下所示:


encr_algs encryption-algorithm

对于算法,您可以指定一个数字或一个算法名称。要禁用隧道安全性,请指定以下选项:


encr_algs none

如果指定一个 ESP 验证算法,但是未指定加密算法,则 ESP 加密算法的缺省值为参数 null

要获得可用加密算法的列表,请运行 ipsecalgs 命令。

snoop 命令和 IPsec

snoop 命令可以解析 AH 头和 ESP 头。由于 ESP 对自己的数据进行加密,因此,snoop 命令不能查看受 ESP 保护的加密头。AH 不会对数据进行加密。因此,可以使用 snoop 命令来检查受 AH 保护的通信。此命令的 -V 选项显示何时对包使用 AH。有关更多详细信息,请参见 snoop(1M) 手册页。

有关受保护包中的详细 snoop 输出样例,请参见如何检验包是否受 IPsec 保护