增强 Linux 服务器

GNU/Linux 服务器安全性简介

服务器 — 无论用于测试还是生产 — 都是攻击者的主要目标。通过采取适当的步骤,可以将一台脆弱的机器变成强化的服务器,并帮助阻止外部攻击。了解如何加强 Secure Shell (SSH) 会话,配置防火墙规则,并设置入侵检测来提醒在 GNU/Linux® 服务器上可能受到的攻击。

Jeffrey Orloff, IT/安全主管, SafeWave, LLC

Jeffrey Orloff 是 SafeWave, LLC 的 IT 和安全主管。他还是 Alternative Education/DJJ 的 Palm Beach County 学区的技术协调人。



2014 年 3 月 06 日

Linux® 已经占有了很大的服务器市场份额,并且预测显示,由于云计算需求,这一份额将增加。关注安全性的企业 IT 部门需要考虑这些服务器对网络构成的漏洞,以及如何保护这些机器。本文演示了如何增强 Secure Shell (SSH) 会话,配置防火墙,并设置入侵检测。

规划服务器安装

保护桌面和操作系统

虽然许多核心安全概念对于桌面操作系统和服务器操作系统都适用,但它们的保护方式是不同的。默认情况下,桌面操作系统为用户提供可开箱即可运行的环境。桌面操作系统的销售前提是,它们要求最低配置,并加载尽可能多的应用程序,让用户可以正常运行使用。相反,服务器的操作系统应该将访问限制为可以支持正常运作的最低级别。

增强 GNU/Linux 服务器的第一步是确定服务器的功能,这就决定了需要在其上安装的服务。例如,如果所涉及的服务器被用作 Web 服务器,您应该安装 Linux、Apache、MySQL 和 Perl/PHP/Python (LAMP) 服务。如果服务器被用于目录服务,允许在其上运行的应用程序和服务只应该是它要执行的任务所需要的那些应用程序和服务。不应该安装额外的东西,有两个原因:

  • 安装额外的软件或运行额外的服务会产生不必要的漏洞。例如,如果在服务器上为目录服务运行 Lightweight Directory Access Protocol (LDAP),那么操作系统和 LDAP 都必须是最新的,包含最新的安全修补程序和补丁。如果在这台服务器上安装了 LAMP(或其他任何软件),即使没有使用它,也需要更新和关注它。只要它存在于服务器上,就会为攻击者提供进入系统的另一个途径。
  • 在服务器上安装额外的软件,意味着有人会试图使用该服务器执行其预期用途以外的任务。使用服务器执行其主要任务以外的任务会分散其主要任务的资源,并将其暴露于潜在的威胁之中。

GUI 登录

有些依靠 GUI(如 GNOME 或 KDE)的人可能会倾向于安装一个图形化登录工具,比如 GNOME Display Manager。这是没有必要的,因为在命令行界面登录与通过基于 GUI 的登录界面进行登录一样容易。惟一的区别是,如果需要通过 GUI 界面来管理服务器,就必须使用 sudo startx 命令。

您需要决定是否要安装一个图形用户界面 (GUI)。GNU/Linux 管理员长期以来一直自傲于从命令行界面管理其网络和服务器。但是有些系统管理员也开始通过 GUI 管理其 GNU/Linux 服务器。GUI 会占用系统的资源,因为它是一个没有必要的额外服务,会带来漏洞。然而,当不再使用 GUI 进程时,可以关闭它,它使管理员可以更轻松地执行某些任务,比如处理数据库。

如果决定要安装 GUI,以下说明帮助您了解如何将 GNOME 安装为桌面 GUI:

  1. 登录到您的系统。如要安装 GNOME 核心,在命令提示符键入以下命令,然后按下 Enter 键:

    sudo aptitude install x-window-system-core gnome-core
  2. 键入 sudo 密码,然后按下 Enter 键。

    您会被告知正在安装的是什么。

  3. 键入 Y,然后按下 Enter 键。

    这将安装一个精简版的 GNOME,将桌面环境的特性减到最少,节省系统资源。如要安装全功能版本的 GNOME,键入:


    sudo aptitude install x-window-system-core gnome
  4. 按下 Enter 键,并遵循流程,直到 GNOME 已安装在您的系统上。
  5. 当任一软件包安装完成后,您还是在命令提示符下。如要打开 GNOME,键入 sudo startx

增强 Secure Shell 协议

SSH 为用户提供一个到远程计算机的连接;系统管理员通常使用 SSH 从远程计算机登录到服务器来执行维护和管理任务。虽然 SSH 提供的安全性水平比它所取代的协议高得多,但您可以做一些事情,使它更安全。

通过隐匿来实现安全

安装 Emacs

使用 sudo aptitude install emacs 安装 Emacs。接下来在文件中找到要设置端口号的部分。找到它(默认端口是 22)后,您可以将它更改为任意数字。有超过 65,000 个端口可供选择:选择靠近上限并且容易记住的数字。请记住,熟练的攻击者了解人们的想法。将端口号更改为 22222 或 22022 是一个常见的​​错误,因此请选择一个不容易被猜到的数字。

其中一种最常用的强化 SSH 的方法是改变用来访问它的端口号。理论上,使用默认端口或 TCP 22 端口建立连接的攻击者会被拒绝访问,因为服务在一个安全端口上运行。但是,更改端口号将不会防止使用端口扫描程序的攻击者发现 SSH 端口,他可以花时间来扫描服务器上的所有端口。出于这个原因,很多系统管理员也懒得更改端口。但是,这种方法会阻止喜欢用脚本的家伙通过专用来寻找已打开 TCP 22 端口的自动工具来攻击 SSH。如果在所扫描的第一个端口范围中没有发现 SSH 运行,不耐烦的攻击者可能对扫描您的服务器感到厌倦。

如要更改 SSH 端口地址,先在服务器上安装 SSH。键入以下命令,然后按 Enter 键:

sudo aptitude install openssh-server

键入您的密码。此命令安装用于远程登录到服务器的 openssh

当需要配置一个 SSH 文件时,复制文件,以防在配置过程中发生问题。您可以随时恢复到原来的状态。然后:

  1. 在命令行中键入以下命令,然后按 Enter 键:

    sudo cp /etc/ssh/sshd_config /ete/ssh/sshd_config.back
  2. 键入您的密码,完成此文件的备份。

现在,您需要更改 sshd_config 文件的权限,以便可以修改它。为此:

  1. 键入以下命令,然后按 Enter 键:

    sudo chmod 644 /etc/ssh/sshd_config
  2. 现在,您可以使用 Emacs 或 vi 等文本编辑器来修改文件:

    emacs /etc/ssh/sshd_config

保持打开 Emacs 或 vi,以便对这个文件进行更多的修改。

Root 登录权限

所有 Ubuntu 版本中的 root 用户都是禁用的,但您可以激活该帐户。如果您正在使用 SSH,在您或攻击者已经激活该帐户的情况下,您应该拒绝 root 帐户远程登录到服务器的权限。打开编辑器后,向下滚动到显示 PermitRootLogin 的行。 默认设置为 yes。

白名单用户

在服务器上强化 SSH 可采取的另一个步骤是,只允许某些人使用此服务。这个过程称为白名单。要创建白名单,首先需要那些获准使用 SSH 远程访问服务器的人的用户名。然后,执行以下步骤:

  1. 添加此行到 sshd_config 文件:

    # Allow only certain users
    AllowUsers username username username

    用列表中的用户名替换 username 一词。或者,您也可以使用以下命令,允许组进行 SSH 登录:


    # Allow only certain groups 
    AllowGroups group group

    同样,用您的用户组替换示例中的 group 一词。

  2. 保存配置文件,并退出编辑器。
  3. 重新启动 SSH,使更改生效。您不必关闭计算机,只需键入 sudo service ssh restart
  4. 按下 Enter 键,并提供您的密码。

    该服务重新启动,并显示 [OK]

您可以用其他方法保护 SSH,但那些方法都面向更高级的用户。当您有更多使用 GNU/Linux 和 SSH 的经验时,可以考虑采取那些步骤。


编写防火墙规则

您可以通过防火墙拒绝对您的服务器的访问。Ubuntu 服务器使用的防火墙名称为 Uncomplicated FireWall (UFW),这是一个 iptables 管理工具。Iptables 基于系统管理员编写的规则筛选网络数据包。Iptables 对于初学者可能较复杂,但 UFW 简化了它。使用 UFW 可以帮助您强化服务器,但如果编写 iptables 规则,就可以调优服务器的安全性。

曾经有一段时间,系统管理员必须使用 sudo aptitude install ufw 安装 UFW。但是,Ubuntu 和许多其他 GNU/Linux 版本都已安装了这个应用程序;只是在默认情况下未启用它。如要启用 UFW,在打开的终端中键入命令 sudo ufw enable,然后按下 Enter 键。然后键入:

sudo ufw status verbose

按下 Enter 键。看到的输出应该类似于清单 1:

代码输出
youruser@yourcomputer:~$ sudo ufw status verbose
[sudo] password for youruser:
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing)
New profiles: skip
youruser@yourcomputer:~$

请注意,在默认情况下,所有传入流量都将被拒绝。您可以将其更改为允许所有传入的流量,但是这会破坏防火墙的作用。您可以创建规则,指定允许哪些流量通过:

  • 端口和协议
  • IP 地址
  • 服务

按端口和协议定义的防火墙规则

最简单的(也是最常见的)防火墙规则编写方法是阻止特定端口上的流量。例如,如果想允许端口 80 上的传入流量,可以在终端里输入以下命令:

sudo ufw allow 80

您还可以选择指定允许哪个协议。如果没有指定协议,那么规则同时涵盖 TCP 和 User Datagram Protocol (UDP)。然而,若只允许端口 80 上通过 TCP 流量,命令为:

sudo ufw allow 80/tcp

如要允许端口 80 上传入的 UDP 流量,也可以用相同的语法:

sudo ufw allow 80/udp

如要拒绝所有这些示例中的流量,输入:

sudo ufw deny 80
sudo ufw deny 80/tcp
sufo ufw deny 80/udp

按 IP 地址定义防火墙规则

也可以编写与特定 IP 地址、甚至子网相关的规则。阻止一个特定 IP 地址的规则是:

sudo ufw deny from xxx.xxx.xxx.xxx

要阻止整个子网,就需要输入整个地址范围。例如,对于这个 C 类网络,您可以键入:

sufo ufw deny from 192.168.1.0/24

如果需要只允许来自一个 IP 地址或子网的流量,也可以使用同样的语法,只需将 deny 替换为 allow

按服务定义防火墙规则

也可以编写防火墙规则来治理整个服务。例如,如果要拒绝 SSH 流量,该规则将是:

sudo ufw deny ssh

如要允许 SSH 流量,键入以下命令说明此事实:

sudo ufw allow ssh

停止防火墙

若您需要撤消已经写好的一条防火墙规则,可以如下删除该规则:

sudo ufw delete deny ssh

要完全停止防火墙,可以使用以下命令选择禁用它:

sudo ufw disable

不建议禁用运行必要服务或包含敏感数据的防火墙。即使暂时停止这个保护一会儿,也有可能将服务器及其资源暴露于威胁之中。


监视您的系统

采取措施防止入侵后,您需要建立一个监视系统,以检测是否已经发生对服务器的攻击。如果收到关于攻击的警报,您就可以做好充分准备来处理它。Tripwire(参见 参考资料)提醒您服务器上的系统文件发生了未经授权的活动。使用 Logwatch(参见 参考资料)来创建可以分析的报告。

Tripwire

Tripwire 为您的计算机建立正常系统二进制文件的基线。然后,它根据此基准通过电子邮件警报或通过日志向您报告任何异常情况。基本上,如果系统二进制文件有所改变,您会知道这一变化。如果一个合法的安装造成这样的改变,这没有关系。但如果二进制文件因一个木马式安装而被修改,您就要从一个起点调查攻击并解决问题。

  1. 如要通过命令行安装和配置 Tripwire,键入以下命令,然后按 Enter 键:

    sudo aptitude install tripwire
  2. 对安装过程中的所有问题都选择 Yes

    您可能会被要求创建一个密码。如果这样,请记下它以备将来使用。

  3. 当您到达如图 1 所示的屏幕时,Tripwire 安装完成。单击 OK
    Tripwire 安装完成
    图中显示 Tripwire 安装完成窗口
  4. 打开文本编辑器,进行如清单 2 所示的配置,用您的服务器名称替换 hostname(在这里要使用 Emacs):
    Tripwire 配置
    hostname ~ # emerge tripwire
    hostname ~ # cd /etc/tripwire
    hostname ~ # emacs -nw /etc/tripwire/twpol.txt
    hostname ~ # emacs -nw /etc/tripwire/twcfg.txt
  5. 输入以下命令,创建密钥并签署策略:
    hostname ~ # cd /etc/tripwire ; sh ./twinstall.sh
  6. 初始化所有内容,并使用下一个命令创建数据库(这里应该要求您提供密码):
    hostname ~ # tripwire --init

当这个过程完成之后,Tripwire 就创建好了您的系统的快照。该基线将用来检查是否有任何重要的文件已被更改。如果有,您会收到警报。

您也可以从 Tripwire 运行报告。从编辑器键入以下命令:

sudo twprint --print-report -r\

现在,提示符变为一个向右的尖括号 (>)。 在这个新的提示符下,键入:

/var/lib/tripwire/report/[hostname]-YYYYMMDD-HHMMSS.twr| less

如果不知道运行报告的确切时间,导航到目录 /var/lib/tripwire/reports,查看完整的文件名。

如要调优 Tripwire 的功能,可以使用 twadmin。您还可以设置一个 cron 作业,每天将这份报告的副本用电子邮件发送给您,或配置 Tripwire 在报告异常情况时向您发送电子邮件。

Logwatch

Logwatch 可帮助您监视系统的日志文件。此程序需要有效的邮件服务器在网络上通过电子邮件发送日志给您。如果想修改 .conf 文件,需要打开 /usr/share/logwatch/default.conf/logwatch.conf,并寻找 MailTo 这一行。将 user.name.domain.tld 改为您的电子邮件地址。

您可以用这个命令安装 Logwatch:

sudo aptitude install logwatch

如要将日志通过电子邮件发送给自己,键入:

logwatch --mailto email@youraddress.com --range All

按 Enter 键将报告的副本发送到指定的电子邮件地址。如果您没有在网络上运行邮件服务器,但仍希望看到 Logwatch 报告,下面的命令将它提供到您的屏幕上:

logwatch --range All --archives --detail Med

输出跨越多个屏幕;按 Shift-Page Up 可移到报告的开头。


用户和组

在 GNU/Linux 系统上,可以将用户组织到各个组中,进行方便的管理。但您还需要通过权限来提供对文件和文件夹的访问。没有具备完全访问权的 “超级用户” 允许用户访问计算机或网络上的所有东西,就像在 Windows 操作系统上一样。GNU/Linux 系统旨在提高安全性;它使用一个 3x3 系统来授予权限:

不要以 root 身份运行

永远,永远,永远不要在 GNU/Linux 系统中作为 root 用户运行任何东西。在需要以 root 身份运行一些程序时,使用 sudo 命令。如果您提供密码,任何系统管理员都可以使用 sudo 命令。要查看如何以及何时使用了 sudo 密码,请查看 /var/log/messages。因为您要查找使用 sudo 的所有地方,使用 grep 命令来查找它们。

  • 文件权限。读 (r)、写 (w) 和执行 (x)。这些权限中每一个也分配了一个数字:读 = 4,写 = 2,执行 = 1。
  • 目录级权限。Enter 提供进入目录的权限;Show 提供查看目录内容的权限;Write 提供创建新文件或子目录的权限。
  • 如何分配权限。权限的分配方式有三种:用户级别、组级别和其他级别。用户级别定义创建文件或目录的用户;组级别定义用户所在的组;其他级别用于用户组之外的任何用户。

首先授予用户权限:例如,r/w/x 意味着用户可以读、写和执行文件夹中的一个或多个文件。您可以将数值应用到每个权限。因此,如果一个用户可以读、写和执行,将相应的数字 4、2 和 1 相加,总数为 7。接下来是组权限。例如,该用户的组的其他成员可以读和执行,但不能写。相应的值相加后得到 5。其他类别的用户只能读文件,因此他们的数值为 4。因此,该文件或文件夹的权限是 754。

当权限被设置为 777 时,每个用户都被赋予读、写和执行的能力。chmod 命令可更改文件和目录的权限。如果您想改变一个用户的所有权,使用 chown 命令。要更改某个文件或目录的组所有权,使用 chgrp 命令。


加密

加密是扰乱存储在计算机上的数据的过程,使得没有密钥将数据重新创建为原始形式的人无法读取它。已加密的数据可以存储在本地计算机上,存储在网络共享上,或传输给其他用户和计算机。

您可以加密整个硬盘或磁盘的分区。这应该在安装时完成。您也可以通过加密保护数据,方法是创建一个目录,并对其进行加密。例如,如果您设置了一个文件服务器,您可能要加密保存敏感信息的目录。

在保护您的数据之前,您需要键入以下命令,安装来自 Ubuntu 存储库的 eCryptfs:

sudo aptitude install ecryptfs-utils

安装时,建立一个专用目录,在这里可以存储加密的文件和文件夹。为此,在终端中键入以下命令:

ecryptfs-setup-private

您会被要求输入登录密码,然后创建一个挂载通道(或为您生成一个)。写下这个密码:您将需要它来手动恢复数据。登出您的计算机,然后重新登入。登录后,在 ~/Private 中写入的任何文件夹或文件都将被加密。

恢复数据

在紧急情况下,您可能需要恢复加密的数据。您可以自动恢复,方法是确保您的硬盘驱动器已挂载,然后打开终端。在提示符下,运行:

sudo encryptfs-recover-private

按照提示,在数据解密后,您就可以访问该数据。请确保您将它保存在其他位置,以便可以再次访问它。


额外的安全措施

现在,您已经为强化服务器创造了坚实的基础,再采取几个步骤来加强已经落实到位的安全措施。

更新

在测试或开发服务器上测试更新和补丁之前,切勿将它们安装到生产服务器上。因为服务器上可能没有安装 GUI,您必须通过终端下载任何更新和补丁。当准备好安装更新时,键入命令 sudo apt-get update,然后键入 sudo apt-get dist-upgrade。在某些情况下,您需要重新启动服务器。

恶意软件

虽然病毒不会对 GNU/Linux 服务器构成太大的威胁,但如果您运行 Samba 来共享 Windows 文件,请确保已安装像 ClamAV 这样的防病毒扫描程序,这样受感染的文件就不会扩散到整个系统。除了病毒、蠕虫、木马等之外,还存在黑客将 rootkit 安装到您的系统上的危险,它可以获取 root 级别的权限来捕获密码,拦截流量,并创建其他漏洞。为了对抗这种威胁,在服务器上安装 Rootkit Hunter (rkhunter) 和 chkrootkit 等工具(参见 参考资料 中 “增强 Linux 桌面” 的链接,其中包含了说明)。

备份与恢复

囊括 TB 级信息、企业网站或目录服务目录的服务器需要有一个备份和恢复策略。这不仅是有意义的,并且有时电子发现法律法规会要求您根据要求交出信息。大多数企业网络可以通过多台服务器提供冗余能力,而较小的网络可以通过虚拟化以及备份和恢复软件来应急。

如果打算从 Ubuntu 存储库运行备份和恢复软件,Simple Backup (SBackup) 是一个很好的选择,因为可以从命令行界面或 GUI 来运行它。在将服务器数据备份到企业网络上时,重要的是要在服务器之外存储备份文件。便携式存储设备以合理的价格提供了大量的存储空间,它们是存储备份文件和目录的不错选择。

密码

作为系统管理员,您需要为服务器的 root 帐户和组织中的其他敏感帐户(比如 MySQL 数据库或 FTP 连接)设置密码。在 Ubuntu 服务器中,您不能强迫用户使用强密码,但您肯定可以训练用户如何创建一个强密码。

网络密码策略

如果您要运行目录服务(比如 OpenLDAP),通过一些可用的配置选项,您可以选择在您的网络中实施强密码。

密码应至少八个字符长,至少包含三个以下字符:一个大写字母、一个小写字母、一个数字或符号。教用户使用强密码、而不将复杂的密码写在便签上的一个方法是,让他们使用口令句。类似 Myf@voritecolorisBlue! 的密码比 M$iuR78$, 更容易记住,并且满足最低复杂性标准。


安全的永恒定律

Microsoft 的 Scott Culp 起草了他所称的 10 条安全的永恒定律(参见 参考资料)。如果应用得当,对管理员的 10 条定律是强化任何系统的良好基础。他说,安全性不关乎风险规避,而是关乎风险管理。事情总是会发生。 有可能发生恶意软件蔓延,您的网站可能会被攻击,或可能会受到自然灾害的破坏。在某些时候,您的系统的安全性将受到考验。确保您已做了可以保护它的一切工作,在处理威胁的同时让您的服​​务器及其资源对依赖它们的用户仍然可用。

请记住:对安全问题投入更多技术并不会解决它。系统管理员的警惕、管理层的支持以及用户的接受都必须全部到位,安全策略才可以有效地工作。


结束语

本文和 “增强 Linux 桌面” 中所概述的任务应该为您提供了有关系统安全性主题的坚实知识基础。请记住,这些文章都是针对初学者的,为进一步了解 GNU/Linux 安全性奠定了基础。

参考资料

学习

获得产品和技术

  • 下载 Ubuntu Server Edition,以跟随本文中的课程进行学习。
  • 下载 VirtualBox,创建虚拟机来练习本文中的示例。
  • 了解关于 Samba 的更多信息,它向 Windows 计算机提供文件和打印服务。
  • 了解有关 GNOME 的更多信息,这是一个 Linux 图形化桌面。
  • 了解有关 GNOME Desktop Manager 的更多信息,它提供图形化登录。
  • 了解有关 KDE 的更多信息,它是 GNOME 的可选图形化桌面。
  • 从 Ubuntu 维基了解有关 UFW 的更多信息。
  • 了解有关 Tripwire 开源项目的更多信息。
  • 了解有关 Logwatch 的更多信息。
  • 更多了解 eCryptfs 如何保护文件和文件夹。
  • 更多了解 ClamAV 如何帮助保护服务器免受恶意软件攻击。
  • 更多了解 Rootkit Hunter 如何帮助保护服务器。
  • 了解有关 chkrootkit 的更多信息,它可帮助找出在服务器上安装的 rootkit。
  • 从 Ubuntu 维基了解有关 iptables 的更多信息。
  • 以最适合您的方式 评估 IBM 产品:下载产品试用版、在线试用产品,或在云环境中使用产品。

讨论

  • 加入 developerWorks 中文社区。查看开发人员推动的博客、论坛、组和维基,并与其他 developerWorks 用户交流。

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Linux
ArticleID=964487
ArticleTitle=增强 Linux 服务器
publish-date=03062014