第 5章 . 服务器安全

当系统被用作公共网络的服务器时,它就会成为攻击对象。正因此,对于系统管理员来说,加强系统防御和封闭某些服务就显得至关重要。

在深入研究具体问题之前,请回顾一下以下用来增强服务器安全性的常识:

5.1. 使用 TCP 会绕程序和 xinetd 来维护服务安全

TCP 会绕程序(TCP wrappers)为多项服务提供访问控制。多数现代的网络服务,如 SSH、Telnet 和 FTP,都使用 TCP 会绕程序。该会绕程序位于进入请求和被请求服务之间。

当与 xinetd 一起使用时,TCP 会绕程序的优越性就更为显著。xinetd 是一种提供附加的访问、记录、关联、重导向和资源利用控制的超级服务。

窍门窍门
 

使用 TCP 会绕程序、xinetd、以及 IPTables 防火墙来创建服务访问控制的冗余性是一个好主意。关于使用 IPTables 命令来实现防火墙的详细信息,请参阅第7章

有关配置 TCP 会绕程序和 xinetd 的更多信息可以在《红帽企业 Linux 参考指南》的“TCP 会绕程序和 xinetd”这一章中找到。

以下各小节假定你已掌握了各个课题的基础知识,因此只集中讨论特定的安全选项。

5.1.1. 使用 TCP 会绕程序来强化安全

TCP 会绕程序的能力不仅局限于拒绝对服务的访问。本节会向您解释如何使用它来发送连接横幅、警告来自特定主机的攻击、以及如何使用它来增强记录功能。要获得 TCP 会绕程序功能的完整列表,请参阅 hosts_options 的说明书页。

5.1.1.1. TCP 会绕程序和连接横幅

给连接服务的客户发送一幅警戒性横幅是掩盖服务器所使用的系统的好办法。同时,它也让潜在的攻击者知道系统管理员是相当警惕的。要为某服务实现 TCP 会绕程序横幅,请使用 banner 选项。

这个例子为 vsftpd 实现了一个横幅。首先,创建一个横幅文件。它可以位于系统上的任何地方,但是它的名称必须和守护进程相同。在这个例子中,该文件叫做 /etc/banners/vsftpd

该文件的内容如下所示:

220-Hello, %c
220-All activity on ftp.example.com is logged.
220-Act up and you will be banned.

%c 代符提供了各类客户信息,如用户名和主机名,或用户名和 IP 地址,从而使连接更令人生畏。《红帽企业 Linux 参考指南》 中列举了用于 TCP 会绕程序的其它代符。

要把这个横幅展示给每个进入连接,把以下行添加到 /etc/hosts.allow 文件中:

vsftpd : ALL : banners /etc/banners/

5.1.1.2. TCP 会绕程序和攻击警告

如果某个主机或网络被发现正在攻击服务器,TCP 会绕程序可以通过 spawn 指令对来自该主机或网络的后续攻击向管理员发出警告。

在这个例子中,假定某个来自 206.182.68.0/24 网络的怪客被发现正在试图攻击服务器。如果把以下行添加到 /etc/hosts.deny 文件中,连接企图就会被拒绝并记录在一个特殊的文件中。

 ALL : 206.182.68.0 : spawn /bin/ 'date' %c %d >> /var/log/intruder_alert

%d 代符提供攻击者其它访问的服务名称。

要运行连接并记录日志,把 spawn 指令放在 /etc/hosts.allow 文件中。

注记注记
 

因为 spawn 指令执行任何 shell 命令,你可以创建一个脚本,该脚本会在某个特定客户企图连接服务器的时候通知管理员或执行一系列命令。

5.1.1.3. TCP 会绕程序和强化记录

如果某类连接比其它连接更值得关注,你可以通过 severity 选项来提高该类服务的记录级别。

在这个例子中,假定每个企图连接 FTP 服务器的端口23(Telnet 端口)的客户都是怪客。在日志文件中放置一个 emerg 标记而不是使用默认的 info 标记来否定连接。

要达到这个目的,把以下行放在 /etc/hosts.deny 文件中:

in.telnetd : ALL : severity emerg

它使用默认的 authpriv 记录设施,但是把优先级别从默认的 info 提高到 emerg,这会把日志消息直接显示在控制台上。

5.1.2. 使用 xinetd 来增强安全性

xinetd 超级服务器是另一个用来控制对其从属服务访问的有用工具。本节集中讨论如何使用 xinetd 来设置陷阱服务,以及如何使用它来控制任何给定 xinetd 服务可以使用的资源数量,从而阻挠拒绝服务攻击。要阅读更全面的可用选项列表,请参考 xinetdxinetd.conf 的说明书页。

5.1.2.1. 设置陷阱

xinetd 的一个重要功能是把主机添加到全局 no_access 列表的能力。如果一个主机在这个列表上,它对 xinetd 管理的服务的后续连接都会被拒绝一段时间,直到 xinetd 被重新启动为止。这是通过使用 SENSOR 属性来实现的。该技术是阻塞试图扫描服务器端口的主机的简单方法。

设置 SENSOR 的第一个步骤是选择你不打算使用的服务。以下以 Telnet 为例进行说明。

编辑 /etc/xinetd.d/telnet 文件,把含有 flags 的行改成:

	      flags           = SENSOR

在括号内添加以下行:

	      deny_time       = 30

这会拒绝试图连接到端口的主机在今后30分钟内的所有连接。deny_time 属性还有一个可接受的值是 FOREVER,它会使该禁令在 xinetd 被重新启动前保持有效;NEVER 则会允许连接并且记录它。

最后,确定一下这个文件的最后一行是:

	      disable         = no

虽然使用 SENSOR 是检测和阻止恶意主机和你的服务器建立连接的好办法。它有两个缺点:

  • 它对暗中扫描不起作用。

  • 知道 SENSOR 在运行的攻击者可以通过伪造 IP 地址和连接到禁用端口来对某些特定主机发起“拒绝服务”攻击。

5.1.2.2. 控制服务器资源

xinetd 的另一个重要功能是它能够控制从属服务可以使用的资源量。

它通过以下指令来达到这个目的:

  • cps = <number_of_connections> <wait_period> — 指定每秒钟内被允许到服务的连接数量。该指令只接受整数值。

  • instances = <number_of_connections> — 指定允许到服务的连接总数。该指令接受整数值或 UNLIMITED

  • per_source = <number_of_connections> — 指定每个主机被允许到服务的连接数量。该指令接受整数值或 UNLIMITED

  • rlimit_as = <number[K|M]> — 指定服务可以占用的内存地址空间数量,以千字节或兆字节为单位。该指令接受整数值或 UNLIMITED

  • rlimit_cpu = <number_of_seconds> — 指定服务占用 CPU 的时间(以秒为单位)。该指令接受整数值或 UNLIMITED

使用这些指令有助于防止某个 xinetd 服务大量占用系统,从而导致“拒绝服务”情况的出现。