版权 © 2008 Red Hat, Inc.
Copyright © 2008 Red Hat, Inc. This material may only be distributed subject to the terms and conditions set forth in the Open Publication License, V1.0 or later with the restrictions noted below (the latest version of the OPL is presently available at http://www.opencontent.org/openpub/).
Distribution of substantively modified versions of this document is prohibited without the explicit permission of the copyright holder.
Distribution of the work or derivative of the work in any standard (paper) book form for commercial purposes is prohibited unless prior permission is obtained from the copyright holder.
Red Hat and the Red Hat "Shadow Man" logo are registered trademarks of Red Hat, Inc. in the United States and other countries.
All other trademarks referenced herein are the property of their respective owners.
The GPG fingerprint of the security@redhat.com key is:
CA 20 86 86 2B D6 9D FC 65 F6 EC C4 21 91 80 CD DB 42 A6 0E
1801 Varsity Drive Raleigh, NC 27606-2072 USA Phone: +1 919 754 3700 Phone: 888 733 4281 Fax: +1 919 754 3701 PO Box 13588 Research Triangle Park, NC 27709 USA
January 2008
修订历史 | ||||
---|---|---|---|---|
修订 5.2-11 | Wed May 21 2008 |
Michael Hideo Smith <mhideo@redhat.com>
|
||
|
本部署指南文档包括了所有与红帽企业 Linux 5.2 部署、配置和管理相关的信息。
欢迎使用《红帽企业 Linux 部署指南》。
《红帽企业 Linux 部署指南》介绍了怎样定制红帽企业 Linux 系统来满足你的需要。如果你正在寻找一个完备的、面向任务的配置和定制系统的指南,这本书就是你的最佳选择。
这本指南假定你已经对红帽企业 Linux 系统有了基本的了解。如果你需要关于安装红帽企业 Linux 的帮助,请参考 《红帽企业 Linux 安装指南》。
如果你在《红帽企业 Linux 部署指南》中发现了错别字,或者有改进本书的建议,我们很希望能收到您的来函!你可以向 Bugzilla(http://bugzilla.redhat.com/bugzilla/
)提交一份关于 Deployment_Guide
的报告。
如果你有改进本书的建议,请尽可能详细地阐明。如果你发现了错误,请包括所在章节及相关段落的内容,以便我们可以轻易地查找到。
在解释了怎样配置网络之后,本部分内容讨论了和网路相关的主题,如怎样允许远程的登录、在网络上共享文件和目录以及设置 Web 服务器。
在红帽企业 Linux里,所有的网络通讯都发生在所配置的软件
网络接口配置文件放在/etc/sysconfig/network-scripts/
目录下.用来激活和停止这些文件的脚本也放在同一目录下.虽然不同的系统有不同数量和类型的接口文件,但在这个目录下都有三个类别的文件.
接口配置文件
接口控制脚本
网络功能文件
这些不同类别的文件被用在不同的网络设备上.
本章将会探索这些文件之间的关系和使用方法
在研究这些接口配置文件之前,让我们首先了解用于网络配置的主要配置文件.理解这些文件在设置网络中的作用,会对我们定制一个红帽企业 Linux 系统有所帮助.
以下列出了主要的网络配置文件:
/etc/hosts
这个文件的主要目的是用来解析没法用其他方法解析的主机名. 它也被用在没有域名服务器的小型网络里. 不管是什么类型的网络, 这个文件应该有一行来指定回路设备,如: (127.0.0.1
) as localhost.localdomain
. 请参考hosts
帮助页来获得更多信息.
/etc/resolv.conf
这个文件指定了域名服务器的IP地址和搜索域名. 除非有其他用途, 网络初始脚本都会载入这个文件. 关于这个文件的更多信息,请参考resolv.conf
帮助页.
/etc/sysconfig/network-scripts/ifcfg-<interface-name>
对于每个网络接口,都有一个相应的接口配置文件.每个文件都提供了特定网络接口的信息.请参考第 1.2 节 “接口配置文件” 来获得这种类型的文件的更多信息.
/etc/sysconfig/networking/
目录里存放了 网络管理工具 (system-config-network
) 的使用信息. 这个目录里的内容不应该手工编辑. 考虑到误删配置文件的风险,我们强烈建议只使用一种方法来配置网络.
接口配置文件用来控制每个网络设备的软件接口.系统启动时会根据这些文件来决定起用和配置哪些网络接口. 这些文件通常用ifcfg-
来命名,name在这里代表配置文件所控制的设备名称.
<name>
最常见的接口文件是 ifcfg-eth0
, 它控制系统里的第一个以太网卡. 如果系统里有多个网卡,就有多个配置文件ifcfg-eth
files ( <X>
<X>
是特定接口的唯一标识). 因为每个设备都有自己的配置文件,管理员就能分别对每个接口功能进行控制.
以下是使用固定 IP 地址的一个系统的 ifcfg-eth0
文件实例:
DEVICE=eth0 BOOTPROTO=none ONBOOT=yes NETWORK=10.0.1.0 NETMASK=255.255.255.0 IPADDR=10.0.1.27 USERCTL=no
接口配置文件里的值会根据其他的值而改变. 举例来说,应用DHCP的接口文件ifcfg-eth0
会有点不一样,因为IP信息是由DHCP服务器提供的.
DEVICE=eth0 BOOTPROTO=dhcp ONBOOT=yes
然而, 对于给定的网络接口, 手工编辑配置文件也是有可能的.
下面是一个以太接口配置文件的配置参数清单:
BONDING_OPTS=<parameters>
sets the configuration parameters for the bonding device, and is used in /etc/sysconfig/network-scripts/ifcfg-bond
(see 第 1.2.3 节 “网络接口”). These parameters are identical to those used for bonding devices in <N>
/sys/class/net/
, and the module parameters for the bonding driver as described in <bonding device>
/bondingbonding
Module Directives.
用这个配置方法可为多个绑定设备分别进行配置。如果您在 ifcfg-
中使用 <name>
BONDING_OPTS
,请不要为该绑定设备指定选项。
BOOTPROTO=<protocol>
在这里,
是以下值中的一个:
<protocol>
none
— 在启动时不使用任何协议。
bootp
— 使用 BOOTP 协议。
dhcp
— 使用 DHCP 协议。
BROADCAST=<address>
在这里,
是广播的地址。这个项已经不再被使用,因为这个值可以被 <address>
ifcalc
自动计算。
DEVICE=<name>
在这里,
是物理设备的名称(当它是动态分配的 PPP 设备时,它是 逻辑名)。
<name>
DHCP_HOSTNAME
当 DHCP 服务器需要客户机在接收 IP 地址前指定主机名时才使用该选项。
DNS{1,2}
=<address>
在这里,
是 <address>
/etc/resolv.conf
(PEERDNS
项被设为 yes
)文件中的名称服务器的地址。
ETHTOOL_OPTS=<options>
在这里,
被 <options>
ethtool
支持的特定设备的选项。例如,您需要设置100Mb,双项网络:
ETHTOOL_OPTS="autoneg off speed 100 duplex full"
和使用定制初始化脚本相反,请使用 ETHTOOL_OPTS
设定接口速率和双工设定。在网络初始化脚本之外运行定制初始化脚本可导致在重启后引导网络设备时出现无法预计的结果。
如果要改变速度和双工设置,需要禁止自动协商选项autoneg off
. 这个必须先于其他选项启动,因为选项都是按顺序排列的.
GATEWAY=<address>
在这里,<address>
是路由器或网关设备的 IP 地址。
HWADDR=<MAC-address>
在这里,<MAC-address>
是以太网设备的硬件地址(格式为 AA:BB:CC:DD:EE:FF
)。这个项对有多个网卡的系统非常有用:无论每个网卡的模块是以什么顺序被加载的,它们都可以获得正确的设备名。这个项 不能 和 MACADDR
一起使用。
IPADDR=<address>
在这里,
是 IP 地址。
<address>
MACADDR=<MAC-address>
在这里,<MAC-address>
是以太网设备的硬件地址(格式为 AA:BB:CC:DD:EE:FF
)。这个项被用来为一个接口分配一个 MAC 地址,这个地址会覆盖分配给物理网卡的地址。这个 不能 和 HWADDR
一起使用。
MASTER=<bond-interface>
在这里,
是以太网接口所连接的接口的频道绑定接口。
<bond-interface>
这个项和 SLAVE
项一起使用。
要了解更多关于频道绑定接口的信息,请参阅第 1.2.3 节 “网络接口”。
NETMASK=<mask>
在这里,
是网络掩码的值。
<mask>
NETWORK=<address>
在这里,
是网络地址。这个项已经不再被使用,它现在被 <address>
ifcalc
自动计算。
ONBOOT=<answer>
在这里,
是以下值中的一个:
<answer>
yes
— 这个设备在启动时被激活。
no
— 这个设备在启动时不被激活。
PEERDNS=<answer>
在这里,
是以下值中的一个:
<answer>
yes
— 如果 DNS 项被设定,修改 /etc/resolv.conf
;如果使用DHCP,yes
就是默认设置。
no
— 不修改 /etc/resolv.conf
文件。
SLAVE=<bond-interface>
在这里,
是以下值中的一个:
<bond-interface>
yes
— 这个设备由 MASTER
项中指定的频道绑定接口控制。
no
— 这个设备不被MASTER
项中指定的频道绑定接口控制。
这个项与 MASTER
项一起使用。
如需了解更多关于频道绑定接口的信息,请参阅 第 1.2.3 节 “网络接口”。
SRCADDR=<address>
where
is the specified source IP address for outgoing packets.
<address>
PEERDNS=<answer>
在这里,
是以下值中的一个:
<answer>
yes
— 允许非根用户控制该设备。
no
— 不允许非根用户控制该设备。
下面的文件是一个关于局域网A的IPsec连接的例子. 在这个例子里, 我们用 ipsec1
来标识网络连接, 文件被命名为: /etc/sysconfig/network-scripts/ifcfg-ipsec1
TYPE=IPsec ONBOOT=yes IKE_METHOD=PSK SRCNET=192.168.1.0/24 DSTNET=192.168.2.0/24 DST=X.X.X.X
SRCADDR=
,这里的<address>
是用于输出包的指定源 IP 地址。
<address>
下面是一个IPsec接口可配置参数的清单:
BROADCAST=<address>
SRCADDR=
,这里的<address>
是用于输出包的指定源 IP 地址。
<address>
ONBOOT=<answer>
USERCTL=
,这里的<answer>
是以下之一:
<answer>
SRCADDR=<address>
SRCADDR=
,这里的<address>
是用于输出包的指定源 IP 地址。
<address>
ONBOOT=<answer>
SRCADDR=
,这里的<address>
是用于输出包的指定源 IP 地址。
<address>
MASTER=<bond-interface>
PEERDNS=
,这里的<answer>
是以下之一:
<answer>
如果使用手工健值加密IPsec, 请参考 /usr/share/doc/initscripts-
(replace <version-number>
/sysconfig.txt<version-number>
with the version of the initscripts
package installed) 里的配置参数.
racoon
IKEv1 健值管理精灵进程为IPSec协商和配置一系列的参数. 它能够使用预?共享健值,RSA签名或者GSS-API.如果 racoon
被用来自动管理健值加密, 下面的选项是必需的:
ETHTOOL_OPTS=<options>
SRCADDR=
,这里的<address>
是用于输出包的指定源 IP 地址。
<address>
NETMASK=<mask>
SRCADDR=
,这里的<address>
是用于输出包的指定源 IP 地址。
<address>
DEVICE=<name>
USERCTL=
,这里的<answer>
是以下之一:
<answer>
PEERDNS=<answer>
USERCTL=
,这里的<answer>
是以下之一:
<answer>
PEERDNS=<answer>
PEERDNS=
,这里的<answer>
是以下之一:
<answer>
如果想知道IPsec
红帽企业 Linux允许管理员使用bonding
核心模块和一个特殊的网络接口(channel bonding interface)把多个网络接口绑定在单一通道. 通道联合使两个或更多的网络接口象单一接口一样地工作, 既增加了带宽,也提供了冗余功能.
为了创建一个通道联合接口, 需要在/etc/sysconfig/network-scripts/
目录下创建一个叫ifcfg-bond
的文件(<N>
<N>
是接口的序号, 如 0
).
这个文件的内容可以和任意一个绑定的接口相同, 如以太接口. 区别在于, DEVICE=
必须是 bond
(<N>
<N>
是接口的序号, 如 0
)
下面是个通道绑定配置文件的样本:
DEVICE=bond0 BONDING_OPTS="mode=1 miimon=500" BOOTPROTO=none ONBOOT=yes NETWORK=10.0.1.0 NETMASK=255.255.255.0 IPADDR=10.0.1.27 USERCTL=no
通道绑定接口创建以后, 被绑定接口的配置文件里必需加入 MASTER=
和SLAVE=
. 各绑定接口的配置文件可以近似相同.
举例来说, 如果两个以太接口被绑定, eth0
和 eth1
可能是下面的样子:
USERCTL=
,这里的<answer>
是以下之一:
<answer>
SRCADDR=
,这里的<address>
是用于输出包的指定源 IP 地址。
<address>
alias 和 clone 文件是两个用的比较少的接口配置文件.
用来在同一接口上绑定多个地址的别名接口配置文件, 使用ifcfg-
命名规则.
<if-name>
:<alias-value>
例如: ifcfg-eth0:0
可以指定DEVICE=eth0:0
和静态地址10.0.0.2. 假设以太接口的别名已经配置成通过DHCP里获取IP信息. 在这种情况下, eth0
被绑定在一个动态地址上, 但同一网卡又可以设置成静态地址 10.0.0.2.
别名接口不支持DHCP.
克隆接口配置文件应该使用下面的命名规则: ifcfg-
. 别名文件允许同一接口拥有多个地址, 克隆文件用来指定某一接口的额外选项. 例如: 一个叫<if-name>
-<clone-name>
eth0
的标准DHCP以太接口, 可能象下面这样:
USERCTL=
,这里的<answer>
是以下之一:
<answer>
如果USERCTL
directive is no
的缺省值没有被指定, 用户就不能启动或停止这个接口. 我们如果拷贝 ifcfg-eth0
到 ifcfg-eth0-user
, 并且把下面的语句加进去, 就可以让客户控制这个接口.
USERCTL=
,这里的<answer>
是以下之一:
<answer>
在这里, 因为ifcfg-eth0
和 ifcfg-eth0-user
里的配置选项被合并了, 用户可以用 /sbin/ifup eth0-user
命令来启动接口eth0
. 尽管这只是个非常简单的例子, 这个方法也可以用于其他的选项和接口.
如果你通过拨号来连接互联网, 这个接口必需有一个配置文件.
PPP接口文件采用下列格式来命名:
DEVICE=<name>
SRCADDR=
,这里的<address>
是用于输出包的指定源 IP 地址。
<address>
当使用wvdial
、网络管理工具 或者 Kppp 来创建拨号帐号,PPP 接口配置文件会自动创建。您也可以手工创建和编辑这个文件.
no
— 不要修改 /etc/resolv.conf
。
DEVICE=ppp0 NAME=test WVDIALSECT=test MODEMPORT=/dev/modem LINESPEED=115200 PAPNAME=test USERCTL=true ONBOOT=no PERSIST=no DEFROUTE=yes PEERDNS=yes DEMAND=no IDLETIMEOUT=600
Serial Line Internet Protocol (SLIP) 是另一个拨号接口, 尽管用的比较少. 它的配置文件名类似于ifcfg-sl0
.
可以在这些文件里使用的其他选项包括:
ONBOOT=<answer>
在这里,
是以下值中的一个:
<answer>
yes
— 允许非根用户控制该设备。
no
— 不允许非根用户控制该设备。
PEERDNS=<answer>
在这里,
是以下值中的一个:
<answer>
yes
— 允许非根用户控制该设备。
no
— 不允许非根用户控制该设备。
DEVICE=<name>
PEERDNS=
,这里的<answer>
是以下之一:
<answer>
NETMASK=<mask>
SRCADDR=
,这里的<address>
是用于输出包的指定源 IP 地址。
<address>
PEERDNS=<answer>
SRCADDR=
,这里的<address>
是用于输出包的指定源 IP 地址。
<address>
NETWORK=<address>
SRCADDR=
,这里的<address>
是用于输出包的指定源 IP 地址。
<address>
ONBOOT=<answer>
MTU定义了除了信息头以外所能承载的最大字节数. 在某些拨号环境里, 把这个值设置成576
会减少信息包的损失,而且会稍稍提高连接的吞吐量.
DEVICE=<name>
USERCTL=
,这里的<answer>
是以下之一:
<answer>
DEVICE=<name>
SRCADDR=
,这里的<address>
是用于输出包的指定源 IP 地址。
<address>
PEERDNS=<answer>
在这里,
是以下值中的一个:
<answer>
yes
— 允许非根用户控制该设备。
no
— 不允许非根用户控制该设备。
IPADDR=<address>
SRCADDR=
,这里的<address>
是用于输出包的指定源 IP 地址。
<address>
DEVICE=<name>
SRCADDR=
,这里的<address>
是用于输出包的指定源 IP 地址。
<address>
如下是其他常见的接口配置文件:
拨号
本地loopback interface通常用来测试, 有时候也被一些需要指向自身地址的应用程序里所使用. 所有发送到回路设备的数据都会马上被回送到主机的网络层.
回路接口脚本/etc/sysconfig/network-scripts/ifcfg-lo
不应该被手工编辑. 这样作会导致系统不能正常运行.
拨号
infrared interface 允许设备之间的信息, 如笔记本和打印机, 通过红外连接进行交换. 这和以太设备很相似, 只不过红外连接通常是点对点的连接.
拨号
Parallel Line Interface Protocol (PLIP) 连接和以太设备几乎一样, 只不过它是使用并行接口罢了.
拨号
Token Ring 拓扑结构不象Local Area Networks(LANs) 那么常见, 它已经逐渐
接口控制脚本激活和终止系统接口. 在/etc/sysconfig/network-scripts/
目录下有两个主要的调用控制脚本的接口控制脚本: /sbin/ifdown
和/sbin/ifup
.
接口脚本ifup
和 ifdown
都是/sbin/
目录下脚本的链接. 其中一个被调用的时候, 都需要指定的接口的值, 如:
USERCTL=
,这里的<answer>
是以下之一:
<answer>
The ifup
和 ifdown
是仅有的用户用来启动和停止网络接口的脚本.
下面的脚本仅作参考.
/etc/rc.d/init.d/functions
和 /etc/sysconfig/network-scripts/network-functions
用作在启动网络接口时的初始化. 详情请参考第 1.5 节 “网络功能文件”.
当确认接口已经被指定而且用户被允许控制这个接口, 适当的脚本就会启动或停止接口. 下面是一些在/etc/sysconfig/network-scripts/
目录下的常见接口控制脚本.
ifup-aliases
当有多个IP接口联接到同一接口时, 可以在接口配置文件里配置IP别名.
ifup-ippp
和 ifdown-ippp
启动和停止 ISDN 接口.
ifup-ipsec
和 ifdown-ipsec
。
启动和停止 IPsed 接口.
ifup-ipv6
和 ifdown-ipv6
启动和停止 IPv6 接口.
ifup-ipx
启动 IPX 接口。
ifup-plip
启动 PLIP 接口.
ifup-plusb
启动用于网络连接的USB 接口
ifup-post
和 ifdown-post
包含在接口已经启动或停止后执行的命令.
ifup-ppp
和 ifdown-ppp
。
启动或停止PPP接口
拨号
当设备接口被启动后加入静态路由.
ifdown-sit
和ifup-sit
ename >。
包括在IPv4连接里启动和停止IPv6管道的功能调用.
ifup-sl
和 ifdown-sl
启动和停止SLIP接口
ifup-wireless
启动一个无线接口.
删除和修改/etc/sysconfig/network-scripts/
目录下的脚本会导致接口连接不正常工作. 只有高级用户才可以修改网络接口脚本.
同时操作所有网络脚本最简单的方法就是使用 /sbin/service
在网络服务 (/etc/rc.d/init.d/network
) 里的命令, 如下所示:
/sbin/service network <action>
在这里, <action>
可以是 start
, stop
, 或 restart
.
可以使用下列命令来查看已经配置好的设备和激活的网络接口:
/sbin/service network status
因为将在路由设备中配置路由,所以无需在红帽企业版 Linux 服务器或者客户端中配置静态路由。但如果需要静态路由,可以为每个接口单独配置。这在不同的子网有多个接口时很有用。请使用 route
命令显示 IP 路由表。
静态路由配置保存在 /etc/sysconfig/network-scripts/route-
文件中。例如:eth0 接口的静态路由是保存在 interface
/etc/sysconfig/network-scripts/route-eth0
文件中。route-
文件有两种格式:IP 命令参数和网络/子网掩码指令。
interface
在第一行定义默认网关。这只在没有通过 DHCP 设定网关时需要:
defaultX.X.X.X
devinterface
X.X.X.X
是默认网关的 IP 地址。interface
是已连接到默认网关或者可连接到默认网关的接口。
定义静态路由。每行都被解析为单独的路径:
X.X.X.X/X
viaX.X.X.X
devinterface
X.X.X.X/X
是网络号和静态路由的子网掩码。X.X.X.X
和 interface
分别是默认网关的 IP 地址和接口。X.X.X.X
地址不一定是默认网关的 IP 地址。在大多数情况下,X.X.X.X
会是不同子网下的 IP 地址,而 interface
将是已经连接到或者可以连接到那个子网的接口。请根据要求任意添加静态路由。
以下是使用 IP 命令参数格式的 route-eth0
文件示例。默认网关为 192.168.0.1,接口 eth0。两个静态路由分别针对 10.10.10.0/24 和 172.16.1.0/24 网络:
default 192.168.0.1 dev eth0 10.10.10.0/24 via 192.168.0.1 dev eth0 172.16.1.0/24 via 192.168.0.1 dev eth0
应该只能为其它子网配置静态路由。以上示例并不是必须的配置文件,因为流向网络10.10.10.0/24 和 172.16.1.0/24 的数据包会使用默认网关。下面是在位于 192.168.0.0/24 子网的机器中将静态路由设定到不同子网的配置示例。示例机器在 192.168.0.0/24 子网中有 eth0 接口,在 10.10.10.0/24 子网中有 eth1 接口:
10.10.10.0/24 via 10.10.10.1 dev eth1
如果已经从 DHCP 分配了默认网关,IP 命令参数格式会在启动或者使用 ifup
命令将接口开启时造成一个或者两个错误:"RTNETLINK answers: File exists" 或者 'Error: either "to" is a duplicate, or "X.X.X.X
" is a garbage.',其中 X.X.X.X
是网关或者不同的 IP 地址。这些错误还会在您使用默认网关路由到另一个网络时发生。这两个错误都无伤大雅,可被忽略。
您还可以在 route-
文件中使用网络/子网掩码指令格式。以下是网络/子网掩码格式的样板,具体操作稍后另述:
interface
ADDRESS0=X.X.X.X
NETMASK0=X.X.X.X
GATEWAY0=X.X.X.X
ADDRESS0=
是静态路由的网络号。
X.X.X.X
NETMASK0=
是 X.X.X.X
ADDRESS0=
定义的网络号的子网掩码。
X.X.X.X
GATEWAY0=
是默认网关或者可用来连接到 X.X.X.X
ADDRESS0=
的 IP 地址。
X.X.X.X
以下是使用网络/子网掩码指令格式的 route-eth0
文件示例。默认网关为 192.168.0.1,接口 eth0。两个静态路由分别针对 10.10.10.0/24 和 172.16.1.0/24 网络。但如前所述,这个示例并不是必要的,因为 10.10.10.0/24 和 172.16.1.0/24 网络还是会使用默认网关:
ADDRESS0=10.10.10.0 NETMASK0=255.255.255.0 GATEWAY0=192.168.0.1 ADDRESS1=172.16.1.0 NETMASK1=255.255.255.0 GATEWAY1=192.168.0.1
之后的静态路由必须按顺序编号,且不可跳过任何数值。例如:ADDRESS0
、ADDRESS1
、ADDRESS2
等等。
以下是在位于 192.168.0.0/24 子网的机器中将静态路由设定到不同子网的示例。示例机器在 192.168.0.0/24 子网中有 eth0 接口,而在 10.10.10.0/24 子网中有 eth1 接口。
ADDRESS0=10.10.10.0 NETMASK0=255.255.255.0 GATEWAY0=10.10.10.1
DHCP 应该会自动分配这些设定,因为不需要在红帽企业版 Linux 服务器或者客户端中配置静态路由。
红帽企业 Linux使用了几个包含启动和停止接口的重要常用功能的文件. 这些功能分列在多个文件里, 而不只是单一的接口控制文件.
文件/etc/sysconfig/network-scripts/network-functions
包含了最常用的IPv4功能, 这些功能被许多接口控制脚本所采用. 这些功能包括获取接口状态变化的信息, 设置主机名, 寻找网关设备, 探测指定设备是否运行, 增加缺省路由等等.
因为 IPv6接口需要的功能和IPv4不一样, 文件/etc/sysconfig/network-scripts/network-functions-ipv6
被用来记录这些不同的信息. 这个文件里的功能配置和删除IPv6的静态路由, 建立和删除管道, 增加和删除接口的IPv6地址, 以及测试接口上的IPv6地址是否存在.
系统管理员需要提高关键业务系统、服务或者数据的安全性,作为完备的安全性策略的一部分,红帽企业 Linux 提供了一系列工具和方法。
本章提供了对安全性的一般性简介,尤其是从红帽企业 Linux的角度。它介绍了安全性评估、common exploits、系统入侵和对事故的反应等概念。它也介绍了SELinux来用加固工作站、服务器、VPN、防火墙和实施 SELinux 的概念性的和特殊的配置信息。
本章假定你有 IT 安全性的基本知识,因此只提供对常见安全性问题如控制物理访问、健壮的帐号策略和过程、审计等的基本介绍。在适当的时候,你可以参考对这些问题的外部资源的引用。
由于近来对使用功能强大的联网计算机来帮助商业运转和记录个人信息的依赖性日益增强,许多围绕着网络和计算机安全的行业也渐渐形成。企业机构开始聘请安全专家来确切地评审系统并制定出适合其组织的解决方案。由于许多机构属于动态性质,工作人员要么本地要么远程地使用公司的信息技术资源,因此各个机构对安全计算环境的需求已愈来愈强烈。
但是,多数机构(以及个人用户)把安全问题当成“马后炮”。安全问题常常会由于对增强功能、提高生产率以及对预算的考虑而被忽略。正确的安全措施经常是在事后调查(postmortem)后才被实施 —,即在非法入侵事件出现之后。安全专家们一致认为,在把网站连接到不可信的网络(如互联网)之前预先采取正确的措施是阻挠入侵企图的有效方法。
只要有足够的时间、资源、和动力,怪客能够闯入几乎所有系统。说到底,所有的安全措施和当前可用的技术都无法保证系统能免受入侵威胁。路由器有助于保护通向互联网的网关的安全性;防火墙有助于保护网络边缘地带的安全性;虚拟专用网能够在加密流中安全地传递数据;入侵检测系统能够在出现蓄意活动的时候向您发出警告。可是,以上这些技术的成功与否都有很多依赖因素,这些因素包括:
负责配置、监视和维护相关技术的人员的专业程度。
进行快速有效地更新或给服务和内核打补丁的能力。
负责时刻监测网络活动的人员的能力。
数据系统和技术的动态性使得保护公司企业资源的任务变得相当复杂。这种复杂性又给寻求各方面的系统专家带来一定难度。虽说要找到在信息安全的许多领域内都有渊博知识的人员是可能的,但是要保留这些多领域内的专家却不容易。这主要是因为信息安全的每一领域都要求其专业人士全身投入和时刻关注。而且信息安全本身也不是一种原地不动、停滞不前的行业。
假设您是某个企业网络的管理员。这类网络通常包括操作系统、应用程序、服务器、网络监视器、防火墙、入侵检测系统等等。现在,想像一下要在以上每个方面都保持更新状态。鉴于今天的软件和网络环境的复杂性,程序漏洞和错误肯定存在。使用补丁和勘误来保持整个网络的更新状态对于拥有混合系统的大机构来说不能不算是一项繁杂冗长的任务。
由于对专业人才需求方面的严格性,以及保持更新状态任务的艰巨性,所以不该发生的事件难免会发生,系统的防守难免会被攻破,数据也难免遭到破坏,服务也会被迫中断。
要增强保安技术,协助对系统、网络和数据的保护,您应该想敌人所想,从怪客的角度来检测系统的弱点。对自己的系统及网络资源进行防范性弱点测定有助于发现潜在的问题,这些问题可以在攻击者找到利用方法之前被解决。
如果您要对您的居住点进行安全检查,您很可能会检查一下所有的门户是否关闭上锁了。您还会检查每扇窗户,确定它们也被关紧插严。系统、网络和电子数据的保安方法也是基于相同的原则。恶意用户是数据盗贼。关注他们使用的工具、他们的所思所想、以及他们的动机和出发点,您就能够迅速地对他们的行动做出反应。
弱点测定可以被分化成两类:由外向里看”(Outside looking in)和由里向外看”(inside looking around)。
在进行“由外向里看”的弱点测定时,您是在试图从外部打入您的系统。站在系统之外会给您提供怪客的视角。您会看到怪客所见 — 可公开路游的 IP 地址、位于 DMZ 中的系统、防火墙的对外接口等等。DMZ 代表“停火区域”。它是指位于可信任的内部网络(如公司专用网)和不可信任的外部网络(如公共互联网)之间的计算机或小型子网。典型的 DMZ 包括可被互联网交通进入的设备,如万维网(HTTP)服务器、FTP 服务器、电子邮件(SMTP)服务器和 DNS 服务器。
在进行“由里向外看”的弱点测定时,您占据一定的优势,因为您是局内人,您的状态被提升为可信任级别。这是您和您的同事在系统上登录后的视角。您会看到打印服务器、文件服务器、数据库、以及其它资源。
这两类弱点测定截然不同。站在局内人的角度给您更多特权 — 比局外人要多得多。可是,现在的多数机构中,保安配置的目的仍是旨在把入侵者拒之门外。在保持机构内部安全方面(如部门间的防火墙、用户级别的安全控制、内部资源的验证手续、等等)做的却相当少。典型情况下,如果从内部看,可用资源要比从外部看多得多,因为多数系统都是公司内部使用的。一旦您步出公司之外,您就会被立即给予不信任级别。您可以使用的系统资源就会大受限制。
考虑一下弱点测定和侵入测试(penetration tests)的区别。弱点测定应该是侵入测试的第一步。测定中所积累的信息将会用于测试。弱点测定是检查漏洞及潜在缺陷的过程,而侵入测试是试图利用这些漏洞缺陷的实践行为。
测定网络体系是一个动态过程。信息安全和物理安全都是动态的。执行测定只会显示一个大概,它有可能会造成一些假象,让您白担心或者空欢喜一场。
安全管理员只能尽其工具和知识经验之能。使用任何当前可用的测定工具,在系统上运行它们,您几乎可以肯定会出现一些假警报。不管这是程序错误还是使用错误,其结果都是一样的。工具可能会发现实际上不存在的弱点(false positive);甚至更糟糕的是,它可能会漏掉实际上存在的弱点(false negative)。
现在,弱点测定和侵入测试之间的区别已经被表明了,在进行侵入测试前仔细评审弱点测定中的发现通常是一个良好的习惯。
试图寻找生产资源上的漏洞弱点会给您的系统和网络的生成力和效率带来不利影响。
以下列表讨论了执行弱点测定会给您带来的优势。
积极地将注意力集中到信息安全上
在怪客找到潜在漏洞前发现它们
时刻保持系统的更新并及时应用补丁程序
鼓励职员深化其专业知识
减少财政损失和消极宣传
为了给弱点测定选择适当的工具,建立一套弱点测定方法是明智之举。不幸的是,目前还没有预先定义的或被行业批准的方法;然而,常识和经验通常足以充当向导。
目标是什么?我们在看一个服务器还是整个网络以及网络内的一切?我们是在公司之内还是公司之外?这些问题的答案是很重要的,因为它们不但能够帮助您判定应该选择哪些工具,还能够帮助您判定该如何使用这些工具。
关于建立整套方法的更多信息,请参考以下网站:
http://www.isecom.org/projects/osstmm.htm《开源安全测试方法指南》 (OSSTMM)
http://www.owasp.org/开放万维网应用安全计划
典型的测定可以从收集信息开始。在测定整个网络时,首先使用布局图来找出运行着的主机位置。找到后,逐个检查每台主机。这需要您使用另一套工具。懂得使用恰当的工具是寻找弱点的关键所在。
如同我们的日常生活一样,每件事都可以有好几种做法。执行弱点测定也是如此。操作系统、应用程序、甚至网络(根据使用协议而定)都有其特殊的测定工具。某些工具是免费的,而某些却不是。某些工具很形象易用,而某些虽然晦涩难懂又没有充足的文档,但是却有其它工具没有的功能。
找到恰当的工具不是件轻而易举的事。说到底,经验最重要。如果可能,设立一个测试试验室,尽可能地多试一些工具,记录每个工具的强弱点。回顾工具的 README 文件或说明书页。此外,还可以在互联网上寻找更多信息,例如文章、指南、甚至专门讨论某个工具的邮件列表。
以下讨论的工具只是从可使用的大量工具中截取的一小部分。
Nmap 被包括在红帽企业 Linux 中。它是一个很流行的工具,可以被用来判定网络布局。Nmap 已经存在多年,可能是最常使用的收集信息工具。它的说明书页对其选项和用法都有详尽的描述。管理员可以在网络上使用 Nmap 来寻找其中的主机系统和开放的端口。
Nmap 是比较合适的弱点测定的第一步。您可以用它制定出网络内的所有主机的布局图,甚至传递选项来试图识别在某个主机上运行的操作系统。Nmap 为建立使用安全服务和停运不被使用服务的政策奠定了良好基础。
Nmap 可以从 shell 提示下运行。在 shell 提示下,键入 nmap 命令,随后是要扫描的主机名或 IP 地址。
nmap foo.example.com
扫描的结果(可能会花几分钟时间,根据主机所在位置而定)和以下相似:
Starting nmap V. 3.50 ( www.insecure.org/nmap/ ) Interesting ports on localhost.localdomain (127.0.0.1): (The 1591 ports scanned but not shown below are in state: closed) Port State Service 22/tcp open ssh 25/tcp open smtp 111/tcp open sunrpc 443/tcp open https 515/tcp open printer 950/tcp open oftep-rpc 6000/tcp open X11 Nmap run completed -- 1 IP address (1 host up) scanned in 71.825 seconds
Nmap 测试常用的网络通信端口上的监听或等待服务。这些信息对于想要关闭不必要服务的管理员来说很有帮助。
关于使用 Nmap 的更多信息,请参阅以下 URL 的官方网站:
Nessus 是一个功能完全的安全扫描器。Nessus 的插件结构允许用户为他们的系统和网络自行定制。和其它扫描器一样,Nessus 只能和它所依赖的签名数据库一样有效。幸运的是,Nessus 被频繁更新。它的功能包括:完整报告、主机扫描、真实时间的弱点搜索。记住,假警报可能会出现,即便是像 Nessus 这样的功能强大而又被时时更新的工具也不例外。
Nessus 没有被包括在 红帽企业 Linux 中,也不被支持。它被包括在本文档中,只是为了给有兴趣使用这个流行程序的用户提供一个参考。
关于使用 Nessus 的更多信息,请参阅以下 URL 上的官方网站:
Nikto 是一个优秀的 CGI(公用网关接口)扫描器。Nikto 不仅具备检查 CGI 弱点的能力,它还能够用一种比较难以捉摸的方法来进行,这样就能躲过入侵检查系统。该程序还附带了丰富的文档。您在运行程序前应该仔细阅读文档。如果您的万维网服务器提供 CGI 脚本,Nikto 是检查这些服务器安全性的好工具。
Nikto 没有被包括在 红帽企业 Linux 中,也不被支持。它被包括在文档中,只是为了给有兴趣使用这个流行程序的用户提供一个参考。
关于 Nikto 的更多信息,可以在以下 URL 上找到:
VLAD 是 Bindview, Inc. 的 RAZOR 组开发出来的弱点扫描器。它会检查 SANS 十大常见安全问题(SNMP 问题、文件共享问题等等)。虽然不像 Nessus 那么功能全面,VLAD 仍值得一试。
VLAD 没有被包括在 红帽企业 Linux 中,也不被支持。它被包括在文档中,只是为了给有兴趣使用这个流行程序的用户提供一个参考。
关于 VLAD 的更多信息可以在以下 URL 上的 RAZOR 组的网站上找到:
根据您的目标和资源而定,可以使用的工具不胜枚举。这些工具有用于无线网络、Novell 网络的,也有用于 Windows 系统、Linux 系统的。执行测定的另一个重要部分可能会包括审核物理安全性、人员安全审查、或声音/PBX 网络测定。一些新的概念,如 war walking — 扫描企业物理结构的边缘来寻找无线网络的可乘之机 — 是您可以进行调查的新兴概念,若必要,还可以包括在您的弱点测定中。在计划和执行弱点测试过程中,唯一的限制只是您的想象力和系统的暴露程度。
为了设计并实现一个好的安全策略,我们首先要明确激发攻击者决意攻击和破坏系统的原因所在。在详细阐明这些问题前,我们必须首先定义识别攻击者时所用的术语。
黑客(hacker)这个术语的现代意义起源于60年代的麻省理工学院(MIT)技术模型铁路俱乐部。这个俱乐部设计比例较大、细节逼真的火车模型。“黑客”被用来称呼那些发现了聪明技巧或问题的绕行措施的俱乐部成员。
从那以后,“黑客”这个术语就被用来描述从计算机迷到具有天赋的编程员之类的人士。多数黑客的共同之处是他们对计算机系统和网络的自发的探索之心。开源软件开发者经常认为自己和他们的同事是黑客,并且把这个称谓当作一种尊称。
典型的黑客都遵守一种黑客道德(hacker ethic)。它要求黑客必须追求专门知识和技能,和社区分享这些知识和技能是每个黑客的职责。在追求知识的过程中,某些黑客会从规避计算机系统的安全控制的学术挑战中获得乐趣。由于这个原因,新闻媒界经常使用“黑客”这个术语来描述那些蓄意地、带有犯罪意图的非法进入系统和网络的人。描述这类人的更恰当的用语应该是怪客(cracker) — 一个被黑客在八十年代中期创造出来的术语,用来区分这两大类人。
寻找并利用系统和网络弱点的人被区分成不同种类。这种类别是按照他们在进行安全弱点调查时所“戴”的帽子颜色来区分的。帽子的颜色代表了他们的企图。
白帽黑客(white hat hacker)测试网络和系统的性能来判定它们能够承受入侵的强弱程度。通常,白帽黑客攻击他们自己的系统,或被聘请来攻击客户的系统以便进行安全审查。学术研究人员和专职安全顾问就属于白帽黑客。
黑帽黑客(black hat hacker)是怪客的同义词。通常来说,怪客并不注重于入侵系统的编程或学术方面。他们经常为了个人利益而依靠现成的攻击程序和著名的系统漏洞弱点来发现保密信息,或破坏目标系统或网络。
灰帽黑客(grey hat hacker)在多数情况下都具备白帽黑客的技术和意图,但是偶尔也使用这种知识来进行不太光明正大的行径。灰帽黑客可以被认为是偶尔会为个人企图而戴着黑帽的白帽黑客。
典型的灰帽黑客会遵循另一种黑客道德。他认为闯入系统是无可非议的,只要不进行盗窃行为或破坏保密信息就可以。不过,某些人可能会说,闯入系统本身就是不道德的。
不管入侵者的意图如何,了解怪客会试图利用的漏洞这一点都很重要。本章的剩余部分将会集中讨论这些问题。
在配置网络的以下部分时,某些不良习惯会增加系统被攻击的危险性。
配置不正确的网络是未经授权用户的主要入口。把基于信任的开放型本地网络向极不安全的互联网敞开就如同住在罪案重重的街区里却不封门闭户一样 — 在一段时间内可能会平安无事,但是最终总会有人要利用这个机会。
系统管理员经常忽略联网硬件在保安计划里的重要性。简单的硬件,如集线器和路由器,依赖广播或非转换的原理;这就是说,不管什么时候某个节点通过网络来传输数据,集线器或路由器都会广播这些数据分组,直到接收节点收到并处理这些数据为止。这种方法最容易被外界入侵者和本地未经授权的用户施行地址解析协议(arp)或媒体访问控制(MAC)的地址假冒攻击。
另一种潜在的联网危险是对中央化计算系统的使用。许多企事业中最常使用的节省开支的措施就是把所有的服务都集中于一个功能强大的机器上。这种方法会很省事,因为它比多服务器的配置要更好管理,而且开支也少。然而,中央化的服务器也给网络带来了单一失效点的问题。如果中央服务器被弱化了,这就会导致整个网络都变得无法使用,甚至造成数据被篡改或盗窃。在以上这些情况下,中央服务器就成为一个敞开的大门,允许任何人进入整个网络。
服务器安全和网络安全同等重要,这是因为服务器中常常贮存着机构内部的大量重要信息。如果一个服务器泄密了,其中的所有内容都可以被怪客随心所欲地利用。以下各节讨论了一些主要问题。
一个完全安装的红帽企业 Linux 包括1000个以上的应用程序和库软件包。不过,多数服务器管理员并不打算安装其中的每个软件包,而倾向于进行基本安装,再包括几个服务器程序。
多数被包括在默认安装中的服务器程序是稳定的、被全面测试过的软件。在生产然而,世界上并不存在完美无缺的软件,万事都有提高的余地。除此之外,由于更新的软件在生产环境中的使用时间不长,或者因为它没有其它服务器软件那么流行,它可能没有像人们所期待的一样被全面测试过。环境中被使用了多年后,这些软件的源码已经被全面精化,许多软件中存在的错误已被发现并修正。
然而,世界上并不存在完美无缺的软件,万事都有提高的余地。除此之外,由于更新的软件在生产环境中的使用时间不长,或者因为它没有其它服务器软件那么流行,它可能没有像人们所期待的一样被全面测试过。
开发者和系统管理员经常会在服务器程序中发现可被当作漏洞而利用的程序错误并在错误跟踪和安全相关的网站(如 Bugtraq 邮件列表:http://www.securityfocus.com)或计算机紧急响应组(CERT)的网站(http://www.cert.org)上公开这些信息。虽然这些机制是向社区发出安全弱点警告的有效方法,但它却要依靠管理员来及时地给各自的系统打补丁。如果怪客也能够获得同样的弱点跟踪服务,他们一有机会就会使用这些信息来攻击未加补丁的系统。优秀的系统管理要求你时刻警惕、时刻跟踪错误、并且进行正确的系统维护来保证安全的计算环境。
关于保持系统更新状态的详情,请参阅第 2.4 节 “安全更新”
忘记给系统打补丁的管理员是威胁服务器安全的最大因素。据系统管理网络和安全学院(System Administration Network and Security Institute,SANS)调查,计算机安全弱点的主要导致原因是“指派未经培训的人员来维护安全,并且不提供使其能够胜任的培训和时间”[1]。这不仅是指那些没有经验的管理员,也是指那些过分自信或自以为是的管理员。
某些管理员忘记了给他们的服务器和工作站打补丁,而另一些则忘记了查看来自系统内核或网络交通的日志消息。另一个常见错误是不改变服务的默认密码或密码。例如,某些数据库有默认的管理密码,因为数据库开发者假定系统管理员在安装后会立即改变这些密码。如果某个数据库管理员忘记了改变密码,甚至一个毫无经验的怪客也能够使用众所周知的默认密码来获得到数据库的管理特权。这里仅列举了几种漫不经心的管理会导致的服务器弱化情况。
如果所选的网络服务带有固有的不安全因素,即便是警惕性最高的组织也可能成为受害者。例如,许多服务是在用于可信任网络的假定条件下被开发的;然而,一旦这些服务可通过互联网被使用,这个假定条件就不适用了 — 互联网本身就带有固有的不可信任性。
还有一类不安全网络服务是那些需要用户名和密码来验证的服务。Telnet 和 FTP 就属于这类服务。如果分组嗅探软件正在监视远程用户和这类服务器间的交通,密码就能够被轻而易举地窃取。
以上提及的服务还会轻易地遭到安全行业称之为中间人”(man-in-the-middle)的攻击。在这类攻击中,怪客会设计让网络上的一个已攻破的名称服务器指向自己的机器而不是实际的目标服务器来重新导向网络交通。一旦某人打开了一个到该服务器的远程会话,怪客的机器就会充当一个隐型导管,悄悄地坐在远程服务和毫无疑心的用户间截取信息。怪客可以用这种方法来收集管理性密码和原始数据,服务器和用户对此却一无所知。
另一类不安全服务是网络文件系统和信息服务,如 NFS 或 NIS。它们是专门为使用 LAN 而开发的,但是不幸的是,后来又被扩展来包括 WAN(以方便于远程用户)。按照默认设置,NFS 没有配置任何验证或安全机制来防止怪客挂载 NFS 共享以便使用其中的任何数据。同样的,NIS 也有网络上的每个计算机都必须提供的重要信息,包括密码和文件权限。它们都存在于一个纯文本的 ACSII 或 DBM(ASCII-derived)数据库中。能够进入这个数据库的怪客就能够进入网络上的每个用户帐号,包括管理员的帐号。
工作站和家用电脑对攻击者的吸引力可能不会像网络或服务器那么大,但是由于其上经常包含保密信息,如信用卡信息,这些机器也被系统怪客看好。工作站还能够被怪客在协调的攻击中被用作“从属”机器,而其主人对此却一无所知。由于这些原因,了解工作站的弱点能够帮助用户避免重新安装操作系统的麻烦。
虽然管理员可能会有一个完全安全的、全面打过补丁的服务器,这并不意味着远程用户在进入它时就是安全的。例如,如果服务器提供经由公共网络的 Telnet 或 FTP 服务,攻击者可能会在纯文本用户名和密码在网络中经过时劫获它们,然后使用这个帐号信息来进入远程用户的工作站。
甚至在使用安全协议如 SSH 的时候,如果远程用户没有更新他们的客户程序,他们也可能遭受某些攻击。例如,使用 SSH 第一版本的用户就有可能遭受来自蓄意不良的 SSH 服务器的 X 转发攻击。一旦连接到了服务器上,攻击者就能够不动声色地截取客户通过网络进行的击键和鼠标点击。这个问题在 SSH 协议的第二版本中被修正了,但是它却要依赖于用户自身的自觉性,看他是否关注哪些应用程序有哪些弱点,并在必要时更新这些程序。
表 2.1 “常见的漏洞利用” 详细列举了某些最常见的漏洞利用以及入侵者用来进入组织内部网络资源的常用入口。避免这些常见漏洞被利用的关键是了解这些活动的进行方式,以及管理员应该如何保护他们的网络来免遭这类攻击。
漏洞利用 | 描述 | 备注 | |||
---|---|---|---|---|---|
空口令或默认口令 | 把系统管理口令设为空或使用产品生产商所设置的默认口令。虽然某些运行在 Linux 上的服务有默认的管理口令(红帽企业 Linux 5中并不包括),但这种情况多发生在硬件(如路由器和防火墙)产品中见。 |
|
|||
默认的共享密钥 | 安全服务有时会把用于开发或评估测试目的的默认安全密钥打入软件包内。如果这些密钥不经改变而被用于互联网上的生产环境,那么任何有相同默认密钥的用户都可以访问使用那个共享密钥的资源,以及其中的保密信息。 |
|
|||
IP 假冒(Spoofing) | 某个远程机器冒充您的本地网络上的一个节点。它在您的服务器上寻找弱点,并安装一个后门程序或特洛伊木马来获取对你的网络资源的控制。 |
|
|||
窃听 | 通过窃听网络中的两个活跃节点间的连接来收集它们之间传递的信息。 |
|
|||
服务弱点 | 攻击者在互联网上运行的某个服务中寻找缺陷或漏洞;通过这个弱点,攻击者可以攻击整个系统以及系统上的任何数据,甚至还能破坏网络上的其它系统。 |
|
|||
应用程序弱点 | 攻击者在桌面系统和工作站应用程序(如电子邮件客户程序)中寻找缺陷并执行任意程序编码、插入用于未来攻击行为的特洛伊木马、或者崩溃系统。如果被破坏的工作站拥有对整个网络的管理特权,还会发生进一步的漏洞利用。 |
|
|||
拒绝服务(DoS)攻击 | 攻击者或一组攻击者通过给目标机器(服务器、路由器或工作站)发送未经授权的数据来对某个机构的网络或服务器资源的攻击。这会迫使合法用户无法使用资源。 |
|
当发现了安全弱点后,您必须更新受到影响的软件以便把潜在的安全威胁限制在一定范围内。如果该软件是目前被支持的红帽企业 Linux 发行版本的一部分,红帽会保证尽快地发行修正弱点的更新软件包。在某个安全漏洞被宣布的同时通常会附带补丁(或修正问题的源码)。然后,该补丁就会被应用到红帽企业 Linux 软件包中,当它被红帽的质检组测试后就会作为勘误更新而被发行。然而,如果安全漏洞在宣布的时候没有附带补丁,红帽的开发人员就会和该软件的维护者合作来修正这个问题。当问题被修正后,该软件包会被测试并作为勘误更新而发行。
如果和您使用的软件有关的勘误更新被发行了,我们强烈建议您尽快更新受到影响的软件包,以便尽量缩短系统上存有潜在威胁的时间。
在更新系统上的软件包时,从可信任的地点下载软件更新至关重要。某个攻击者可以轻而易举地使用修正问题的同一版本号码来重新建构某个软件包,却在其中隐藏另一种安全漏洞,然后在互联网上发行。如果是这种情况,使用原始 RPM 来校验软件包这一方法就检测不到这个漏洞。因此,从可信任的地点(如红帽)下载 RPM,并检查软件包的签名来校验它的完好性这一点至关重要。
红帽提供了两种检索安全勘误更新的方法:
在红帽网络上列出并供下载
在红帽勘误网站上列出并供下载
从红帽企业 Linux 产品系列起,更新的软件包只能从红帽网络上下载。虽然红帽勘误网站包括了更新信息,但它不包括可下载的实际软件包。
红帽网络可以自动化大部分更新步骤。它会判断哪些软件包是您的系统必需的;并从一个安全的软件存储库中下载它们;校验 RPM 签名来确定它们没有被篡改;然后更新它们。软件包安装可以马上进行,也可以被安排在某一特定时间段内进行。
对于每台要更新的机器,红帽网络都需要一份系统配置档案(System Profile)。系统配置档案中包含了和系统相关的硬件和软件信息。该信息会被严格保密,绝不会泄漏给他人。它仅被用来判定每个系统上应该使用哪些勘误更新。没有它,红帽网络将无法判定系统所需的更新。当安全勘误(或任何一种类型的勘误)被发行后,红帽网络会发送一份电子邮件,其中不仅描述了该勘误,还列出了将会受到影响的系统。要应用更新,使用红帽更新代理或通过 http://rhn.redhat.com 网站来调度要更新的软件包。
红帽企业 Linux 中包括了 红帽网络警告提示工具。它是一个简便的面板图标, 当有注册的红帽企业版 Linux 系统更新时会显示提示。关于这个小程序的详情,请参考以下 URL:http://rhn.redhat.com/help/basic/applet.html
在安装任何安全勘误之前,请详细阅读包括在勘误报告内的特殊说明,并正确地执行它们。关于如何应用勘误更新的常规说明,请参阅第 2.4.1.5 节 “应用改变”。
当安全勘误报告被发行时,它们会在红帽勘误网站上公布:http://www.redhat.com/security/。通过这个网页选择您的系统和版本,然后选择网页上方的 「security」按钮来只显示红帽企业 Linux 的安全顾问。如果某个安全顾问中的概要所描述的是用在您的系统上的某个软件包,点击概要来阅读详情。
详情页描述了该安全漏洞,以及若要修正这个漏洞,除了升级软件包之外还必须要执行的其它步骤的特殊说明。
要下载更新的软件包,点击链接登录到红帽网络,然后点击软件包的名称,并把它们保存在硬盘驱动器上。极力推荐您创建一个新目录,如 /tmp/updates
,然后把所有下载的软件包放置在其中。
所有红帽企业 Linux 的软件包都使用红帽的 GPG 密钥进行签注。GPG 是 GNU Privacy Guard(GNU 隐私卫士)或 GnuPG 的缩写。它是被用来确保发行文件的真实性的自由软件。例如,红帽拥有的私人密钥(或保密的密钥)会锁住软件包,而公共密钥可以打开并校验软件包。如果在 RPM 校验过程中,被红帽发行的公共密钥和私人密钥不匹配,该软件包就可能被篡改了,因此不可信任。
红帽企业 Linux 中的 RPM 工具会在安装软件包前自动校验它的 GPG 签名。如果您没有安装 红帽 GPG 密钥钥,请从一个安全、静态的位置(如 红帽企业 Linux 安装光盘)上安装它。
假定光盘被挂载在 /mnt/cdrom
,使用以下命令来把它导入到您的钥匙圈上(keyring,系统上可信任密钥的数据库):
rpm --import /mnt/cdrom/RPM-GPG-KEY
要显示所有已安装的用于 RPM 校验的密钥列表,执行以下命令:
rpm -qa gpg-pubkey*
红帽密钥的输出会包括:
gpg-pubkey-db42a60e-37ea5438
要显示特定公钥的详情,使用 rpm -qi
命令以及前一命令的输出,如:
rpm -qi gpg-pubkey-db42a60e-37ea5438
在安装 RPM 文件前校验它的签名这一个步骤至关重要。只有这样才能确保这些文件没有从红帽软件包的发行版本中被篡改。要立刻校验所有已下载的软件包,使用以下命令:
rpm -K /tmp/updates/*.rpm
对于每个软件包,如果 GPG 钥匙校验成功,该命令会返回:gpg OK
。否则,确认您使用的是正确的红帽公共密钥,并校验其内容。没有通过 GPG 校验的软件包不应该被安装,因为它们可能已经被第三方篡改了。
校验了 GPG 密钥,并下载了所有和勘误报告有关的软件包后,在 shell 提示符下以根用户身份安装它们。
对多数软件包(除了内核软件包外)来说,您可以使用以下命令来安全地安装:
rpm -Uvh /tmp/updates/*.rpm
对于内核软件包,请使用以下命令:
rpm -ivh /tmp/updates/<kernel-package>
把前一个例子中的 <kernel-package>
改成内核 RPM 的名称。
一旦系统使用新内核被安全引导后,你可以使用以下命令来删除老内核:
rpm -e <old-kernel-package>
把前一个例子中的 <old-kernel-package>
改成老内核 RPM 的名称。
您不必删除老内核。默认的引导装载程序 GRUB 允许您安装多个内核,然后在引导时从菜单中选择要引导的内核。
在安装任何安全勘误之前,请详细阅读包括在勘误报告内的特殊说明,并正确地执行它们。关于如何应用勘误更新的常规说明,请参阅第 2.4.1.5 节 “应用改变”。
通过红帽网络或红帽勘误网站下载并安装了安全勘误后,停用旧有软件、使用新软件这一点很重要。怎么做到这一点要根据您的软件类型而定。以下的列表详细列举了软件的一般类别,并为更新软件包后使用被更新的版本提供了说明。
通常说来,重新引导系统是保证所用软件版本是最新版本的最肯定方法;但是,系统管理员并不总是能够使用这个办法。
用户空间的应用程序是指能够被系统用户引发的任何程序。通常,这类程序只有在某用户、脚本、或自动化任务工具启动它们时才被使用,而且并不持续运行很久。
当这类用户空间的应用程序被更新后,停运系统上该程序的所有实例,然后再重新启动它来使用更新的版本。
内核是红帽企业 Linux 操作系统的核心软件组成部分。它管理内存、处理器和外设的使用,并进行所有的任务调度。
由于这种核心角色,您不可能不停运计算机而重新启动内核。因此,在系统被重新引导前,更新的内核版本就无法被使用。
共享函数库是一组程序代码的集合,例如 glibc
被许多应用程序和服务所使用。使用共享库的应用程序通常在初始化的时候载入共享编码,因此使用已更新的共享库的应用程序必须停止并重新启动。
要判定哪些链接到某个共享库的应用程序正在运行,使用 lsof
命令,如:
lsof /usr/lib/libwrap.so*
该命令返回一个使用 TCP 会绕程序来进行主机访问控制的所有正在运行的程序的列表。因此,如果 tcp_wrappers
软件包被更新,所有在这里列出的程序都必须被停运并重新启动。
SysV 服务是在引导过程中启动的驻留内存的服务器程序。SysV 服务的例子包括:sshd
、vsftpd
、和 xinetd
。
因为只要机器被启动了,这些程序就通常持久性地滞留在内存中,所以每个更新了的 SysV 服务在软件包升级后必须被停运并重新启动。你可以使用 服务配置工具来做到,或以根用户的身份运行一个 shell,然后使用 /sbin/service
命令,如:
/sbin/service <service-name>
restart
在前面的例子中,把 <service-name>
改成服务的名称,如 sshd
。
xinetd
服务
由 xinetd
这个超级服务控制的服务只有在有活跃连接时才运行。由 xinetd
控制的服务包括:Telnet、IMAP 和 POP3。
因为这些服务的新实例是在每次 xinetd
收到新请求时被启动的,升级后的连接就会由已更新的软件来处理。然而,如果由 xinetd
控制的服务在被升级时还存在着一些活跃连接的话,这些连接就会由软件的老版本处理。
要停止某个 xinetd
控制的服务的旧实例,升级该服务的软件包,然后停止所有当前正在运行的进程。使用 ps
命令来判定进程是否在运行,再使用 kill
或 killall
命令来停运该服务的所有当前实例。
例如:如果 imap
软件包的安全勘误被发行了,升级这些软件包,然后以根用户身份在 shell 提示符下键入以下命令:
ps -aux | grep imap
该命令返回所有活跃的 IMAP 会话。使用以下命令可以中止单个会话:
kill <PID>
如果这个命令无法中止会话,使用以下命令:
kill -9 <PID>
在前面的例子中,把 <PID>
替换为 IMAP 会话的进程号码(在 ps
命令输出的第二列)。
要中止所有活跃的 IMAP 会话,使用以下命令:
killall imapd
当一个系统被用作公开网络的服务器时,这个系统就成为被攻击的目标。因此,对系统管理员来说,能够使该系统坚固并能锁定某些服务是极为重要的。
在深入研究具体问题之前,让我们先总览一下增强服务器安全的一些有用的建议:
及时更新所有服务项目以便保护系统不受到最新威胁。
尽最大可能使用安全协议。
尽最大可能给一台机器只提供一种类型的网络服务。
对所有服务器严格监控,以便及时发现可疑活动。
TCP Wrappers 为多种不同的服务提供访问把关的功能。大多数现代网络服务系统,像 SSH、Telnet、和 FTP,都利用 TCP Wrappers 在外来进入系统的请求和被请求的服务器之间设立防范。
如果 TCP Wrappers 和 xinetd
一起联合使用,TCP Wrappers 的功能就会增强,因为xinetd
作为超级服务器可以为系统就访问、登录、捆绑、重定向和资源利用方面提供额外的服务享有权控制。
下面几部分就当作我们已经对各个话题都有了基本知识,都会集中探讨具体的安全项目。
TCP Wrappers 除了可以提供对种种服务的拒绝享有功能以外,还可以提供许多其他功能。这一部分阐述如何运用 TCP Wrappers 发送标示连接的旗帜,或从某些特定的主机上发送可能受到攻击的警示,以及如何增强登录功能。关于 TCP Wrapper 函数和所用语言,如需要更多信息,请参照 hosts_options
man page。
当用户连接到服务器时,用合适的旗帜标示显示其连接是一种很好的方式,可以让潜在的袭击者知道本系统管理员很有警惕性。你也可以控制关于系统什么样的信息可以呈现给用户。要想为一项服务设置一个 TCP Wrappers 旗帜标示,请使用 banner
选项。
这个例子为 vsftpd
设置一个旗帜标示。首先,创建一个旗帜标示文件,可以储存在系统的任何地方,但必须与其守护进程同名。例如,该文件命名为 /etc/banners/vsftpd
并包含下面一行:
220-Hello, %c 220-All activity on ftp.example.com is logged. 220-Inappropriate use will result in your access privileges being removed.
%c
权标可提供客户的多种信息,比如用户名和主机名,或用户名和 IP 地址,也许这样会使该连接更让人觉得有胁迫感。
要想使该旗帜在有外来连接进入时显示,请在 /etc/hosts.allow
文件上加上下面一行:
vsftpd : ALL : banners /etc/banners/
如果测出某个特定主机或网络袭击服务器,可以用 TCP Wrappers 通过spawn
命令警示系统管理员,随后可能会有从那个主机或网络而来的袭击。
在这个例子中,假设测出从 206.182.68.0/24 网络来的一个黑客试图袭击该服务器。请在文件 /etc/hosts.deny
里加上下面一行,从而拒绝从那个网络发出的任何尝试连接的信息,并将其试图连接的信息储存在一个特殊文件里:
ALL : 206.182.68.0 : spawn /bin/ 'date' %c %d >> /var/log/intruder_alert
%d
权标提供黑客试图访问的服务器所提供服务的名称。
要想接受该连接请求并允许登录,请在 /etc/hosts.allow
文件里加上 spawn
命令。
一旦某个特定的客户试图连接服务器, spawn
命令可以执行任何 shell 命令,并创建一个特殊脚本来通知系统管理员或执行一连串的命令。
如果某些类型的连接比另外一些更值得关注,可以用 severity
命令选项给更值得关注的服务的登录级别升级。
这个例子中,假设来自 FTP 服务器并试图连接 23 端口(即Telnet 端口)的任何人都是黑客。要标记这些黑客,在登录文件中放置emerg
标志,而不是用默认的info
标志,并且要拒绝其连接请求。
要做到这一点,在 /etc/hosts.deny
文件里加上下面的命令行:
in.telnetd : ALL : severity emerg
虽然仍使用默认的 authpriv
登录设施,其登录优先级别却从默认的 info
升级到 emerg
,后者将登录讯息直接记入到控制台。
这部分集中讨论如何用 xinetd
设立软中断(trap)服务并如何用它控制其拥有的资源级别。为服务器设置资源限制级别可以帮助阻止Denial of Service(服务中断) (DoS) 的袭击。要想查看可以使用的命令行选项列表,请参考 man pages 的 xinetd
和 xinetd.conf
部分。
xinetd
命令的一个重要特点是其将不同主机加在 no_access
全球列表上的能力。该列表上的主机会在特定的时间段内或直到 xinetd
重新被启动后都会被拒绝其随后的连接到由 xinetd
管理的各项服务项目的请求。要做到这一点,你可以利用 SENSOR
的属性,这是一种阻断主机试图扫描服务器端口的简单方法。
设立 SENSOR
命令的第一步是选择一项你不打算使用的服务。这个例子中,我们选择了Telnet。
编辑文件 /etc/xinetd.d/telnet
并改变flags
行,见如下:
flags = SENSOR
加上下面一行:
deny_time = 30
这样的话,在 30 分钟内那个主机要连接那个端口的任何进一步请求都会遭到拒绝。 deny_time
命令可接受的其他命令行属性值是 FOREVER 和 NEVER,FOREVER 使那个主机要连接那个端口的任何进一步请求一直到 xinetd
命令重新启动后都会遭到拒绝;而 NEVER 允许那个主机连接到那个端口并让其登录。
最后,最后一行应该是:
disable = no
这会启动该软中断服务。
尽管使用 SENSOR
来探测和终止来自不受欢迎的各种主机的连接是一种很好的方式,但这种方式也有两个缺点:
不能阻止秘密的扫描。
如果一个袭击者知道 SENSOR
正在运行,他可以通过伪造 IP 地址的方式对某些特定主机挂载 Denial of Service (服务中断)的袭击,从而连接到被禁止的端口上。
xinetd
命令的另一个重要特征是它能够对其管辖的服务设定资源限制。
用下列命令来做到这一点:
cps = <number_of_connections> <wait_period>
— 限制外来连接的速度。这个命令有两个参数:
<number_of_connections>
— 每分钟能够处理的连接数目。如果处理外来连接的速度高于这个数目,该服务就会暂时中断。默认值是 50。
<wait_period>
— 服务中断几秒中之后才能重新启动该服务。其默认间隙是 10 秒钟。
instances = <number_of_connections>
— 指明一项服务所能允许的连接总数。这项命令接受任何整数数值或 UNLIMITED
。
per_source = <number_of_connections>
— 指明一台主机所能允许的一项服务的连接总数。这项命令接受任何整数数值或 UNLIMITED
。
rlimit_as = <number[K|M]>
— 以千字节或 MB 为单位指明该服务所占用的内存空间。这项命令接受任何整数数值或 UNLIMITED
。
rlimit_cpu = <number_of_seconds>
— 以秒为单位指明一项服务所占用 CPU 的时间总量。这项命令接受任何整数数值或 UNLIMITED
。
使用这些命令可以帮助防止任何某个 xinetd
命令会使系统超负荷运行,从而导致服务中断。
portmap
服务是一项动态的关于端口分配的守护进程,用于 RPC 服务,比如 NIS 和 NFS。这项程序的验证机制比较弱,能够为其控制下的服务分配大量的端口。正因为如此,保证其安全就比较困难。
与 portmap
安全相关的是 NFSv2 和 NFSv3 的运行,因为 NFSv4 已经不需要 portmap
了。如果你打算使用 NFSv2 或 NFSv3 服务器的话,portmap
是需要的,那么下面的章节就对你有用了。
运行 RPC 服务时,请遵守这些基本原则。
因为 portmap
服务没有内置式的验证机制,因此使用 TCP Wrappers 来限制哪些网络或主机可以享有 portmap
服务是很重要的。
另外,当需要限制某些主机享有该服务时,写入命令时 只 用它们的 IP 地址,不要用主机名称,因为主机名称可以通过毒化 DNS 和其他方式进行伪造。
为了进一步限制某些网络享有 portmap
服务,在服务器上增加 iptables 规则是一个很好的注意,这样可以限制某些特定网络的进入。
下面是两个 iptables 命令的例子。第一个命令允许 TCP 通过 192.168.0.0/24 网络连接到 111 端口(该端口由 portmap
服务使用)。第二个命令允许 TCP 通过本地主机连接到同一个端口 111。这对由 Nautilus 使用的 sgi_fam
命令来说是必要的。其它的软件包就不需要了。
iptables -A INPUT -p tcp -s! 192.168.0.0/24 --dport 111 -j DROP iptables -A INPUT -p tcp -s 127.0.0.1 --dport 111 -j ACCEPT
以类似的方式限制 UDP 传输,请使用下面的命令。
iptables -A INPUT -p udp -s! 192.168.0.0/24 --dport 111 -j DROP
Network Information Service(网络信息服务) (NIS) 是一项 RPC 服务,叫作 ypserv
,-->,这项服务和 portmap
以及其它相关服务联合使用来分配关于自称某域名下任何计算机的用户名、用户密码、和其它敏感信息。
一个 NIS 服务器由几个应用程序组成,这些应用程序有:
/usr/sbin/rpc.yppasswdd
— 也叫 yppasswdd
服务,这项守护进程允许用户们改变他们的 NIS 密码。
/usr/sbin/rpc.ypxfrd
— 也叫 ypxfrd
服务,这项守护进程负责 NIS 图在网络上转移。
/usr/sbin/yppush
— 这项应用程序将改变过的 NIS 数据库传播到多个 NIS 服务器。
/usr/sbin/ypserv
— 这就是 NIS 服务器的守护进程。
按今天的标准 NIS 从某种程度上来说似乎不安全。NIS 不但没有主机验证机制,而且其所有信息包括密码一类的散列信息都以不加密的形式在网络上传输。因此,如果用 NIS 建立一个网络,一定要特别小心。另外还有一个事实让这种小心非常必要,那就是:NIS 系统的默认配置有其内在的不安全性。
我们建议,任何人如果要使用 NIS 服务器,首先应该按 第 3.1.2 节 “使 Portmap 安全 ” 中列出的项目使 portmap
服务安全,然后还要注意下列事项,比如网络规划。
因为 NIS 以不加密的形式在网络上传送敏感信息,因此要让该服务在防火墙后面且在分段和安全的网络上进行是很重要的。每当 NIS 信息在不安全的网络上传送时,都有被窃听或截取的危险。精心的网络规划能帮助防止出现严重的安全问题。
NIS 域名下的任何机器都能够无须验证地通过执行命令在服务器上提取信息,只要这个用户知道 NIS 服务器的 DNS 主机名和 NIS 域名。
例如,如果有人或是通过连接手提电脑或是从外界(设法编造一个内部 IP 地址)闯入该网络,下面的命令会揭示其 /etc/passwd
图:
ypcat -d<NIS_domain>
-h<DNS_hostname>
passwd
如果这个袭击者是个根用户,他便可以通过键入如下的命令获得 /etc/shadow
文件:
ypcat -d<NIS_domain>
-h<DNS_hostname>
shadow
如果使用的是 Kerberos 的话,/etc/shadow
文件不储存在 NIS 图内。
为了使袭击者更难于接近 NIS 图,可以把 DNS 主机名称加上一串任意字符,比如 o7hfawtgmhwg.domain.com
。同样,也可以用另一个 不同 的任意字符串命名 NIS 域名。这样的话,袭击者要想袭击 NIS 服务器就会困难得多。
如果 /var/yp/securenets
文件没有内容,或根本不存在(默认安装后的情况就是这样)NIS 对所有网络都进行监听。首先要做的事情便是给该文件加上网络掩码,这样,ypserv
就只对来自合法网络的请求作出反应。
下面是 /var/yp/securenets
文件的一个输入范例:
255.255.255.0 192.168.0.0
第一次运行 NIS 服务器之前,千万要先创建 /var/yp/securenets
文件。
这项技术虽然不能保护系统不受假冒 IP 的袭击,但至少可以限制哪些网络可以享有 NIS 服务器的服务。
所有与 NIS 相关联的服务器都可以分配到一些特定的端口,除 rpc.yppasswdd
— 之外,这是一项允许用户们改变其登录密码的守护进程。给另外两个 NIS 服务器守护进程即 rpc.ypxfrd
和 ypserv
分配端口,允许防火墙规则的创建以便进一步保护 NIS 服务器守护进程不受外来者的袭击。
为达此目的,请在 /etc/sysconfig/network
文件里加上下面几行:
YPSERV_ARGS="-p 834" YPXFRD_ARGS="-p 835"
下面的 iptables 规则可以用来实现服务器到底要对哪个网络下的这些端口进行监听:
iptables -A INPUT -p ALL -s! 192.168.0.0/24 --dport 834 -j DROP iptables -A INPUT -p ALL -s! 192.168.0.0/24 --dport 835 -j DROP
这就意味着如果连接请求来自 192.168.0.0/24 网络,该服务器只允许这个网络连接到端口 834 和 835,不管它使用什么协议。
当 NIS 用来作验证用时,需要考虑的问题之一是,每当用户登录到机器上,来自 /etc/shadow
图上的一个密码散列信息就会通过网络发送出去。如果一个外侵者进入到某个 NIS 域内,嗅探网络业务流通量,他便可以收集用户名和密码散列信息。如果有充足的时间,使用密码破译程序可以破解一些保密性差的密码,那么这个外侵者便可以通过一个有效帐户进入网络。
红帽企业版 Linux 的 NFS 版本即 NFSv4 已经不需要 第 3.1.2 节 “使 Portmap 安全 ” 中列出的portmap
服务。现在 NFS 通信所有版本都使用 TCP 而不是 UDP。使用 NFSv4 时需要 TCP。 现在 Kerberos 用户 和组验证已经作为 RPCSEC_GSS
核心模块的部分被包括在 NFSv4 中。关于 portmap
的信息也包括在内,因为红帽企业版 Linux 也支持 NFSv2 和 NFSv3,这两者都使用 portmap
。
现在 NFSv4 有能力使用 Kerberos 通过网络将信息以加密的形式传送,这项服务的正确配置是很重要的,即该服务要么在防火墙后要么在分段式网络上运行。NFSv2 和 NFSv3 传送数据时仍然不够安全,这一点应该引起注意。在这些方面进行谨慎的网络设计可以帮助防止出现安全问题。
NFS 服务器通过咨询 /etc/exports
文件从而决定输出哪种文件系统以及用哪些主机导出这些目录。在编辑这个文件时注意不要增加任何额外的空格。
例如,在 /etc/exports
文件中的下面一行与主机 bob.example.com
享有同一个目录 /tmp/nfs/
,并有读取/写入权限。
/tmp/nfs/ bob.example.com(rw)
然而,在 /etc/exports
文件中的下面一行与主机 bob.example.com
享有同一个目录,只有读取权限;而与 world 也享有同一个目录,却有读取/写入权限,只因在主机名称后面多了一个空格字符。
/tmp/nfs/ bob.example.com (rw)
使用 showmount
命令来检查任何 NFS 配置中的共享成分以及用此来验证什么是共享的成分是一项很好的练习。
showmount -e <hostname>
作为默认值,NFS 会把根用户变成 nfsnobody
用户,即一个不享有任何特权的用户帐户。这样就把从根目录创建的文件归列在拥有者 nfsnobody
的名下,这样就阻止了用户上载有 setuid 位设定的程序。
如果使用 no_root_squash
的话,远程根用户就能在共享的文件系统内修改任何文件,并且使应用程序处于特洛伊木马病毒感染状态,以使其他任何用户不至于无意中执行这些应用程序。
Apache HTTP 服务器是红帽企业版 Linux 所提供的最稳定最安全的服务之一。有大量的方法和技术使 Apache HTTP 服务器运行安全,同时,这方面也有许多可以深入探究的东西。
系统管理员在使用下列配置选项时一定要小心:
默认情况下这个指示命令处于执行状态,所以为 Web 服务器的文件根创建符号链接时一定要小心。例如,为 /
创建符号链接就不是一个好主意。
默认情况下这个指示命令处于执行状态,但也许我们并不希望执行这项命令。要想阻止来访者浏览服务器上的文件,那就删除这个指示命令。
默认情况下 UserDir
指示命令处于非执行状态,因为执行该命令可以确认系统上一个用户帐户的存在。要使用户能够在服务器上浏览目录,使用下面的命令:
UserDir enabled UserDir disabled root
这些命令激活用户浏览目录功能,用户可以浏览除 /root/
之外的所有目录。如果想要使某些用户不能浏览目录,就在 UserDir disabled
命令行中加上用户名列表,用户名之间以空格隔开。
作为默认值,Server-Side Includes (SSI) 模块不能执行命令。建议你除非绝对必要不要改变这一设定,因为如果改变的话就有可能使潜在的袭击者能够在该系统上执行命令。
File Transport Protocol(文件传输协议) (FTP) 是一项比较旧的 TCP 协议,用来在网络上传送文件。因为与服务器之间的所有事务,包括用户验证事务,都是不加密的,所以这项协议被认为是一项不安全的协议,需要精心地配置。
红帽企业版 Linux 提供三种 FTP 服务器。
gssftpd
— 是一项兼容 Kerberos xinetd
为基础的 FTP 守护进程,这项守护进程不在网络上传送验证信息。
Red Hat Content Accelerator(红帽内容搜索加速器) (tux
) — 是一个带有 FTP 功能的内核空间网络服务器。
vsftpd
— 是一项独立的并且以安全运行为导向的 FTP 服务。
设定 vsftpd
FTP 服务时,要遵守下面的一些安全指导原则。
在提交用户名和密码之前,所有用户都会收到一个问候旗帜。作为默认值,这个旗帜含有版本信息,对黑客试图寻找系统中的弱点会有帮助。
要想用 vsftpd
来替代问候旗帜,就在/etc/vsftpd/vsftpd.conf
文件里加上下面的命令:
ftpd_banner=<insert_greeting_here>
在上面的命令中用问候讯息文本替代 <insert_greeting_here>
。
如果是多行旗帜,最好使用一个旗帜文件。为了使多种不同旗帜便于管理,把所有旗帜放在一个叫/etc/banners/
的新目录下。这个例子中,/etc/banners/ftp.msg
就是进行 FTP 连接的旗帜文件。要知道这样的文件看上去是什么样的,请看下面的例子:
######### # Hello, all activity on ftp.example.com is logged. #########
第 3.1.1.1.1 节 “TCP Wrappers 和 连接旗帜(Connection Banners)” 中指明,不需要在文件的每一行都以 220
开始。
要在 vsftpd
中引用这个问候旗帜文件,请在 /etc/vsftpd/vsftpd.conf
文件里加上下面的命令:
banner_file=/etc/banners/ftp.msg
第 3.1.1.1.1 节 “TCP Wrappers 和 连接旗帜(Connection Banners)” 中描述道:使用 TCP Wrappers 向进入系统的连接寄送额外的旗帜也是可能的。
/var/ftp/
目录的存在激活匿名帐户。
创建该目录最简单的方式是安装 vsftpd
软件包。这个软件包为匿名用户建立一个目录树并且在各级目录中设置匿名用户的权限为只读用户。
默认情况下,匿名用户不能在任何目录下写入信息。
如果允许对 FTP 服务器的匿名访问,应该了解敏感数据储存的地方。
要想允许匿名用户上载文件,建议在 /var/ftp/pub/
目录下创建一个 write-only(只写)目录。
要创建这个只写目录,请键入下面的命令:
mkdir /var/ftp/pub/upload
接下来,要想使匿名用户无法浏览该目录的内容,那就改变其权限:
chmod 730 /var/ftp/pub/upload
该目录的详细列表看起来应该是这样的:
drwx-wx--- 2 root ftp 4096 Feb 13 20:05 upload
允许匿名用户在各目录下读取和写入的系统管理员常常发现他们的服务器简直成了盗用软件的储存库。
另外,请在 vsftpd
目录下的/etc/vsftpd/vsftpd.conf
文件里加上下面一行:
anon_upload_enable=YES
因为 FTP 验证用户时在不安全的网络上传输不加密的用户名和密码,因此最好拒绝用户从他们的用户帐户对服务器进行系统用户访问。
要想使 vsftpd
中的所有用户帐户无法做系统访问,那就在 /etc/vsftpd/vsftpd.conf
中加上下面的命令:
local_enable=NO
关于用 TCP Wrappers 来控制对任何 FTP 守护进程的访问,第 3.1.1.1 节 “用 TCP Wrappers 提高安全性能”中有所概述。
Sendmail 是一个用 Simple Mail Transport Protocol(简单邮件传输协议)(SMTP) 在邮件传输中介( Mail Transport Agent,即MTA)和邮件客户或传送中介之间递送电子讯息的 MTA。尽管很多 MTA 能够对传递的信息加密,大多数的 MTA 却不能加密。因此通过公共网络发送邮件被认为是一种带有固有不安全性的交流方式。
建议任何打算使用 Sendmail 服务器的人们都需要搞清楚下面的事项。
由邮件的性质决定,一个袭击者如果决意要袭击服务器的话,他可以比较容易地用大量的邮件来淹没服务器从而导致服务中断。如果在 /etc/mail/sendmail.mc
中设定一些限制,那么对服务器进行如此袭击的成功率就得到了限制。
confCONNECTION_RATE_THROTTLE
— 服务器每秒钟可以接受连接的数目。默认情况下,Sendmail 不限制接受连接的数目。如果设定数目限制的话,达到设定数目后的连接会被延迟。
confMAX_DAEMON_CHILDREN
— 服务器可以处理的子进程的最大数目。默认情况下,Sendmail 不为处理的子进程数目设定限制。如果设定数目限制的话,达到设定数目后的连接会被延迟。
confMIN_FREE_BLOCKS
— 服务器用来接收邮件的最小空闲空间块数,默认值是 100 块。
confMAX_HEADERS_LENGTH
— 能够接受的邮件讯息标题最大值(以字节数为单位)。
confMAX_MESSAGE_SIZE
— 能够接受的单个邮件讯息最大值(以字节数为单位)。
千万不要把邮件假脱机目录 /var/spool/mail/
放在 NFS 共享的容量中。
因为 NFSv2 和 NFSv3 对用户和用户组的身份不进行验证,两个或多个用户有可能会拥有同样的 UID,这样他们就能够接到并阅读所有寄给他们中任何一个的邮件。
而 NFSv4 使用 Kerberos,情况就不同了。因为 SECRPC_GSS
内核模块不使用以 UID 为基础的身份验证。然而,我们仍然建议 不要 把邮件假脱机目录放在 NFS 共享的容量中。
配置好网络服务后,关注哪些端口实际上在系统网络界面上进行监听是很重要的。任何打开的端口都有可能是侵入窃密的证据。
要探测哪些端口在网络上进行监听有两种基本方法。其中不太可靠的方法是使用像 netstat -an
或 lsof -i
一样的命令查询网络栈式储存器。这种方法不够可靠,是因为这些查询程序不是通过网络连接到机器上的,反而成了检查系统上运行的是什么。正因为这个原因,这些应用程序常常成为袭击者不断替代的目标。黑客们试图通过打开未授权的网络端口并用他们自己的修改过的命令版本来替代 netstat
和 lsof
以便起到掩盖其踪迹的作用。
一个比较可靠的探测哪些端口在网络上进行监听的方法是使用像 nmap
一样的端口扫描仪。
从控制台上发出的下列命令能够确定哪些端口在监听来自网络的 TCP 连接:
nmap -sT -O localhost
这项命令的输出信息看上去如下:
Starting nmap 3.55 ( http://www.insecure.org/nmap/ ) at 2004-09-24 13:49 EDT Interesting ports on localhost.localdomain (127.0.0.1): (The 1653 ports scanned but not shown below are in state: closed) PORT STATE SERVICE 22/tcp open ssh 25/tcp open smtp 111/tcp open rpcbind 113/tcp open auth 631/tcp open ipp 834/tcp open unknown 2601/tcp open zebra 32774/tcp open sometimes-rpc11 Device type: general purpose Running: Linux 2.4.X|2.5.X|2.6.X OS details: Linux 2.5.25 - 2.6.3 or Gentoo 1.2 Linux 2.4.19 rc1-rc7) Uptime 12.857 days (since Sat Sep 11 17:16:20 2004) Nmap run completed -- 1 IP address (1 host up) scanned in 5.190 seconds
这种输出信息表明由于 sunrpc
服务的存在,该系统正在运行 portmap
。然而,也发现 834 端口上有一项神秘的服务。要想检查这个端口是否进行的都是系统已知的并且已列出的公务,请键入:
cat /etc/services | grep 834
这个命令没有调出任何输出信息。这就表明虽然端口处于专用区间(即 0 到 1023),需要有根用户权限才能打开,这项服务不是系统可以辨认的已知服务。
然后,用 netstat
或 lsof
检查端口的信息。若用 netstat
检查端口 834,请键入下面的命令:
netstat -anp | grep 834
该命令调出下面的输出信息:
tcp 0 0 0.0.0.0:834 0.0.0.0:* LISTEN 653/ypbind
netstat
调出的信息中这个打开的端口的存在让人感到放心一些,因为如果是黑客偷偷地非法闯进系统并打开端口的话,那他是不大可能会让这个端口通过这个命令显示的。而且,[p]
选项显示打开该服务端口的 ID 验证过程(PID)。这个例子中,打开的端口属于 ypbind
(NIS),是一项与 portmap
服务一起联合运行的 RPC 服务。
lsof
命令也能够把打开的端口与其服务相关联,显示与 netstat
命令类似的信息:
lsof -i | grep 834
这个命令输出信息的相关部分如下:
ypbind 653 0 7u IPv4 1319 TCP *:834 (LISTEN) ypbind 655 0 7u IPv4 1319 TCP *:834 (LISTEN) ypbind 656 0 7u IPv4 1319 TCP *:834 (LISTEN) ypbind 657 0 7u IPv4 1319 TCP *:834 (LISTEN)
这些工具显示很多有关机器上正在运行服务的状态信息。这些工具不但用起来灵活,而且能提供关于网络服务配置的大量信息。如需要更多信息,请参考 man pages 的 lsof
、netstat
、 nmap
和 services
部分。
使用身份验证的方法来验证用户身份从而为用户分配对系统访问权限的程序(也就是确定用户自称的身份)。
在过去,每个程序都会使用自己的方法来对用户身份进行验证。在 红帽企业 Linux 中,多数程序被配置使用一个集中化的用户身份验证方法叫作 可插入验证模块(Pluggable Authentication Modules) (PAM)。
PAM 使用一个可插入式的、模块化的结构。它为系统管理员设置用户身份验证政策提供了很大的灵活性。
在多数情况下,一个支持 PAM 的应用程序的默认 PAM 配置文件就可以满足一般的要求。但是在一些情况下,还是需要对 PAM 配置文件进行特殊的配置。因为如果对 PAM 进行了错误的配置可能会导致系统的安全性被破坏,所以在对这些文件进行配置前必须对这些文件的结构有一定的了解。请参阅 第 3.2.3 节 “PAM 配置文件的格式” 来获得更详细的信息。
PAM 提供了以下优越性:
可以被多种应用程序使用的常用用户身份验证计划。
为系统管理员和应用程序开发者在进行用户身份验证处理时提供了极大的灵活性。
包括了一个有详细记录的、单一的程序库,这个程序库使开发者们不需要再开发自己的用户身份验证系统。
/etc/pam.d/
目录包括所有支持 PAM 应用程序的 PAM 配置文件。以前的 PAM 版本使用 /etc/pam.conf
文件,但现在这个文件已经过时,只在 /etc/pam.d/
目录不存在时才被使用。
每个 PAM 配置文件都包括一组有以下格式的命令:
<module interface>
<control flag>
<module name>
<module arguments>
这些项在以下章节中被介绍。
当前有四类可用的 PAM 模块接口。每类接口分别代表了用户身份验证的不同方面:
auth
— 这个模块接口被用来验证。例如,它需要一个密码并验证密码是否正确。带有这个接口的模块也可以设置许可证,如组群成员或 Kerberos 令牌。
account
— 这个模块接口被用来验证所允许的访问。例如,检查一个用户帐号是否已经过期;或一个用户是否被允许在一天的某个特定的时间进行登录。
password
— 这个模块接口被用来改变用户的密码。
session
— 这个模块接口被用来配置并管理用户会话。带有这个接口的模块也可以进行允许访问所需的额外任务,如挂载用户的主目录,使用户的邮箱有效。
一个单独的模块可以包括一个或多个模块接口。例如,pam_unix.so
包括了所有四个模块接口。
在一个 PAM 配置文件中,模块接口是第一个定义的项。一般的配置文件都会有与以下形式类似的行:
auth required pam_unix.so
它告诉 PAM 使用 pam_unix.so
模块的 auth
接口。
模块界面命令可以被 堆积(stacked) 或在一个上面堆放另一个,这样多个模块可以被一起使用来实现一个目的。如果一个模块的控制标识值使用 "sufficient" 或 "requisite"(请参阅 第 3.2.3.2 节 “控制标识旗(Control Flag)” 来获得详细信息),那么模块排列的顺序对用户身份验证的过程就非常重要。
系统管理员要求先有特定的条件存在才允许用户进行身份验证,堆积命令可以使这个过程更容易。例如,reboot
命令通常使用一组堆积模块,请看下面的 PAM 配置文件:
[root@MyServer ~]# cat /etc/pam.d/reboot #%PAM-1.0 auth sufficient pam_rootok.so auth required pam_console.so #auth include system-auth account required pam_permit.so
第一行是注释行,不会被处理。
auth sufficient pam_rootok.so
— 这一行使用 pam_rootok.so
模块来检查当前用户是否是根用户,检查它们的 UID 是否为 0。如果通过了这个检查,将不再咨询其它模块命令就会被执行。如果不能通过检查,将咨询下一个模块。
auth required pam_console.so
— 这一行使用 pam_console.so
模块来对用户身份进行验证。如果这个用户已经通过终端登录,pam_console.so
会检查在 /etc/security/console.apps/
目录下是否有和这个服务名 (reboot) 相同名称的文件。如果有这个文件,验证就会成功,控制权会被传递到下一个模块。
#auth include system-auth
— 这是一个注释行,不会被处理。
account required pam_permit.so
— 这一行使用 pam_permit.so
模块来允许根用户或在这个控制台登录的任何用户重新启动这个系统。
所有的 PAM 模块在被调用后都会产生一个成功或失败的结果。控制标识旗会指示 PAM 根据结果下一步怎么办。模块可以以特定的顺序进行堆积排列,控制标识旗决定一个特定模块对用户验证成功或失败整个过程的重要性。
有四个预先定义好的控制标识旗:
required
— 要使验证过程继续,这个模块的结果必须是成功。如果这一步的测试失败,用户不会马上被通知,他们会在所有模块的测试都完成后才会被通知。
requisite
— 要使验证可以继续进行,这个模块的结果必须是成功。然而,如果这一步测试失败,用户会被马上通知,而通知的信息中包括了第一个失败了的 required
或requisite
模块测试。
sufficient
— 如果模块验证失败,其结果就不会被理会。但是,如果一个被标识为 sufficient
的模块成功 并且 前面没有任何标识为 required
的模块验证失败,那么用户就通过验证可以使用这个服务,无需其它任何验证结果。
optional
— 模块结果不被理会。被标识为 optional
的模块只有在这个界面中没有引用其它模块时才成为验证成功所必须的。
required
模块被调用的顺序并不重要。只有控制标识旗为 sufficient
和 requisite
的模块的调用顺序才变得重要。
PAM 现在可使用一个更新的、可以进行更准确控制的控制标识旗语法。
pam.d
man page 和 PAM 的文件编辑位于 /usr/share/doc/pam-
目录下,其中的 <version-number>
/<version-number>
是你系统上的 PAM 的版本号,这里相信描述了这个更新的语法。
模块名为 PAM 提供了包括特定模块界面的可插入模块的名称。在较老版本的 红帽企业 Linux 中,PAM 配置文件包括模块的完全路径。但是,自从使用了 multilib 系统(它把64位的 PAM 模块存储在 /lib64/security/
中),目录名就可以被省略,应用程序会被连接到适当的 libpam
版本,它可以定位这个模块的正确版本。
在为一些模块进行验证时,PAM 使用参数来把信息传递给一个可插入模块。
例如,pam_userdb.so
模块使用存储在一个 Berkeley DB 文件中的信息来验证用户。Berkeley DB 是一个开源的数据库系统,被内置于许多应用程序中。这个模块使用一个 db
参数,从而使 Berkeley DB 知道所请求的服务使用哪个数据库。
以下是在一个 PAM 配置中一个典型的 pam_userdb.so
行。<path-to-file>
是到 Berkeley DB 数据库文件的完全路径:
auth required pam_userdb.so db=<path-to-file>
无效的参数 通常 会被忽略,它不会影响到 PAM 模块验证的结果。但在一些模块中,无效的参数可能会导致模块验证失败。多数模块都会把错误写入 /var/log/secure
文件。
以下是一个 PAM 应用配置文件实例:
#%PAM-1.0 auth required pam_securetty.so auth required pam_unix.so nullok auth required pam_nologin.so account required pam_unix.so password required pam_cracklib.so retry=3 password required pam_unix.so shadow nullok use_authtok session required pam_unix.so
第一行是注释行,由该行行首的井字号(#
)标示。
第二行到第四行包括了三个用于登录验证的堆积模块。
auth required pam_securetty.so
— 这个模块保证:如果用户试图以根用户登录,这个用户所登录的 tty 需要在 /etc/securetty
文件中列出,如果这个文件存在的话。
如果 tty 没有在这个文件中列出,任何以根用户身份登录的企图都会失败,并显示一个 Login incorrect
信息。
auth required pam_unix.so nullok
— 这个模块要求用户输入密码,然后使用存储在 /etc/passwd
和 /etc/shadow
文件(如果这个文件存在的话)中的信息来检查用户输入的密码。
auth required pam_nologin.so
— 这是验证的最后一步。这一步检查 /etc/nologin
文件是否存在。如果这个文件存在,而用户并不是一个根用户,那么用户身份验证会失败。
在这个例子中,所有三个 auth
都被检查,即使第一个 auth
模块失败。这可以防止用户知道是哪一步导致了验证失败。如果一个恶意的网络用户知道了这个信息,则可以利用这个信息来进行网络攻击。
account required pam_unix.so
— 这个模块执行所有需要的帐号验证。例如,如果启用 shadow 密码, pam_unix.so
的帐号接口就会检查这个帐号是否已经过期,或用户在允许的过渡期期间是否已经修改密码。
password required pam_cracklib.so retry=3
— 如果一个密码已经过期,pam_cracklib.so
模块的密码部分会要求输入一个新密码。然后,它会检查新创建的密码是否能够被密码字典破解系统轻易地破解。
retry=3
参数指定如果第一次测试失败,用户会有另外两次机会来创建一个更安全的密码。
password required pam_unix.so shadow nullok use_authtok
— 这一行指定如果程序要修改用户的密码,应该使用 pam_unix.so
模块的 password
接口来进行。
shadow
参数告诉模块在更新一个用户的密码时创建 shadow 密码。
nullok
参数告诉模块允许用户把他们的密码 从 空密码改为其它的密码,否则的话,无密码状态会被认为是一个帐号锁。
这一行的最后一个参数 use_authtok
提供了一个很好的实例来说明堆积 PAM 模块时顺序的重要性。这个参数告诉模块不向用户要求输入一个新密码,它会使用前一个密码模块获得的密码。在这种情况下,所有新密码在被接受前都必须通过 pam_cracklib.so
的检查。
session required pam_unix.so
— 最后一行告诉 pam_unix.so
模块的会话接口来管理会话。这个模块会在每个会话的开始和结束阶段把用户名和服务类型记录到 /var/log/secure
文件中。这个模块可以和其它会话模块堆积在一起来实现其它的功能。
你可以随时为支持 PAM 的应用程序创建或添加新的 PAM 模块。
例如,一个程序开发人员可以创建一个一次性密码的产生方法,并编写一个 PAM 模块来支持它。支持 PAM 的应用程序可以马上使用这个新模块而不用重新进行编译。
这可以让程序开发人员和系统管理员在不需要重新编译的情况下为不同的应用程序测试各种用户身份验证方法。
编写模块的文档包括在 /usr/share/doc/pam-
目录中,其中,<version-number>
/<version-number>
是你系统上的 PAM 的版本号。
红帽企业 Linux 中包括的一组图形化的管理工具通过 pam_timestamp.so
模块为用户提供了一段时间(最长为5分钟)的管理权限。了解它们的工作原理是非常重要的,如果一个用户暂时离开他们的终端时,pam_timestamp.so
没有被关闭,那么任何可以使用这个终端的人都可以利用它来操纵系统。
在 PAM 时间戳(timestamp)规划中,图形化的管理程序会在启动时要求用户输入根用户密码。当用户被验证后,pam_timestamp.so
模块会创建一个时间戳文件。默认情况下,它会在 /var/run/sudo/
目录中被创建。如果时间戳文件已经存在,图形化的管理程序不会再要求输入密码。pam_timestamp.so
模块会更新时间戳文件,这个用户可以重新获得额外 5 分钟的管理访问权限。
你可以通过查 /var/run/sudo/<user>
文件来确认时间戳文件的实际状态。对于台式机来说,相关的文件是 unknown:root
。如果这个文件存在而且它的时间戳不长于5分钟的话,用户身份是有效的。
当时间戳文件存在时,一个验证图标会出现在系统面板的通知区域中。
关闭一个时间戳处于活动状态下的 PAM 的控制台前,最好销毁时间戳文件。要在图形化环境中执行这个任务,点击面板中的验证图标。一个对话框会出现,点击 Forget Authorization 来销毁活动的时间戳文件。
在处理 PAM 时间戳文件时应注意以下问题:
如果是通过使用 ssh
远程登录到系统,请使用 /sbin/pam_timestamp_check -k root
命令来销毁时间戳文件。
你应该在你发出使用这一特权应用程序的同一个终端视窗下运行 /sbin/pam_timestamp_check -k root
命令。
要使用 /sbin/pam_timestamp_check -k
命令,你必须以最初启动 pam_timestamp.so
模块的用户身份登录。不要以根用户身份登录来使用这个命令。
如果你要销毁桌面上的用户身份信息(而不想运行图标中的 Forget Authorization),请使用以下命令:
/sbin/pam_timestamp_check -k root </dev/null >/dev/null 2>/dev/null
如果使用这个命令失败,只会从你所运行这个命令的 pty 中删除用户身份信息。
请参阅 pam_timestamp_check
man page 来获得更多关于使用 pam_timestamp_check
来销毁时间戳文件的信息。
pam_timestamp.so
模块可接受多个命令。以下是两个最常用的选项:
timestamp_timeout
— 指定时间戳文件的有效期(以秒为单位)。默认值是 300 秒(5分钟)。
timestampdir
— 指定时间戳文件保存在哪个目录中。默认值是 /var/run/sudo/
。
请参阅 第 3.2.8.1 节 “安装的文件编辑程序(Installed Documentation)” 来获得更多关于控制 pam_timestamp.so
模块的信息。
在 红帽企业 Linux 中,第一个通过物理控制台登录的用户可以控制特定的设备并可以执行一些通常只有根用户才可以执行的任务。这是由名为 pam_console.so
的 PAM 模块所控制的。
当一个用户登录到一个 红帽企业 Linux 系统时,pam_console.so
模块会被 login
或图形化的登录程序(gdm、kdm 和 xdm)调用。如果这个用户是第一个通过物理控制台登录的用户 — 称为 控制台用户 — 模块会把一些通常的拥有者是根用户的设备的所有权分配给这个用户。这个控制台用户会拥有这些设备,直到这个用户的最后一个本地会话结束。在这个用户退出系统后,这些设备的拥有者身份则被交回给根用户。
这些设备包括,但不限于,声卡、软驱和 CD-ROM 驱动器。
这个设施允许一个本地用户在不需要获得根权限的情况下来使用这些设备,因此可以简化控制台用户完成一些常用任务的程序。
你可以通过编辑以下文件来修改由 pam_console.so
控制的设备列表:
/etc/security/console.perms
/etc/security/console.perms.d/50-default.perms
你可以修改在以上文件中列出的不同设备的访问权限,或覆盖已经指定的默认设置。你应该创建一个新文件(如
)并输入需要修改的值,而不是修改 xx
-name.perms50-default.perms
文件。新的默认文件的文件名必须以一个大于 50 的数值开始,如 51-default.perms
。这样会覆盖 50-default.perms
文件的默认值。
如果 gdm、kdm 或 xdm 的配置文件已经被修改来允许远程用户登录,而且 主机被配置为使用运行级别 5,建议你把 /etc/security/console.perms
文件的 <console>
和 <xconsole>
命令项的值改为:
<console>=tty[0-9][0-9]* vc/[0-9][0-9]* :0\.[0-9] :0 <xconsole>=:0\.[0-9] :0
这将防止远程用户获得设备的访问权,并限制他们在该机器上对应用程序的使用。
如果 gdm、kdm 或 xdm 的配置文件被修改为允许远程用户登录,并且主机被配置为使用运行级别 5 以外的运行级别,建议你删除 整个 <xconsole>
命令,并把 <console>
命令改为:
<console>=tty[0-9][0-9]* vc/[0-9][0-9]*
该控制台用户也可以使用一些 /etc/security/console.apps/
目录下为用户配置的程序。
这个目录中包括允许控制台用户使用 /sbin
和 /usr/sbin
中的某些应用程序的配置文件。
这些配置文件和它们所设置的应用程序享有相同名称。
控制台用户可以使用的一组重要应用程序程序包括三个可以用来关闭或重新启动系统的程序:
/sbin/halt
/sbin/reboot
/sbin/poweroff
因为这些都是支持 PAM 的应用程序,因此需要时都可以调用 pam_console.so
模块。
请参阅 第 3.2.8.1 节 “安装的文件编辑程序(Installed Documentation)” 来获得更多信息。
以下资源进一步介绍了使用和配置 PAM 的方法。另外,你还可以通过查看系统上的 PAM 配置文件来了解它们是如何构成的。
与 PAM 相关的 man page — man page 上有多个不同的应用程序和配置文件与 PAM 有关。以下列出了其中较重要的页数。
pam
— 介绍 PAM 的重要信息,包括 PAM 配置文件的结构和目的。
请注意,这一页讨论了 /etc/pam.conf
和 /etc/pam.d/
目录中的各种单个配置文件。在默认情况下,红帽企业 Linux 使用 /etc/pam.d/
目录下的各种单个配置文件,而不使用 /etc/pam.conf
,即使这个文件存在也使用。
pam_console
— 介绍 pam_console.so
模块的目的,也描述 PAM 配置文件中应该使用的适当语法。
console.apps
— 描述 /etc/security/console.apps
配置文件的格式和可用的选项,这个配置文件规定哪些应用程序可以被 PAM 分配的控制台用户访问。
console.perms
— 描述 /etc/security/console.perms
配置文件的格式和可用的选项,而且指定由 PAM 分配的控制台用户权限。
pam_timestamp
— 描述 pam_timestamp.so
模块。
/usr/share/doc/pam-
— 含有 《系统管理员指南》,一个《模块编写人员指南》和《应用程序开发人员手册》,以及 PAM 标准:DCE-RFC 86.0,其中,(<version-number>
<version-number>
是 PAM 的版本号。
/usr/share/doc/pam-
— 含有与 <version-number>
/txts/README.pam_timestamppam_timestamp.so
PAM 模块相关的信息,其中,<version-number>
是 PAM 的版本号
http://www.kernel.org/pub/linux/libs/pam/ — Linux-PAM 工程的主要发行网站,含有多个 PAM 模块的信息和一个 FAQ 及其它 PAM 文件信息。
这个网站中发布 PAM 最新版本信息,也许不会和 红帽企业 Linux 所提供的 PAM 版本信息 100% 吻合。
对网络服务进行访问控制是一个服务器管理员面临的最重要的安全任务之一。红帽企业 Linux 为这种访问控制提供了一些工具。例如,内核使用一个基于 iptables
的防火墙来将不受欢迎的网络数据包过滤在内核网络之外。对于使用这种防火墙的网络服务,TCP Wrappers 又增加了一层保护,这层保护通过定义哪些主机允许或不允许连接到 "wrapped" 网络服务上来实现。xinetd
超级服务器 就是这样的一个 wrapped network(会绕网络)服务。这项服务被称为一个超级服务器,是因为它可以控制连接到网络服务的一个子集的连接,还能进一步精致地进行访问控制。
图 3.3 “网络服务的访问控制” 为一基本实例来说明这些工具是如何组合在一起来保护网络的。
在默认情况下会安装 TCP Wrappers 软件包(tcp_wrappers
),该软件包提供基于主机的、到网络服务的访问控制。这个软件包中最重要的组成部分是 /usr/lib/libwrap.a
库。通常来说,使用 libwrap.a
库进行编译的服务就是一个 TCP Wrappers。
当一个客户试图与一个 TCP-wrapped 服务进行连接时,这个服务首先会检查主机的访问文件(/etc/hosts.allow
和 /etc/hosts.deny
)来决定这个客户是否被允许连接到这个服务。在大多数情况下,这个服务还会使用 syslog 守护进程(syslogd
)把这个发出请求的客户用户名以及所要求访问的服务写入 /var/log/secure
或 /var/log/messages
文件中。
如果一个客户被允许进行连接,TCP Wrappers 会释放它对所请求服务的连接控制权,然后将不再在这个客户与服务器间的通信过程中起任何作用。
除了可以控制访问和记录日志信息外,TCP Wrappers 还可以在允许或拒绝到网络服务的连接请求之前来执行相关的命令与客户进行交流。
因为 TCP Wrappers 是系统管理员所使用的安全工具库的一个很有价值的补充,红帽企业 Linux 中的多数网络服务都与 libwrap.a
库相连。这样的应用程序包括 /usr/sbin/sshd
、/usr/sbin/sendmail
和 /usr/sbin/xinetd
。
要决定一个网络服务的二进制码是否与 libwrap.a
相连,以根用户的身份键入以下命令:
ldd <binary-name> | grep libwrap
使用网络服务的二进制码的名称来替换 <binary-name>
。
如果这个命令的输出结果是空的,这项网络服务则 没有 与 libwrap.a
链接。
以下的例子表示 /usr/sbin/sshd
与 libwrap.a
相链接:
[root@myserver ~]# ldd /usr/sbin/sshd | grep libwrap libwrap.so.0 = > /usr/lib/libwrap.so.0 (0x00655000) [root@myserver ~]#
TCP Wrappers 拥有以下其它网络控制技术不具备的优势:
对客户和 wrapped (会绕的)网络服务的透明性 — 连接的客户和 wrapped 网络服务都不需要知道 TCP Wrappers 在使用中。合法用户会被记录到日志中,并获得所需要的服务,而非法用户则无法获得要求的服务。
中央化管理多项协议 — TCP Wrappers 独立运行于它们所保护的网络服务,这就允许多个服务器应用程序共享一组通用的访问控制配置文件,从而简化了管理任务。
要决定一个客户是否被允许连接一项服务,TCP Wrappers 会参考以下两个文件,这两个文件通常被称为 主机访问 文件:
/etc/hosts.allow
/etc/hosts.deny
当一个 TCP Wrappers 接收到一个客户请求时,它会运行以下几个步骤:
检查/etc/hosts.allow
. — TCP 会绕的服务会循序地解释 /etc/hosts.allow
文件并应用第一个为这个服务所指定的规则。如果找到了一个匹配的规则,则允许连接。如果找不到匹配的规则,就会进行下一个步骤。
检查 /etc/hosts.deny
. — TCP 会绕的服务会循序地来解释 /etc/hosts.deny
文件。如果找到一个匹配的规则,则拒绝这个连接。如果找不到匹配的规则,则允许连接到这个服务。
在使用 TCP Wrappers 保护网络服务时应该考虑以下几个要点:
因为 hosts.allow
中的规则会首先被应用,所以比 hosts.deny
中指定的规则有优先权。因此,如果访问一项服务在 hosts.allow
中设置为允许,那么在 hosts.deny
中同一项服务的拒绝访问设置则被忽略。
每个文件中的各项规则是由上到下被读取的,第一个匹配的规则是唯一被应用的规则。因此,规则的排列顺序极其重要。
如果在这两个文件中都没有找到匹配的规则,或这两个文件都不存在,那么就授予访问这项服务的权限。
TCP 会绕的服务并不缓存主机访问文件中的规则,因此对 hosts.allow
或 hosts.deny
的配置改变都无需重新启动网络服务便会马上起作用。
如果一个主机访问文件的最后一行不是一个新行符(即按 Enter 键所产生的),这个文件中的最后一条规则会失败,而且会将一个错误信息记录到 /var/log/messages
或 /var/log/secure
文件中。一个占据多个行的规则在换行时没有使用反斜线字符时,也会有同样的问题。下面的例子展示了规则失败时日志讯息的相关部分,规则失败的原因可以是上文提到的两个原因中任何一个:
warning: /etc/hosts.allow, line 20: missing newline or line too long
/etc/hosts.allow
和 /etc/hosts.deny
文件的格式是完全相同的。每个规则都必须位于其正确的行位。空行或以井字号 (#) 开始的行会被忽略。
每条规则都使用以下基本格式来对网络服务的访问进行控制:
<daemon list>
:<client list>
[:<option>
:<option>
: ...]
<daemon list>
— 一个由逗号分隔的进程名(不是 服务名)列表,或 ALL
通配符。守护进程列表也接受运算符(请参阅第 3.3.2.1.4 节 “算子(Operators)”)来提供更大的灵活性。
<client list>
— 一个由逗号分隔的主机名、主机 IP 地址、特殊模式或通配符列表,该列表用来识别受这项规则影响的主机。客户列表也接受在 第 3.3.2.1.4 节 “算子(Operators)” 中列出的运算符来允许更大的灵活性。
<option>
— 这项规则被触发时要运行一个动作选项或由冒号分隔开动作列表。选项领域支持扩展式、发布 shell 命令、允许或拒绝访问以及修改日志记录。
在这部指南的其它章节可以找到关于上面提到的专门术语的更多信息:
下面是一个基本的主机访问规则示例:
vsftpd : .example.com
这条规则指示 TCP Wrappers 监测在 example.com
域内的任何主机要向 FTP 守护进程(vsftpd
)发出的连接。如果这条规则出现在 hosts.allow
中,连接则被接受。如果这条规则出现在 hosts.deny
中,连接则被拒绝。
下面的主机访问规则比较复杂,而且使用两个选项领域:
sshd : .example.com \ : spawn /bin/echo `/bin/date` access denied>>/var/log/sshd.log \ : deny
请注意每个选项领域前面都有反斜线(\)。使用反斜线可以防止由于规则太长而造成失败。
这个范例规则规定如果 example.com
中的某个主机试图向 SSH 守护进程(sshd
)发出连接请求,那么执行 echo
命令来将这次尝试添加到一个专用日志文件里,并且拒绝该连接。因为使用了命令选项 deny
,这一行拒绝访问,即使它出现在 hosts.allow
文件里。请参阅 第 3.3.2.2 节 “选项领域 ” 来获得关于各种可选选项更详细的信息。
通配符使 TCP Wrappers 更容易匹配各种守护进程或主机。使用通配符最频繁的是在访问规则的客户列表领域内。
以下是可以被使用的通配符:
ALL
— 完全匹配,可以用在守护进程列表和客户列表中。
LOCAL
— 与任何不包括圆点 (.) 的主机匹配,如 localhost。
KNOWN
— 与任何带有已知主机名和主机地址或已知用户的主机匹配。
UNKNOWN
— 与任何带有未知主机名和主机地址或未知用户的主机匹配。
PARANOID
— 与任何带有主机名和主机地址不相匹配的主机匹配。
通配符 KNOWN
、 UNKNOWN
, 和 PARANOID
使用起来应该多加小心,因为这些通配符的正确运行有赖于 DNS 服务器的功能。命名解析时出现的任何失误都可能使合法用户无法访问某项服务。
模式可以用在访问规则的客户领域里,从而更准确地给客户主机指定分组。
下面是一个输入客户领域的输入项常用模式列表:
主机名以圆点 (.)开始 — 如果在一个主机名的开始放置一个圆点,那么就与所有共享这个主机名中列出的相同组成部分的主机匹配。下面的例子适用于 example.com
域内的任何主机:
ALL : .example.com
IP 地址以圆点 (.) 结束 — 如果在一个 IP 地址的末尾放置一个圆点,那么就与所有共享一个 IP 地址的起始数值组的主机匹配。下面的例子适用于 192.168.x.x
网络内的任何主机:
ALL : 192.168.
IP 地址/网络掩码对 — 网络掩码表达式也可以作为一个模式用来控制对某一组特定的 IP 地址的访问。下面的例子适用于地址区间从 192.168.0.0
到 192.168.1.255
的任何主机:
ALL : 192.168.0.0/255.255.254.0
使用 IPv4 地址空间时,地址/前缀长度(prefixlen)对声明 (CIDR 记号) 不被支持。只有 IPv6 规则可以使用这种格式。
[IPv6 地址]/前缀长度对 — [网]/前缀长度对也可以作为一种模式用来控制对某一组特定的 IPv6 地址的访问。下面的例子会适用于地址区间从 3ffe:505:2:1::
到 3ffe:505:2:1:ffff:ffff:ffff:ffff
的任何主机:
ALL : [3ffe:505:2:1::]/64
星号 (*) — 星号可以用来匹配整个不同组别的主机名或 IP 地址,只要在含有其它模式类型的客户列表中这些组不混杂在一起的话。下面的例子会适用于 example.com
域内的任何主机:
ALL : *.example.com
斜线 (/) — 如果一个客户列表以斜线开始,这个列表就被当作一个文件名对待。若是需要指定很大数量主机的各种规则的话,这一点就很有用处。下面的例子把 TCP Wrappers 交付于 /etc/telnet.hosts
文件来进行所有的 Telnet 连接:
in.telnetd : /etc/telnet.hosts
TCP Wrappers 也接受其它较少用到的模式。请参阅 hosts_access
man 5 page 来获取更多信息。
使用主机名和域名时要特别小心,因为攻击者可能会使用各种诀窍来做到对名称的准确分解。另外,DNS 服务的中断甚至让授权用户都无法使用网络服务。因此,如果可能的话,最好使用 IP 地址。
实施 TCP Wrappers 的 Portmap
不支持主机查找,也就是说 portmap
命令不能用主机名来识别相应的主机。因此,在 hosts.allow
或 hosts.deny
中对 portmap 的访问控制规则必须使用 IP 地址来特指某主机,或用关键词 ALL
。
对 portmap
访问控制规则的修改可能不会立即起作用。你可能得重新启动 portmap
服务。
像 NIS 和 NFS 一样的被广泛使用的服务都有赖于 portmap
来进行运作,所以要了解这些局限性。
目前,访问控制规则接受一个算子 EXCEPT
,这个算子可以用在一个规则的守护程序列表中,也可以用在客户列表中。
这个 EXCEPT
算子允许特定的例外以用来在同一个规则中拓宽匹配的范围。
下面的例子来自一个 hosts.allow
文件,除 cracker.example.com
之外,允许所有example.com
主机连接所有的服务:
ALL: .example.com EXCEPT cracker.example.com
hosts.allow
文件内的另一个例子中,来自 192.168.0.
网络的所有客户都可以使用除 FTP 之外的所有服务:
x
ALL EXCEPT vsftpd: 192.168.0.
从组织结构上来说,避免使用 EXCEPT
算子更简易一些。因为这样可以让其他的系统管理员能很快地扫描相关的文件以便查看哪些主机被允许或被拒绝访问服务,而无须通过 EXCEPT
算子来进行排序。
除了允许和拒绝访问的基本规则外,红帽企业 Linux 对 TCP Wrappers 的实施支持通过 option fields 对访问控制语言的扩展式。通过在主机访问规则中使用选项领域,系统管理员可以完成多种不同的任务,比如像修改日志动作、加强访问控制以及发出 shell 命令。
通过使用 severity
命令,其选项领域让系统管理员能够很容易地改变一个规则的日志设施和优先级别。
在下面的例子中,example.com
域内的任何主机向 SSH 守护进程发出的各种连接会登录到默认的 authpriv
syslog
设施内(因为没有具体指明设施参数值),并且以 emerg
优先:
sshd : .example.com : severity emerg
使用 severity
选项也可以指定某个设施。下面的例子将来自 example.com
域主机的任何 SSH 连接意图登录到 local0
设施,并以alert
优先。
sshd : .example.com : severity local0.alert
实际操作中,这个例子直到 syslog 守护进程(syslogd
)被配置为登录到 local0
设施才会起作用。请参阅 syslog.conf
man page 来获取有关配置定制日志设施的信息。
选项领域也允许系统管理员通过添加 allow
或 deny
作为命令的最后选项来明确地以单个规则方式允许或拒绝主机。
例如,下面的两个规则允许来自 client-1.example.com
的 SSH 连接但却拒绝来自 client-2.example.com
的连接:
sshd : client-1.example.com : allow sshd : client-2.example.com : deny
访问控制以每个规则为基础,这样选项领域就允许系统管理员把所有访问规则写成一个单一文件,要么是hosts.allow
,要么是 hosts.deny
。有些系统管理员认为这样组织访问规则更容易一些。
选项领域允许访问规则通过下面两个指令发出 shell 命令:
spawn
— 作为子进程发出一个 shell 命令。这个命令可以完成的任务有:使用/usr/sbin/safe_finger
来获取发出请求客户的更多信息,或使用 echo
命令来创建专用日志文件。
在下面的例子中,试图访问来自 example.com
域的 Telnet 服务的客户被俏俏地登录到一个专用文件:
in.telnetd : .example.com \ : spawn /bin/echo `/bin/date` from %h>>/var/log/telnet.log \ : allow
twist
— 把要求进行的服务转换成特定的命令。这个命令经常用来给外侵者设立陷阱(也叫"蜜罐儿")。也可以用来向预连接的客户发送信息。这个 twist
命令必须出现在该规则命令行的末尾。
在下面的例子中,试图访问来自 example.com
域的 FTP 服务的客户接收到用 echo
命令发送的一个讯息:
vsftpd : .example.com \ : twist /bin/echo "421 This domain has been black-listed. Access denied!"
如果需要关于 shell 命令选项的更多信息,请参阅 hosts_options
man page。
扩展式命令与 spawn
和 twist
命令一起使用时,可以提供关于客户、服务器以及相关进程的信息。
下面是一个支持扩展式的命令列表:
%a
— 返回用户的 IP 地址。
%A
— 返回服务器的 IP 地址。
%c
— 返回大量的客户信息,比如用户名和主机名,或用户名和 IP 地址。
%d
— 返回守护进程的名称。
%h
— 返回客户的主机名(或 IP 地址,如果主机名没有提供的话)。
%H
— 返回服务器的主机名(或 IP 地址,如果主机名没有提供的话)。
%n
— 返回客户的主机名。如果主机名没有提供的话,屏幕上会显示 unknown
。如果客户的主机名和主机地址不匹配的话, 屏幕上会显示 paranoid
。
%N
— 返回服务器的主机名。如果主机名没有提供的话,屏幕上会显示 unknown
。如果服务器的主机名和主机地址不匹配的话, 屏幕上会显示 paranoid
。
%p
— 返回守护进程的进程 ID。
%s
— 返回各种不同类型的服务器信息,比如守护进程的进程和服务器的主机或 IP 地址。
%u
— 返回客户的用户名。如果没有提供的话,屏幕上会显示 unknown
。
下面用来示范的规则与 spawn
命令一起使用了一个扩展式来在一个定制的日志文件中确认客户主机。
当来自 example.com
域的一个主机向 SSH 守护进程(sshd
)发出连接意图时,执行 echo
命令来把这次包括客户主机名(通过使用 %h
扩展式)的连接尝试信息记录到一个专用文件中。
sshd : .example.com \ : spawn /bin/echo `/bin/date` access denied to %h>>/var/log/sshd.log \ : deny
同样的,扩展式也可以用来把个性化的讯息返回给客户。在下面的例子中,试图访问来自 example.com
域的 FTP 服务的客户们得到通知,他们的访问被服务器取缔了:
vsftpd : .example.com \ : twist /bin/echo "421 %h has been banned from this server!"
如果需要有关可用扩展式的更完全的解释,以及对附加的访问控制选项的更完全的解释,请参阅 man page 的第五部分,查看 hosts_access
(man 5 hosts_access
)和 hosts_options
。
请参阅 第 3.3.5 节 “其它资料” 来获取关于 TCP Wrappers 的更多信息。
xinetd
守护进程是一个 TCP-wrapped (TCP-会绕的)超级服务,这种服务控制对一个流行网络服务子集的访问,该子集包括 FTP、 IMAP 和 Telnet。同时这种服务还对访问控制、增强的日志记录功能、捆绑、重定向以及资源使用控制提供特定化服务配置选项。
当一个用户试图连接由 xinetd
控制的一个网络服务时,这种超级服务会接到请求并且查看是否有任何相匹配的 TCP Wrappers 访问控制规则存在。
如果连接被允许,xinetd
则检验该连接在其个性化的规则下对那项服务来说是被允许的。同时也检查该项服务是否还有足够的资源份额以及这项服务是否与任何定义好的规则相冲突。
如果所有条件都得到满足,(也就是:访问这项服务的请求被允许,这项服务还有足够的资源份额,以及这项服务不与任何定义好的规则相冲突),那么 xinetd
就开始进行被请求的服务并且让其通过对连接的访问控制。连接建立后,xinetd
就不再参与客户和服务器之间的通讯交流。
xinetd
的配置文件如下:
/etc/xinetd.conf
— 全局 xinetd
配置文件。
/etc/xinetd.d/
— 包含所有具体化服务文件的目录。
/etc/xinetd.conf
文件包含一般的配置设定,这种设定影响 xinetd
控制下的每一项服务。当 xinetd
服务第一次启动时,其设定信息就被读取,所以要想使改变后的配置起作用,你需要重新启动 xinetd
服务。下面是一个 /etc/xinetd.conf
文件的示范:
defaults { instances = 60 log_type = SYSLOG authpriv log_on_success = HOST PID log_on_failure = HOST cps = 25 30 } includedir /etc/xinetd.d
这些行控制 xinetd
以下的各个方面:
instances
— 指定 xinetd
可以处理同时间进入系统的请求的最大数值。
log_type
— 配置 xinetd
来使用 authpriv
日志设施,该设施将日志条目写入 /var/log/secure
文件。如果加上一个像 FILE /var/log/xinetdlog
一样的命令,就会在 /var/log/
目录下创建一个叫作 xinetdlog
的定制日志文件。
log_on_success
— 配置 xinetd
来记录成功的连接尝试。默认情况下,远程主机的 IP 地址和服务器处理这个请求的处理 ID 都要被记录。
log_on_failure
— 配置 xinetd
来记录失败的连接尝试,或被拒绝的连接尝试。
cps
— 配置 xinetd
来设定对任何一项服务来说每秒钟最多允许 25 个连接。如果超过这个限制,该服务就会隐退 30 秒。
includedir
/etc/xinetd.d/
— 包含位于 /etc/xinetd.d/
目录下的并且在具体化特定服务配置文件中声明的各种选项。请参阅 第 3.3.4.2 节 “The /etc/xinetd.d/ Directory” 来获取更多信息。
log_on_success
和 log_on_failure
在 /etc/xinetd.conf
中的设定经常被进一步修改,以形成具体化特定服务的配置文件。因此在某特定服务的日志文件中呈现的信息要比 /etc/xinetd.conf
文件所预示的多。请参阅 第 3.3.4.3.1 节 “记录日志选项” 来获取更一步的信息。
/etc/xinetd.d/
目录含有 xinetd
管理下的每一项服务的配置文件以及与该服务相关连的各文件的名称。就 xinetd.conf
来说,该目录只有当 xinetd
服务启动时才被读取。要使改变的配置起作用,系统管理员必须重新启动 xinetd
服务。
/etc/xinetd.d/
目录下的文件格式使用与 /etc/xinetd.conf
相同的常规格式。各项服务的配置都储存在一个独立的文件中,其主要原因是这样做使得个性化定制更容易一些,一项服务影响其它服务的可能性也更小一些。
要想了解这些文件是如何组构在一起的,请参考 /etc/xinetd.d/krb5-telnet
文件:
service telnet { flags = REUSE socket_type = stream wait = no user = root server = /usr/kerberos/sbin/telnetd log_on_failure += USERID disable = yes }
这些行控制 telnet
服务的多个不同侧面:
service
— 指定服务名称,通常是 /etc/services
文件中服务列表中的一项。
flags
— 设定连接的一系列属性中任何一个属性。REUSE
指示 xinetd
来重新使用这个插座进行 Telnet 连接。
反对使用 REUSE
标识旗。现在所有服务都暗暗地使用 REUSE
标识旗。
socket_type
— 设定该网络插座类型为 stream
。
wait
— 指定这项服务是单线程(yes
)还是多线程(no
)。
user
— 指定该进程运行在哪个用户 ID 下。
server
— 指定要发射哪个二进制可执行文件。
log_on_failure
— 为 log_on_failure
指定登录参数,在 xinetd.conf
中已经定义好的除外。
disable
— 指定这项服务是要被中止(yes
)还是不被中止(no
)。
请参阅 xinetd.conf
man page 来获取关于这些选项及其用途的更多信息。
对于由 xinetd
保护的各项服务,有一系列的命令可以使用。这一部分突出讨论一些比较常用的选项。
下面的日志记录选项可用于 /etc/xinetd.d/
目录下的 /etc/xinetd.conf
和各种具体化特定服务配置文件。
下面是一些比较常用的日志记录选项列表:
ATTEMPT
— 日志记录每次连接尝试失败的事实(log_on_failure
)。
DURATION
— 日志记录这项服务被远程系统使用的时间长度(log_on_success
)。
EXIT
— 日志记录退出状态或这项服务的中止信号(log_on_success
)。
HOST
— 日志记录远程主机的 IP 地址(log_on_failure
和 log_on_success
)。
PID
— 日志记录该服务器接到连接请求时进行处理的处理 ID(log_on_success
)。
USERID
— 日志记录远程用户使用为所有多线程主流服务而在 RFC 1413 中规定的方法(log_on_failure
andlog_on_success
)。
如果需要一个日志记录的完整列表,请参阅 xinetd.conf
man page。
xinetd
服务的用户们可以选择使用 TCP Wrappers 主机访问规则,也可以通过 xinetd
配置文件提供访问控制,或二者混合使用。请参阅 第 3.3.2 节 “TCP Wrappers 配置文件” 来获取关于 TCP Wrappers 主机访问控制文件的更多信息。
这一部分讨论如何使用 xinetd
来控制对各种服务的访问。
与 TCP Wrappers 不同的是,对访问控制作出的配置改变只有在 xinetd
管理员重新启动 xinetd
服务后才起作用。
与 TCP Wrappers 不同的还有,通过 xinetd
实现的访问控制只影响由 xinetd
控制下的各项服务。
xinetd
主机访问控制与 TCP Wrappers 使用的方法不同。TCP Wrappers 把所有访问配置设定放在两个文件里,即 /etc/hosts.allow
和 /etc/hosts.deny
。而 xinetd
的访问控制设定是一项服务一个配置文件,这些文件位于 /etc/xinetd.d/
目录下。
下面是一些 xinetd
支持的主机访问控制选项:
only_from
— 只允许特别指定的主机使用这项服务。
no_access
— 阻断列出的主机使用这项服务。
access_times
— 指定某一特定服务可能需要的时间段。该时间段的表达必须用 24-小时的符号格式,即:HH:MM-HH:MM。
only_from
和 no_access
选项可以使用很多 IP 地址或主机名,或者可以指定整个网络。与 TCP Wrappers 类似, 将 xinetd
访问控制与增强的日志记录配置相结合可以提高安全性,这样可以阻断被禁止主机的请求同时又详细记录每一次的连接尝试。
例如,下面的 /etc/xinetd.d/telnet
文件可以用来阻断来自某特定网络群体的 Telnet 访问,也用来限制允许用户们登录的总体时间段:
service telnet { disable = no flags = REUSE socket_type = stream wait = no user = root server = /usr/kerberos/sbin/telnetd log_on_failure += USERID no_access = 172.16.45.0/24 log_on_success += PID HOST EXIT access_times = 09:45-16:15 }
在这个例子中,当一个来自 10.0.1.0/24
网络的用户系统,比如I 10.0.1.2
,试图访问 Telnet 服务时,会收到下面的讯息:
连接由外连主机关闭。
另外,他们的登录试图会记录在 /var/log/messages
中,如下:
Sep 7 14:58:33 localhost xinetd[5285]: FAIL: telnet address from=172.16.45.107 Sep 7 14:58:33 localhost xinetd[5283]: START: telnet pid=5285 from=172.16.45.107 Sep 7 14:58:33 localhost xinetd[5283]: EXIT: telnet status=0 pid=5285 duration=0(sec)
当 TCP Wrappers 和 xinetd
连用来进行访问控制时,了解这两种访问控制机制之间的关系是很重要的。
当一个客户请求连接时, xinetd
控制下的事件发生顺序如下:
xinetd
守护进程通过使用 libwrap.a
库呼叫来访问 TCP Wrappers 主机访问规则。如果一个拒绝规则匹配这个客户,那么连接就被放弃。如果一个允许规则匹配这个客户的话,该连接就被传递给 xinetd
。
xinetd
守护进程检查其本身的访问控制规则,这种检查既为 xinetd
服务,也为被请求的服务。如果一个拒绝规则匹配这个客户,那么连接就被放弃。否则,xinetd
就启动这项被请求的服务,并让连接连到那项服务上。
当把 TCP Wrappers 访问控制与 xinetd
访问控制一起用时一定要小心。配置不当可以引起不良后果。
xinetd
服务配置文件支持将这项服务捆绑到一个 IP 地址上,并且把那项服务的外来请求重定向到另外一个 IP 地址、主机名或端口。
捆绑服务用特定化服务配置文件中的 bind
选项来控制,并把该服务链接到系统上的一个 IP 地址。捆绑配置好后,bind
选项只允许到合法 IP 地址的请求来访问该服务。你可以使用这种方法把不同服务根据要求捆绑到不同的网络接口。
这对拥有多重网络适配器或多个 IP 地址的系统尤其有用。在这样的系统内,不安全的服务(比如 Telnet)可以配置成只用来侦听连接到某专用网的接口而不侦听连接到互联网(Telnet)的接口。
redirect
选项接受后面带有端口号的 IP 地址或主机名,并配置这项服务来把连接到这项服务的任何请求都重定向到指定的主机和端口号。重定向的这一特征可以用来把请求改向到同一个系统上的另一个端口,重定向到同一台机器上的一个不同 IP 地址,或转移到一个完全不同的系统和端口号,以及这些选项的任何结合。因此,一个系统上要连接到某项服务的用户可能会被路由到另外一个系统,而无须中断目前的系统。
xinetd
守护进程要完成这样的重定向需要不断复制这样一个过程:发出请求的客户主机和实际提供这项服务的主机在连接期间要保持活动状态并且两个系统之间不断要有数据的传输转移。
bind
和 redirect
选项一起使用时,其优势最为明显。如果把一项服务捆绑到一个系统的某特定的 IP 地址,然后再把对该服务的请求重定向到只有第一个机器可以看见的第二个机器上,那么可以使用内部系统来为一个完全不同的网络提供这些服务。还有其它用途, 比如这些选项可以用来限制在一个多处为家的机器上某特定服务与一个已知 IP 地址的连接时间,也可以用来把对那项服务的任何请求重定向到另外一台专门为那项服务配置的机器。
例如,考虑这样一个系统,一个为其 Telnet 服务而设定的被用作防火墙的系统:
service telnet { socket_type = stream wait = no server = /usr/kerberos/sbin/telnetd log_on_success += DURATION USERID log_on_failure += USERID bind = 123.123.123.123 redirect = 10.0.1.13 23 }
这个文件中的 bind
和 redirect
选项保证那台机器上的 Telnet 服务被捆绑到外部 IP 地址(123.123.123.123
),面向互联网的那个地址。另外,任何发送到 123.123.123.123
的 Telnet 服务请求都会通过第二个网络适配器重定向到一个内部 IP 地址(10.0.1.13
),这个地址只有防火墙和内部系统可以访问。 这个防火墙就传输这两个系统之间的通讯交流,可是该连接系统却认为连接的是 123.123.123.123
,而实际上连接的是一个不同的机器。
这一特征对使用宽带连接又只有一个固定的 IP 地址的用户尤其有用。使用 Network Address Translation (NAT)(网络地址转换)时,网关机器背后的使用内部专用 IP 地址的各系统在该网关系统以外是不能被使用的。然而,当由 xinetd
控制的某些服务用 bind
和 redirect
选项配置时,该网关机器可以被用作外部系统和某特定被配置好来提供该服务的内部机器之间的服务代理。另外,多种不同的 xinetd
访问控制和日志选项也可以接受额外的保护。
xinetd
守护进程可以增加一层基本的不受 DoS(服务拒绝)攻击的保护。下面是一个可以帮助限制类似攻击成效的命令列表:
per_source
— 规定每个源 IP 地址连接服务实例的最大数值。只接受整数作为参数,而且可以用在 xinetd.d/
目录下的 xinetd.conf
文件和特定化服务的各配置文件中。
cps
— 规定每秒钟连接的最大数值。该命令接受两个由空格隔开的整数参数。第一个参数是每秒钟允许连接到该服务上的连接最大数值。第二个参数是 xinetd
必须要等待的启动该服务之前的秒钟数。只接受整数为参数,而且可以用在 xinetd.d/
目录下的 xinetd.conf
文件和特定化服务的各配置文件中。
max_load
— 定义 CPU 用量或一项服务负载平均限量值。它接受一个非固定点的数值参数。
负载平均是对某一时间内系统有多少进程处于活动状态的一个大体测量。请参阅 uptime
、who
和 procinfo
命令来获取关于负载平均的更多信息。
还有很多可以使用的资源管理选项可以用来管理 xinetd
。请参阅 xinetd.conf
man page 来获取更多信息。
关于 TCP Wrappers 和 xinetd
的更多信息可以在系统文档和互联网上找到。
要寻找其它的 TCP Wrappers、xinetd
和访问控制的配置选项,从你系统上的文档开始找起是一个很好的注意。
/usr/share/doc/tcp_wrappers-
— 这个目录含有一个 <version>
/README
文件,这个文件讲述 TCP Wrappers 是如何工作的以及目前存在的各种主机名和主机地址被破译的危险。
/usr/share/doc/xinetd-
— 这个目录含有一个 <version>
/README
文件,这个文件讲述访问控制的各个侧面以及讲述 /etc/xinetd.d/
目录下的 sample.conf
文件,该文件含有修改特定化服务配置文件的各种建议。
TCP Wrappers 和 xinetd
-related man pages — 用户手册上有多种不同的与TCP Wrappers 和 xinetd
相关的应用程序和配置文件。下面是一些比较重要的内容:
man xinetd
— xinetd
的 man page。
man 5 hosts_access
— TCP Wrappers 主机访问控制文件的 man page。
man hosts_options
— TCP Wrappers 选项领域的 man page。
man xinetd.conf
— 列出 xinetd
配置选项的 man page。
http://www.xinetd.org/ — xinetd
的主页,含有配置文件示例、配置文件特点的详细列表和一个很有用的 FAQ。
http://www.macsecurity.org/resources/xinetd/tutorial.shtml — 一部详细的学习指南,讨论多种不同方式来优化 xinetd
默认配置文件以满足特定的安全需要。
在多个区域都有办公室的机构通常会使用专用的线路来连接各个办公室,这样可以更高效,在网络间传输的数据也可以受到保护。例如,一些商业机构使用帧中继或 Asynchronous Transfer Mode (ATM) 网络来连接各个办公室。这种机构可能会非常昂贵,特别是对于中小型企业(small to medium sized businesses,SMBs)来说。这种中小型企业既想要扩大规模又不想投入与企业规模相当的高成本,因此都致力于使用数字电路。
为了满足这种需要,虚拟专用网 (VPNs) 得到开发。和专用网络线路的原则相同,VPN 允许在网络间进行安全的数字化传输并通过现存的 Local Area Networks - 局域网 (LANs)创建一个 Wide Area Network - 广域网 (WAN)。它与帧中继或 ATM 的不同之处在于其传输媒介。VPN 使用数据报(datagram)作为传输层在网上进行 IP 传输,从而通过网络安全地传输到目的地。多数自由软件 VPN 的实现都使用了开放标准的加密方法来加密传输中的数据。
一些机构使用硬件 VPN 的解决方案来增强数据的安全性,而其他用户选择使用软件或基于协议的解决方案。有多个厂商可以提供硬件 VPN 解决方案,如 Cisco、Nortel、IBM 和 Checkpoint。另外,Linux 有一个基于软件的免费的 VPN 解决方案叫作 FreeS/Wan,它使用一个标准化的 Internet Protocol Security(因特网协议安全) (IPsec) 来实现。无论是硬件解决方案还是软件解决方案,这些 VPN 都会象一个特殊的路由器一样存在于各个使用 IP 连接的办公室之间。
当一个数据包从一个客户端传送时,会通过一个 VPN 路由器或网关传送,该路由器或网关会为数据包添加一个 Authentication Header (AH) 来进行引路和认证。然后这些数据会被加密,最后被加上一个 Encapsulating Security Payload (ESP)。后者包括用来进行解密和处理的一些指令。
接收的 VPN 路由器会剥去主题信息,解密数据并把它发送到目的地(即一个工作站或网络上的另一个节点)。通过使用一个网络到网络的连接,本地网络上的接收节点所收到的数据包已经被解密并且处于待处理状态。从网络到网络 VPN 连接的加密/解密过程对本地节点来说是透明的。
有了如此高水平的安全性,一个网络袭击者如果要劫获这个数据包,他同时还要能够对该数据包进行解密。而在服务器和客户之间使用中间人袭击方法(man-in-the-middle attack)的外侵者至少必须需要一方的私用密钥才能通过验证步骤。因为系统使用多层次的验证和加密,VPN 是一种安全有效的连接多个远程节点的方式,运行起来像一个统一的内联网一样。
就实施基于软件解决方案安全地连接到一个 WAN 方面,红帽企业 Linux 提供多种不同的方式。 Internet Protocol Security(网络协议安全) (IPsec) 即为支持 VPN的 红帽企业 Linux 的实现方式,同时也有效地满足了有网络办公室的机构及远程用户的使用需求。
红帽企业 Linux 通过像因特网一样的常用网络载体使用一个安全隧道支持 IPsec 对远程主机和各网络之间的互相连接。IPsec 可以通过应用主机到主机(即一个到另一个电脑工作站)或网络到网络(一个到另一个LAN/WAN)的配置来实现。
在红帽企业 Linux中 IPsec 的实现使用 Internet Key Exchange (IKE),即一个由网络工程任务强势(Internet Engineering Task Force,IETF)而实现的协议,用来实现相连接系统之间的相互验证和安全关联。
一个 IPsec 连接分成两个逻辑阶段。 在第一阶段,一个 IPsec 节点发起与远程节点或网络的连接。该远程节点或网络检查请求连接的节点的资格,预连接的双方协商连接的验证方法。
在 红帽企业 Linux 系统上,一种 IPsec 连接使用 pre-shared key(事先选好的共享密码) 方法进行 IPsec 节点验证。在 pre-shared key IPsec 连接中,两个主机双方必须使用同一个密码才能过渡到 IPsec 连接的第二阶段。
IPsec 连接的第二阶段 也就是 Security Association (安全关联) (SA) 在 IPsec 节点之间被建立的阶段。这个阶段建立一个含有像加密方法、密钥交换参数等更多配置信息的SA 数据库。同时这个阶段也在各远程节点和网络间建立起实际的 IPsec 连接。
红帽企业 Linux 在网络上的主机之间就共享密钥而言使用 IKE 来实现 IPsec。设定密钥守护进程 racoon
用来处理 IKE 密钥分配和交换。如需要该守护进程的更多信息,请参考 man page 的 racoon
部分。
使用 IPsec 需要在所有 IPsec 主机上(如果使用主机到主机配置)或路由器上(如果使用网络到网络配置)安装 ipsec-tools
RPM 软件包。该 RPM 软件包含有主要程序库、守护进程和建立 IPsec 连接的各种配置文件,包括:
/sbin/setkey
— 操纵内核中 IPsec 的密钥管理和安全属性。这项可执行程序由 racoon
密钥管理守护进程控制。如需要更多信息,请参阅 man page 的 setkey
(8)部分。
/sbin/racoon
— IKE 密钥管理守护进程,用来管理和控制由 IPsec 相连系统间的安全关联和密钥共享。
/etc/racoon/racoon.conf
— 即 racoon
守护进程配置文件,用来配置 IPsec 连接的各个方面,包括连接时使用的验证方法和加密算法。如要了解现有命令的全部列表,请参阅 man page 的 racoon.conf
(5) 部分。
要在 红帽企业 Linux 中配置 IPsec,您可以使用 Network Administration Tool 或手工编辑网络和 IPsec 配置文件。
要连接通过 IPsec 连接的两个主机,请参阅 第 3.4.6 节 “IPsec 主机到主机连接配置”。
要通过 IPsec 把一个 LAN/WAN 和另一个进行连接,请参阅第 3.4.7 节 “IPsec Network-to-Network Configuration(IPsec 网络到网络配置)”。
IPsec 通过配置可以使用主机到主机方式将一个台式机或工作站(主机)连接到另一个。这种类型的连接利用连接至每一台主机的网络在主机之间建立一个安全隧道。建立主机到主机连接的要求也就是每台主机上 IPsec 的配置是极少的。主机双方只需要连接到一个可靠的连接载体(比如因特网)和 红帽企业 Linux 上,从而建立 IPsec 连接。
主机到主机的 IPsec 连接是一种两个系统之间的加密连接,双方都运行带有同样验证密码的 IPsec。 IPsec 连接激活后,两个主机之间的任何网络业务都以加密形式进行。
要配置一个主机到主机的 IPsec 连接,在每个主机上都进行以下步骤:
您应该在您配置的实际机器上进行下面的步骤,不要尝试通过远程方式配置和建立 IPsec 连接。
在命令 shell 中输入 system-config-network
来启动 Network Administration Tool。
在「IPsec」标签页中点击 新建 来启动 IPsec 配置向导。
点击 Forward 来启动配置主机到主机的 IPsec 连接。
为这一连接键入一个独一无二的名称,比如叫 ipsec0
。如需要的话,选择机器启动时便自动激活该连接的会话框。请点击 Forward 继续。
连接类型选择 Host to Host encryption,然后点击 Forward。
选择要使用的加密类型:手动加密或自动加密。
如果你选择手动加密,这一进程的后期要提供一个密钥。如果你选择自动加密,racoon
守护进程则会生成密钥。而且如果你要使用自动加密的话,必须安装 ipsec-tools
软件包。
点击 Forward 继续。
键入远程主机的 IP 地址。
要测定远程主机的 IP 地址,请 在远程主机上 使用下面的命令:
[root@myServer ~] # /sbin/ifconfig <device>
其中 <device>
是你用来进行 VPN 连接的以太网设备。
如果你的系统中只有一个以太网设备,那么该设备的名称通常为 eth0。下面的例子显示这个命令调出的相关信息(注意这只是输出信息的一个例子而已):
eth0 Link encap:Ethernet HWaddr 00:0C:6E:E8:98:1D inet addr:172.16.44.192 Bcast:172.16.45.255 Mask:255.255.254.0
其 IP 地址为 inet addr:
标签后面的数字。
对主机到主机的连接来说,两台主机都应该有公用的可路由的地址。也就是说,两台主机只要在一个 LAN 中,就可以有专用的不可路由的地址(例如:从 10.x.x.x 到 192.168.x.x)。
如果主机位于不同的 LAN,或者一台主机有公用地址,而另一台有专用地址,请参考 第 3.4.7 节 “IPsec Network-to-Network Configuration(IPsec 网络到网络配置)”。
点击 Forward 继续。
如果在 6 步骤中选择了手动加密,请指定要使用的密钥,或点击 Generate 生成一个密钥。
指定验证密码,或点击 Generate 生成一个验证密码,可以是数字和字母的任意组合。
点击 Forward 继续。
验证 IPsec — 含总结信息的 页面,然后点击 Apply。
点击 File => Save 以保存配置。
要使作出的修改生效,你也许需要重新启动网络。重新启动的话,使用下面的命令:
[root@myServer ~]# service network restart
从列表中选择 IPsec 连接,然后点击 Activate 按钮。
另一方的主机也要重复整个过程,并且在步骤 8 中一定要使用同样的密钥。否则, IPsec 不会运行。
配置好 IPsec连接之后,就会在 IPsec列表中显示出来,跟 图 3.4 “IPsec 连接” 中显示的一样。
当 IPsec 连接配置好后,就创建了下面的文件:
/etc/sysconfig/network-scripts/ifcfg-
<nickname>
/etc/sysconfig/network-scripts/keys-
<nickname>
/etc/racoon/
<remote-ip>
.conf
/etc/racoon/psk.txt
如果选择了自动加密的话,/etc/racoon/racoon.conf
文件也同时被创建。
界面呈现出来时,/etc/racoon/racoon.conf
被修改,增加了
。
<remote-ip>
.conf
建立连接的第一步是从各工作站收集系统和网络的信息。要建立主机到主机连接,你需要下列信息:
每个主机的 IP 地址
一个独一无二的名称,例如,ipsec1
。在进行 IPsec 连接时这个名称用来进行身份验证并与其它服务和连接区别开来。
一个事先选好的密钥或由 racoon
自动生成的密钥。
一个事先选好的共享验证密码,该密码在连接建立的最初阶段会用到,用来进行密钥交换。
例如,假设工作站 A 和工作站 B 想通过 IPsec 隧道建立相互的连接。这两个工作站要用一个事先选好的共享密码即Key_Value01
进行连接,而且用户们同意让racoon
自动生成一个主机之间共享的验证密码。连接双方决定以 ipsec1
来命名这一连接。
你选择的 PSK 应是大写字母、小写字母、数字和标点符号的组合,因为容易猜出的 PSK 不安全。
对每个主机来说选择相同的连接名称倒不是必须的。你应该选择一个对你的安装来说既方便又有意义的名称。
下面是 IPsec 为工作站 A 与工作站 B 进行主机到主机IPsec 连接的配置文件。这个例子中识别该连接的独一无二的名称是 ipsec1
,因此该连接合成的文件名是 /etc/sysconfig/network-scripts/ifcfg-ipsec1
。
DST=X.X.X.X
TYPE=IPSEC
ONBOOT=no
IKE_METHOD=PSK
对工作站 A 来说,X.X.X.X
是工作站 B 的 IP 地址。对工作站B 来说,X.X.X.X
是工作站 A 的 IP 地址。这一连接的设定不是在启动(ONBOOT=no
)时就启动该连接,而是要使用事先选好的共享验证密码方式(IKE_METHOD=PSK
)进行连接。
下面是关于事先选好的共享验证密码的文件内容(叫 /etc/sysconfig/network-scripts/keys-ipsec1
),两个工作站都需要验证相互的身份。这个文件的内容在两个工作站处应该是完全一致的,而且应该只有根用户才有读取和写入该文件的权限。
IKE_PSK=Key_Value01
要在 keys-ipsec1
文件创建后修改此文件以保证只有根用户能够读取和编辑该文件,请使用下面的命令:
[root@myServer ~] # chmod 600 /etc/sysconfig/network-scripts/keys-ipsec1
任何时候如果需要修改验证密码,两个工作站都应通过编辑 keys-ipsec1
文件来实现。要使连接正常运行,双方的验证密码必须完全一样。
接下来的例子显示连接到远程主机时第一阶段的具体配置。该文件叫
,其中X.X.X.X
.confX.X.X.X
是 IPsec 连接中远程主机的IP 地址。注意这个文件是在 IPsec 隧道被激活时自动生成的,而且应该无法直接对它进行编辑。
remote X.X.X.X
{
exchange_mode aggressive, main;
my_identifier address;
proposal {
encryption_algorithm 3des;
hash_algorithm sha1;
authentication_method pre_shared_key;
dh_group 2 ;
}
}
默认情况下,当 IPsec 连接启动时第一阶段配置文件含有 红帽企业 Linux 使用的和由 IPsec 实现的下列声明:
X.X.X.X
指定该配置文件随后的文件段只适用于由 X.X.X.X
IP 地址识别的远程节点。
在 红帽企业 Linux上 IPsec 默认的配置是使用挑衅性的验证方式(aggressive authentication mode),这样可以使该连接在空中降低位置,从而允许与多个主机进行多项连接的 IPsec 配置。
验证节点时指定要使用的验证身份的方式,红帽企业 Linux 使用 IP 地址来识别节点。
指定验证身份时使用的密码暗号。默认情况下,规定使用 Triple Data Encryption Standard (3DES)。
指定节点之间在第一阶段的协商中所使用的散列算法。默认情况下,给定使用 Secure Hash Algorithm version 1(安全散列算法第一版)。
指定节点之间协商中所使用的验证方法。默认情况下, 红帽企业 Linux 使用事先选好的共享密码验证方法。
指定 Diffie-Hellman 的组号码以便建立动态生成的会话密钥。其默认号码是 modp1024 (group 2)。
/etc/racoon/racoon.conf
文件在所有 IPsec 节点上应该是完全一样的,只有一个 例外,那就是 include "/etc/racoon/
声明。这个声明(以及它相关的文件)是在 IPsec 隧道被激活时生成的。 对工作站 A 来说,X.X.X.X
.conf"include
声明中的X.X.X.X
是工作站 B 的 IP 地址。反过来则是工作站 B 的 IP 地址。下面显示的是当 IPsec 连接被激活时生成的 racoon.conf
的典型文件。
# Racoon IKE daemon configuration file. # See 'man racoon.conf' for a description of the format and entries. path include "/etc/racoon"; path pre_shared_key "/etc/racoon/psk.txt"; path certificate "/etc/racoon/certs"; sainfo anonymous { pfs_group 2; lifetime time 1 hour ; encryption_algorithm 3des, blowfish 448, rijndael ; authentication_algorithm hmac_sha1, hmac_md5 ; compression_algorithm deflate ; } include "/etc/racoon/X.X.X.X.conf";
这个默认的 racoon.conf
文件包括 IPsec 配置定义好的路径、事先选好的共享密钥文件和证书。 sainfo anonymous
中的字段描述IPsec 节点之间的第二阶段 SA — 、IPsec 连接的性质(包括所用的加密算法)和交换密钥的方法。下面的列表定义第二阶段的各项字段:
表明 SA 可以在匿名状态下启动任何同级设备,只要其IPsec 资格相匹配。
定义 Diffie-Hellman 密钥交换协议,该协议决定使用什么方法使 IPsec 节点之间建立相互的临时会话密码,以便进行 IPsec 第二阶段的连接。默认情况下,红帽企业 Linux 实施 IPsec 使用 Diffie-Hellman 密码密钥交换组中的组 2(group 2)(或 modp1024
)。组 2 使用 1024 比特模运算方式,这种方式可以防止袭击者们试图破解在此之前传输的 IPsec 信息,即使他们找到一个有效密码而进入也无济于事。
这个参数指定一个以时间或以字节数来量化的 SA 寿命。默认 红帽企业 Linux时 IPsec 规定其寿命是一个小时。
指定所支持的进行第二阶段的加密暗号 红帽企业 Linux 支持 3DES,448-bit Blowfish, 和 Rijndael(在 Advanced Encryption Standard 或 AES 中使用的密码)。
列出所支持的为身份验证而进行的散列算法。所支持的方式是 sha1 和 md5 散列讯息验证码(HMAC)。
为 IP Payload Compression (IPCOMP) 支持设备定义 Deflate 压缩算法,这样能在传输比较慢的连接上潜在地加速 IP 数据报的传输。
要开始连接,在各个主机上运行下面的命令:
[root@myServer ~]# /sbin/ifup <nickname>
其中 <nickname> 即是你为这个IPsec 连接指定的名称。
要测试 IPsec 连接,执行 tcpdump
命令来查看传输在主机之间的网络数据包,并验证该连接是通过 IPsec 进行加密的。这个数据包应该包括一个 AH 标题,并且显示是 ESP 数据包,ESP 意味着是加密的。例如:
[root@myServer ~]# tcpdump -n -i eth0 host <targetSystem> IP 172.16.45.107 > 172.16.44.192: AH(spi=0x0954ccb6,seq=0xbb): ESP(spi=0x0c9f2164,seq=0xbb)
IPsec 也可以用来配置整个一个网络(像 LAN 或 WAN)通过网络到网络连接方式连接到另一个远程网络上。网络到网络连接要求在连接的两端设定 IPsec 路由器来用透明的方式处理路径信息,其路径从LAN 上的一个节点到远程 LAN 上的另一个节点。 图 3.5 “A network-to-network IPsec tunneled connection” 显示一个网络到网络的 IPsec 隧道连接。
A network-to-network IPsec tunneled connection
这个图示显示两个由 Internet(因特网)隔开的 LAN。这两个 LAN 用IPsec 路由器来验证和启动一个通过因特网的安全隧道连接起来的连接。在传输中截获数据包会需要强力破解密码才能获得,这样就保护了数据包在两个 LAN 之间的传输。从 192.168.1.0/24 IP 区间的一个节点到 192.168.2.0/24 IP 区间的另一个节点的信息交流对这两个节点来说是完全透明的,因为信息的处理、加密/解密以及传输 IPsec 数据包完全都是由 IPsec 路由器进行的。
建立网络到网络连接所需信息包括:
专用 IPsec 路由器上可以公开访问的 IP 地址
由 IPsec 路由器服务的 LAN/WAN的网络地址区间(比如 192.168.1.0/24 或 10.0.1.0/24)。
将数据由网络传输到因特网的网关设备 IP 地址
一个独一无二的名称,例如,ipsec1
。在进行 IPsec 连接时这个名称用来进行身份验证并与其它服务和连接区别开来。
一个选定的密钥或由 racoon
自动生成的密钥
一个事先选好的共享验证密码,该密码在连接建立的最初阶段会用到,用来进行密钥交换。
一个网络到网络 IPsec 连接要用两个 IPsec 路由器,一个网络一个,专用分支网络之间的传输就通过这两个路由器建立。
例如,正像 图 3.6 “网络到网络 IPsec” 显示的一样,如果192.168.1.0/24 专用网向 192.168.2.0/24 专用网传输网络业务,数据包会经网关 0 (gateway0)到 ipsec0,再经因特网到 ipsec1,然后到网关 1(gateway1),最后到达 192.168.2.0/24 分支网络。
IPsec 路由器要求有可以公开访问的 IP 地址和第二个以太网(Ethernet)设备连接到相应的专用网上。网络业务只能通过一个 IPsec 路由器到另一个 IPsec 路由器,而且两个路由器之间的传输连接是加密的。
其它网络配置选项包括在各个 IP 路由器和因特网之间设立防火墙,也在每个 IPsec 路由器和分支网络网关之间设立内联网防火墙。IPsec 路由器和分支网络网关可以是同一个系统下的两个以太网(Ethernet)设备:一个有可以公开访问的 IP 地址,用作 IPsec 路由器;而另一个有专用 IP 地址,用作专用分支网络的网关。每个 IPsec 路由器可以在其专用分支网内使用网关,也可以通过公用网关将数据包传送到另一个 IPsec 路由器。
用下列步骤来配置网络到网络 IPsec 连接:
在命令 shell 中输入 system-config-network
来启动 Network Administration Tool。
在「IPsec」标签页中点击 新建 来启动 IPsec 配置向导。
点击 Forward 启动网络到网络 IPsec 连接的配置。
为这个连接键入一个独特的名称,比如叫 ipsec0
。如需要的话,选择电脑启动时就激活该连接。点击 Forward 继续。
连接类型选择 Network to Network encryption (VPN),然后点击 Forward 继续。
选择要使用的加密类型:手动加密或自动加密。
如果你选择手动加密,这一进程的后期要提供一个密钥。如果你选择自动加密,racoon
守护进程则会生成密钥。而且如果你要使用自动加密的话,必须安装 ipsec-tools
软件包。
点击 Forward 继续。
在 Local Network 页面上键入下面的信息:
Local Network Address — 由 IPsec 路由器连接到该专用网上设备的 IP 地址。
Local Subnet Mask — 本地网络 IP 地址的分支网络掩码。
Local Network Gateway — 专用分支网络的网关。
点击 Forward 继续。
在 Remote Network 页面上键入下面的信息:
Remote IP Address — 连接到 其它 专用网的 IPsec 路由器的可以公开访问的 IP 地址。我们的例子中要为 ipsec0 键入可以公开访问的 IP 地址 ipsec1,反之亦然。
Remote Network Address — 其它IPsec 路由器背后的专用分支网的网络地址。我们的例子中,配置 ipsec1 时要键入192.168.1.0
,配置 ipsec0 时要键入 192.168.2.0
。
Remote Subnet Mask — 远程 IP 地址的子网掩码。
Remote Network Gateway — 该远程网络地址的网关 IP 地址。
如果在 6 步骤中选择手动加密,要指定所使用的密钥,或者点击 Generate 生成一个密钥。
指定一个验证密码或点击 Generate 生成一个验证密码。该密码可以是数字和字母的任意组合。
点击 Forward 继续。
验证 IPsec — 含总结信息的 页面,然后点击 Apply。
选择 File => Save 保存配置。
从列表中选择 IPsec 连接,然后点击 Activate 来激活该连接。
启动 IP 转发:
编辑 /etc/sysctl.conf
并设定 net.ipv4.ip_forward
为 1
。
用下面的命令使这一改变生效:
[root@myServer ~]# /sbin/sysctl -p /etc/sysctl.conf
如果必要的话,激活 IPsec 连接的网络脚本会自动生成通过 IPsec 路由器传输数据包的网络路径。
假设 LAN A (lana.example.com) 和 LAN B (lanb.example.com) 要通过 IPsec 隧道进行相互的连接。LAN A 的网络地址是 192.168.1.0/24 区间,而 LAN B 使用 192.168.2.0/24 区间。LAN A 的网关 IP 地址为 192.168.1.254,LAN B 的网关 IP 地址为192.168.2.254。IPsec 各个路由器由 LAN 网关使用两个网络设备(eth0 和 eth1)隔开:eth0 被指派给一个可以公开访问的静态 IP 地址,可以连接因特网;而 eth1 则被用作一个选路点(routing point)来处理和传输从一个网络节点到各远程网络节点的 LAN 数据包。
各网络之间的 IPsec 连接使用事先选好的共享密钥 r3dh4tl1nux
,而且系统管理员 A 和 B 同意让 racoon
自动生成并共享每个 IPsec 路由器之间的验证密码。 LAN A 管理员决定命名该 IPsec 连接为 ipsec0
,而 LAN B 管理员命名该 IPsec 连接为 ipsec1
。
下面的例子显示 LAN A 的网络到网络 IPsec 连接的 ifcfg
文件的内容。本例中识别该连接的独特名称为ipsec0
,所以合成的文件叫作 /etc/sysconfig/network-scripts/ifcfg-ipsec0
。
TYPE=IPSEC
ONBOOT=yes
IKE_METHOD=PSK
SRCGW=192.168.1.254
DSTGW=192.168.2.254
SRCNET=192.168.1.0/24
DSTNET=192.168.2.0/24
DST=X.X.X.X
下面的列表描述该文件的内容:
指定连接类型。
指定电脑启动时便激活这个连接。
指定该连接使用事先选好的共享密钥来进行身份验证。
源网关的 IP 地址。对 LAN A 来说是 LAN A 网关,对 LAN B 来说是 LAN B 网关。
目的地网关的 IP 地址。对 LAN A 来说是 LAN B 网关,对 LAN B 来说是 LAN A 网关。
为 IPsec 连接指定源网络,在这个例子中则是 LAN A 的网络区间。
为 IPsec 连接指定目的地网络,在这个例子中则是 LAN B 的网络区间。
LAN B 的可以公开访问的 IP 地址。
下面的例子是事先选好的共享密钥文件的内容,该文件叫 /etc/sysconfig/network-scripts/keys-ipsec
(其中 X
X
对 LAN A 来说是 0, 对 LAN B 来说是 1)。A 和 B 两个网络都用这个密钥来相互验证,而且这个文件的内容在 A 和 B 处应该完全一致,只有根用户才有读取和写入的权限。
IKE_PSK=r3dh4tl1nux
文件 keys-ipsec
创建之后,要修改该文件以保证只有根用户才能读取或编辑这个文件,那么请运行下面的命令:
X
chmod 600 /etc/sysconfig/network-scripts/keys-ipsec1
任何时候需要修改验证密码,请在 IPsec 的两个路由器上编辑 keys-ipsec
文件,要使连接正常运转,两个密钥必须完全一致。
X
下面的例子显示 IPsec 连接的 /etc/racoon/racoon.conf
配置文件内容。注意该文件的最下面一行即 include
是自动生成的,而且只有在 IPsec 隧道运行时才显示。
# Racoon IKE daemon configuration file.
# See 'man racoon.conf' for a description of the format and entries.
path include "/etc/racoon";
path pre_shared_key "/etc/racoon/psk.txt";
path certificate "/etc/racoon/certs";
sainfo anonymous
{
pfs_group 2;
lifetime time 1 hour ;
encryption_algorithm 3des, blowfish 448, rijndael ;
authentication_algorithm hmac_sha1, hmac_md5 ;
compression_algorithm deflate ;
}
include "/etc/racoon/X.X.X.X
.conf"
下面是连接到远程网络的具体配置,该文件叫作
(其中 X.X.X.X
.confX.X.X.X
是远程 IPsec 路由器的 IP 地址)。注意该文件是 IPsec 隧道被激活时自动生成的,而且无法直接对其进行编辑。
remote X.X.X.X
{
exchange_mode aggressive, main;
my_identifier address;
proposal {
encryption_algorithm 3des;
hash_algorithm sha1;
authentication_method pre_shared_key;
dh_group 2 ;
}
}
在启动 IPsec 连接之前,内核中 IP 转发功能应该被启动。要启动 IP 转发功能,请:
编辑 /etc/sysctl.conf
并设定 net.ipv4.ip_forward
为 1
。
用下面的命令使这一改变生效:
[root@myServer ~] # sysctl -p /etc/sysctl.conf
要启动 IPsec 连接,请在各个路由器上使用下面的命令:
[root@myServer ~] # /sbin/ifup ipsec0
连接被激活,LAN A 和 LAN B 便可以相互交流了,因为在 IPsec 连接上运行 ifup
时路径就通过初始化脚本被自动生成。要想显示该网络的路径列表,请用下面的命令:
[root@myServer ~] # /sbin/ip route list
要测试 IPsec 连接,在外选路(externally-routable )设备(这个例子里即 eth0)上运行 tcpdump
程序来查看网络数据包在主机(网络)之间的传输,以及验证其传输是通过 IPsec 加密的。例如,要检查 LAN A 的 IPsec 连通性,使用下面的命令:
[root@myServer ~] # tcpdump -n -i eth0 host lana.example.com
这个数据包应该包括一个 AH 主题,并显示为 ESP 数据包,其中,ESP 意味着是加密的。例如,(/表示一行的继续):
12:24:26.155529 lanb.example.com > lana.example.com: AH(spi=0x021c9834,seq=0x358): \ lanb.example.com > lana.example.com: ESP(spi=0x00c887ad,seq=0x358) (DF) \ (ipip-proto-4)
如果 IPsec 连接的配置不是在电脑启动就激活,你可以从命令行中启动。
要启动连接,如果是主机到主机 IPsec 连接就在各个主机上运行下面的命令,如果是网络到网络 IPsec 连接,就在各个 IPsec 路由器上运行下面的命令:
[root@myServer ~] # /sbin/ifup <nickname>
其中,<nickname>
是先前配置的名称,比如像 ipsec0
。
要中止连接,运行下面的命令:
[root@myServer ~] # /sbin/ifdown <nickname>
红帽企业 Linux 在内核中包括了高级的网络数据包过滤功能 — 控制进入和离开网络的数据包以及在网络中传输的数据包。在内核版本 2.4 前,数据包过滤的功能是通过 ipchains
实现的,它使用一组规则来控制数据包过滤的每一个步骤。2.4 内核使用 iptables
(也被称为 netfilter),它与 ipchains
相似,但扩展了网络数据包过滤的范围。
本章介绍了数据包过滤的基础信息,并列出了 ipchains
和 iptables
的不同之处。另外,它还介绍了 iptables
可用的选项,以及如何在重新启动时保留所设置的数据包过滤规则。
请参阅 第 3.5.7 节 “其它资料” 来获得如何设计 iptables
规则,以及如何根据这些规则设置防火墙的信息。
在 2.4 和它以后的内核中,默认的防火墙是 iptables
,但如果 ipchains
已经在运行,iptables
则无法被使用。如果 ipchains
在系统启动的时候被运行,内核将会发出一个 iptables
运行失败的错误信息。
ipchains
的功能不会受到这个错误信息的影响。
Linux 内核使用 Netfilter 来过滤数据包,它允许一些数据包被系统接收或处理,而拒绝其它一些数据包。这个功能被内建在 Linux 内核中,它有以下三个内建的 规则表(tables) 或 规则列表(rules lists):
filter
— 处理网络数据包的默认规则表。
nat
— 修改数据包来创建新的连接;处理网络地址转换(Network Address Translation) (NAT)。
mangle
— 被用来处理特定的数据包。
每个规则表都包括一组内建的 chain,它们与 netfilter
对数据包所执行的行动相对应。
filter
规则表内建的 chain 包括:
INPUT — 应用于目标地址是这个主机的网络数据包。
OUTPUT — 应用于本地产生的网络数据包。
FORWARD — 应用于通过这个主机路由的数据包。
nat
规则表的内建 chain 包括:
PREROUTING — 当到达时修改网络数据包。
OUTPUT — 在把本地产生的网络数据包发出前进行修改。
POSTROUTING — 在把网络数据包发出前进行修改。
mangle
规则表的内建 chain 包括:
INPUT — 修改目标地址为这个主机的网络数据包。
OUTPUT — 在把本地产生的网络数据包发出前进行修改。
FORWARD — 修改经过这个主机路由的网络数据包。
PREROUTING — 在路由进入这个系统的网络数据包前修改它们。
POSTROUTING — 在把网络数据包发出前进行修改。
每个被 Linux 系统发送或接收的网络数据包最少都应该通过一个规则表的检查。但是,一个数据包可能会在到达 chain 的最后前被规则表中的多个规则所应用。各个规则的结构会不相同,但它们通常会涉及到:使用一个特定的网络协议或网络服务;到一个或一组特定 IP 地址的数据包;或从一个或一组特定 IP 地址发送的数据包。
在默认情况下,防火墙规则存储在 /etc/sysconfig/iptables
或 /etc/sysconfig/ip6tables
文件中。
当 Linux 系统启动时,iptables
服务会在所有 DNS 相关的服务启动前被启动。这意味着防火墙规则只使用数字化的 IP 地址(如 192.168.0.1)。在规则中使用域名(如 host.example.com) 将会产生错误。
无论它们的目的地址是什么,当数据包与一个规则表中的某个规则匹配时,一个 target 或行动将会被应用。如果在一个规则中指定了一个 ACCEPT
target,和这条规则匹配的数据包将跳过剩下的所有规则,并被发送到它的目标地址中的下一个目的地。如果一条规则指定了 DROP
target,和这条规则匹配的数据包将被这个系统拒绝,而发送这个数据包的主机也不会收到任何反馈信息。如果规则指定了 QUEUE
target,匹配的数据包会被发送到用户空间。如果一个规则指定了 REJECT
target,这个数据包将会被丢掉,而这个数据包的原始发送者则会接收到一个错误信息。
每个 chain 都会有一个默认的政策:ACCEPT
、DROP
、REJECT
或 QUEUE
。如果 chain 中的规则都不适用于某个数据包,这个数据包将会根据默认政策被处理。
iptables
命令被用来配置这些规则表,并可以在需要时设置新的规则表。
ipchains
和 iptables
都使用在 Liunx 内核中运行的规则 chain,并根据指定的规则或规则集合来进行数据包过滤。但是,iptables
提供了更大范围的数据包过滤功能,系统管理员可以对数据包过滤有更大的控制权。
您应该注意以下所列出的 ipchains
和 iptables
间的显著不同:
iptables
时,每个被过滤的数据包只使用一个 chain 中的规则,而不是使用多个 chain 中的规则。
例如,到一个使用 ipchains
系统的 FORWARD 数据包要通过 INPUT、FORWARD 和 OUTPUT chain 后才可以继续被发送,而当使用 iptables
时,如果数据包的目标地址是本地系统时,它只被发送到 INPUT chain;如果数据包是本地产生的,它只被发送到 OUTPUT chain。因此,您需要把规则放置在实际处理这个数据包的 chain 中。
在 ipchains
中,与一个 chain 中的一条规则匹配的数据包可以被发送到 DENY target。在 iptables
中,这个 target 被改为 DROP。
在 ipchains
中,规则选项的顺序是不相关的。
iptables
命令对语法有更严格的限制。iptables
命令需要在源或目的端口前指定使用的协议(ICMP、TCP 或 UDP)。
例如,输入接口(-i
选项)只能在 INPUT 或 FORWARD chain 中使用。同样的,输出端口(-o
选项)只能在 FORWARD 或 OUTPUT chain 中使用。
换句话说,INPUT chain 和输入的网络接口一起工作,而 OUTPUT chain 和输出的网络接口一起工作。FORWARD chain 则可以和输入和输出的网络接口一起工作。
OUTPUT chain 不再被输入网络接口使用,INPUT chain 也不再处理通过网络接口输出的数据包。
以上所列出的不同点并不完全,要获得更详细的信息,请参阅 第 3.5.7 节 “其它资料”。
数据包过滤的规则是由 iptables
命令所创建的。数据包的以下属性通常被用来组成判断的标准:
数据包类型 — 过滤的数据包的类型。
数据包源地址/目标地址 — 根据源地址或目标地址来决定所过滤的数据包。
Target — 指定对符合以上条件的数据包所要进行的行动。
请参阅 第 3.5.3.4 节 “IPTables 匹配选项” 和 第 3.5.3.5 节 “Target 选项” 来获得更详细的信息。
特定 iptables
规则所使用的选项必须根据规则的目的和整体条件来有逻辑地进行分组。以下的内容介绍了 iptables
命令常用的选项。
多数 iptables
命令都具有以下结构:
iptables [-t <table-name>
] <command>
<chain-name>
\ <parameter-1>
<option-1>
\ <parameter-n>
<option-n>
<table-name>
— 指定这个规则所应用的规则表。如果没有使用这个选项,filter
规则表则被使用。
<command>
— 指定要执行的行动,如添加或删除一条规则。
<chain-name>
— 指定编辑、创建或删除的 chain。
<parameter>-<option>
— 指定如何处理符合这个规则的数据包的参数和相关的选项。
根据目的的不同,一个 iptables
命令的长度和复杂程度会有很大不同。
例如,从一个 chain 中删除一条规则的命令可能会很短:
iptables -D
<chain-name> <line-number>
相反的,添加一条特定情况的数据包规则的命令可能会很长。当编写 iptables
命令时,一些参数和选项可能还会需要其它的参数和选项。
输入 iptables -h
可以查看 iptables
命令结构的完整列表。
命令选项告诉 iptables
来执行一个特定的行动。每个 iptables
命令只允许使用一个命令选项。除了帮助命令,其它所有命令都使用大写字符。
iptables
命令包括:
-A
— 在指定 chain 的最后添加规则。与下面介绍的 -I
选项不同,它不接受整数参数。它总在指定 chain 的最后添加规则。
-C
— 在把一个特定的规则添加到用户定义的 chain 前检查它。这个命令可以通过要求您输入额外的参数和选项来创建复杂的 iptables
规则。
-D <integer> | <rule>
— 根据所提供的号码(如 5
代表一个 chain 中的第5个规则)或规则的内容来删除一个特定 chain 中的一条规则。规则的内容必须与一条存在的规则完全匹配。
-E
— 重新命名一个用户定义的 chain。用户定义的 chain 是指除默认的和预存在的 chain 以外的 chain。(请参阅下面介绍的 -N
选项来获得如何创建用户定义的 chain 的信息。)这只是形式上的变化,它并不影响规则表的结构。
如果您试图重新命名默认的 chain,系统将产生 Match not found
错误。您无法重新命名默认的 chain。
-F
— 删除指定 chain 中的所有规则。如果没有指定 chain,它会删除所有 chain 中的规则。
-h
— 提供命令结构的一个列表,以及命令参数和选项的一个简单介绍。
-I [<integer>]
— 根据用户指定的一个整数参数来在一个特定的 chain 中的指定位置插入规则。如果没有指定参数,规则会被插入到 chain 的最前面。
我们在前面已经提到,一个 chain 中的规则的顺序决定了数据包将使用哪条规则。因此,您需要根据不同的情况选择使用 -A
或 -I
选项。
这一点在使用 -I
和一个整数参数添加规则时尤其重要。如果您在向一个 chain 添加一条规则时指定了一个存在的数值,iptables
将把新的规则添加到存在的规则 之前(上面)。
-L
— 列出在命令后面指定的 chain 的所有规则。要列出默认的 filter
规则表中的所有 chain 中的所有规则,请不要指定任何 chain 或规则表。否则的话,使用以下的语法来列出特定规则表中的特定 chain 中的规则:
iptables -L <chain-name>
-t <table-name>
-L
命令的其它选项(它们可以提供规则号以及更详细的规则描述)在 第 3.5.3.6 节 “列出选项” 中被介绍。
-N
— 使用一个用户定义的名称来创建一个新的 chain。这个新 chain 的名称必须是唯一的,否则将会出现一个错误信息。
-P
— 为特定的 chain 设置默认的政策,当整个 chain 中都没有匹配的规则时,数据包被发送到特定的 target,如 ACCEPT 或 DROP。
-R
— 替换指定 chain 中的一个规则。这个规则的号必须在 chain 名的后面被指定。chain 中的第一条规则与规则 1 相对应,以此类推。
-X
— 删除一个用户指定的 chain。您不能删除一个内建的 chain。
-Z
— 把一个规则表中的所有 chain 中的字节和数据包计数器设置为零。
一些 iptables
命令(包括在一个特定 chain 中添加、追加、删除、插入或替换规则)需要不同的参数来组成一条数据包过滤规则。
-c
— 为特定的规则重设计数器。这个参数可以使用 PKTS
和 BYTES
选项来指定重设哪个计数器。
-d
— 设定匹配这个规则的数据包的目的地主机名,IP 地址或网络。当匹配一个网络时,以下的 IP 地址/网络掩码格式被支持:
— 这里,N.N.N.N
/M.M.M.M
N.N.N.N
是 IP 地址范围,M.M.M.M
是子网掩码。
— 这里,N.N.N.N
/M
N.N.N.N
是 IP 地址,M
是位掩码。
-f
— 只对分段的数据包应用这个规则。
您可用在这个参数后面使用 (!
) 选项来指定只有未分段的数据包才匹配。
虽然分段的数据包是 IP 协议的一个标准部分,准确指出分段和未分段数据包是需要的。
它最初是被设计来允许 IP 数据包使用不同大小的数据段来在网络中传输,而在当前,数据分段却被一些人利用来使用非法格式化的数据包进行 DoS 网络攻击。您还应该注意,IPv6 完全禁止使用数据分段。
-i
— 设置入站的网络接口,如 eth0
或 ppp0
。使用 iptables
时,如果是 filter
规则表,这个选项参数只用于 INPUT 和 FORWARD chain;如果是 nat
和 mangle
规则表,它只用于 PREROUTING chain。
这个参数也支持以下特殊的选项:
!
— 表示不包括在这个规则中的接口。
+
— 用来代表匹配特定字符串的所有接口的通配符。例如, -i eth+
表示所有 Ethernet 接口,但不包括其它接口(如ppp0
)。
如果使用了 -i
参数而没有指定接口,则所有接口都受这条规则的影响。
-j
— 当一个数据包匹配一条特定规则时,跳到指定的 target。
标准的 target 是 ACCEPT
、DROP
、QUEUE
和 RETURN
。
红帽企业 Linux iptables
RPM 软件包默认加载的模块也包括了扩展的选项。在这些模块中包括的有效 target 有 LOG
、MARK
、 REJECT
和其它 target。请参阅 iptables
说明书页来获得更多关于这些 target 的信息。
这个选项也可以用来把匹配特定规则的一个数据包导向到当前 chain 以外的一个用户定义的 chain 中,从而可以对这个数据包应用其它规则。
如果没有指定 target,这个数据包会通过这个规则而没有任何行动被执行。但是,这个规则的计数器会增加一个数值。
-o
— 为一个规则设置出站网络接口。在 filter
规则表中,这个选项只对 OUTPUT 和 FORWARD chain 有效,而在 nat
和 mangle
规则表中,这个选项对 POSTROUTING chain 有效。这个参数接受和入站网络接口参数 (-i
) 相同的选项。
-p <protocol>
— 设置受这条规则影响的 IP 协议。这可能是 icmp
、tcp
、udp
或 all
;或是代表这些或一个不同协议的数值。您也可以使用在 /etc/protocols
文件中列出的任何数值。
"all
" 协议意味着这条规则适用于所有支持的协议。如果这条规则中没有指定协议,它的默认值则为 "all
"。
-s
— 为一个特定的数据包设定源地址。它使用和目的地址 (-d
) 参数相同的语法。
不同的网络协议会提供不同的匹配选项,它们可以被配置来匹配使用这个协议的特定的数据包。但是,这个协议必须先在 iptables
命令中被指定。例如,-p
启用了指定协议的选项。请注意,您也可以使用协议 ID 来代替协议名。请参照以下的实例,它们有相同的效果:
<protocol-name>
iptables -A INPUT -p icmp --icmp-type any -j ACCEPT
iptables -A INPUT -p 5813 --icmp-type any -j ACCEPT
/etc/services
文件包括了服务的定义。为了阅读方便,建议您使用服务名,而不使用端口号。
您需要保证 /etc/services
文件的安全性来防止未经授权的修改。如果这个文件可以被编辑,未经授权的用户就可能通过编辑这个文件来在您的系统上开放一些您不希望开放的端口。要使这个文件保持安全,以根用户的身份输入以下命令:
[root@myServer ~]# chown root.root /etc/services [root@myServer ~]# chmod 0644 /etc/services [root@myServer ~]# chattr +i /etc/services
这将可以防止这个文件被重新命名、删除或链接到这个文件。
这些匹配选项对 TCP 协议 (-p tcp
) 有效:
--dport
— 设置数据包的目的端口。
要配置这个选项,使用网络服务名(如 www 或 smtp),端口号,或一个端口号范围。
要指定一个端口号范围,使用一个冒号 (:
) 分隔两个端口号,如:-p tcp --dport 3000:3200
。可被接受的最大端口范围是 0:65535
。
在 --dport
选项后面使用 (!
) 来匹配那些 不 使用那个网络服务或端口的数据包。
通过 /etc/services
文件可以查看使用的网络服务和端口号的名称或别名。
--destination-port
匹配选项与 --dport
相同。
--sport
— 设置数据包的源地址端口,它使用和 --dport
相同的选项。--source-port
匹配选项与 --sport
完全相同。
--syn
— 匹配所有用来初始网络通信的 TCP 数据包(通常被称为 SYN packets)。任何包括实际数据的数据包都不会被处理。
在 --syn
选项后面使用 (!
) 来匹配所有非 SYN 的数据包。
--tcp-flags <tested flag list> <set flag list>
— 允许有特定位(标识)的 TCP 数据包匹配一个规则。
--tcp-flags
匹配选项接受两个参数。第一个是掩码:一个由逗号分隔的、被数据包检查的标识。第二个参数是由逗号分隔的、必须为规则匹配设置的一组标识。
可能的标识是:
ACK
FIN
PSH
RST
SYN
URG
ALL
NONE
例如,一个 iptables
规则包括了以下内容,它只匹配有 SYN 标识,而 ACK 和 FIN 标识没有被设定的 TCP 数据包:
--tcp-flags ACK,FIN,SYN SYN
在 --tcp-flags
后面使用 (!
) 来使匹配选项起相反的作用。
--tcp-option
— 试图匹配可以在特定数据包中设置的 TCP 选项。这个选项也可以使用 (!
) 来起到相反的效果。
这些匹配选项对 UDP 协议 (-p udp
) 有效:
--dport
— 指定 UDP 数据包的目的端口,它使用服务名、端口号或端口号范围。--destination-port
匹配选项与 --dport
相同。
--sport
— 指定 UDP 数据包的源端口,它使用服务名、端口号或端口号范围。--source-port
匹配选项与 --sport
相同。
对于 --dport
和 --sport
选项,要指定端口号范围,使用冒号 (:) 分隔两个数值。例如:-p tcp --dport 3000:3200
。可接受的最大端口范围是 0:65535。
以下匹配选项对 Internet Control Message Protocol (ICMP) (-p icmp
) 协议有效:
--icmp-type
— 设置 ICMP 类型的名称或号码来匹配这个规则。输入 iptables -p icmp -h
命令可以获得有效的 ICMP 名称的列表。
iptables
命令加载的模块提供了额外的匹配选项。
要使用一个匹配选项模块,通过名称加载它:-m
,在这里,<module-name>
<module-name>
是模块名。
在默认情况下,许多模块都有效。您也可以创建模块来提供额外的功能。
以下是一些最常用模块的列表:
limit
模块 — 限制一个特定规则可以匹配的数据包的数量。
当与 LOG
target 一起使用时,limit
可以防止大量匹配的数据包在系统日志文件中产生大量重复的信息,或占用大量的系统资源。
请参阅 第 3.5.3.5 节 “Target 选项” 来获得更多关于 LOG
target 的信息。
limit
模块启用了以下选项:
--limit
— 设置在一个特定时间段中最多匹配的数据包数量(使用
对来指定)。例如,<value>/<period>
--limit 5/hour
允许每小时可以匹配五条规则。
时间段可以指定为秒、分钟、小时或天。
如果时间没有被指定,它的默认值为 3/hour
。
--limit-burst
— 设置在同一时间匹配一个规则的数据包的数量限制。
这个选项应该是一个整数值,并需要和 --limit
选项一起使用。
如果没有特定的值被指定,它的默认值为 5。
state
模块 — 启动状态匹配。
state
模块启用了以下选项:
--state
— 匹配有以下连接状态的一个数据包:
ESTABLISHED
— 匹配的数据包与一个已经建立的连接中的其它数据包相关联。如果您希望维护在一个客户端系统和一个服务间的连接,您需要接受这个状态。
INVALID
— 匹配的数据包不能与一个已知的连接相关联。
NEW
— 匹配的数据包正在创建一个新连接,或它是一个以前没有出现的双向连接的一部分。如果您要允许到一个服务的新连接,您需要接受这个状态。
RELATED
— 匹配的数据包正在开始一个与一个存在的连接相关的新连接。它的一个例子是 FTP,FTP 使用一个连接来控制通信(端口21),并使用一个独立的连接进行数据传输(端口20)。
多个连接状态可以在一起使用,使用逗号隔开不同的状态,如 -m state --state INVALID,NEW
。
mac
模块 — 启用硬件 MAC 地址匹配。
mac
模块启用了以下选项:
--mac-source
— 匹配发送这个数据包的网卡的 MAC 地址。要在一条规则中不包括特定的 MAC 地址,在 --mac-source
匹配选项后使用 (!
)。
请参阅 iptables
说明书页来获得更多关于这个模块可用的匹配选项的信息。
当一个数据包与一个特定的规则相匹配时,这条规则可以把这个数据包重新定向到不同的 target 中,由这些 target 来决定对这个数据包采取什么行动。每个 chain 都有一个默认的 target,它在数据包与这个 chain 中的任何规则都不匹配,或所匹配的规则都没有指定 target 时使用。
以下是标准的 target:
— 规则表中的一个用户定义的 chain。用户定义的 chain 的名称必须是唯一的。这个 target 会把数据包发送到指定的 chain。
<user-defined-chain>
ACCEPT
— 允许数据包通过并发送到它的目的地或其它 chain。
DROP
— 丢掉这个数据包并不给发送者任何反馈信息。发送这个数据包的系统将不会得到发送失败的信息。
QUEUE
— 数据包被放置在一个用户空间应用程序的队列中等待被处理。
RETURN
— 停止使用当前 chain 中的规则来检查数据包。如果带有一个 RETURN
target 的数据包与另一个 chain 所调用的一个规则相匹配,这个数据包会重新返回到它所离开的第一个 chain 来恢复规则检查。如果 RETURN
规则在一个内建 chain 中使用,而这个数据包无法返回到它以前的 chain,当前 chain 的默认 target 被使用。
另外,可用的扩展还允许指定其它 target。这些扩展被称为调用的 target 模块或匹配模块,其中的大多数只适用于特定的规则表和特殊的情况。请参阅第 3.5.3.4.4 节 “额外的匹配选项模块”来获得更多关于匹配选项模块的信息。
扩展的 target 模块中的大多数只适用于特定的规则表或特殊的情况。红帽企业 Linux 默认包括的最常用的 target 模块是:
LOG
— 在日志中记录所有匹配这条规则的数据包。因为数据包被内核所记录,所以 /etc/syslog.conf
文件决定了这些日志信息被写到什么地方。默认情况下,它们被放置在 /var/log/messages
文件中。
在 LOG
target 指定了日志记录的方法后,还可以使用其它的选项:
--log-level
— 设置一个日志记录事件的优先级。请参阅 syslog.conf
说明书页来获得优先级列表信息。
--log-ip-options
— 记录一个 IP 数据包头中设置的所有选项。
--log-prefix
— 在记录日志信息前,写入一个最长为 29 个字符的字符串。这在编写 syslog 过滤程序时非常有用。
因为这个信息本身存在的问题,您需要在 log-prefix
值的后面添加一个空格。
--log-tcp-options
— 记录一个 TCP 数据包头中所设置的所有选项。
--log-tcp-sequence
— 在日志中记录这个数据包的 TCP 序列号。
REJECT
— 丢掉这个数据包,并向远程系统发回一个错误数据包。
REJECT
target 接受 --reject-with
(在这里,<type>
<type>
是拒绝的类型) 来允许在返回的错误数据包中包括更详细的信息。如果没有使用其它选项,port-unreachable
就是默认的错误类型。请参阅 iptables
说明书页来获得
选项完整列表的信息。
<type>
另外,您还可以在 iptables
说明书页中获得其它 target 扩展的信息。
默认的列出命令,iptables -L [<chain-name>]
,可以显示默认过滤规则表当前 chain 的基本信息。其它选项可以提供更详细的信息:
-v
— 显示详细的输出,如每个 chain 已经处理的数据包数和字节数;规则匹配的数据包数和字节数;一个特定的规则适用于哪个网络接口。
-x
— 使用精确的值。在一个非常繁忙的系统上,被一个特定 chain 或规则所处理的数据包和字节数可能会以 Kilobytes
、Megabytes
(Megabytes) 或 Gigabytes
为单位。这个选项可以被用来强制显示准确的数值。
-n
— 以数字而不是主机名和网络服务的形式显示 IP 地址和端口号。
--line-numbers
— 列出规则在 chain 中所处位置的数字顺序。当要删除一个 chain 中的特定规则或确定在什么位置插入一条规则时非常有用。
-t <table-name>
— 指定一个规则表名。如果没有指定,则使用默认的 filter 规则表。
以下实例显示了使用这些选项的结果。请注意在使用 -x
选项时字节数的不同。
[root@myserver ~]# iptables -L OUTPUT -v -n -x Chain OUTPUT (policy ACCEPT 64005 packets, 6445791 bytes) pkts bytes target prot opt in out source destination 1593 133812 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 [root@myserver ~]#iptables -L OUTPUT -v -n Chain OUTPUT (policy ACCEPT 64783 packets, 6492K bytes) pkts bytes target prot opt in out source destination 1819 153K ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 [root@myserver ~]#
iptables
命令所创建的规则被存储在内存中。如果在保存 iptables
规则前重新启动系统,则所有的规则将会丢失。要想在系统重新启动后不丢失 netfilter 过滤规则,这些规则必须被保存。要保存 netfilter 规则,以根用户的身份输入以下命令:
/sbin/service iptables save
这个命令执行 iptables
初始脚本,它运行 /sbin/iptables-save
程序,并把当前的 iptables
配置写入到 /etc/sysconfig/iptables
。存在的 /etc/sysconfig/iptables
文件被存为 /etc/sysconfig/iptables.save
。
当系统下一次启动时,iptables
初始脚本会使用 /sbin/iptables-restore
命令来重新应用存储在 /etc/sysconfig/iptables
中的规则。
在把新的 iptables
规则写入到 /etc/sysconfig/iptables
文件前,最好对它进行测试。您可以把另外一个系统版本中的这个文件复制到这个系统上来复制 iptables
规则。这个方法可以被用来在多个系统上实施一组 iptables
规则。
您还可以把 iptables 规则保存到一个单独的文件中来发布它们,对它们进行备份或用于其它目的。要保存您的 iptables 规则,以根用户的身份运行以下命令:
[root@myserver ~]# iptables-save >
在这里,<filename>
<filename>
是由用户定义的、您的规则的名称。
如果把 /etc/sysconfig/iptables
文件传送到其它系统上,输入 /sbin/service iptables restart
来使新规则生效。
请注意 iptables
命令(/sbin/iptables
- 它被用来处理规则表和 chain 来实现 iptables
的功能)和 iptables
服务(/sbin/iptables service
- 它被用来启用或禁用 iptables
服务)间的不同。
在 红帽企业 Linux 中有两种方法来控制 iptables
:
/sbin/service iptables
— 通过使用它的初始脚本来处理 <option>
iptables
的不同功能。它包括以下选项:
start
— 如果一个防火墙被配置(有 /etc/sysconfig/iptables
文件),所有运行的 iptables
都将完全停止,然后使用 /sbin/iptables-restore
命令启动。这个选项只在 ipchains
内核模块没有被加载的时候有效。要检查这个模块是否被加载,以根用户的身份运行以下命令:
[root@MyServer ~]# lsmod | grep ipchains
如果这个命令的运行没有返回任何输出,则这个模块没有被加载。如果需要,使用 /sbin/rmmod
命令来删除这个模块。
stop
— 如果一个防火墙在运行,内存中的防火墙规则会被丢掉,所有 iptables 模块和 helper 会被卸载。
如果 /etc/sysconfig/iptables-config
配置文件中的 IPTABLES_SAVE_ON_STOP
项的值由默认值改为 yes
,当前的规则会被保存到 /etc/sysconfig/iptables
,所有存在的规则都会被移到 /etc/sysconfig/iptables.save
文件中。
请参阅 第 3.5.5.1 节 “IPTables 控制脚本配置文件” 来获得更多关于 iptables-config
文件的信息。
restart
— 如果一个防火墙在运行,内存中的防火墙规则会被丢掉,如果它在 /etc/sysconfig/iptables
中被配置,防火墙会重新运行。这个选项只在 ipchains
内核模块没有被加载的情况下有效。
如果 /etc/sysconfig/iptables-config
配置文件中的 IPTABLES_SAVE_ON_RESTART
项的值由默认值改为了 yes
,当前的规则会被保存到 /etc/sysconfig/iptables
,所有存在的规则都被移到 /etc/sysconfig/iptables.save
文件中。
请参阅 第 3.5.5.1 节 “IPTables 控制脚本配置文件” 来获得更多关于 iptables-config
文件的信息。
status
— 显示防火墙的状态并列出所有活跃的规则。
这个选项的默认配置是在每条规则中显示 IP 地址。要显示域名和主机名信息,编辑 /etc/sysconfig/iptables-config
文件,把 IPTABLES_STATUS_NUMERIC
项的值改为 no
。请参阅第 3.5.5.1 节 “IPTables 控制脚本配置文件”来获得更多关于 iptables-config
文件的信息。
panic
— 丢掉所有防火墙规则。所有配置的规则表中的政策都被设为 DROP
。
当一个服务器的安全性被破坏时这个选项将非常有用。您可以使用这个选项来停止所有到这个系统的网络流量,同时可以保持这个系统的运行来分析系统的状态。
save
— 使用 iptables-save
把防火墙规则保存到 /etc/sysconfig/iptables
。请参阅第 3.5.4 节 “保存 IPTables 规则”来获得更详细的信息。
要使用相同的初始脚本命令对 IPv6 进行 netfilter 控制,把本节中介绍的 /sbin/service
命令中的 iptables
替换为 ip6tables
。更多关于 IPv6 和 netfilter 的信息,请参阅 第 3.5.6 节 “IPTables 和 IPv6”。
iptables
初始脚本是由 /etc/sysconfig/iptables-config
配置文件所控制的。以下是包括在这个文件中的项的列表:
IPTABLES_MODULES
— 在防火墙被激活时,指定一组空间独立的额外 iptables
模块来加载。这可以包括 connection tracking 和 NAT helper。
IPTABLES_MODULES_UNLOAD
— 在重新启动和停止时卸载的模块。这个项接受以下值:
yes
— 默认的值。这个选项必须被设置来在启动和停止一个防火墙时达到一个正确的状态。
no
— 这个选项只有在卸载 netfilter 模块出现问题时才应该设置。
IPTABLES_SAVE_ON_STOP
— 当防火墙停止时把当前的防火墙规则保存到 /etc/sysconfig/iptables
。这个项接受以下值:
yes
— 当防火墙停止时把现存的规则保存到 /etc/sysconfig/iptables
,而以前的版本被保存为 /etc/sysconfig/iptables.save
。
no
— 默认值。当防火墙停止时不保存当前的规则。
IPTABLES_SAVE_ON_RESTART
— 当防火墙重新启动时,保存当前的防火墙规则。这个项接受以下值:
yes
— 当防火墙重新启动时,保存现存的规则到 /etc/sysconfig/iptables
,而以前的版本被存为 /etc/sysconfig/iptables.save
。
no
— 默认值。防火墙重新启动时,不保存现存的规则。
IPTABLES_SAVE_COUNTER
— 保存并恢复所有 chain 和规则中的数据包和字节计数器。这个项接受以下值:
yes
— 保存计数器的值。
no
— 默认值。不保存计数器值。
IPTABLES_STATUS_NUMERIC
— 输出的 IP 地址是数字的格式,而不是域名和主机名的形式。这个项接受以下值:
yes
— 默认的值。在状态输出中只包括 IP 地址。
no
— 在状态输出中返回域名或主机名。
如果 iptables-ipv6
软件包被安装,红帽企业 Linux 包括的 netfilter 可以过滤 IPv6 协议。用来处理 IPv6 netfilter 的命令是 ip6tables
。
这个命令的多数项与 iptables
中的项相同,但是 nat
规则表还不被支持。这意味着还无法执行 IPv6 网络地址翻译的任务,如 masquerading 和 port forwarding。
ip6tables
规则被保存在 /etc/sysconfig/ip6tables
文件中。以前被 ip6tables
初始脚本保存的规则被保存在 /etc/sysconfig/ip6tables.save
文件中。
ip6tables
初始脚本的配置选项被保存在 /etc/sysconfig/ip6tables-config
中,每个项的名称与 iptables
中对应项的名称非常相似。
例如,iptables-config
的 IPTABLES_MODULES
项:在对应的 ip6tables-config
文件中是 IP6TABLES_MODULES
。
更多关于 iptables
数据包过滤的信息可以在以下获得。
http://www.netfilter.org/ — netfilter/iptables 项目的官方网站。它提供了各种与 iptables
相关的信息: Linux IP 防火墙的维护者 Rusty Russell 编写的 FAQ 和不同的帮助信息;HOWTO 文档包括了基本的网络概念、内核数据包过滤和 NAT 的配置。
http://www.linuxnewbie.org/nhf/Security/IPtables_Basics.html — 介绍了数据包通过 Linux 内核的方法,以及构建基本 iptables
命令的方法。
Security-Enhanced Linux (SELinux) 是一个集成到 2.6.x 内核中的、使用 Linux 安全模块(LSM)的安全体系结构,它是美国国家安全局(NSA)和 SELinux 社区的一个项目。把 SELinux 集成到 红帽企业 Linux 是 NSA 和 Red Hat 通力合作的结果。
SELinux 提供了一个构建到 Linux 内核中的、灵活的 Mandatory Access Control(强制访问控制) (MAC) 系统。在标准的 Linux Discretionary Access Control(自主访问控制) (DAC) 中,一个应用程序或进程以一个用户的身份(UID 或 SUID)运行,它们对目标(如文件、套接字和其它进程)有特定的访问权限。而运行一个 MAC 内核可以防止恶性程序或有设计漏洞的程序对系统进行损坏或破坏。
SELinux 为系统上的所有用户、应用程序、进程和文件都定义了访问和变迁权利。SELinux 使用一个根据实际要求设定的或严格或宽松的安全政策来控制这些实体之间的交互作用。
在日常使用中,一般的系统用户通常不怎么注意 SELinux 的存在,只有系统管理员才需要考虑在他们的服务器环境中要实施的安全政策应该多么严格才合适。根据实际需求,安全政策可以很严格也可以很宽松,可以非常详细。这种详细的配置可以使 SELinux 内核对整个系统进行完全精细的控制。
当一个主观项(subject)(如一个应用程序)要访问一个客观项(object)(如一个文件)时,内核中的安全政策强制服务器会检查 access vector cache(访问矢量缓存) (AVC),其中缓存着的主客观项的权限。如果根据 AVC 中的数据不足以决策的话,该请求会继续并到达安全服务器,该服务器会查看这个应用程序的 security context(安全上下文) 以及那个矩阵中的文件。根据查看的结果,访问权限可能被授予,也可能被拒绝。如果访问权限被拒绝,avc: denied
信息会记录到 /var/log/messages
文件中。主观项和客观项的安全上下文是由所安装的安全政策决定的。同时,安全政策也提供安装安全服务器矩阵所需要的信息。
请参阅以下图示:
SELinux不是在强制模式下运行,而是可以在容许模式下运行,其中 AVC 被检查而且拒绝信息被并记录,但 SELinux 并不强制实施相应的安全政策。这对故障排除和开发或优化 SELinux 政策是很有用的。
要获得关于 SELinux 工作原理的更多信息,请参阅第 4.1.3 节 “其它资源”。
以下章节介绍 SELinux 的配置文件和相关文件系统。
/selinux/
伪文件系统包括内核子系统最常使用的各种命令。这个类型的文件系统与 /proc/
伪文件系统非常相似。
系统管理员和用户通常不需要直接操作这个部件。
以下实例显示一个 /selinux/
目录的示范内容:
-rw-rw-rw- 1 root root 0 Sep 22 13:14 access dr-xr-xr-x 1 root root 0 Sep 22 13:14 booleans --w------- 1 root root 0 Sep 22 13:14 commit_pending_bools -rw-rw-rw- 1 root root 0 Sep 22 13:14 context -rw-rw-rw- 1 root root 0 Sep 22 13:14 create --w------- 1 root root 0 Sep 22 13:14 disable -rw-r--r-- 1 root root 0 Sep 22 13:14 enforce -rw------- 1 root root 0 Sep 22 13:14 load -r--r--r-- 1 root root 0 Sep 22 13:14 mls -r--r--r-- 1 root root 0 Sep 22 13:14 policyvers -rw-rw-rw- 1 root root 0 Sep 22 13:14 relabel -rw-rw-rw- 1 root root 0 Sep 22 13:14 user
例如,对 enforce
文件运行 cat
命令会显示一个 1
(强制模式)或 0
(容许模式)。
以下章节描述 SELinux 配置和政策文件,以及在 /etc/
目录中相关的各种文件系统。
在 红帽企业 Linux下,可以使用两种方法来配置 SELinux:使用 安全级别配置工具 (system-config-securitylevel
) 或手动编辑配置文件 (/etc/sysconfig/selinux
)。
/etc/sysconfig/selinux
是启动或中止 SELinux 的主要配置文件,也可以用来设定哪些政策需要在系统上被强制执行,以及如何强制执行它们。
/etc/sysconfig/selinux
包含一个连接到实际的配置文件(/etc/selinux/config
)的符号链接。
以下解释一整套可供配置使用的子选项:
SELINUX=
— 在一个系统上定义 SELinux 最高级别(top-level)的状态。
enforcing|permissive|disabled
enforcing
— SELinux 安全政策被强制执行。
permissive
— SELinux 系统输出警告信息,但不强制执行安全政策。
这可以被用来进行故障排除。在容许模式中,系统会记录更多的拒绝信息。这是因为一些主观项在容许模式中可以继续进行的动作在强制模式中会被拒绝。例如,当在容许模式中访问一个目录树时,访问每一级目录时都会产生 avc: denied
信息。而在强制模式中,SELinux 早就起初阶段被中止,以至于避免了其它拒绝信息的产生。
disabled
— SELinux 被完全中止。SELinux 挂机程序就从内核中脱离,那么伪文件系统就脱离注册。
在 SELinux 中止期间所运行的动作可能会导致文件系统不再拥有正确的安全上下文,即由该政策定义的安全上下文。重新标记文件系统的最好方法就是创建标识文件 /.autorelabel
并且重新启动机器。这会使重新标识的工作在引导进程的早期进行,也就是在任何其它进程运行前进行。使用这个方法可以防止在错误的安全上下文中创建文件;或在错误的上下文中启动。
在启用 SELinux 来重新标识这个文件系统之前使用 fixfiles relabel
命令是可能的。但是,这个方法并不是好方法,因为在此进程完成后,有些进程仍然有可能在错误的安全上下文中潜在运行,而这些进程也可能在错误的安全上下文中创建文件。
在每个配置行最后添加不必要的空格,或在文件的最后添加额外的行都可能会导致无法预测的行为发生。为了保险,请删除不必要的空格。
SELINUXTYPE=
— 指定哪个政策 SELinux 应该被强制执行。
targeted|strict
targeted
— 只有选定的网络守护进程会得到保护。
在默认选定的政策下,以下守护进程得到保护:dhcpd, httpd (apache.te)、named、nscd、ntpd、portmap、snmpd、squid
和 syslogd
。系统的其它守护进程在 unconfined_t 域中运行。这个域允许其安全上下文中的主观项和客观项使用标准的 Linux 安全系统来运作。
这些守护进程的政策文件位于 /etc/selinux/targeted/src/policy/domains/program
文件中。这些文件可能会在更新的 红帽企业 Linux 版本发行时有所改变。
这些守护进程的安全政策的强制执行可以通过使用由 安全级别配置工具 (system-config-securitylevel
)控制的布尔值被开启或关闭。
把一个选定的守护进程布尔值设为 0
(零)会中止对这个守护进程的安全政策变迁。例如,您可以把 dhcpd_disable_trans
设定为 0
来防止 init
把 dhcpd
从 unconfined_t 域转换到 dhcpd.te
中指定的域。
使用 getsebool -a
命令列出所有 SELinux 布尔值。以下是使用 setsebool
命令来设定 SELinux 布尔值的一个实例。-P
选项使这一改变成为永久效果。如果没有这个选项,布尔值会在重新启动时被重新设定为 1
。
setsebool -P dhcpd_disable_trans=0
strict
— 对所有守护进程进行完全的 SELinux 保护。安全上下文会为系统中的所有主客观项设定,并且每个动作都由安全政策强制服务器进行处理。
SETLOCALDEFS=
— 控制本地定义(用户和布尔值)如何被设定。如果这个值设定为 1,这些定义被 来自 0|1
/etc/selinux/
中文件的 <policyname>
load_policy
控制。如果这个值设定为 0,则由 semanage
控制。
如果您不是完全了解这个改变所带来的影响,请不要改变它的默认值(0)。
/etc/selinux/
目录是所有政策文件和主要配置文件所在的首要位置。
以下实例显示 /etc/selinux/
目录中的示范内容:
-rw-r--r-- 1 root root 448 Sep 22 17:34 config drwxr-xr-x 5 root root 4096 Sep 22 17:27 strict drwxr-xr-x 5 root root 4096 Sep 22 17:28 targeted
这两个子目录 strict/
和 targeted/
是含有同一个名称的政策所有文件的特定目录(即,strict
和 targeted
。
以下是常用的 SELinux 工具程序:
/usr/sbin/setenforce
— 实时修改 SELinux 运行的模式。
例如:
setenforce 1
— SELinux 以强制模式运行。
setenforce 0
— SELinux 在容许模式下运行。
要真正中止 SELinux,您需要在 /etc/sysconfig/selinux
中指定适当的 setenforce
参数;或需要在 /etc/grub.conf
文件中或系统引导时把参数 selinux=0
传递给内核。
/usr/sbin/sestatus -v
— 显示一个运行 SELinux 的系统详细状态。以下实例显示 sestatus -v
输出信息的一个片段:
SELinux status: enabled SELinuxfs mount: /selinux Current mode: enforcing Mode from config file: enforcing Policy version: 21 Policy from config file: targeted Process contexts: Current context: user_u:system_r:unconfined_t:s0 Init context: system_u:system_r:init_t:s0 /sbin/mingetty system_u:system_r:getty_t:s0
/usr/bin/newrole
— 在一个新上下文或角色中运行一个新的 shell。安全政策必须允许转换到新角色。
这个命令只在安装了 policycoreutils-newrole
软件包后才有效,严格的和MLS 安全政策都需要这个软件包。
/sbin/restorecon
— 通过标记带有合适文件或安全上下文的扩展属性来设定一个或多个文件的安全上下文。
/sbin/fixfiles
— 在这个文件系统上检查或纠正安全上下文数据库。
请参阅这些工具程序相关的说明书页来获得更详细的信息。
请参阅 setools
或 policycoreutils
软件包内容来获得所有可用的二进制工具程序的详细信息。要想查看一个软件包的内容,使用以下命令:
rpm -ql
<package-name>
如需了解更多关于 SELinux 的信息,请参阅以下资源:
/usr/share/doc/setools-<
工具程序的所有文档都包括在 version-number
>/setools
软件包中,包括所有帮助脚本、示配置文件范和文档。
http://www.nsa.gov/selinux/ NSA SELinux开发队伍的主页,许多可供使用的资源都使用 HTML 和 PDF 格式。尽管这些链接中的很多并不是只适用于 SELinux,但SELinux的一些概念也许对您会有所帮助。
http://fedora.redhat.com/docs/ Fedora 文档工程的主页,包括 Fedora Core 专用的比较新的材料,因其发行周期比较短。
http://selinux.sourceforge.net SELinux团体的主页。
最初,SELinux 是美国国家安全局 (NSA )[2] 和其它一些机构的一个开发项目。它是 Flask 操作系统安全结构[3]的一个实现。NSA 使用 Linux Security Modules (LSM ) 结构把 SELinux 集成到 Linux 的内核中。Linus Torvalds 希望使用模块化的方法来实现系统的安全性,而不只是简单地把 SELinux 放入内核。因为这个原因,LSM 被创建来把 SELinux 集成到内核中。
在最初的阶段,SELinux 使用存储在一个不被使用的 ext2 inode 区域中的persistent security IDs (PSIDs)。这些标识(如 non-human-readable)被 SELinux 对应到一个安全上下文标识。但是,这需要改变所有文件系统的类型来支持 PSIDs,因此,这并不是一个可扩展的解决方案,也并不被 Linux 内核的上游社区所支持。
接下来,SELinux 发展为 Linux 内核 2.4.<x>
系列的一个可加载的内核模块。这个模块把 PSIDs 保存在一个普通文件中,因此 SELinux 可以支持更多的文件系统。这个解决方案从性能角度来看并不是最好的,而且在不同的平台上并不统一。最后,SELinux 代码被上游社区集成到 2.6.x
内核中,它完全支持 LSM 并在 ext3 文件系统上有 扩展的属性(extended attributes)
(xattrs
)。SELinux 改为使用 xattrs 来存储安全上下文信息。xattr 的名称空间(namespace)可以使同一个系统中存在的多个安全模块相互独立。
被上游社区所接受的与内核相关的工作,以及后续的 SELinux 开发,是 NSA、红帽和 SELinux 开发社区通力合作的结果。
更多关于 SELinux 的发展历史可以通过访问 http://www.nsa.gov/selinux/ 获得。
[2] NSA 是美国联邦政府的信息情报部门,它负责与信息和情报相关的安全工作。您可以访问 NSA 的网站 - http://www.nsa.gov/about/,来获得更详细的信息。
[3] Flask 是从一个把 Distributed Trusted Operating System (DTOS ) 集成到 Fluke 研究操作系统中的项目发展出来的。Flask 是这个结构的名称,它是在 Fluke 操作系统上实现的。