内容: 关于加固 保护引导过程 保护服务和后台进程 保护本地文件系统 强" name="description" />

让 Linux 更安全,第 3 部分: 加固系统

发表于:2007-07-04来源:作者:点击数: 标签:
我们将讨论加固(hardening)Linux 的步骤 让 Linux 更安全,第 3 部分: 加固系统 java script:window.open(this.src);" style="CURSOR: pointer" onload="return imgzoom(this,550)"> 内容: 关于加固 保护引导过程 保护服务和后台进程 保护本地文件系统 强

我们将讨论加固(hardening)Linux 的步骤

让 Linux 更安全,第 3 部分: 加固系统javascript:window.open(this.src);" style="CURSOR: pointer" onload="return imgzoom(this,550)">

clearcase/" target="_blank" >ccess control),以及识别那些在使用新软件更新安全设施时可能会引入的安全漏洞。本系列的第 1 部分介绍了安全性的概念以及潜在的威胁。第 2 部分列出了计划安全安装时需要谨记的事情。" name="body" />
内容:
关于加固
保护引导过程
保护服务和后台进程
保护本地文件系统
强制实行配额和限制
启用强制访问控制
更新和添加安全补丁
将您的安全计划付诸实行
结束语
参考资料
作者简介
对本文的评价
相关内容:
让 Linux 更安全,第 1 部分:介绍
让 Linux 更安全,第 2 部分:计划安装
理解 Linux 配置文件
功能丰富的 Perl: 将 xinetd 程序用于系统管理
解决 Linux 中的安全问题
服务器诊所: 实用 Linux 安全性
订阅:
developerWorks 时事通讯
如何通过一些配置保持您的系统不受攻击

级别: 初级

Mario Eberlein, IT 设计师, IBM Global Services
Rene Auberger, 软件 IT 设计师, IBM Software Group
Wolfram Andreas Richter, IT 设计师, IBM Software Group

2005 年 5 月 15 日

学习能够使您的 Linux?系统更能抵御攻击的技术,包括保护引导过程和本地文件、为服务和后台进程加锁、强制实行配额和限制、启用强制访问控制(mandatoryaccess control),以及识别那些在使用新软件更新安全设施时可能会引入的安全漏洞。本系列的 第 1 部分 介绍了安全性的概念以及潜在的威胁。第 2 部分 列出了计划安全安装时需要谨记的事情。

在此系列文章中,您将看到如何以一种安全的方法来计划、设计、安装、配置和维护运行 Linux 的系统。除了安全概念的理论概述、安装问题、潜在的危险及其作用以外,您还将得到关于如何保护和加固基于 Linux 的系统的实用建议。我们将讨论最小化安装、加固 Linux 安装、授权/认证、本地和网络安全、攻击和如何防御攻击,以及数据安全、病毒和恶意程序。

本系列的 第 1 部分 通过给出关于安全概念和潜在危险的一般理解让您开始上手。第 2 部分 引导您进行到下一个阶段,列出当计划一个安全安装时需要紧记的事情,其中包括制定一个详细的安全行动计划。

在本部分,我们将讨论加固(hardening)Linux 的步骤。

关于加固
要让加固行动更为成功,您应该:

  • 在系统连接到网络之前进行加固,以避免攻击。
  • 基于 最小权限原则(least-privilege model) 进行配置:系统应该为特定的功能只赋予其所需要的权限。类似地,用户应该只拥有他们所需要的最小限度的权限。

在完成初步计划并准备和执行了最小化安装后(见第 2 部分),您需要进行一些配置步骤。这些步骤通常被称作是加固 Linux。

  • 保护引导过程
  • 保护服务和后台进程
  • 保护本地文件
  • 强制实行配额和限制
  • 启用强制访问控制
  • 更新和添加安全补丁

保护引导过程
配置引导加载器(LILO 或者 Grub),以令其在引导时不被任何用户干涉;这样就防止了用户在引导提示时向内核传递参数。除非您需要远程引导(比如在远程的数据中心),不然就配置它让它要求输入密码。这是对有可能物理上接触机器的人的进一步防范;它可以防止某些事件的偶然攻击,比如使用参数 single 或者 init=/bin/sh 来获得 root shell,等等。不过,要注意,稍加努力就可以避开此防范机制(比如拆下硬盘驱动器并将其挂载到另一个系统上),除非您对文件系统也进行了加密。

对 LILO 而言,在 lilo.conf 配置文件(通常在 /etc 下)中使用参数 password 替换 prompt。对于 Grub,相应的参数是 Grub 配置文件(通常在 /boot/grub/grub/conf 下)中的 hiddenmenudefault 0password

在 /etc/inittab 中添加 sp:S:respawn:/sbin/sulogin,以确保当切换到单用户模式时运行级的配置要求输入 root 密码。

防止用户使用 Ctrl-Alt-Del 进行重新引导:在 /etc/inittab 中注释掉 ctrlaltdel 行,禁用 ctrlaltdel。通过向类似这样一行(#ca::ctrlaltdel:/sbin/shutdown -t5 -rf now)添加一个井号(#),您就可以防止那个组合键触发重新引导。

保护服务和后台进程
服务的安全配置的第一个步骤是,禁用所有不需要的服务。不提供的服务不会为潜在的入侵者所利用,有效地降低了风险。

为了找出所有启用的服务,需要检查若干个位置。另外,要禁用不安全的服务,并使用更为安全的选择来取代它们。例如,telnet 不是加密的,所以,使用加密的 ssh 服务来取代 telnet(见第 2 部分)。

当保护服务时,考虑这些方面:

  • /etc/inittab
  • /etc/init.d 中的引导脚本
  • inetd/xinetd 后台进程
  • TCP 封装器(wrappers)
  • 防火墙

/etc/inittab
在引导过程中,init 进程会去读取 /etc/inittab 文件中的条目。每一个条目 —— 每一行 —— 都定义了在特定的条件下运行哪个程序。这些程序或者本身是服务,或者是用于启动和停止服务。

init 进程能识别若干个称为 运行级(run levels) (由一个字母标识)的状态。当输入了运行级或者发生特定的事件(比如电源故障)时,就会考察那些条目,并执行适当的命令。

/etc/inittab 中条目的格式是,前面是条目的标签,随后是在哪些运行级下此条目要执行,然后是动作关键字以及包括命令行参数的需要执行的命令。所有这些域都由冒号隔开,典型的条目应该类似这样:

my_service:35:once:/usr/local/bin/my_service someparameter

(在 inittab 手册中可以找到动作关键字的完全列表。)

在这个示例中,条目的标签是 my_service。当输入的运行级为 3 或 5 时,它将使用参数 someparameter 来运行程序 /usr/local/bin/my_service。一旦这个程序被终止,它将不会再重新启动(动作关键字“once”)。

为了保护 Linux 系统,您应该理解 /etc/inittab 中所有条目的功能,并禁用潜在不必要的服务,方法是删除那个条目,或者在那一行的开头使用井号注释掉它。

在所有 Linux 系统中,都会有以下两类条目。第一类用来启动名为 /sbin/getty(或者类似的)的程序,这些通常是用来允许通过 Linux 虚拟控制台或者串行线登录。第二类会运行 /etc/rc.d 目录中通常名为 rc 的脚本,并将当前运行级作为参数给出。这个脚本控制服务的启动和停止(接下来会介绍)。

/etc/init.d 中的引导脚本
/etc/init.d 中的引导脚本用来启动或者停止系统服务。对于每一个运行级,都有一个 /etc/rcN.d 目录(“N”是运行级的标识),其中包含了指向那些在运行级改变时需要调用的脚本的软链接。

如果链接名以“S”开头,则脚本在进入那个运行级时执行,启动相应的服务;如果以“K”开头,则脚本在退出那个运行级时执行,停止那个服务。

大部分情况下,引导脚本的名称会暗示它所控制的服务。要防止在特定的运行级中会启动某个服务,则删除运行级目录中指向相应引导脚本的链接,或者使用一个不做任何事情的虚脚本取代 /etc/init.d 中原来的引导脚本。

inetd/xinetd 后台进程
也可以在客户机请求时根据需要调用服务。这些请求被转交给超级后台进程 inetd 或者 xinetd。然后超级后台进程确定要启动哪个服务,并将请求传递到相应的后台进程。通常,telnet、ftp、rlogin 等服务使用 inetd 或者 xinetd 启动。

inetd 后台进程在 /etc/inetd.conf 配置,那个文件中包含了关于每一个超级后台进程需要提供的服务的条目。配置 FTP 服务器的条目应该类似这样 —— ftp stream tcp nowait root /usr/bin/ftpd in.ftpd -el —— 使用井号注释掉它,就可以禁用它。

为了安全起见,建议使用 xinetd。与 inetd 相比,xinetd 能够启动基于 rpc 的服务,并支持访问控制。xinetd 可以限制进入连接的速度、来自特定主机的进入连接的数目,或者某个服务的总连接数。

通过用于每个从属后台进程的独立配置文件来配置 xinetd 。这些文件位于 /etc/xinetd.d/ 目录中。前面 FTP 服务器的示例配置文件应该称为 called /etc/xinetd.d/ftp,类似这样:

清单 1. 配置文件,/etc/xinetd.d/ftp

service ftp
{
socket_type = stream
protocol = tcp
wait = no
user = root
server = /usr/bin/ftpd
server_args = -el
disable = yes
}

为了禁用这个服务,参数 disable 被设置为 yes,如上面示例所示。

为了更详细的访问控制,xinetd 支持以下三个另外的参数:

  • only_from
  • no_access
  • access_time

为了限制访问,但不完全禁用 ftp 后台进程,您可以如下修改配置文件 /etc/xinetd.d/ftp:

清单 2. 为限制访问而修改过的配置文件,/etc/xinetd.d/ftp

service ftp
{
socket_type = stream
protocol = tcp
wait = no
user = root
server = /usr/bin/ftpd
server_args = -el
disable = no
only-from = 192.168.200.3 192.168.200.7 192.168.200.9
only-from += 192.168.200.10 192.168.200.12 172.16.0.0
no_access = 172.16.
access_times = 07:00-21:00
}

only-fromno_access 可以接受数字 IP 地址(最右边的零作为任意数值处理)、IP 地址/网络掩码 范围、主机名以及 /etc/networks 中的网络名。如果组合使用 only-fromno_accessxinetd 会为每个主机连接寻找最接近的匹配。

在前面的代码示例中,表示 IP 地址为 172.16.x.x 的主机可以连接到此主机,但地址属于 172.16.1.x、172.16.2.x、172.16.3.x 和 172.16.10.x 的则不能连接。可见,当使用 no_access 所用的因数符号时,不需要指定地址的所有四个部分。因数部分必须是地址最右边的部分。参阅下面的 参考资料 部分,以获得关于 xinetd 及其配置的文章。

TCP 封装器
如果您决定不使用 xinetd,而是使用 inted,那么您可以使用 TCP 封装器来记录请求和具体的对特定网络的 允许/拒绝。TCP 封装器会为了认证和记录日志而去检查 /etc/hosts.allow/etc/hosts.deny,并将客户机请求封装起来,不直接回应它们。一旦认证成功,请求就会被转发到原来请求的服务。

相对于使用普通的 inetd,使用 TCP 封装器有两个主要的好处:

  • 发出请求的客户机不会察觉到 TCP 封装器;因此,没有异心的人不会发现任何区别,而心怀不轨的人也得不到关于他们的请求失败的任何信息。
  • TCP 封装器的工作不会理会任何已经被封装的服务,让应用程序能够共享它们的配置文件,从而简化管理。

要获得关于 TCP 封装器配置文件的详细文档,请参阅 参考资料 中列出的 Red Hat Linux Reference Guide

如何找到所有人都可写的(world-writable)文件
要找出所有人都可写的文件,使用此命令:

find / -perm -002 \( -type f -o -type d \) -ls

其中:

  • / 是搜索的起始位置。
  • -perm 检查权限。
  • 002 表示(八进制符号)“other”设置了写位。
  • 模式 002 之前的 - 表示设置了所有权限位(没有考虑模式中的 zero-bits)。
  • -type f 或者 -type d 搜索常规的文件和目录。
  • -ls 以 ls 格式列出找到的文件。

防火墙
为了防范与不应该运行的服务或者不应该被 Internet 等特定网络所访问的服务的通信,建议安装一个防火墙。防火墙提供网络间基于信任级别的受控通信,并权衡使用基于角色的安全策略和最小权限原则允许或者拒绝对特定服务的访问。

防火墙的安装与配置是一个非常复杂的话题,不在本系列文章的讨论范围之内。

保护本地文件系统
保护本地文件系统涉及的是文件和目录的所有者及访问它们的权限。要保护文件系统,文件和目录的保护位必须设置为只授予最小限度的权限。

要特别注意关于所有人可写的文件和系统目录的不适当权限,以及所谓的 setuid 或者 setgid 命令。这些命令运行时的用户权限比运行此命令的用户实际拥有的权限更高。对访问只有 root 才可以访问的文件来说这可能是必需的(比如 /bin/passwd 需要访问 /etc/passwd)。对于这些命令,要确保它们每一个都确实需要设置 setuid/setgid 位。如果不是这样,那么禁用它。

当某个分区上的所有文件确实都不需要 setuid/setgid 位时,/etc/fstab 中的 nosuid 选项可以为相应文件系统中的每个文件都禁用它(下面的示例中的 /dev/hdc1):


#devicemountpointfilesystemtypeoptionsdumpfsckorder

/dev/hda1/ext2defaults11
...
/dev/hdc1/mnt/cdromiso9660 nosuid,user12

此外,对于所有敏感的数据,都有必要对其进行加密并使用密码保护它。为此,GnuPG 提供了一个合适的软件包。

强制实行配额和限制
Linux PAM(插入式认证模块,Pluggable Authentication Modules)可以强制实行一些实用的限制,在 /etc/security/limits.conf 文件中对此进行配置。谨记,这些限制适用于单个对话。您可以使用 maxlogins 来控制总额限制。limits.conf 中的条目有如下结构:username|@groupname type resource limit

为了与 username 区别,groupname 之前必须加 @。类型必须是 soft 或者 hard。软限制(soft-limit)可以被超出,通常只是警戒线,而硬限制(hard-limit)不能被超出。resource 可以是下面的关键字之一:

  • core - 限制内核文件的大小(KB)。
  • data - 最大数据大小(KB)。
  • fsize - 最大文件大小(KB)。
  • memlock - 最大锁定内存地址空间(KB)。
  • nofile - 打开文件的最大数目。
  • rss - 最大持久设置大小(KB)。
  • stack - 最大栈大小(KB)。
  • cpu - 以分钟为单位的最多 CPU 时间。
  • nproc - 进程的最大数目。
  • as - 地址空间限制。
  • maxlogins - 此用户允许登录的最大数目。

在下面的代码示例中,所有用户每个会话都限制在 10 MB,并允许同时有四个登录。第三行禁用了每个人的内核转储。第四行除去了用户 bin 的所有限制。ftp 允许有 10 个并发会话(对匿名 ftp 帐号尤其实用);managers 组的成员的进程数目限制为 40 个。developers 有 64 MB 的 memlock 限制,wwwusers 的成员不能创建大于 50 MB 的文件。

清单 3. 设置配额和限制

* hard rss 10000
* hard maxlogins 4
* hard core 0
bin -
ftp hard maxlogins 10
@managers hard nproc 40
@developers hard memlock 64000
@wwwusers hard fsize 50000

最佳的配额经验
您应该为允许用户写入的每一个分区启用配额。也要考虑到您的系统中有一些属于应用程序的用户 ID,而不是个人用户。那些 ID 可能会拥有对某些目录的写权限,而人没有这种权限。

向 cronjobs 添加 /sbin/quotacheck -avug,以自动更新内核当前所使用的配额文件和表。

要激活这些限制,您需要在 /etc/pam.d/login 底部添加下面一行:session required /lib/security/pam_limits.so

配额让您能够限制用户和组的 inode 数目和可用空间。注意,配额是在每个加载点上定义的,所以,如果用户在若干个分区上有写权限,那么要确保为它们每个都定义配额。

配额是管理员最小化 DoS 攻击的一种方式,这类攻击以填满硬盘驱动器上所有可用空间为手段(这会使其他进程不能创建临时文件而使它们失败)。根据您正在使用的发行版本,您可以安装自带的配额工具,也可以自己下载、编译并安装它们(参见 参考资料)。

必须在内核中启用配额。当前大部分发行版本都支持配额。如果您的发行版本没有启用配额,那么参考 参考资料 中的 mini-howto 来获得启用它们的说明。

要为文件系统启用配额,您必须在 /etc/fstab 中为相应的那行添加一个选项。使用 usrquotagrpquota 来启用用户配额和组配额,如清单 4 所示:

清单 4. 启用用户配额和组配额

/dev/hda1 / ext3 defaults 1 1
/dev/hda2 /home ext3 defaults,usrquota 1 1
/dev/hda3 /tmp ext3 defaults,usrquota,grpquota 1 1
/dev/hda4 /shared ext3 defaults,grpquota 1 1
/dev/hdc1 /mnt/cdrom iso9660 nosuid,user 1 2

然后,使用 mount -a -o remount 重新挂载相应的文件系统,来激活刚才添加的选项;然后使用 quotacheck -cugvm 创建一个二进制配额文件,其中包含了机器可读格式的配额配置。这是配额子系统要操作的文件。

使用工具 edquota 完成配额的指派。要为用户 alice 定义限制,则使用 edquota -u alice 来调用它。环境变量 EDITOR 中定义的编辑器(默认是 vi)会打开,其中有类似如下的内容:


Quotas for user alice:
/dev/hda2: blocks in use: 3567, limits (soft = 5500, hard = 6500)
inodes in use: 412, limits (soft = 1000, hard = 1500)

“in use”值只是为您提供信息,不能被修改 —— 您能修改的只是软限制和硬限制。保存并退出编辑器后,edquota 会读取您刚才编辑的临时文件,并将那些值传递到二进制配额文件,以使您的修改生效。对组配额的编辑与此相同,只是必须使用 -g 选项而不是 -u

软限制是警告级别,可以被超出,而硬限制是严格强制的。软限制有一个 宽限期(grace period) (有时也称为 软性时间限制(soft time limits));这是允许用户超出软限制直到被系统强制执行之前的时间间隔。

您可以使用 edquota -t 来设置宽限期。可以使用的单位是秒、分、小时、天、周和月。其他管理配额的实用工具包括 repquota(总结某个文件系统的配额)、quotaonquotaoff(打开和关闭配额)。

启用强制访问控制
通过 SELinux 所实现的强制访问控制(或者说是 MAC),您可以获得进一步的安全性。使用 MAC,操作系统中的许可由进程所属的 用户/组 ID 以及正要被访问的对象(文件)所属的 用户/组 ID 来管理。另外,使用 MAC,Linux 会强制为每个单独的进程执行这些策略,它们会控制进程可以做什么事情。

那样,在使用 MAC 进行适当配置的系统中,被外来控制或攻击的服务不能够接管系统。就算是进程运行所属的用户或组 ID(最坏的情形:root)可能会与 /etc/passwd 等关键系统文件权限相匹配,那个策略也会及时地禁止对它们的访问。

Internet 上的测试系统可以展现出 SELinux 的有效性,它允许任何人登录;控制机制防止了所有的恶意行为,即使用户能够以 root 身份登录!

添加提供商 GnuPG 密钥
发行版本提供商 GnuPG 密钥应该已经是基本配置的一部分。您可以使用这个命令添加您所信任的第三方提供商的密钥:$ rpm -import <keyfile>

您应该确保是以安全的方式获得密钥文件,例如,通过 HTTPS 从提供商的 Web 站点上下载,这样您可以校验连接的证书。

不过,使用 SELinux 也有一些问题。首先,如果发行版本提供商不支持 MAC,那么其配置是相当困难的。可能需要打补丁和重新编译内核,并替换特定的系统管理工具(所有这些都可能影响发行版本提供商的支持策略)。第二,定义一个适当的策略是非常复杂的任务。如果没有可用的策略定义供您的应用程序选择,那么在 MAC 环境中制定并实施这个策略会非常艰难。这就使得对某些使用情形来说这样做比较困难,比如需要支持种类很多的软件包的桌面工作站。

更新和添加安全补丁
为了让系统尽可能保持安全,您需要及时了解用于您的软件的新修订和补丁。这些信息可以通过若干个渠道得到,不过,通常软件提供商和 Linux 发行商应该为您及时地提供这些信息。您也可以使用(几乎永远免费)CERT(Computer Emergency Response Team)的服务。他们通常会维持传达关于最新的建议、漏洞等信息的邮件列表。

当有新的更新可用时,您应该去查看它是否适用于您的系统以及您的安全需要。安装更新本身可能会导致安全问题。另外,要考虑到每个更新都可能会引入新的漏洞,或者如果更新失败,您的系统可能会停留在不可用的状态。

当在大范围的系统中安装某个更新时,您通常不能同时对它们全部进行更新 —— 这可能会导致您的多个系统在更新期间互相不兼容。

可见,更新系统会涉及到很多风险。这里是降低这些风险的一些建议:

  • 初始安装后,不要将您的系统立即连接到网络。将所有相关的更新下载到一台单独的机器,然后手工地传输它们,以确保系统在暴露在网络上之前已经处于当前状态(current state)。

  • 始终拥有可用的近期系统备份。

  • 对于业务中每一个关键的系统,您都应该有一个与产品环境的硬件和软件相同的独立测试环境。首先在测试环境中获得关于更新的经验,以防止在管理产品系统时出现意外。

  • 理想情况下,您应该已经准备好一套回归测试,在更新包括系统在内的所有程序之前和之后对适当的功能和性能进行对比。至少,要确保拥有可重复的而且文档化的质量控制检查,以保证在修改产品环境之前测试环境中的主要功能和服务不会受到影响。

  • 对于小型网络来说,手工安装更新或许可行,但规模较大时很快就难以处理了。这经常会导致更新不能被安装。使用商业的或者开放源代码的系统管理或者软件分发工作来简化更新的部署。

  • 我们是不是提醒过您最好在手边准备一个备份?我们还要再提醒一次。

  • 制定一个安装更新的计划,并考虑:
    • 更新系统的次序
    • 对您的业务来说关键的系统
    • 系统如何互相依赖
    • 哪个系统包含机密数据

  • 当使用完整性检查工具时(强烈建议至少对服务器使用),为了能识别出意外的更改,要记得更新系统在已知安全状态下占用内存的基线。

  • 在安装任何修订之前,要使用密码检验和工具检查软件的完全性和真实性(尤其是从 Web 站点或者 ftp 服务器上下载时)。在 Linux 领域中,通常使用 MD5 和/或 SHA-1 检验和。如果软件以 RPM 包的形式提供,那么提供商应该已经提供了一个 GnuPG 签名。您可以运行 $ rpm -v --checksig <name>.rpm 命令来检查它。成功的响应应该是 "<name>.rpm: md5 gpg OK";不成功的会是 "<name>.rpm: md5 GPG NOT OK"。您可以使用 $ md5sum <name>.rpm$ sha1sum <name>.rpm 来确认 MD5 或 SHA-1 检验和。如果您下载的某个文件中包含的检验和可用于多个文件(大部分情况下称为 md5sum.asc 或 <name>.md5),那么您可以使用 $ md5sum -c md5sum.asc

  • 最后,但不是最不重要的是,要备份您的系统。(我们是不是已经说过了?)

将您的安全计划付诸实行
如本系列 第 2 部分 中所讨论的,现在来将文档化的安全计划应用到已经安装的系统。弄清楚哪些进程正在您的系统中实际地运行,并禁用不需要的那些。要定期地检查不正常的行为;未知的进程可能会提供不必要的服务,预示着系统的受损。

本节向您介绍如何找出并禁用那些不必要的(潜在危险)进程,以及如何为系统准备定期审计。

找出并禁用不必要的进程
理想情况下,您应该明白在您的系统中运行的每一个进程。要获得所有进程的列表,可以执行命令 ps -ef(POSIX 风格)或 ps ax(BSD 风格)。进程名有方括号的是内核级的进程,执行辅助功能(比如将缓存写入到磁盘);所有其他进程都是使用者进程。您会注意到,就算是在您新安装的(最小化的)系统中,也会有很多进程在运行。熟悉它们,并把它们记录到文档中。

网络监控工具
这些工具可以帮助进行网络监控:

  • Nmap(Network Mapper)是一个免费的开源工具,可用于网络探察和安全审计。完成安装和设置后使用它来检查您的系统。
  • IPTraf 是一个用于 Linux 的基于控制台的网络统计工具。它收集各种数据,比如 TCP 连接数据包和字节计数、接口统计和活动指示器、TCP/UDP 传输衰减、局域网工作台数据包和字节计数。
  • Multi Router Traffic Grapher(MRTG)是一个用于监控网络链路上传输负载的工具。MRTG 会生成包含图形的 HTML 页面,为此传输提供生动的可视化描述。参见 MRTG 索引页 上的示例。

现在让我们来看那些开放网络连接的进程;它们受到攻击的潜在可能最大。要获得所有 TCP 或 UDP 连接的列表,执行命令 netstat -atu(附带名字解析,易读)或者 netstat -atun(没有名字解析,更快)。在这个列表中,特别要注意状态为 LISTEN 的 TCP 连接和所有的 UDP 连接,因为服务器通过这些连接来接收到来的连接。

如果服务器侦听 127.0.0.1/localhost,那么它只能由系统本身(环回接口)访问到。因此它的暴露程度要远低于侦听外部可达接口甚至 0.0.0.0(= *,如果打开名字解析)的服务器,后者可以由任意网络接口所访问。

如果您使用过 netstat -atun,那么您需要自己翻译端口号。可以在 /etc/services 中去查找它们。使用附加的参数 -p 来显示相应的进程,如 清单 5 所示。

在这个示例中,您可以推断出 portmapper 和 graphical user interface(X)是特定的服务器所不需要的。portmapper 为 NFS 等各种基于 RPC 的服务提供标准端点(endpoint);系统并不提供 NFS 共享。当系统用作工作站时 X 窗口是有用的,但在服务器上的使用受限。

确定这些进程是如何被启动的(通过 /etc/inittab,通过引导脚本,等等)并如前所述的那样禁用它们。如果程序是由另一个程序启动的,那么这项任务可能会更具挑战性:X 服务器很有可能是由显示管理器启动的,比如 xdm、kdm 或 gdm,其本身并不会出现在 inittab 或引导脚本目录中。

netstat 所列出的连接并不是自动都可以由网络上的所有计算机来使用。在任何数据包到达开放的连接之前,基于 Linux 内置功能的防火墙可以进一步控制访问。

审计准备
安装了基本的系统并安全地配置后,您的最终目标是保持系统的安全。为了识别出对系统的不必要修改,使用审计工具来记录处于希望是已知且安全的状态的系统的内存占用,并检测对它的修改。

结束语
本期文章向您展示了如何加固您的 Linux 系统,即通过保护引导过程和本地文件系统、锁定服务和后台进程、强制实行配额和限制、启用强制访问控制、找出在使用新软件版本更新安全性时可能会引入的安全漏洞。当配置安全性参数时,请遵循最小权限原则的概念。另外,要了解在您的系统中运行的 所有 进程,以使得您可以禁用不需要的那些,防止它们成为进入到您的 Linux 环境安全心脏的途径。

下一期将深入研究 SELinux,为您给出关于如何使用它的概念资料和实践资料。

参考资料

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文。

  • 阅读 developerWorks 上此 让 Linux 更安全 系列的其他各期文章。

  • “解决 Linux 中的安全问题”(developerWorks,2001 年 6 月)为您给出了一个关于提供安全的 Linux 环境的全面概述和资源指南。

  • “服务器诊所: 实用 Linux 安全性”(developerWorks,2002 年 10 月)强调指出有效的安全首先要有有效的用户管理。

  • developerWorks 上的 安全编程 专栏是一个正在发展中的系列,致力于帮助您为 Linux 编写安全的程序。

  • LinuxLinks 的 安全发行版本列表 是一个已经加固的 Linux 发行版本的列表。

  • ?leen Frisch 撰写了一个关于 加固 Linux 系统 的专栏 —— 也在这个 hardening checklist 中。

  • Linux Security HOWTO 是对 Linux 系统管理员所面临的安全问题的全面概述。

  • Jerry Peek 的 Sharing Files (Carefully) 提供了对 Linux 文件系统权限的全面理解。

  • comptechdoc.org 提供了两篇关于 inetd 的极好的文章:Inetd Services 和 Inetd and Network Services。

  • LinuxPlanet 教程 Controlling Access to Your Services with xinetd 介绍了 xinetd,它是 inetd 的“安全”替代者。

  • Red Hat Linux Reference Manual on TCP Wrappers 是关于 TCP 封装器和 xinetd 的极好资源。

  • IBM study tests Linux security (z+xSeries) 是一项计划部署并比较各种开源安全工具的为期三个月的研究,基于研究过程中的经验提供解决方案建议。

  • Quota mini-HOWTO 描述了如何在 Linux 主机上启用文件系统配额。

  • 下面的资源可以帮助您了解 SELinux:
    • SELinux History and Project FAQ
    • SELinux unofficial technical FAQ
    • SELinux play machines
    • Writing a SELinux policy

  • 在 developerWorks Linux 专区 可以找到更多为 Linux 开发者准备的参考资料。

  • 通过参与 developerWorks blogs 加入 developerWorks 社区。

  • 购买 Developer Bookstore Linux 区 打折出售的 Linux 书籍。

  • 定购免费的 SEK for Linux,这套 DVD (两张),包含了来自 DB2®、Lotus®、Rational®、Tivoli® 和 WebSphere® 的用于 Linux 的最新 IBM 试用软件。

  • 使用可以直接从 developerWorks 下载的 IBM 试用软件 来改革您的下一个 Linux 开发项目。
作者简介
Mario Eberlein 是一名致力于商务应用程序的 IT 架构师。他于 1998 年 10 月加入 IBM,当前在 IBM Global Services 从事客户项目的工作。Mario 拥有科学学士学位,当前正在攻读 Business Administration 硕士学位,并且具有 7 年的 Linux 经验。他是 EMEA Central Region 的 IBM Linux Security Workgroup 的领导。您可以通过 m_eberlein@de.ibm.com 与 Mario 联系。


Rene Auberger 是 IBM Software Group 的一名软件 IT 设计师。他主要与来自德国的公共部门(一个对 Linux 有浓厚兴趣的客户)的客户一起工作。1996 年 Rene 开始从事 Linux 方面的工作,从那里起就以各种形式为了不同的目的而使用 Linux。他是德国、奥地利和瑞典的 Software Group 的 Linux 专业领导,您可以通过 rene.auberger@de.ibm.com 与 Rene 联系。


Wolfram Andreas Richter 是 IBM Software Group 的一名商务集成顾问和 IT 专家。自 1995 年加入 IBM 起,Wolfram 已经涉足了很多学科领域,范围从应用程序开发到管理教育。他有 8 年的 Linux 经验,拥有德国斯图加特 University of Cooperative Education 的科学学士学位,以及英国 Henley Management College 的 Business Administration 硕士学位。在业余时间,Wolfram 喜欢进行运动、骑摩托车和外出。您可以通过 wrichter@de.ibm.com 与 Wolfram 联系。

原文转自:http://www.ltesting.net