Linux 安全之道:安全部署的五个阶段

作者:Jeramiah Bowling

“道”意味着“路径”或“方式”,是一种旨在实现预期目标的指导方针或规则体系。与任何“道”一样,安全需要结构化、系统化的方法。它也应该是整体的,涵盖系统生命周期的每个部分,从规划到报废。本文中的“道”包含五个简单的阶段,每个 Linux 系统都应该经历这些阶段,以建立安全基线。这些阶段不是安全保障的万能公式。它们仅仅提供了一个基础,可以在此基础上构建更深层次的安全措施。

在介绍每个阶段时,我将部署两个示例系统,一个 Red Hat Fedora 桌面系统和一个 Debian 服务器系统,以展示如何实施安全性。我选择 Fedora 是因为它可以说是目前最流行的发行版。它适用于任何用途,具有许多桌面增强功能,并且是非命令行 Linux 用户最容易上手的发行版之一。我选择 Debian 作为我们的服务器平台,因为它轻量级、具有悠久的可靠性历史、强大的支持社区和广泛的文档。两者都是优秀的平台,并且都内置了独特的安全措施。如果您有不同的发行版偏好,这里介绍的阶段可以应用于任何系统。

阶段 1:规划

“道”的第一个阶段也是最重要的阶段,因为在这个阶段您将做出影响整体安全的大部分决策。所有步骤之前的首要步骤是定义要部署的系统的用途。它将是邮件服务器吗?桌面?入侵检测系统?一旦您确定了用途,就可以在整个过程中将其作为指导。然后,重点就变成了在提供尽可能安全的环境的同时实现该用途。毕竟,为什么要部署一个无人可用的系统呢?安全永远不应该妨碍功能。

接下来,您需要确定系统要达成的安全目标。每个构建的首要目标始终应该是最小访问权限或最小特权原则。这意味着仅向用户和程序提供系统运行所需的最低权限。您可能还有其他安全目标,例如使用防病毒软件扫描每个文件或使用 LDAP 验证每个用户身份,但最小特权始终应该是最重要的。

有了这些目标,您需要在实际构建系统之前弄清楚如何实现它们。回答一些简单的问题将有助于确定在阶段 2 和阶段 4 中实现目标的适当步骤。此系统将是服务器还是桌面?这个问题的答案将决定新系统上的大部分配置。用户将本地还是远程访问系统?这是另一个重要的配置问题,涉及安全隐患。系统是否需要桌面环境?

如果您或将要管理系统的人员对命令行感到满意,请将系统部署为“无头”系统,即没有 GUI 界面。通过从安装中消除 X Window System,您可以大幅缩小攻击面(您的暴露区域)。另一方面,如果您或您的员工需要 GUI,请仅安装一个,并了解需要额外的步骤来正确锁定系统。通常的经验法则是服务器安装时不安装 X,而用户桌面系统使用桌面环境。

最后,规划将在此系统上运行的应用程序。确定哪些依赖项和库对于操作至关重要。通常,在系统被入侵后,会使用不必要的库来运行远程命令、掩盖入侵者的存在或探测网络。如果您不需要某个软件包,请不要安装它。

当完成解答这些问题后,将答案写在构建日志或笔记本中,并在初始构建后也保持更新。

阶段 2:构建

有了书面计划,现在进入构建阶段。在这里,您开始技术性地应用在规划阶段设定的安全目标。由于篇幅限制,以下部分不是每个示例安装的详细清单。我仅重点介绍了与安全重点相关的选项。与阶段 1 一样,在安装过程中将您的选择记录在构建日志中,以备将来需要重建系统时使用。

Fedora Core 7

首先从 Fedora 7 ISO 启动一个新系统,该 ISO 可以从任何发行版站点镜像获得。输入键盘和语言设置后,您将进入磁盘分区实用程序。对于大多数桌面,安装程序在配置驱动器方面做得很好。但是,如果系统将由工作敏感的人员使用,请将 /home 文件夹放在其自己的分区上。

分区之后是引导加载程序选项。选择 GRUB 并设置密码。为引导加载程序使用密码是一种良好的实践,有助于防止驱动器或系统被盗时数据丢失。与任何好的密码一样,它应该具有复杂性,避免使用字典单词,并使用数字、字母和非字母数字字符。

在下一个屏幕上,选择 DHCP,因为客户端机器通常不需要静态 IP。如果您需要静态 IP,请确保在网络上的某个位置使用网络地址转换 (NAT)。接下来,设置主机名和域名,并设置复杂的 root 密码。在软件包选择屏幕上,始终使用“立即自定义”单选按钮查看您要安装的内容。在“自定义选择”屏幕上,仅选择一个桌面环境。安装多个环境会导致以后出现更多漏洞(以及要更新的补丁)。保留 GNOME 上的默认选项。浏览其他每个选中的选项,您会发现将安装许多软件包(图 1)。在我的构建中,我使用这些选项安装了 843 个软件包。您的数字可能会有所不同。使用“可选软件包”按钮消除您不需要的任何无关软件包。完成软件包选择后,系统将重新启动。

The Tao of Linux Security: the Five Phases of a Secure Deployment

图 1. 在 Fedora 7 中安装软件包选择

重新启动后,系统会提示您启用防火墙。启用防火墙,并仅添加运行此系统所需的端口/程序(图 2)。在 Security Enhanced Linux 屏幕上,如果可以,请将策略设置为强制执行(图 3)。对于不熟悉 SELinux 的人来说,它是一种基于策略的保护方案,最初由美国国家安全局开发,在操作系统和一些流行的 Linux 应用程序(例如 Apache)之上添加了一层安全层。使用 SELinux 的缺点是它有时会破坏您尝试保护的程序(以及其他程序)。如果您遇到问题,您可以随时使用 setenforce 命令或使用文本编辑器编辑策略来更改策略。然后,系统将提示您创建一个用户帐户,并在进行其他一些选择后,将出现第一个登录屏幕。

The Tao of Linux Security: the Five Phases of a Secure Deployment

图 2. Fedora 防火墙配置

The Tao of Linux Security: the Five Phases of a Secure Deployment

图 3. SELinux 显著增强了机器的安全性。

Debian

使用 Debian ISO(此处使用 4.0r1)启动您的空白服务器。因为在本示例中我将此系统用作服务器,所以让我们对安装采取更精简的方法。对于不法分子来说,服务器通常比桌面更具吸引力,因此您需要采取额外的预防措施,尤其是在将它们部署在公共网络或互联网上时。

在设置时区、国家/地区等常用选项后,您需要为服务器设置主机名和域名。接下来是分区选项。与其将许多系统目录放在它们自己的分区上,不如坚持将 /home 目录放在单独的分区上,并更进一步加密您的驱动器。这听起来可能很困难,但 Debian 分区实用程序使这变得容易。从选项中选择“引导式分区”,然后选择“引导式 - 使用整个磁盘并设置加密 LVM”。使用整个磁盘并选择使用单独的 home 分区的选项。Debian 建议进一步隔离您的目录,以保持根目录、程序和用户数据分离,但这样的配置可能难以管理。将更改写入磁盘,并在出现提示时(图 4),输入复杂的密码来加密卷。接下来,设置您的时区和 root 密码,然后基本安装将开始。

基本安装完成后,接下来的几个提示无关紧要,直到您进入软件选择屏幕。对于我们的场景,仅安装 Apache Web 服务器。最后,安装 GRUB 加载程序,您的新系统就可以使用了。重新启动后,通过将以下行添加到 /boot/grub/menu.lst 文件中,使用密码锁定 GRUB 加载程序

timeout 30
password yourpasswordhere
The Tao of Linux Security: the Five Phases of a Secure Deployment

图 4. Debian 使复杂的方案配置变得容易。

阶段 3:打补丁

此部署的下一个阶段是为系统打补丁。虽然有时很繁琐,但打补丁是必要的恶。毕竟,843 个软件包需要保护。您还需要保持系统更新,以应对新的漏洞威胁。值得庆幸的是,本文中介绍的示例发行版使此过程非常容易。在 Fedora 客户端上,您已经具备此功能。首次登录后,系统会自动检查更新(图 5)。Fedora 使用 Yellow Dog Update Manager(更广为人知的是 yum)和一个新的更新 GUI pup 来自动化更新过程。但是,弹出式提醒似乎仅在 GNOME 桌面环境中有效。如果您想手动更新系统,也可以使用以下命令yum list updatesyum info updates查看哪些软件包需要更新。您也可以简单地运行yum不带任何选项即可将所有可用更新应用于所有已安装的软件包。

The Tao of Linux Security: the Five Phases of a Secure Deployment

图 5. Fedora 在安装后立即检查更新。

继续介绍示例服务器,Debian 使用一个名为 aptitude (apt) 的实用程序来更新软件包。apt 传统上用作软件包管理器,类似于 Red Hat 的 RPM,但它也具有像 yum 一样检查更新的能力。它使用预定义和自定义源列表来检查针对已安装软件包的更新。如果您的 /etc/apt/sources.list 文件中没有以下行,请添加它,以便您可以针对主要的稳定美国存档检查更新

deb http://http.us.debian.org/debian stable main contrib non-free

添加该行后,运行apt-get update命令。要更新系统上的所有软件包,请在命令提示符下键入apt-get upgrade(图 6),系统将开始检查,并在您批准后,下载并应用更新。如果您想在运行 apt-get 之前查看您有哪些软件包,请使用命令dpkg -l。要每周检查一次更新,请使用以下命令或编写您自己的脚本并使用 crontab 安排它

echo /usr/bin/apt-get  update > /etc/check4updates
echo /usr/bin/apt-get  upgrade >> /etc/check4updates
chmod 750 /etc/check4updates
crontab -e
The Tao of Linux Security: the Five Phases of a Secure Deployment

图 6. 使用 apt-get 查找 Debian 安全更新。

将以下行添加到您的 crontab 文件中,以使脚本在每周三凌晨 3:30 运行

30 3 * * 3  /etc/check4updates

注意 - 如果您编译了自己的软件包或使用来自其他来源的软件包,它们可能不会使用 yum 或 apt-get 自动更新。

阶段 4:强化

为新系统打上补丁后,您可能需要采取其他步骤来保护它。这就是在规划阶段记录您的安全目标有所帮助的地方。您可以使用这些目标来确定哪些额外的步骤是合适的,因为您很可能需要比此处图示的步骤更多。您的目标越多,您可能需要采取的步骤也就越多。尽量保持简洁。复杂的设置实际上可能会使系统安全性降低,因为它们通常会导致配置错误。另外,请记住在构建日志中记录这些步骤。

Fedora 示例已经展示了两个增强安全性的重要步骤:启用 SELinux 和安装防火墙。在大多数典型的桌面使用场景中,当与防病毒应用程序结合使用时,这已经足够了。对于 Debian 机器,我选择了三个应在任何服务器系统上使用的常用步骤:使用 sudo、锁定 SSH 和使用限制性 iptables 防火墙。这些简单的项目应被视为任何服务器系统的最低要求,如果需要,它们也可以应用于桌面。

sudo

sudo 是一个很棒的应用程序,用于限制 root 访问权限,这在任何服务器上都应受到严密保护。将用户添加到 /etc/sudoers 文件中,限制了他们使用 su 的能力,可以限制为特定命令、特定目录或按网络主机进行限制。sudoers 文件中的任何用户只需键入sudo在他们想要执行的命令之前,即可在 root 凭据下运行。这比将 root 密码提供给每个人要容易得多,也安全得多。

SSH

SSH 是当今 Linux 系统上使用的标准远程访问协议。在其默认配置中,它有一些您绝对需要锁定的设置。将以下行添加到 /etc/ssh/sshd.config

PermitRootLogin no
X11DisplayForwarding no

第一行阻止 root 通过 SSH 登录到服务器,这是永远不应该做的。第二行禁用 X 转发,这将允许用户从您的服务器启动 X 会话。在示例案例中,未安装 X,因此这应该不是问题。您可以通过 chrooting 或使用 TCP Wrappers 进一步锁定 SSH;但是,由于篇幅限制,我省略了这些配置步骤。

iptables 防火墙

与其长篇大论地讨论防火墙的正确配置,不如创建一个带有注释的以下脚本来保护 Debian 系统。它(有状态地)将流量限制为仅新的 SSH、HTTP 和 SSL 连接。将此示例中的 IP 地址更改为您的服务器地址。有关 iptables 中可用选项的更多详细信息,请查阅手册页。在构建自己的防火墙时,请记住通过仅在 iptables 中打开必要的端口来缩小攻击面的目标

#!/bin/sh

PATH=/usr/sbin:/sbin:/bin:/usr/bin

#FLUSH PREVIOUS TABLE ENTRIES
iptables --flush

#CHANGE DEFAULT POLICIES FROM
#ACCEPT TO DROP
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP

#ALLOW LOCAL LOOPBACK TRAFFIC
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

#ALLOW ESTABLISHED CONNECTIONS
iptables -A INPUT -m state --state \
ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state \
ESTABLISHED,RELATED -j ACCEPT

#ALLOW DEFINED TRAFFIC
#
#SSH - 22
iptables -A INPUT -d 192.168.1.2 -p tcp \
--dport 22 --sport 1024:65535 -m state \
--state NEW -j ACCEPT

#HTTP - APACHE -80
iptables -A INPUT -d 192.168.1.2 -p tcp \
--dport 80 --sport 1024:65535 -m state \
--state NEW -j ACCEPT

#SSL - 443
iptables -A INPUT -d 192.168.1.2 -p tcp \
--dport 443 --sport 1024:65535 -m state \
--state NEW -j ACCEPT

将此脚本本地保存,然后复制或移动到 /etc/network/if-up.d 目录,以便它在网络启动后启动时运行。如果您想在基于 Red Hat 的系统上应用此配置,您可以简单地运行上述脚本并使用iptables-save命令以在重新启动时保持规则集不变。

虽然您可以采取这些步骤以及更多步骤,但有一个工具可以使此过程更加容易,即 Bastille(图 7 和图 8)。Bastille 使用问答响应来编写您首选的安全设置脚本,并将它们应用于实际系统。互联网上还提供了大量适用于大多数发行版和应用程序的手动安全检查表。一些最好的检查表是由互联网安全中心发布的基准。这些基准包含与特定操作系统和流行的应用程序相关的“最佳实践”的详细设置和描述。它们是 Bastille 的绝佳伴侣。

The Tao of Linux Security: the Five Phases of a Secure Deployment

图 7. Debian 中的 Bastille

The Tao of Linux Security: the Five Phases of a Secure Deployment

图 8. X Window System Fedora 环境中的 Bastille

阶段 5:监控/审计

“道”的最后阶段是一个持续的过程。定期监控您的系统将验证您的安全目标是否随着时间的推移而得到满足。为此最有用的工具是系统内置的 syslog。从 /var/log/messages 文件中,您可以查看系统和某些应用程序的各种安全相关信息。许多应用程序使用自己的日志文件。请务必也查看这些日志文件。如果您有多个系统,则应使用中央 syslog 服务器来收集日志。这可以很容易地在 syslog.conf 文件中配置。

syslog 的一个较新的替代方案称为 Splunk(图 9)。Splunk 既有免费版(每天限制为 500MB)也有企业版。Splunk 的优点在于其超级简单的安装,并且您可以通过简化的基于 Web 的界面使用类似 Google 的命令搜索日志。

The Tao of Linux Security: the Five Phases of a Secure Deployment

图 9. Splunk 是目前最好和最有用的开源项目之一。

日志虽然有用,但它们并不能完整地反映您的安全措施的有效性。只有定期审计才能实现这一点。这样做可以告诉您您的安全措施是否仍然到位并正常运行。我不是建议对每个系统都进行渗透测试,但对您的设置进行积极测试是一种很好的保险。创建检查表或脚本来测试对于维护您的安全目标很重要的那些设置。您可以使用 Bastille 的 --assess 开关来获取当前安全配置的安全报告,而不是使用检查表。您还可以使用 CIS 基准(它依赖于 Bastille)作为审计的基线检查表。如果条件允许,请聘请外部顾问来验证您的安全性,并使用他或她自己的测试来让您安心,尤其是在您在受到严格监管的行业工作时。

The Tao of Linux Security: the Five Phases of a Secure Deployment

图 10. Bastille 评估报告为您提供了当前安全配置的详细概述。

在路上

在构建中使用“道”的阶段是第一步。这种简单、有序的策略将使您的系统达到更安全的状态;但是,每个系统都是独一无二的。确保您的安全目标与您的系统相匹配。安全并不困难。使用简单且可重复的流程,随时了解最佳实践和常见漏洞,尽可能行使最小特权,定期查看您的日志,您会发现自己走在“道”上。

资源

Debian 安全手册: www.debian.org/doc/manuals/securing-debian-howto

Fedora 7 安全 Wiki: fedoraproject.org/wiki/Security

Bastille-Linux: bastille-linux.sourceforge.net

互联网安全中心: www.cisecurity.org

Splunk: www.splunk.com

Jeramiah Bowling 担任系统管理员和网络工程师超过十年。他目前在马里兰州亨特谷的一家会计和审计公司工作,并持有包括 CISSP 和 Linux+ 在内的多项行业认证。欢迎您在 jb50c@yahoo.com 发表评论。

加载 Disqus 评论