安装后安全措施

作者:Eddie Harari

安装 Linux 系统是一项相对容易的任务。大多数发行版都提供自动安装工具;这些工具负责从头到尾的安装过程。这些自动安装工具的问题在于,它们倾向于对您的系统做出错误的假设。当涉及到安全考量时,这些错误的假设可能会导致问题。

保护 Linux 系统并非易事。您永远不知道谁在试图从您的服务器甚至桌面电脑上收集信息。有些人甚至不试图收集信息;他们只是喜欢看到您的 Web 服务器崩溃或展示他们的最新艺术作品。

内核

安装后的第一件事是删除不需要的内核特性和服务。Linux 内核有许多不错的网络特性;其中一些特性是我们的系统需要的,有些则不需要。以下是一些我们应该编译到内核中的内核网络特性:IP 防火墙、Tcp Syn Cookies、丢弃源路由帧。IP 防火墙选项允许从命令行设置 IP 访问列表。Tcp Syn Cookies 有助于防止已知的 SYN 洪水拒绝服务攻击。源路由帧允许攻击者通过在数据包数据中指定数据包应通过的路由器来绕过正常的路由决策:这是一个非常糟糕的主意,但有时是需要的。在编译内核时,我们需要仔细检查所有选项,并且只启用我们的系统需要的选项。如果需要某个内核选项,我们可以将其编译为内核的一部分,或者我们可以编译内核以支持作为模块的此选项。新内核有新特性;在编译新内核时,我们必须确保我们知道我们启用的每个选项的作用。

禁用进程

列表 1

我们可以通过输入 ps aux 来查看系统中运行的进程。可以通过输入 netstat -an 来显示系统中打开的网络套接字。列表 1 显示了 Linux 机器上的一些打开的套接字。

我们的系统提供的服务越少越好。inetd 进程监听其配置文件指定的 TCP/UDP 套接字。默认情况下,配置文件 /etc/inetd.conf 告诉 inetd 它应该打开哪些套接字,以及一旦在套接字上建立连接,它应该执行哪些进程。我们应该检查 /etc/inetd.conf 中的所有服务,并禁用我们系统上不需要的服务。禁用服务的最佳方法是在配置我们要禁用的服务的行首放置注释符号 #。最好注释掉所有 /etc/inetd.conf 服务,并使用安全服务代替。例如,我们可以禁用 TELNET 和 FTP,并启用 ssh 和通过 ssh 的 FTP。

如果我们必须启用一项服务,我们应该以尽可能安全的方式配置该服务。Linux 系统有许多工具可以帮助管理员安全地提供服务。

这些工具之一是内核支持的 IP 防火墙。另一个工具是 tcpd,这是一个监视系统上服务请求的程序。它记录并检查请求,如果所有检查都表明客户端可以接收该服务,它将为客户端打开正确的服务。tcpd 在检查授权时会查阅两个文件:/etc/hosts.allow 和 /etc/hosts.deny。要在服务开始之前启用 tcpd 检查,我们只需在配置文件中告诉 inetd 运行 tcpd。大多数 Linux 发行版都配置为默认情况下为大多数服务运行带有 tcpd 的 inetd。以下是 inetd.conf 中的一行,它在客户端的 TELNET 连接请求到达时启用 tcpd 检查

telnet  stream  tcp     nowait  root\
/usr/sbin/tcpd  /usr/sbin/in.telnetd

每当 telnet 连接请求到达时,inetd 都会激活 tcpd。tcpd 通过 syslogd 服务记录连接请求,然后查阅 hosts.allow 文件。如果 hosts.allow 文件包含 telnetd 和请求客户端的匹配项,则 telnet 连接被视为已授权,并且连接已建立。如果没有这样的行,则会查阅 /etc/hosts.deny 文件。如果我们不希望系统响应客户端 X,则 /etc/hosts.deny 文件中必须有一行指定 telnetd 和客户端 X

tcpd 配置文件中还有更复杂的选项可用,例如在发生特定连接请求后运行 shell 命令。有关文件格式的更多信息,请查看 hosts_access 和 hosts_options 手册的第 5 节。

禁用通过 inetd 运行的服务的另一种方法是运行 shell 脚本而不是进程。让我们看一下一个简单的 shell 脚本。请注意,使用此方法并不总是安全的

$ cat > /usr/sbin/telnetd.new
#!/bin/sh
echo "Please do not use telnet to this computer.\
Use ssh only if you have the correct public key"
$ chmod +x /usr/sbin/telnetd.new

然后我们编辑 /etc/inetd.conf 文件,使其执行我们的新脚本而不是 in.telnetd。该行应如下所示

telnet stream tcp nowait root /usr/sbin/tcpda\
   telnet.new
向 inetd 发送 HUP 信号,以便它读取新配置
kill -HUP 'ps -aux | grep inetd |
awk '{print $2}' '
测试新配置
$ telnet localhost
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Please do not use telnet to this computer. Use ssh only
if you have the correct public key.
我们必须记住,通过 inetd 运行的每个进程都有自己的配置文件。在这些配置文件中,有一些可以激活的安全设置。我们可以设置这些安全设置,以便服务获得额外的安全性。以 FTP 为例;我们可以使用 tcpd 检查 FTP 请求,但作为额外的安全措施,我们可以使用 ftpaccess 文件来禁用 root 的 ftp 访问,以防万一。如果我们的机器有多个网络接口卡,我们可能希望使用守护程序,使我们能够指定它们应该在哪个 NIC 上打开套接字。这种类型的设置无法通过 inetd 以简单的方式完成。一些 FTP 守护程序通过配置文件启用这些设置。还有另一种方法可以强制网络守护程序仅监听特定接口。假设我们的机器连接到网络 A 和网络 B,并且它有两个 IP 地址:IA 和 IB。我们希望 telnetd 仅监听 IPA,因此我们编写一个简单的程序,该程序在 IPB 接口上打开端口 23,并在 telnetd 之前运行此程序。在 telnetd 启动并运行后,我们可以终止我们的小程序。这不适用于每个可能的守护程序,因为某些守护程序无法启动,除非它们可以在系统上的每个 NIC 上打开套接字。
网络应用程序

一些其他网络程序不通过 inetd 运行。这些主要是通过系统启动时的 rc 文件运行的守护程序。如果不需要,可以通过编辑系统启动文件来禁用这些守护程序。例如,mount 守护程序是使人们能够从我们的 Linux 机器挂载文件系统的守护程序。如果我们想完全禁用 mount 守护程序,我们应该编辑 rc 文件,以便守护程序在系统重启后不会运行。如果我们想让网络中选定的客户端使用我们文件系统的一部分,我们可以运行带有受限规则集的 mountd,这将对客户端强制执行我们的策略。这将为客户端提供对我们系统的有限访问权限。

要配置 mountd 限制,我们应该编辑 /etc/exports 文件。/etc/exports 文件是 mount 守护程序在授予客户端挂载我们的本地文件系统的权限之前查阅的文件。我们不仅可以限制可以挂载我们本地文件系统的客户端,而且我们还可以对授权客户端强制执行只读、nosuid 等选项。

另一个经常使用的程序是 lpd,它监听网络上的连接。行式打印机守护程序打开端口 515 以监听连接。我们可以编辑 /etc/hosts.equiv 或 /etc/hosts.lpd 文件来为某些客户端禁用和启用该服务。使用 port# 参数,我们可以告诉 lpd 监听与 515 不同的端口;这是一个很好的技巧,只要这不是我们为保护服务而采取的唯一步骤。

X Window 系统是一个基于网络的窗口系统,它使其他客户端能够将其应用程序的显示发送到我们的服务器。这些应用程序可能是危险的,因为它们可以读取我们的击键并查看我们的 X 服务器上其他应用程序的显示。如果我们不需要 X 网络支持,我们可以运行带有选项 -nolisten tcp 设置的 X 服务器。此选项导致 X 服务器不监听端口 6000,因此不接受来自任何客户端的连接。要使用此选项,只需将其添加到 /usr/X11/bin/startx 脚本中的 clientargs 变量中即可。

如果我们需要在我们 X 服务器上显示来自其他机器的输出,我们可以使用 xhostsxauth 命令来限制可以在我们 X 服务器上运行应用程序的机器和用户。xhost 命令非常简单:xhost + hostnamexhost - hostname

+ 符号表示客户端有权在我们 X 服务器上运行应用程序,使用客户端机器上命令行中的 -display server:0.0 选项。- 符号表示客户端无权在我们服务器上运行应用程序,如果客户端机器上的用户尝试在我们服务器上运行 X 应用程序,他将收到一条错误消息,指示他未被授权这样做。

互联网服务器

DNS 服务器必须是安全的。人们可以轻松获得大量信息,只需将我们的区域文件传输到他们的系统即可。有时我们的区域文件包含我们系统的内部网络地址、路由器地址等等。

BIND-8 有许多简洁的安全功能。BIND 8 的最新版本是 8.2.1,我建议将名称服务器升级到此版本。它包含对区域查询和区域传输的访问列表 (ACL) 的支持。在 BIND 配置文件中,我们可以限制可以传输到每个区域的机器。我们可以做的另一件事是将我们的本地网络区域(如果有)置于安全模式,以便 named 只回答属于该区域的名称的查询给本地网络中的客户端。有一些内置的 ACL 名称,例如 anynone,我们可以在 named 配置文件中使用它们。新 bind 版本的一个大优势是日志记录。使用版本 8,我们可以调整日志以显示我们想看到的任何内容。当涉及到安全时,日志是一个非常重要的问题。列表 1 是一个配置文件示例,它仅允许来自网络 192.168.1/24 的本地主机查询所有区域;它还允许来自网络上任何位置的查询仅查询外部区域。在此 named 配置文件中需要注意的另一件事是,区域传输仅允许给网络上的另外两台机器,并且仅用于外部区域。

列表 2

我们可以使用 named 的这些新功能,并通过仅允许世界查询我们的名称服务器具有权威性的区域,并仅允许来自我们本地网络的其他查询来禁用“dns 中继”。这种设置将禁用来自 Internet 的某人向我们的服务器发送递归请求的可能性。

BIND 8 的另一个不错的功能是 named 可以在 chrooted 环境中运行;这意味着如果黑客利用了 named,它将无法访问所有文件系统,而只能访问文件系统的一个很小的部分。要使 named 在 chrooted 环境中运行,我们可以使用命令行中的 -t 选项。

关于 DNS 的最后一件事是我们可以使名称守护程序以非 root 用户身份运行。这与许多其他程序一样,是一件非常好的事情,除了 named。通过以 root 身份运行进程,我们实际上赋予了该进程在我们系统中执行任何操作的权限;只要该进程只执行它最初被编程要做的事情,我们就可以接受这一点。但是,如果有人可以使此进程运行任意代码,例如,那么此任意代码将以 root 身份运行。这意味着在此进程中发现的任何错误或缓冲区溢出都可能使黑客获得 root 权限。由于我们不想让黑客的生活更轻松,我们可以让 named 以不同的用户身份运行。

要完成此任务,我们首先将适当的用户和组添加到系统中。然后我们使用命令行中的 -u-g 选项来指定 useridgroupid 给 named 进程。[有关“保护 UNIX 上的名称服务器”的更多讨论,请参见本期中同名的文章。]

POP、IMAP 和其他

POP、IMAP 和一些其他众所周知的协议(例如 TELNET 和 FTP)的问题在于,用户名和密码以明文形式从客户端发送到服务器。这意味着有人可以窃听服务器和客户端之间的通信,并获取用户名和密码。也可以对服务器进行暴力破解攻击,试图猜测用户名和密码。我们可以通过运行一个检查此类情况的服务器来处理暴力破解攻击。一些 POP 和 IMAP 服务器会在输入五个错误密码后关闭帐户;该帐户仅在等待一段时间后打开,或者可能必须手动打开。对于明文密码,有一个有趣的解决方案。某些服务支持质询-响应密码以及普通密码。

例如,我们可以使用 SKEY 包获得清晰的 TELNET 连接。SKEY 包为用户提供“一次性密码”;即使有人窃听线路并获得了密码,他也无法再次使用此密码进入服务器。另一个工具是 stunnel,David Bandel 在 1999 年 7 月的 LJ 中对其进行了评测。stunnel 提供了从客户端到服务器以安全加密方式连接的能力,用于多种目的,例如 SMTP、POP 等。

Sendmail

可以写一本书来介绍 sendmail 安全性。我想只提及关于 sendmail 的众多事情中的一小部分。首先是存在一些声称比 sendmail 安全得多的替代品。测试其中一个应用程序可能是值得的。关于 sendmail 的另一件事是,黑客可以使用一个非常简单的程序,通过使用 VRFY 协议命令从我们的系统中获取许多用户名。VRFY 和 EXPN 协议命令应在 /etc/sendmail.cf 文件中禁用。要禁用这些命令,我们应该在 sendmail.cf 文件中使用以下行

O PrivacyOptions=authwarnings\
noexpn novrfy

此选项将阻止 sendmail 响应 VRFY 和 EXPN 命令。它还会导致 sendmail 抱怨安全性设置较弱。我对 sendmail 做的最后一件事是从其 HELO 字符串中删除版本号,这样外部就不知道版本号了。

结论

在安全性方面需要做很多工作。我们应该每天检查,看看出现了哪些新的黑客攻击,以及应该出于安全原因升级哪些软件。在安装新应用程序时,我们应该始终查看安全设置,并尽可能将其设置得严格。这不会使我们的系统 100% 防破解,但它会使破解者更难进入我们的系统。

可以通过电子邮件 eddie@sela.co.il 联系 Eddie Harari。

Post-Installation Security Procedures
Eddie Harari (eddie@sela.co.il)
加载 Disqus 评论