安全

保护你的服务器

攻击者始终在寻找服务器的漏洞。本文汇集 21 项安全建议与最佳实践:SSH 连接与密钥、FTPS 与 SSL、用户与密码管理、更新、防火墙、入侵检测、备份与环境隔离。

· 3 分钟阅读 · 难度 中级

攻击者始终在寻找服务器上的漏洞。因此,确保你的数据安全可靠是你自己的责任。

通过落实我们的安全建议与最佳实践,把风险降到最低,确保你的数据放在受保护的服务器上是安全的。

Illustration 1 — Sécuriser votre serveur

服务器的连接方式

1. 建立并使用安全的连接

在连接远程服务器时,建立一条安全的通信通道至关重要。

使用 SSH 协议(Secure Shell)是建立受保护连接的最佳方式。与此前使用的 Telnet 不同,SSH 访问会对交换过程中传输的全部数据进行加密。

要通过 SSH 协议进行远程访问,你需要安装 SSH 守护进程,并拥有一个 SSH 客户端,用它来下达命令和管理服务器。

默认情况下,SSH 使用 22 端口。所有人都知道这一点,包括攻击者。大多数人不会去调整这个看似无关紧要的细节。然而,更改端口号是降低服务器被攻击者盯上的一种简单方式。因此,SSH 的最佳做法是使用 1024 到 32 767 之间的端口号。


2. 使用 SSH 密钥认证

你可以使用一对 SSH 密钥来对 SSH 服务器进行认证,而不是使用密码,这比传统的登录方式更好。密钥所包含的位数远多于一个密码,大多数现代计算机难以将其破解。常用的 RSA 2048 位加密相当于一个 617 位数字的密码。

密钥对由一把公钥和一把私钥组成。

公钥有多份副本,其中一份留在服务器上,其余的分发给用户。任何持有公钥的人都可以加密数据,而只有持有对应私钥的用户才能读取这些数据。私钥不与任何人共享,必须妥善保管。在建立连接时,服务器会要求用户证明自己持有私钥,然后才授予特权访问。


3. 安全的文件传输协议

为了在服务器之间传输文件而不至于让攻击者破坏或窃取数据,使用 FTPS 协议(File Transfer Protocol Secure)十分重要。它会对数据文件和你的认证信息进行加密。

FTPS 同时使用一条命令通道和一条数据通道,用户可以对两者都进行加密。请记住,它只在传输过程中保护文件。数据一旦到达服务器,就不再处于加密状态。因此,在发送之前先对文件加密,会再增加一层安全防护。


4. Secure Sockets Layer 证书

使用 Secure Socket Layer(SSL)保护你的网页管理区域和表单,它保护经由互联网在两个系统之间传输的信息。SSL 既可用于服务器与客户端之间的通信,也可用于服务器与服务器之间的通信。

该机制会打乱数据,使得敏感信息(例如姓名、账号、信用卡号和其他个人信息)不会在传输途中被窃取。拥有 SSL 证书的网站,其地址中带有 HTTPS,表明它们是受保护的。

该证书不仅对数据进行加密,还用于用户认证。因此,为你的服务器管理证书有助于确立用户的权限。管理员可以配置服务器,使其与一个集中的证书颁发机构以及该机构签发的任何其他证书进行通信。


5. 使用专用网络和 VPN

另一种保证通信安全的方式,是使用专用网络和虚拟专用网络(VPN),以及诸如 OpenVPN 这类软件。开放网络对外部世界可达,因而容易受到恶意用户的攻击;与之相反,专用网络和虚拟专用网络把访问限制在特定用户范围内。

专用网络使用私有 IP 地址,在同一地址段内的服务器之间建立相互隔离的通信通道。这样,同一账户下的多台服务器就可以交换信息和数据,而不必暴露在公共空间中。

当你希望像在本地那样,通过一个专用网络连接远程服务器时,请使用 VPN。它提供一条完全安全且私密的连接,并且可以覆盖多台远程服务器。若要让多台服务器在同一个 VPN 下通信,它们必须共享安全与配置数据。


服务器的用户管理

6. 监控登录尝试

使用入侵防御软件来监控登录尝试,是保护服务器免受暴力破解攻击的一种方式。这类自动化攻击采用试错的方法,尝试字母和数字的所有可能组合,以获得对系统的访问权限。

入侵防御软件会监视所有日志文件,检测可疑的登录尝试。如果尝试次数超过设定的标准,入侵防御软件就会在一段时间内封禁该 IP 地址,甚至永久封禁。

7. 管理用户

每台服务器都有一个 root 用户,它可以执行任何命令。由于它拥有的权力,root 一旦落入他人之手,对你的服务器会非常危险。通常的做法是完全禁止通过 SSH 使用 root 登录。

由于 root 用户权限最大,攻击者会把注意力集中在破解这个特定用户的密码上。如果你决定完全禁用该用户,就会让攻击者处于明显不利的位置,使你的服务器免于潜在威胁。

为了确保第三方不会滥用 root 权限,你可以创建一个权限受限的用户账户。该账户不具备与 root 相同的权限,但仍然可以通过 sudo 命令执行管理任务。

这样,你就可以以受限用户账户的身份完成大多数管理工作,只在确有必要时才使用 root 账户。


服务器密码的安全

8. 制定密码安全要求

首先要做的,是确定服务器所有成员都必须遵守的密码要求和规则。

不要允许使用空密码或默认密码。强制规定密码的最小长度和复杂度。制定账户锁定策略。不要使用可逆加密来存储密码。在无操作时强制会话过期,并启用双因素认证。

9. 设定密码过期策略

为密码设定一个有效期,是制定用户要求时的另一项常见做法。根据所需的安全级别,一个密码可以使用数周或数月。


10. 为服务器密码使用密码短语

使用密码短语(也称口令短语)而不是密码,有若干理由有助于提升服务器的安全性。两者的主要区别在于,密码短语更长,并且在词与词之间含有空格。因此它往往是一个句子,但并不一定必须是句子。

例如,一个作为密码的短语可以是:J'm! la sécuQdc'estb1fait.

所给的例子比通常的密码更长,并且包含大写字母、小写字母、数字和特殊字符。

此外,记住一个密码短语要比记住一串随机字母容易得多。最后,由于这里它由 26 个字符组成,破解起来也更困难。


11. 密码方面不该做的事

如果你想维持一台安全的服务器,在密码方面有一些事情必须避免。首先,注意你把密码存放在哪里。不要把它们写在纸片上,也不要把它们藏在办公室里。

通常建议不要使用个人信息,例如你的生日、家乡、宠物名字,以及其他可能把用户与密码联系起来的内容。这类信息极易被猜到,尤其是被认识你本人的人猜到。

只由普通词典单词构成的密码同样容易被破解,尤其是被字典攻击(暴力破解)破解。出于同样的风险考虑,也要尽量避免在同一个密码中重复相同的字符序列。

最后,不要在多个账户上使用同一个密码。重复使用密码会让你面临很大的风险。如果攻击者成功进入了其中一个账户,所有使用相同密码的其他账户都可能陷入危险。请尽量为每个独立账户使用不同的密码,并借助密码管理器来记录它们,例如我们的方案 AwPasswords,或者广为人知的 KeePass。


保护服务器的其他良好做法

12. 定期更新与升级

在服务器上定期更新,是保护它免受攻击者侵害的关键一步。过时的软件其薄弱环节已经被人研究过,攻击者有可能利用这些弱点破坏你的系统。如果你把一切都保持在最新状态,就能确保它在第一道防线上具备自我保护的能力。

自动更新是确保不遗漏任何更新的一种方式。不过,允许系统自行进行这类改动可能带有风险。在更新你的生产环境之前,建议先在测试环境中检验更新的表现。

务必定期更新服务器的控制面板。如果你使用了内容管理系统,也必须定期更新它以及它可能带有的所有插件。每个新版本都包含用于解决已知安全问题的安全补丁。


13. 删除或停用所有不必要的服务

通过缩小所谓的攻击面来提升服务器的安全性。

这个网络安全术语指的是:只安装和维护保持服务运行所必需的最低限度内容。只启用操作系统和已安装组件所使用的网络端口。系统上的东西越少越好。

一台 Windows 操作系统服务器只应保留必需的操作系统组件。一台 Linux 操作系统服务器应采用最小化安装,只安装真正需要的软件包。

由于大多数 Linux 发行版会监听来自互联网的入站连接,你必须配置防火墙,只允许特定端口,拒绝其余所有不必要的通信。

在系统上安装软件之前先检查依赖关系,确保不会引入你并不需要的东西。此外,也要检查系统上有哪些依赖被自动启动,以及你是否需要它们。


14. 隐藏服务器信息

尽量少提供关于底层基础设施的信息。外界对服务器知道得越少越好。

把你在服务器上安装的各种软件的版本号隐藏起来同样是明智的做法。这些版本号往往会默认透露确切的发布日期,从而帮助攻击者去查找弱点。通常只要把这些信息从 HTTP 头及其欢迎横幅中去掉即可,操作并不复杂。


15. 使用入侵检测系统

为了发现任何未经授权的活动,请使用入侵检测系统(IDS),例如 Sophos,它会监视你服务器上正在运行的进程。你可以把它配置为检查每日操作、定期执行自动扫描,或者决定手动运行该 IDS。


16. 文件审计

文件审计是发现系统上非预期改动的另一种好方法。

它会在系统处于良好「健康」状态时记录下系统的全部特征,并把它与当前状态进行比较。通过并排比较同一系统的两个版本,你可以发现所有不一致之处,并追查它们的来源。

17. 服务审计

服务审计会梳理服务器上运行的服务、它们所使用的协议,以及它们进行通信的端口。了解这些细节有助于管理系统中潜在的攻击面。


18. 配置并管理防火墙

通过控制和限制对系统的访问来保护你的服务器。

使用 CSF(ConfigServer and Firewall)对加强服务器安全十分重要。它只允许特定的关键连接,封锁对其他服务的访问。

在服务器初次配置时,或者在你改动服务器所提供的服务时,配置防火墙。默认情况下,一台典型的服务器会运行各种服务,其中包括公共服务、私有服务和内部服务。

  • 公共服务通常由必须允许访问某个网站的网页服务器来提供。任何人都可以在互联网上访问这些服务,而且往往是匿名访问。
  • 私有服务用于处理例如数据库控制面板之类的内容。在这种情况下,只有若干选定的人员需要访问同一个入口。他们在服务器内部拥有带有特殊权限的授权账户。
  • 内部服务是那些绝不应暴露到互联网或外部世界的服务。它们只能从服务器本机访问,并且只接受本地连接。

防火墙的作用,是根据用户被授权使用的服务来允许、限制和过滤访问。请配置防火墙,限制除你的服务器必需之外的所有服务。


19. 备份你的服务器

尽管前面提到的各项步骤是为了保护你服务器上的数据,但在出现问题时拥有一份系统备份仍然至关重要。

把关键数据的加密备份存放在异地,或者使用一种云方案。

无论你使用自动备份任务还是手动执行备份,都要确保把这项预防措施变成一项常规工作。你还必须测试备份,进行完整的备份测试。这应当包括「一致性检查」,由管理员甚至最终用户来确认数据恢复是一致的。


20. 建立多服务器环境

隔离是你能采取的最佳服务器防护方式之一。

完全的分离需要使用专用的裸金属服务器,它们不与其他服务器共享任何组件。这种方式最易于管理、安全性最高,但同时也最昂贵。

在数据中心内拥有相互隔离的运行环境,可以实现所谓的职责分离(SoD),并根据服务器所承担的功能来配置服务器。

把数据库服务器与网页应用服务器分开,是一项标准的安全做法。对于无法承受任何安全漏洞的较大规模企业来说,分离的运行环境尤其有利。

独立的数据库服务器可以保护敏感信息和系统文件,使其免受成功进入管理账户的攻击者的侵害。此外,隔离让系统管理员可以单独配置网页应用的安全性,并通过设置网页应用防火墙来缩小攻击面。


21. 建立相互隔离的虚拟环境

如果你无力负担、或者并不需要使用专用服务器组件实现完全隔离,也可以选择把运行环境隔离开来。

这有助于你处理可能出现的安全问题,从而确保其他数据不被波及。你可以在容器和虚拟机虚拟化之间选择,两者的配置都要简单得多。

在 UNIX 操作系统中,虚拟化环境的另一种选择是创建 chroot 牢笼。Chroot 把一个进程与中央操作系统的根目录分开,只允许它访问自身目录树中的文件。不过,这并不是完全的隔离,只应与其他安全措施配合使用。


结语:保护你的服务器

在读完本文并遵循这些安全建议之后,你应当对自己服务器的安全性更有把握。

许多安全措施必须在服务器初次配置时就落实,另一些则应成为持续或定期维护工作的一部分。如果你对服务器的监控没有实现自动化,请务必制定并执行有计划的安全检查。

#安全

现在,开始动手吧。