系统管理:最大化 Linux 安全性:第二部分

作者:Æleen Frisch
文件系统保护

除了密码保护之外,文件所有权和保护模式是传统 UNIX 安全性的另一个主要组成部分。虽然远非完美的解决方案,但精心设置和维护的文件系统将在非 root 帐户被入侵的情况下提供极大的保护,使其免受损害。文件系统安全性包括以下考虑因素

  • 系统文件的正确所有权和保护:命令二进制文件、共享库等等。这些文件通常应由 root 或其他系统用户(如 bin)以及系统组(如 system 或 bin)拥有。它们不应是组或世界可写的。某些文件(如影子密码文件)应仅限于所有者访问。

  • 相同的考虑因素适用于存储系统文件的目录。请记住,对目录的写入访问权限允许您修改其中的任何文件,而不管各个文件的所有权或保护如何(尽管目录上的 SETGID 访问权限限制用户对其自身文件的访问,例如 /tmp)。

  • SETUID 和 SETGID 文件值得特别关注。应将其保持在最低限度,并在安装前进行彻底测试。任何新出现的 SETUID root 文件都应受到极度怀疑。以下命令将查找系统上的所有 SETUID 和 SETGID 文件

    # find / -type f \
    \( -perm -2000 -o -perm -4000 \) -ls
    
  • 用户主目录树也不应包含组或世界可写的子目录。

  • 用户登录和 shell 配置文件——.login、.profile、.cshrc 等——也应由每个用户拥有,并且仅对其所有者可写。

  • 必须谨慎设计组成员资格,以便用户仅被授予对其所需的文件和目录的访问权限。

  • 必须立即检测到对系统二进制文件、库、配置文件和其他重要数据的任何篡改。

所有这些都可以归纳为两个最重要的原则

  • 了解什么是正常状态(并将您的系统恢复到该状态)。这在 Linux 系统上变得更加困难,因为各种发行版之间的系统文件所有权存在相当大的差异,因此您必须自己做出一些决定。

  • 通过持续监控和定期备份来确保它保持这种状态。

普渡大学 COAST 项目的 Tripwire 工具可以处理第二步。Tripwire 可以记录文件系统的正确状态,然后在稍后的某个时间,将当前配置与保存的配置进行比较,并报告任何差异。它可以考虑文件的外部属性,例如其所有权、保护、大小、inode 编号(如果使用标准 UNIX 命令替换文件,这将发生变化)、inode 创建日期和文件修改日期。

但是,由于可以在不更改任何这些项目的情况下修改文件,因此 Tripwire 还为每个文件计算多个文件签名。通常,文件签名是使用文件内容计算的值。Tripwire 可以使用多达 10 种不同的算法来计算文件签名,这些算法的复杂性和相应的伪造难度各不相同。

虽然有可能更改文件并仍然为单个算法保留相同的文件签名——事实上,对于较低质量的文件签名(如传统校验和)来说,这样做相对容易——但在不更改两个或更多不同文件签名的情况下更改文件是一个非常困难的问题。当 Tripwire 检查文件系统时,它可以比较每个文件的多个文件签名,从而几乎确保任何更改都将被检测到。

Tripwire 已被移植到 Linux,并且易于构建。在完成编译可执行文件后,务必运行软件包提供的测试套件,以确保一切运行正常。以下命令启动测试套件

# make test

要开始使用,您首先在初始化模式下运行 Tripwire (tripwire -init)。至关重要的是,您要在已知干净的系统上执行此操作;理想情况下,Linux 将从原始媒体重新安装。在此模式下,Tripwire 创建一个数据库,列出您已请求的其配置文件中指定文件的当前属性和文件签名。在初始运行时,您应计算尽可能多的不同文件签名,包括至少两种不同的高度安全算法。您还应设置配置文件以包含尽可能多的系统,这样即使对于您不一定定期监视的文件,您也将拥有数据,以备不时之需。

每当操作系统升级发生时,数据库也需要进行类似的更新(考虑到 Linux 内核的重建速度,在某些系统上可能会非常频繁)。数据库创建后,必须以任何情况下都无法被篡改的方式存储(否则,黑客可能会例如替换文件并更改数据库中与其对应的信息)。Tripwire 文档建议将其放置在物理写保护介质上,例如锁定的软盘或可移动磁盘,在不使用时将其从驱动器中取出。当数据库以这种方式受到保护时,即使是从被入侵的 root 帐户进行的更改也可以被检测到。如果可能,Tripwire 软件本身也应受到类似的保护。

在创建初始数据库后,可以使用 Tripwire 检查文件系统的完整性。您在此模式下运行 Tripwire 的频率取决于您的系统和站点的需求,但我建议尽可能每晚执行一次。图 1 给出了 Tripwire 生成的报告类型的示例。

deleted: -rwxr-xr-x root  77828 Aug 23 22:45:43 1995
/usr/bin/refer
added:   -rwxr-xr-x root  10056 Mar 19 12:33:11 1995 /etc/passwd.save
changed: -rwxr-xr-x root 155160 Apr 28 15:56:37 1995 /usr/bin/perl
### Attr        Observed (what it is)         Expected (what it should be)
### =========== ============================= =============================
/usr/bin/perl
st_size: 155160                        439400
st_mtime: Fri Feb 17 12:10:47 1995      Fri Apr 28 12:33:11 1995
md5 (sig1): 1Th46QB8YvkFTfiGzhhLsG        2MIGPzGWLxt6aEL.GXrbbM>

在此系统上,refer 命令的可执行文件丢失,出现了一个新文件 (/etc/passwd.save)(从 Tripwire 的角度来看,无论如何),并且 Perl 的可执行文件已更改大小、修改时间和文件签名(使用 MD5 算法计算)。所有这些更改都很重要,应该进行调查,尽管它们都不能最终表明未经授权的活动(refer 可能已被意外删除,/etc/passwd.save 可能是系统管理员创建的备份,而 Perl 可能自 Tripwire 的数据库上次更新以来已被重建)。

Tripwire 的配置文件(通常命名为 tw.config)非常灵活,允许您详细指定要检查的确切文件和目录以及要比较的属性和/或文件签名,可以根据您的需要详细到任何程度。

Tripwire 在监视文件系统以查找任何更改方面做得非常出色。但是,还有其他系统功能也值得关注。《计算机 Oracle 和密码系统》(COPS) 对系统安全性执行多项有用的测试,我建议获取它并定期运行它。COPS 最适合检查以下项目

  • 密码和组文件的语法和内容。

  • 匿名 ftp 设置。

  • 用户环境:umask 值和 PATH 变量定义,如用户登录配置文件中所定义。

  • 通过将系统可执行文件的日期与 CERT 咨询中的数据进行比较,搜索已知不安全的命令版本。

除了 Tripwire 和 COPS 之外,以下其他工具对于系统安全监控也非常有用

  • /var/adm/sulog 文件,其中包含每次使用 su 命令的记录(成功和不成功)。应定期检查它。

  • syslog 工具:许多子系统通过 syslog 记录消息。其配置文件 /etc/syslog.conf 指定记录的消息类型以及其目标日志文件。

  • 可选的记帐工具收集的数据对于某些类型的侦查工作可能很有用。为了使用此子系统,您需要安装记帐和配额内核补丁、重建内核并编译记帐实用程序包中的程序。

计算机事件咨询能力 (CIAC) 创建了 Merlin 程序,作为多个安全监控软件包(包括 COPS、Crack 和 Tripwire)的易于使用的图形前端。

改进网络安全

到目前为止,我们主要关注单个计算机系统环境中出现的安全问题。但是,大多数系统都连接到网络,因此必须处理来自该环境的各种威胁。

标准 TCP/IP 仅提供有限的机制来控制网络访问,并且它们的设计目的是为了方便访问,而不是真正的网络安全。在其标准形式中,/etc/hosts.equiv 文件包含本地主机信任的系统列表,并且在这些远程系统之一上具有相同用户名的用户可以通过网络登录到本地系统,而无需提供密码。

在正常情况下,这是有道理的。问题在于远程系统上的帐户已被入侵时;信任该系统也会使您自己的系统面临风险。当然,当远程 root 帐户被攻破时,这个问题会被放大很多倍。因此,在系统之间允许无密码 root 访问是一个非常糟糕的主意,并且 /etc/hosts.equiv 机制不会这样做(但是,设置帐户等效性的另一种方法会这样做),

.rhosts 文件中的每个条目都包含主机名和(可选)一个或多个用户名。它允许从列出的远程用户名无密码访问本地帐户(或者如果条目仅包含主机名,则允许具有相同用户名的用户访问)。例如,当以下 .rhosts 文件位于用户 chavez 的主目录中时,它将允许 hamlet 上的用户 vasquez 和 romeo 上的用户 chavez 通过网络登录到她的帐户而无需密码

hamlet vasquez
romeo

TCP/IP 信任系统概念的问题在于,信任另一个系统的影响超出了本地系统和受信任远程系统之间的交互。不可避免地,信任以传递方式运作:如果系统 A 信任系统 B,并且系统 B 信任系统 C,那么在某种程度上,系统 A 信任系统 C,无论它是否愿意或是否知道。这样的链条可以无限期地持续下去,而黑客非常擅长利用它们。

因此,以下预防措施将最大限度地减少对您的系统进行受信任网络访问的风险

  • 在 /etc/hosts.equiv 中包含最少数量的主机。

  • 确保 hosts.equiv 中没有 [cw]+[ecw] 条目(这充当通配符并信任宇宙中的每个系统)。

  • 根据需要使用 Linux 版本的此文件支持的 - 条目。/etc/hosts.equiv 中以减号开头的主机名要求来自该系统中想要登录到本地系统的每个用户提供密码。它还使系统上所有 .rhosts 文件中该主机的任何条目无效。因此,此机制可用作覆盖传递信任的一种方式。

  • Linux 版本的 /etc/hosts.equiv 允许主机名可选地后跟用户名,这为该用户提供了对本地系统上任何非 root 帐户的无密码访问权限。我不建议使用此功能。

  • 系统上不应存在 /.rhosts 文件;远程 root 访问应始终需要密码(如果完全允许)。

  • 定期监视用户的 ~/.rhosts 以查找不适当的条目。

更精细的网络访问控制

传统的 hosts.equiv 机制仅允许最粗略的访问控制级别。TCP Wrappers 软件包包含在几乎每个 Linux 发行版中,它提供了对哪些远程主机使用哪些本地网络服务的更详细的控制,以及跟踪和记录基于网络的系统访问的能力。

TCP Wrappers 软件包提供了 tcpd 守护程序,它在 inetd(主要的 TCP/IP 守护程序)及其管理的众多子守护程序之间引入了一个额外的层。telnet 工具等服务的守护程序由 inetd 根据需要启动;一旦安装了 TCP Wrappers,对 telnet 服务的请求将首先发送到它,并且只有在系统配置允许的情况下才会被授予。

构建 tcpd 守护程序后,您只需修改 inetd 的配置文件 /etc/inetd.conf,将任何和所有子守护程序置于 tcpd 的控制之下。例如,图 2 显示了如何更改 telnet 守护程序的条目以使用 TCP Wrappers。

#service socket protocol wait? user  program         arguments
telnet   stream tcp     nowait root  /usr/sbin/in.telnetd

更改为

#service socket protocol wait? user  program         arguments
telnet   stream tcp     nowait root  /usr/sbin/tcpd  in.telnetd

对网络资源的访问由 TCP Wrappers 的配置文件 /etc/hosts.allow 和 /etc/hosts.deny 控制。第一个文件包含指定哪些主机可以使用哪些服务的条目

in.telnetd : hamlet romeo
in.fingerd : LOCAL EXCEPT juliet

第一个条目表示来自 hamlet 和 romeo 的 telnet 请求将被接受,第二个条目表示可以从除 juliet 之外的任何本地系统运行远程 finger 命令(本地系统定义为名称中不包含句点的系统)。

hosts.deny 文件包含拒绝特定服务的条目

netstat  : fool
in.tftpd : ALL
ALL      : ALL

第一个条目拒绝主机 fool 使用 netstat 服务,第二个条目禁用 trivial ftp 工具,第三个条目充当兜底,拒绝所有尚未明确允许所有人的服务。

当 tcpd 考虑网络服务请求时,它使用以下过程

  • 如果 hosts.allow 授权其使用,则请求被授予。使用文件中第一个适用的行。

  • 如果 hosts.allow 中没有适用的条目,则咨询 hosts.deny。如果该文件拒绝该服务,则请求被拒绝,并且再次使用文件中第一个适用的行。

  • 如果两个文件中都没有适用的条目,则请求被授予(请注意,hosts.deny 中的 ALL:ALL 条目可防止这种情况发生)。

TCP Wrappers 通过其守护程序工具将其活动记录到 syslog 子系统中。它生成大量数据,手动检查这些数据可能很麻烦。swatch 软件包提供了一种有用的方法,可以自动筛选任何输出流,以查找您预先指定的事件,并且它与 TCP Wrappers 结合使用非常有用。

探测网络漏洞

应像本地系统一样定期检查网络是否存在潜在的安全问题。曾经臭名昭著的 Satan 程序提供了一种方法。Satan 旨在从外部向内查找网络漏洞。它查找各种问题,包括

  • 臭名昭著的不安全网络服务(如 rexd 和旧版本的 sendmail)的可用性。

  • 任何 ftp 和/或 tftp 工具的设置。

  • 各种 NFS 漏洞。

  • X 服务器漏洞。

  • 不受保护的调制解调器。

对于那些担心滥用如此强大工具的人,Gabriel 和 Courtney 软件包试图检测 Satan 本身的可疑用途。

不要绝望

我们在本文中涵盖了系统安全的各种威胁。不要让它们的数量让你感到不知所措。您所能做的就是尽可能好地保护您的系统,并进行频繁备份,以便在您的最大努力不足的情况下能够快速恢复。请记住,系统安全是一个持续的过程,而不是您可以一次性处理然后忘记的事情。就像生活中的一切一样,没有保证。

有关安全资源有关系统安全的更多信息,请参阅侧边栏。

Æleen Frisch (aefrisch@lorentzian.com) 管理着一个非常异构的 Linux 和其他 UNIX 系统以及 PC 网络。在最近完成两本书的第二版后,她期待追求她真正的使命:为她的猫 Daphne 和 Sarah 拉绳子。

加载 Disqus 评论