第 4 章 Linux 中的安全性

目录

4.1. 伪装和防火墙
4.2. SSH:安全的网络操作
4.3. 对分区和文件进行加密
4.4. 通过 AppArmor 限制特权
4.5. 安全性和机密性

摘要

伪装功能和防火墙可以有效地控制数据流和数据交换。SSH(安全 Shell)使您可以通过加密连接登录到远程主机中。对文件或整个分区加密可以在第三方未经授权访问您的系统时保护您的数据。根据技术说明,查找关于 Linux 网络的安全性问题信息。


4.1. 伪装和防火墙

只要在联网环境中使用 Linux,您就可以使用内核功能通过操纵网络包将内部网络区域和外部网络区域隔开。Linux netfilter 框架提供了一种建立有效防火墙的方法,可以将不同网络隔开。借助 iptables(用于定义规则集的通用表结构)可以精确控制哪些包能通过网络接口。使用 SUSEfirewall2 和相应的 YaST 模块,您可以轻而易举地设置这种包过滤器。

4.1.1. 使用 iptables 过滤包

部件 netfilter 和 iptables 负责网络包的过滤和操纵以及网络地址转换 (NAT)。过滤准则及与过滤准则关联的所有操作均储存在链中;各个网络包在到达时,必须依次与这些链进行匹配。要匹配的链储存在表中。使用 iptables 命令可以更改这些表和规则集。

Linux 内核维护以下三个表,分别对应包过滤器的不同功能:

filter

此表储存大多数过滤规则,因为它执行严格意义上的包过滤机制,例如,决定是让包通过 (ACCEPT) 还是将包丢弃 (DROP)。

nat

此表定义对包的源地址和目标地址所做的任何更改。使用这些功能还能实现伪装,这是 NAT 的一个特例,用于将专用网络与因特网链接起来。

mangle

此表中的规则用于操纵 IP 报头中储存的值(如服务类型)。

图 4.1. iptables:数据包的可能路径

iptables:数据包的可能路径

这些表包含多个用于匹配包的预定义链:

PREROUTING

此链适用于入站包。

INPUT

此链适用于发往系统内部进程的包。

FORWARD

此链适用于仅在系统中路由的包。

OUTPUT

此链适用于从系统自身发出的包。

POSTROUTING

此链适用于所有出站包。

图 4.1 “iptables:数据包的可能路径” 演示了网络包在特定系统中传送时可能经过的路径。为了便于说明,图中将表作为链的各个部分列出,但实际上表本身储存了这些链。

在所有可能的情况中最简单的情况是:发往系统本身的入站包到达 eth0 接口。数据包首先要转到 mangle 表的 PREROUTING 链,然后转到 nat 表的 PREROUTING 链。随后的步骤(涉及包的路由选择)确定包的实际目标,这是系统自身的过程。在包经过 mangle 表和 filter 表的 INPUT 链后,只要与 filter 表的规则确实匹配,那么包将最终到达目标。

4.1.2. 关于伪装的基础知识

伪装是 Linux 特有的一种 NAT(网络地址转换)形式。通过伪装可以将小型 LAN(其中的主机使用专用地址范围中的 IP 地址,请参见第 18.1.2 节 “网络掩码和路由”)与因特网(使用正式的 IP 地址)连接起来。为使 LAN 主机能连接到因特网,需要将其专用地址转换为正式地址。这种转换是在路由器上完成的,路由器充当了 LAN 和因特网之间的网关。基本原理很简单:路由器包含多个网络接口,通常包含一个网卡和一个与因特网连接的独立接口。后者将路由器与外部世界链接起来,同时,还会有一个或多个其它网络接口将路由器与 LAN 主机链接起来。在本地网络中的这些主机连接到路由器的网卡(如 eth0)后,它们就可以将发往本地网络之外的所有包发送到其默认网关或路由器。

[Important]使用正确的网络掩码

在配置网络时,确保所有本地主机的广播地址和网络掩码都相同。做不到这一点就会导致无法正确路由数据包。

如上所述,只要有某台 LAN 主机要向因特网地址发送包,这个包就会发送到默认路由器。但是,必须先配置路由器,然后才能转发这些包。出于安全考虑,SUSE Linux 没有在默认安装中提供这种支持。要提供这种支持,请将文件 /etc/sysconfig/sysctl 中的变量 IP_FORWARD 设置为 IP_FORWARD=yes

连接的目标主机可以看到路由器,但对内部网络中发出包的那台主机却毫不知情。伪装技术就是因此而得名的。由于要进行地址转换,路由器自然成为所有回复包首先到达的目标。路由器必须能够识别这些入站包并转换其目标地址,这样才能将包转发给本地网络中的正确主机。

由于入站通讯数据的路由选择取决于伪装表,所以从外部根本无法打开与内部主机的连接。对于这种连接,伪装表中不会有任何对应项。此外,所有已建立的连接在该表中都被指派了一个状态项,所以其它连接无法再使用该项。

受以上各种因素影响,在使用某些应用程序协议,如 ICQ、cucme、IRC(DCC、CTCP)和 FTP(采用 PORT 方式)时,您可能会遇到一些问题。因此,Netscape(标准的 FTP 程序)和其它许多程序都使用 PASV 方式。就包过滤和伪装而言,这种被动方式不容易出问题。

4.1.3. 防火墙基础知识

在描述不仅可以提供和管理网络间的链接,同时还能够控制网络间的数据流的机制时,防火墙可能是最常使用的术语。严格地说,本节所述的机制应该叫做包过滤器。包过滤器根据特定准则(如协议、端口和 IP 地址)来控制数据流。这样您就可以根据包的地址来拦截不应该发送到您网络中的包。举例来说,若允许对万维网服务器进行公共访问,应明确打开相应的端口。不过,包过滤器并不扫描有合法地址的包的内容(例如那些要发送到该万维网服务器的包)。例如,即使是在入站包想要破坏万维网服务器上的 CGI 程序的情况下,包过滤器仍然允许它们通过。

一种更有效但同时也更复杂的机制是将多种系统结合起来使用,例如让包过滤器与应用程序网关或代理进行交互。在这种情况下,包过滤器将拒绝所有发往禁用端口的包,而只接受发往应用程序网关的包。此网关或代理伪装成服务器的实际客户端。从某种意义上说,可以将这种代理视为应用程序使用的协议级的伪装主机。这种代理的一个示例就是 Squid(一种 HTTP 代理服务器)。要使用 Squid,必须将浏览器配置为通过代理通讯。代理超速缓存将提供请求的任何 HTTP 页,超速缓存中没有的页将由代理从因特网获取。再以 SUSE proxy-suite (proxy-suite) 为例,该程序为 FTP 协议提供了代理。

下一节着重介绍 SUSE Linux 附带的包过滤器。有关包过滤和防火墙的详细信息,请阅读 howto 软件包中的 Firewall HOWTO(防火墙使用说明)。如果已安装此软件包,请使用 less /usr/share/doc/howto/en/txt/Firewall-HOWTO.gz 阅读 HOWTO。

4.1.4. SUSEfirewall2

SUSEfirewall2 是一个脚本,用来读取在 /etc/sysconfig/SuSEfirewall2 中设置的变量以生成一组 iptables 规则。该脚本定义了三个安全区域,但在以下示例配置中只涉及第一个和第二个安全区域:

外部区域

鉴于根本无法对外部网络进行控制,所以需要保护主机,使其免受外部网络的影响。在多数情况下,外部网络就是因特网,但也可能是其它不安全的网络,如 WLAN。

内部区域

内部网络是指专用网络,多为 LAN。如果此网络中的主机使用专用地址范围中的 IP 地址(请参见 第 18.1.2 节 “网络掩码和路由”),则必须启用网络地址转换 (NAT),内部网络中的主机才能访问外部网络。

网络隔离区 (DMZ)

尽管从外部网络和内部网络都可以访问此区域内的主机,但这些主机本身无法访问内部网络。这种设置可用于在内部网络前再加一道防线,因为 DMZ 系统与内部网络是隔离的。

凡是过滤规则集没有明确允许通过的网络通讯数据,iptables 都一概禁止。因此,必须将入站通讯数据所流经的各个接口放入这三个区域之一。对于每个区域,都应定义所允许的服务或协议。规则集只适用于来自远程主机的包。防火墙不截获本地生成的包。

可以使用 YaST 进行上述配置(请参见第 4.1.4.1 节 “使用 YaST 配置”)。还可以在文件 /etc/sysconfig/SuSEfirewall2 中进行手工配置,该文件已作适当注释。另外,/usr/share/doc/packages/SuSEfirewall2/EXAMPLES 还提供了一些示例方案。

4.1.4.1. 使用 YaST 配置

[Important]自动配置防火墙

完成安装后,YaST 会在所有已配置接口上自动启动防火墙。如果在系统中配置并激活了某个服务器,YaST 可通过服务器配置模块中的选项打开防火墙中所选接口上的端口打开防火墙中的端口修改自动生成的防火墙配置。某些服务器模块对话框包含防火墙细节按钮,用于激活其它服务和端口。YaST 防火墙配置模块可用于激活、取消激活防火墙或单独对其进行重配置。

可以从 YaST 控制中心访问图形化的 YaST 配置对话框。选择安全性和用户+防火墙。该配置分为 7 个部分,可以在屏幕左侧的树结构上直接访问它们。

启动

在该对话框中设置启动行为。在默认安装中将自动启动 SUSEfirewall2。也可以在这里启动和停止防火墙。要在正在运行的防火墙上实施新的设置,请使用保存设置并立刻重启动防火墙

图 4.2. YaST 防火墙配置

YaST 防火墙配置
接口

这里列出了所有已知的网络接口。要从区域中去除某接口,请选择此接口,并在按更改后选择未指派任何区域。要向区域中添加某接口,请选择此接口,并在按更改后选择任一可用区域。也可以使用自定义来创建一个采用您自己的设置的特殊接口。

允许的服务

您需要此选项来从自己的系统向受保护区域提供服务。 默认情况下,服务器仅免受外部区域的影响。明确允许使用外部主机可用的服务。在所选区域允许的服务中选择所需的区域后,激活服务。

伪装

对外部网络(例如因特网),伪装隐藏您的内部网络,但内部网络中的主机可以透明地访问外部网络。伪装将阻塞从外部网络到内部网络的请求,而发自内部网络的请求从外部来看好像是由伪装服务器发出的。如果需要使外部网络能够使用内部计算机的特殊服务,则可以为服务添加特殊重定向规则。

广播

在该对话框中配置允许广播的 UDP 端口。将所需的各个端口号或服务添加到适当区域,以空格分隔。另请参见文件 /etc/services

可以在这里启用未接受的广播日志记录。这样做可能会出现问题,因为 Windows 主机使用广播来互相识别,从而生成许多未接受的包。

IPsec 支持

在此对话框中配置是否允许从外部网络使用 IPsec 服务。在细节下配置可信的包。

日志记录级别

日志记录有两种规则:接受的包和未接受的包。未接受的包为 DROPPED 或 REJECTED。可以为这两种包选择全部记录记录关键信息不记录任何信息

完成防火墙配置后,选择下一步退出此对话框。然后打开面向区域的防火墙配置概要。在其中检查所有的设置。所有已允许使用的服务、端口和协议均在此概要中列出。要修改配置,请使用后退。按接受即可保存您的设置。

4.1.4.2. 手工配置

以下段落提供进行成功配置的分步说明。每个配置项都根据该项是与防火墙有关还是与伪装有关作了相应标记。这里未涉及配置文件中提到的与 DMZ(网络隔离区)相关的内容。这些内容只适用于大型组织中较复杂的网络基础结构(公司网络),这需要大量配置以及对此主题的深入了解。

首先,使用 YaST 模块系统服务(运行级别)以您的运行级别(很可能是 3 或 5)启用 SUSEfirewall2。这会在 /etc/init.d/rc?.d/ 目录中设置 SUSEfirewall2_* 脚本的符号链接。

FW_DEV_EXT(防火墙,伪装)

链接到因特网的设备。对于调制解调器连接,请输入 ppp0。对于 ISDN 链接,请使用 ippp0。DSL 连接使用 dsl0。指定 auto 使用与默认路由对应的接口。

FW_DEV_INT(防火墙,伪装)

链接到内部专用网络的设备(如 eth0)。如果内部网络不存在,防火墙只保护它运行所在的主机,则应将此项保留为空白。

FW_ROUTE(防火墙,伪装)

如果需要伪装功能,请将此项设置为 yes。内部主机对外将是不可见的,因为因特网路由器将忽略内部主机的专用网络地址(例如 192.168.x.x)。

对于未使用伪装功能的防火墙而言,只有在您希望允许访问内部网络时才应将此项设置为 yes。在此情况下,内部主机需要使用正式注册的 IP。但在通常情况下,应禁止从外部访问您的内部网络。

FW_MASQUERADE(伪装)

如果需要伪装功能,则将此项设置为 yes。这实际上为内部主机提供了与因特网的直接连接。但更保险的做法是在内部网络主机和因特网主机之间设置代理服务器。代理服务器提供的服务不需要伪装。

FW_MASQ_NETS(伪装)

指定要伪装的主机或网络,各个项之间要留有空格。例如:

FW_MASQ_NETS="192.168.0.0/24 192.168.10.1"
FW_PROTECT_FROM_INT(防火墙)

将此项设置为 yes 可以保护防火墙主机免遭来自内部网络的攻击。只有已经显式启用服务,才可以在内部网络中使用这些服务。另请参见 FW_SERVICES_INT_TCPFW_SERVICES_INT_UDP

FW_SERVICES_EXT_TCP(防火墙)

输入应该可用的 TCP 端口。对于不应提供任何服务的家用普通工作站,应将此项保留为空白。

FW_SERVICES_EXT_UDP(防火墙)

除非您运行 UDP 服务并希望此服务对外部可用,否则将此项保留为空白。使用 UDP 的服务包括 DNS 服务器、IPSec、TFTP、DHCP 及其它。在此情况下,请输入要使用的 UDP 端口。

FW_SERVICES_INT_TCP(防火墙)

使用此变量定义可用于内部网络的服务。变量表示法与 FW_SERVICES_EXT_TCP 的表示法相同,但变量设置适用于内部网络。只有在 FW_PROTECT_FROM_INT 设置为 yes 时才需要设置此变量。

FW_SERVICES_INT_UDP(防火墙)

请参见 FW_SERVICES_INT_TCP。

配置防火墙后,请测试您的设置。以 root 身份输入 SUSEfirewall2 start 可创建防火墙规则集。然后,举例来说,可以从外部主机使用 telnet 查看是否确实会拒绝连接。此后,请查看 /var/log/messages,应能看到如下所示的内容:


Mar 15 13:21:38 linux kernel: SFW2-INext-DROP-DEFLT IN=eth0 
OUT= MAC=00:80:c8:94:c3:e7:00:a0:c9:4d:27:56:08:00 SRC=192.168.10.0 
DST=192.168.10.1 LEN=60 TOS=0x10 PREC=0x00 TTL=64 ID=15330 DF PROTO=TCP 
SPT=48091 DPT=23 WINDOW=5840 RES=0x00 SYN URGP=0 
OPT (020405B40402080A061AFEBC0000000001030300)

用于测试您的防火墙设置的其它包有 nmap 或 nessus。在安装相应的包后,nmap 的文档位于目录 /usr/share/doc/packages/nmap 中,nessus 的文档位于目录 /usr/share/doc/packages/nessus-core 中。

4.1.5. 参见信息

/usr/share/doc/packages/SuSEfirewall2 中提供了有关 SUSEfirewall2 软件包的最新信息和其它文档。netfilter 和 iptables 项目的主页 http://www.netfilter.org 以多种语言提供了丰富的文档资料。