4.5. 安全性和机密性

Linux 或 UNIX 系统的一个主要特点就是能够同时处理多个用户(多用户),并允许这些用户在同一计算机上同时执行多项任务(多任务)。此外,操作系统对网络是透明的。用户往往不知道他们所用的数据和应用程序是他们自己的计算机本地提供的,还是通过网络提供的。

利用多用户功能时,不同用户的数据必须分开储存。要确保安全性和私密性。数据安全性早在计算机能够联网之前就已经是个关键问题。和今天一样,那时人们最担心的问题就是如何保持数据可用,即便数据丢失或是数据媒体(通常是硬盘)损坏也不受任何影响。

本节侧重说明机密性问题以及保护用户隐私的方法;但是,全面的安全观离不开一些过程,即:随时准备好定期更新、可行的和经过测试的备份副本,这一点再怎么强调都不为过。做不到这一点,您可能很难恢复数据 - 不仅是在出现硬件故障时,在怀疑有人未经授权访问和篡改文件时,也很难恢复数据。

4.5.1. 本地安全和网络安全

访问数据有以下几种方式:

  • 与拥有所需信息或能访问计算机数据的人进行人际交流

  • 直接从计算机控制台访问(物理访问)

  • 通过串行线路

  • 使用网络链接

在上述所有情况下,用户只有在通过鉴定后才能访问相关资源或数据。万维网服务器在这方面可能较为宽松,但您仍不希望它向任何访问者透露您个人的所有数据。

在上面的列表中,第一种情况需要最大程度的人际互动,例如在您联系银行职员时,您需要证明自己就是银行帐号的持有人。然后您需要提供签名、PIN 或口令,来证明您就是您自己声称的那个人。有时候,有些人可能会通过提及一些大家都知道的零散信息,利用花言巧语骗取知情人的信任,诱导知情人说出机密信息。受骗人可能会被一步步地诱骗出更多信息,而自己却一直蒙在鼓里。这种手段在黑客内部称为社会工程。要防止受骗,您只能对人们进行教育,并且学会言辞谨慎,不轻易透露信息。在闯入计算机系统之前,攻击者通常将目标锁定在接待员、公司内的服务人员,甚至也可能是家庭成员。在很多情况下,最终发现这种利用社会工程手段发起的攻击时,通常为时已晚。

企图未经授权访问您数据的人也可能使用传统方法直接攻击您的硬件。因此,应该防止有人对计算机做手脚,让任何人都无法拆除、替换或损坏其部件。这也适用于各种备份,甚至是各种网络电缆或电线。还应保护引导过程,因为已知有些按键组合会引起异常行为。通过为 BIOS 和引导装载程序设置口令可以提供这方面的保护。

串行终端连接到串行端口,目前很多地方仍在使用这种连接方式。与网络接口不同,它们不依赖网络协议与主机通讯。通过一根缆线或是红外端口就可以在设备间发送纯字符数据。缆线本身就是这种系统最大的弱点:只要连接上一台旧式打印机,就能很容易地将通过缆线传送的所有数据都记录下来。通过打印机做的事情也可以通过其它方式来完成,具体取决于攻击的强度。

在一台主机的本地读取文件需要一定的访问规则,这与打开网络连接访问其它主机上的服务器所需的规则不同。本地安全不同于网络安全。区别即在于:必须将数据放入包中才能发送到其它位置。

4.5.1.1. 本地安全

关于本地安全,还要从计算机运行所在的位置的物理环境说起。在符合您的安全预期和需要的地点搭建计算机系统。本地安全的主要目标是将不同用户分隔开,防止某个用户假借其它用户的权限或身份。这是要遵守的一条基本规则,但这条规则对 root(根用户,对系统拥有最高权力)尤其适用。root 不必输入口令即具有其它任何本地用户的身份,还能够读取本地储存的所有文件。

4.5.1.2. 口令

在 Linux 系统中,口令不是以纯文本格式储存的,而且也不能简单地将输入的文本字符串与保存的模式匹配。如果事实正好相反,只要有人取得了相应文件的访问权,就会危及系统中所有帐户的安全。所以要对储存的口令加密,并且每次输入时都要再次加密,而后对两个加密字符串进行比较。只有在无法将加密口令反向计算为原始文本字符串时,这种方式才能提高安全性。

实际上,这是通过一种特殊算法(亦称活门算法)实现的,因为该算法只能单向有效。截获加密字符串的攻击者无法通过简单地再次应用同一算法来获取您的口令。这需要测试所有可能的字符组合,直到有一种组合看似加密时的口令。对于八位字符口令,需要计算的可能组合是相当多的。

20 世纪 70 年代时,人们对这种方法是否比其它方法更安全存在争议,因为其中所用算法的计算速度相对较慢,几秒钟才能加密一个口令。而与此同时,PC 的处理能力已足够大,每秒可进行几十万次甚至是几百万次的加密。正因为这样,不应让普通用户看到加密口令(普通用户不能读取 /etc/shadow)。更重要的是,口令应该是不容易猜出的,以防因意外错误而暴露口令文件。因此,将“tantalize”这样的口令“转换”为“t@nt@1lz3”实际上没有任何帮助。

用相似的数字替换单词中的某些字母是不够安全的。利用字典来猜字的口令破解程序用的也是类似的替换方法。最好是编造出没有一般意义的词,即仅对您自己有意义的词,如句中各词的词首字母,或书名,如 Umberto Eco 撰写的“The Name of the Rose”。这样可以编写以下安全的口令:“TNotRbUE9”。相比之下,像“beerbuddy”或“jasmine76”这样的口令,即便是不太了解您的人也很容易猜出。

4.5.1.3. 引导过程

配置系统,让其无法从软盘或 CD 引导;配置方法为:彻底拆除驱动器,或设置 BIOS 口令,将 BIOS 配置为只能从硬盘引导。通常,Linux 系统要通过引导装载程序来启动,这样您可以向引导内核传递更多选项。通过在 /boot/grub/menu.lst 中设置额外的口令可防止其它用户在引导期间使用这类参数(请参见第 9 章 引导装载程序)。这对您的系统安全举足轻重。不仅内核本身以 root 权限运行,而且内核还是在系统启动时授予 root 权限的第一个权威对象。

4.5.1.4. 文件权限

一般来说,执行某项任务时应始终尽量使用限制性最强的特权。例如,以 root 权限读写电子邮件是完全没有必要的。如果邮件程序有错误,攻击者则可能利用该错误,以该程序启动时所具有的权限发起攻击。如若遵守上述规则,则可以尽量减少可能的损失。

为 SUSE 版本中的 200,000 多个文件指派的权限都是经过精挑细选的。系统管理员在安装附加软件或其它文件时要特别小心,尤其是在设置权限位时。经验丰富且安全意识强的系统管理员始终在命令 ls 后使用 -l 选项获取详细的文件列表,这样他们可以立即检测出有错误的文件权限。错误的文件特性不仅意味着文件可能被更改或删除,root 还可能执行这些改过的文件;或者如果是配置文件,程序则可能以 root 权限使用这些文件。这使系统很容易受到攻击。这类攻击被称为布谷鸟蛋,因为程序(蛋)由另一个用户(鸟)执行(孵化),就像是布谷鸟诱骗其它鸟代其孵蛋。

SUSE Linux 系统中的文件 permissionspermissions.easypermissions.securepermissions.paranoid 都位于 /etc 目录中。这些文件用于定义特殊权限(如全局可写目录),或为文件定义 setuser ID 位(设置了 setuser ID 位的程序不以启动该程序的用户的权限运行,而以文件拥有者的权限运行,这个权限多为 root)。管理员可以使用文件 /etc/permissions.local 添加自己的设置。

要定义 SUSE 配置程序使用上述哪个文件来相应地设置许可权限,请在 YaST 中选择安全。要了解这一主题的详细信息,请阅读 /etc/permissions 中的注释,或参见 chmod 手册页 (man chmod)。

4.5.1.5. 缓冲区溢出错误和格式字符串错误

只要程序要处理的数据可以或可能被用户更改,就应该加倍小心;但这个问题更应该是应用程序编程人员的问题而不是普通用户的问题。编程人员必须确保自己编写的应用程序以正确的方式解释数据,避免将这些数据写入内存时,因为内存区域过小而无法容纳。此外,程序应能够通过专用接口一致地传递数据。

如果写入内存缓冲区时未考虑该缓冲区的实际大小,则会发生缓冲区溢出。有时这些数据(即用户生成的数据)占用的空间会超过该缓冲区所能提供的空间。结果导致数据写出缓冲区,以致于在特定情况下,程序可能执行受用户(而不是编程人员)影响的程序顺序,而不只是处理用户数据。这种错误可能导致严重后果,特别是在使用特权执行程序时(请参见第 4.5.1.4 节 “文件权限”)。

格式字符串错误的作用方式略有不同,但同样也是用户输入导致了程序出错。多数情况下,这些编程错误会被以特殊权限执行的程序(setuid 程序和 setgid 程序)利用,这也意味着您可以通过取消这些程序的相应执行特权,来防止您的数据和系统受到这种错误的影响。同样,最好的办法是使用尽可能低的特权(请参见第 4.5.1.4 节 “文件权限”)。

鉴于缓冲区溢出错误和格式字符串错误都是与用户数据处理有关的错误,攻击者不仅可以在本地帐户具有访问权的情况下利用这些错误,还可以通过网络链接利用许多已报告的错误。因此,缓冲区溢出错误和格式字符串错误与本地安全和网络安全都有关系。

4.5.1.6. 病毒

Linux 上确有病毒运行,这与某些人的说法正好相反。但是,已知的这些病毒是由它们的创作者为进行概念验证而发布的,目的是为证明这种技术可以发挥预期的作用。目前尚未发现上述病毒中有任何正在流行

没有借以寄生的宿主,病毒将无法生存和传播。对于计算机病毒来说,这个“宿主”是病毒程序代码能写入的某个程序或系统中的重要储存区域(如主引导记录)。由于 Linux 支持多用户处理,所以它可以将写权限限制到特定文件,这对系统文件尤其重要。因此,以 root 权限执行一般操作无疑会增大系统受病毒感染的机率。相反,若遵循上述规则(即使用尽可能低的特权),感染病毒的机率会非常低。

除此之外,切勿在未真正了解某个因特网站点时就仓促执行其中的程序。SUSE 的 RPM 包具有加密签名,这是个数字标签,表明在生成包时已经考虑到必要的安全措施。病毒的存在是管理员或用户缺乏必要的安全意识的典型表现,病毒使系统受到威胁,即使是设计上高度安全的系统也无法逃避。

不应将病毒和蠕虫混为一谈,后者属于全球网络的问题。蠕虫的传播不需要宿主。

4.5.1.7. 网络安全

网络安全对于保护系统免遭外部攻击至关重要。典型的登录过程(即要求提供用户名和口令以进行用户鉴定)仍然是个本地安全问题。在通过网络登录的特定情况下,应该区分这两方面的安全问题。在实际鉴定之前发生的属于网络安全问题,之后发生的属于本地安全问题。

4.5.1.8. X 窗口系统和 X 鉴定

正如本文开头所述,网络透明特性是 UNIX 系统的核心特性之一。X(作为 UNIX 操作系统的窗口系统)能明显地利用这一特性。利用 X 系统,在远程主机上登录,然后启动一个图形化程序,令其随后通过网络发送并显示在您的计算机上,这个过程基本不成问题。

如果应该使用 X 服务器远程显示 X 客户机,X 服务器应该防止未经授权访问受其管理的资源(即显示)。更具体地说,必须给客户机指派特定权限。在 X 窗口系统中,有两种指派权限的方法,分别为基于主机的访问控制和基于 Cookie 的访问控制。前者依赖应该运行客户机的主机的 IP 地址。所用的控制程序为 xhost。使用 xhost 可以将合法客户机的 IP 地址输入属于 X 服务器的小型数据库。不过,依赖 IP 地址进行鉴定不是十分安全。例如,如果另有用户在发送客户机的主机上工作,该用户将同样能够访问 X 服务器,这像是有人盗取了 IP 地址。由于存在这些缺点,在此不再详述这种鉴定方法,但您可以通过 man xhost 了解更多相关信息。

使用基于 Cookie 的访问控制时,将生成一个只有 X 服务器和合法用户才知道的字符串,就像是某种身份证。这个 Cookie(该词并不指普通意义上的小甜饼,而是指里面有幸运签的中国幸运饼)在登录时储存在用户主目录下的文件 .Xauthority 中,并且可供要使用 X 服务器显示窗口的所有 X 客户机使用。用户可以使用工具 xauth 检查文件 .Xauthority。如果将 .Xauthority 重命名或者意外地从主目录中删除了该文件,则无法再打开任何新窗口或 X 客户机。有关 X 窗口系统安全机制的详细信息,请参见 Xsecurity 手册页 (man Xsecurity)。

SSH(安全 shell)可用于对网络连接彻底加密并将其透明地转发给 X 服务器,而用户根本察觉不到这种加密机制。这也称为 X 转发。要实现 X 转发,需要在服务器端模拟 X 服务器,并在远程主机上为 shell 设置 DISPLAY 变量。有关 SSH 的更多详细信息,请参见 第 4.2 节 “SSH:安全的网络操作”

[Warning]警告

如果不认为登录主机是安全主机,请不要使用 X 转发。在不安全的主机上启用 X 转发后,攻击者可能经由 SSH 连接通过鉴定,闯入您的 X 服务器并嗅探键盘输入之类的信息。

4.5.1.9. 缓冲区溢出错误和格式字符串错误

第 4.5.1.5 节 “缓冲区溢出错误和格式字符串错误” 所述,缓冲区溢出错误和格式字符串错误应划归与本地安全和网络安全都有关系的问题。与这些错误的本地情况一样,若成功攻击了网络程序中的缓冲区溢出漏洞,常常可以获取 root 权限。即便不是这样,攻击者也可以利用该错误获取对非特权本地帐户的访问,以攻击系统中可能存在的其它任何漏洞。

一般来说,通过网络链接发起的针对缓冲区溢出错误和格式字符串错误的攻击当属远程攻击中最常见的形式。攻击的漏洞(用于攻击新发现的安全漏洞的程序)通常在安全邮件列表上发布。通过它们可以修补漏洞而不必了解代码的详细信息。多年来的经验表明:漏洞检测代码的存在成就了更为安全的操作系统,这显然是因为迫于压力,操作系统制造商不得不修复他们软件中的问题。在自由软件中,任何人都有权访问源代码(SUSE Linux 提供所有可用源代码),并且任何人在发现漏洞及其漏洞检测代码后都可以提交增补程序来修复相应的错误。

4.5.1.10. 拒绝服务

拒绝服务 (DoS) 攻击的目的是拦截服务器程序甚至是整个系统,采用的手段有以下几种:使服务器超载、让服务器忙于处理垃圾包,或攻击远程缓冲区溢出漏洞。DoS 攻击往往只有一个目的:让服务不再可用。不过,一旦某个服务不再可用,通讯就易于受到中间人攻击(嗅探、TCP 连接劫持、欺骗),或发生 DNS 中毒。

4.5.1.11. 中间人:嗅探、劫持、欺骗

一般而言,由身处通讯主机之间的攻击者发起的所有远程攻击都称为中间人攻击。几乎所有类型的中间人攻击都有一个共同特点,即受害人通常毫无察觉。这种攻击有多种变化形式,例如,攻击者可能会截获连接请求并自行将其转发给目标计算机。现在受害者就会在不知情的情况下与错误的主机建立连接,因为连接的这一端伪装为合法的目标计算机。

最简单的中间人攻击的形式称为嗅探,攻击者“只是”监听通过网络传递的数据流。更为复杂的“中间人攻击”可能会试图接管已经建立的连接(劫持)。劫持之前,攻击者需要一段时间对数据包进行分析,以便能够推测出属于该连接的 TCP 顺序号。在攻击者最终夺取目标主机的角色后,受害人会注意到这一点,因为他们会收到一条错误讯息,说明连接因失败而终止。由于有些协议没有通过加密来预防劫持,只是在建立连接后执行简单的鉴定过程,这给攻击者创造了可乘之机。

欺骗类型的攻击是对数据包进行修改,使其包含虚假的源数据(通常是 IP 地址)。多数较活跃的攻击都依赖于发送这种虚假数据包,在 Linux 计算机上,发送包的任务只能由超级用户 (root) 执行。

上述很多攻击都是与 DoS 同时进行的。一旦攻击者发现有机会让某台主机突然宕机,即便是很短的时间,攻击者也容易发起猛烈攻击,因为主机将在一段时间内无法对抗攻击。

4.5.1.12. DNS 中毒

DNS 中毒指的是通过向 DNS 服务器回复伪造的 DNS 回复包,试图让该服务器向请求其发送信息的受害者发送特定数据,以此破坏 DNS 服务器的超速缓存。许多服务器都基于 IP 地址或主机名与其它主机保持信任关系。攻击者需要非常熟悉主机之间信任关系的实际结构,才能将自己伪装为受信主机之一。通常,攻击者会分析一些从服务器接收的包,获取必要信息。攻击者还常常需要对名称服务器适时发动 DoS 攻击。您可以使用加密连接,通过对要连接的主机的身份进行校验来保护自己。

4.5.1.13. 蠕虫

蠕虫经常被误认为是病毒,但两者有着明显的区别。不同于病毒,蠕虫无需感染某个要寄生的主机程序。它们的特点就是尽快在网络结构中传播。以往的蠕虫,如 Ramen、Lion 或 Adore,全都利用 bind8 或 lprNG 之类的服务器程序中的已知安全漏洞。蠕虫的预防相对简单。鉴于在发现安全漏洞和蠕虫对服务器发起攻击之间有一段时间,很有可能及时提供受影响的程序的更新版本。只有管理员确实在受感染系统上安装了安全更新程序时,这种方法才有用。

4.5.2. 一些常用的安全提示和技巧

要有效处理安全问题,关键在于随时关注安全方面的新动态并了解最新的安全问题。要保护您的系统免受各种问题的侵扰,最好的方式就是尽快获取并安装安全公告推荐的更新包。SUSE 使用邮件列表发布安全公告,您可以通过链接 http://www.novell.com/linux/security/securitysupport.html 订阅该邮件列表。suse-security-announce@suse.de 列表提供关于更新软件包的第一手信息,向其积极投稿的人当中还有 SUSE 安全小组的成员。

邮件列表 suse-security@suse.de 提供了一个不错的论坛,可以在其中讨论任何相关的安全问题。在同一万维网网页上订阅该邮件列表。

bugtraq@securityfocus.com 是全球知名的安全邮件列表之一。建议阅读此列表,该列表每天要接收 15 到 20 条投递信息。有关详细信息,请参见 http://www.securityfocus.com

下面是一些规则,可能有助于您处理基本的安全问题:

  • 根据要对每个作业都尽量使用限制性最强的一组权限的规则,应避免使用 root 权限执行常规作业。这样即可降低受布谷鸟蛋或病毒攻击的风险,防止您自己犯错误。

  • 如果可能,应尽量使用加密连接在远程计算机上工作。用 ssh(安全 shell)替代 telnetftprshrlogin,这应是标准做法。

  • 避免使用仅基于 IP 地址的鉴定方法。

  • 尽量使最重要的网络相关软件包保持最新,并且订阅相应的邮件列表,接收有关以下程序(如 bind、sendmail、ssh 等)的最新版本的公告。该做法同样适用于与本地安全相关的软件。

  • 更改 /etc/permissions 文件,优化对系统安全至关重要的文件的权限。如果删除某个程序的 setuid 位,该程序很可能无法再正常执行作业。但从另一方面考虑,在多数情况下,该程序也将不再是个潜在的安全隐患。所以,您可以对全局可写目录和文件采取相同的做法。

  • 禁用不是绝对需要的所有网络服务,以便服务器正常运行。这样可以让系统更加安全。使用程序 netstat 可以找到套接状态为 LISTEN 的打开端口。至于选项,建议使用 netstat -apnetstat -anp-p 选项允许您查看哪个进程正以什么名称占用端口。

    将 netstat 的结果与在主机外部执行的彻底端口扫描的结果进行比较。最适合执行这项作业的程序当属 nmap,该程序不仅可以检测计算机的端口,而且可以对哪些服务正等待端口处理作出一些判断。不过,端口扫描可能被认为是一种入侵行为,所以不要在未经管理员明确批准的情况下在主机上执行该操作。最后,要记住不仅要扫描 TCP 端口,而且要扫描 UDP 端口(使用选项 -sS-sU),这一点至关重要。

  • 要以可靠方式监视系统文件的完整性,请使用 SUSE Linux 提供的程序 AIDE(高级入侵检测环境)。对 AIDE 创建的数据库加密,防止有人篡改。此外,在其它计算机上保留此数据库的备份副本,储存该副本的外部数据媒体不能通过网络链接连接到您的计算机。

  • 安装任何第三方软件时都要小心谨慎。曾经有黑客在安全软件包的 tar 档案中嵌入了特洛伊木马病毒,不过幸好发现得及时。如果安装二进制软件包,则应确保下载站点是安全的。

    SUSE 的 RPM 包都具有 gpg 签名。SUSE 使用以下密钥来签名:

    ID:9C800ACA 2000-10-19 SUSE Package Signing Key <build@suse.de>

    Key fingerprint = 79C1 79B2 E1C8 20C1 890F 9994 A84E DAE8 9C80 0ACA

    命令 rpm --checksig package.rpm 显示校验和及未安装软件包的签名是否正确。可以在本版本的第一张 CD 上和全球多数密钥服务器上找到该密钥。

  • 定期检查用户和系统文件的备份副本。考虑如果不测试备份是否有效,实际上它可能毫无价值。

  • 检查日志文件。尽可能编写小型脚本搜索可疑项。无可否认,这并不是一项非常烦琐的任务。最终,只有您才知道哪些项异常,哪些项正常。

  • 使用 tcp_wrapper 限制访问计算机上运行的各个服务,这样您可以明确控制哪个 IP 地址可以连接到某个服务。有关 tcp_wrapper 的进一步信息,请参见 tcpd 和 hosts_access 的手册页(man 8 tcpdman hosts_access)。

  • 使用 SUSEfirewall 可以增强 tcpd (tcp_wrapper) 提供的安全性。

  • 设计安全措施重复出现:两次显示同一讯息总比不显示任何讯息好得多。

4.5.3. 使用中央安全报告地址

如果您发现与安全有关的问题(请首先检查可用的更新软件包),请向 security@suse.de 发送电子邮件。请提供问题的详细说明以及涉及的软件包的版本号。SUSE 将尽快给予答复。建议您对电子邮件讯息进行 pgp 加密。SUSE 的 pgp 密钥为:


ID:3D25D3D9 1999-03-06 SUSE Security Team <security@suse.de>
Key fingerprint = 73 5F 2E 99 DF DB 94 C4 8F 5A A3 AE AF 22 F2 D5

也可以从 http://www.novell.com/linux/security/securitysupport.html 下载该密钥。