保护您的服务器的推荐安全措施

介绍

当您在云基础架构上工作时,启动和运行应用程序通常是您的主要关注点。作为设置和部署过程的一部分,重要的是在系统和应用程序公开可用之前为其构建强大而彻底的安全措施。部署应用程序之前实施本教程中的安全措施将确保您在基础架构上运行的任何软件都具有安全的基本配置,而不是可能在部署后实施的临时措施。

本指南重点介绍了在配置和设置服务器基础架构时可以采取的一些实用安全措施。此列表并不是您可以采取的所有措施来保护您的服务器的详尽列表,但它为您提供了一个可以构建的起点。随着时间的推移,您可以开发更适合您的环境和应用程序特定需求的定制安全方法。

SSH 密钥

SSH 或安全外壳是一种加密协议,用于管理服务器并与服务器进行通信。使用服务器时,您可能将大部分时间花在通过 SSH 连接到服务器的终端会话中。作为基于密码登录的更安全的替代方案,SSH 密钥使用加密来提供一种安全的登录服务器的方式,建议所有用户使用。

使用 SSH 密钥,创建私钥和公钥对以进行身份​​验证。私钥由用户保密和安全,而公钥可以共享。

SSH 密钥图

要配置 SSH 密钥身份验证,您必须将公共 SSH 密钥放在服务器上的正确目录中。当您的客户端首次连接到服务器时,服务器会要求您提供相关私钥的证明。它通过生成一个随机值并将其发送到您的 SSH 客户端来实现。然后,您的 SSH 客户端将使用您的私钥对响应进行加密,然后将加密的回复发送到服务器。然后服务器使用您的公钥解密您的客户端的回复。如果服务器可以解密随机值,则意味着您的客户端拥有私钥,服务器将让您无需密码即可连接。

要了解有关基于 SSH 密钥的身份验证如何工作的更多信息,请查看我们的文章了解 SSH 加密和连接过程

SSH 密钥如何增强安全性?

使用 SSH,任何类型的身份验证(包括密码身份验证)都是完全加密的。但是,当允许基于密码的登录时,恶意用户可以反复尝试访问服务器,尤其是当服务器具有面向公众的 IP 地址时。借助现代计算能力,可以通过将这些尝试自动化并尝试组合一个接一个直到找到正确的密码来进入服务器。

设置 SSH 密钥身份验证允许您禁用基于密码的身份验证。SSH 密钥通常包含比密码多得多的数据位,这意味着攻击者必须运行的可能组合要多得多。许多 SSH 密钥算法被现代计算硬件认为是不可破解的,因为它们需要太多时间来运行所有可行的匹配项。

如何实现 SSH 密钥

SSH 密钥是远程登录任何 Linux 服务器环境的推荐方式。可以在您的本地机器上生成一对 SSH 密钥,您可以在几分钟内将公钥传输到您的服务器。

要在您的服务器上设置 SSH 密钥,请遵循我们的特定发行版指南如何为 Ubuntu、Debian 或 CentOS设置 SSH 密钥

如果您仍然想要密码身份验证,请考虑在您的服务器上实施像fail2ban这样的解决方案来限制密码猜测。

在任何一种情况下,最佳做法是不允许root用户直接通过 SSH 登录。相反,以非特权用户身份登录,然后根据需要使用类似sudo. 这种限制权限的方法被称为最小权限原则一旦您连接到您的服务器并创建了一个您已经验证可以使用 SSH 的非特权帐户,您可以root通过在您的服务器上设置PermitRootLogin no指令来禁用登录/etc/ssh/sshd_config,然后使用类似的命令重新启动服务器的 SSH 进程sudo systemctl restart sshd

防火墙

防火墙是一种软件或硬件设备,用于控制服务向网络公开的方式,以及允许进出给定服务器的流量类型。正确配置的防火墙将确保只能从服务器或网络外部访问应公开可用的服务。

防火墙图

在典型的服务器上,默认情况下可能会运行许多服务。这些可以分为以下几组:

  • 互联网上的任何人都可以访问的公共服务,通常是匿名的。这方面的一个示例是可能允许访问您的站点的 Web 服务器。
  • 只能由选定的一组授权帐户或从某些位置访问的私人服务。例如,像 phpMyAdmin 这样的数据库控制面板
  • 应该只能从服务器本身内部访问的内部服务,而不会将服务暴露给公共互联网。例如,应该只接受本地连接的数据库。

防火墙可以确保根据上述类别以不同的粒度限制对您的软件的访问。公共服务可以保持开放并可供互联网使用,私人服务可以根据不同的标准(例如连接类型)进行限制。内部服务可以完全无法访问互联网。对于未使用的端口,在大多数配置中完全阻止访问。

防火墙如何增强安全性?

即使您的服务实现了安全功能或仅限于您希望它们在其上运行的接口,防火墙仍可作为基础保护层,在应用程序处理流量之前限制进出服务的连接。

正确配置的防火墙将限制对除您需要保持开放的特定服务之外的所有内容的访问。仅公开少数软件可以减少服务器的攻击面,限制容易受到攻击的组件。

如何实施防火墙

有许多可用于 Linux 系统的防火墙,有些防火墙比其他防火墙更复杂。但一般来说,设置防火墙应该只需要几分钟,并且只需要在您的服务器初始设置期间或在您对服务器上运行的服务进行更改时进行。以下是启动和运行的一些选项:

信息

如果您使用的是 DigitalOcean,您还可以免费使用云防火墙,
只需几分钟即可完成设置

对于此处提到的任何教程,请确保您的防火墙配置默认为阻止未知流量。这样,您部署的任何新服务都不会无意中暴露在 Internet 上。相反,您必须明确允许访问,这将迫使您评估服务的运行方式、访问方式以及谁应该能够使用它。

专有网络

虚拟私有云 (VPC) 网络是基础架构资源的私有网络。VPC 网络提供了更安全的资源连接,因为网络接口无法从公共互联网和云中的其他 VPC 网络访问。

VPC网络如何增强安全性

考虑到两者之间的选择,最好使用私有网络而不是公共网络进行内部通信,因为 VPC 网络允许您将资源组隔离到特定的私有网络中。VPC 网络将仅通过内部网络使用其专用网络接口相互连接,这意味着您的系统之间的流量不会通过可能暴露或拦截的公共互联网路由。VPC 网络还可用于隔离执行环境和租户。

此外,您可以将互联网网关设置为 VPC 网络资源和公共互联网之间的单一访问点,让您更好地控制和了解连接到您的资源的公共流量。

如何实施 VPC 网络

许多云基础设施提供商使您能够在其数据中心内的 VPC 网络中创建和添加资源。

信息

如果您正在使用 DigitalOcean 并想设置您自己的 VPC 网关,您可以按照我们的
如何将 Droplet 配置为 VPC 网关指南来了解如何在基于 Debian、Ubuntu 和 CentOS 的服务器上进行操作。

DigitalOcean在创建将每个适用的资源(Droplets、负载均衡器、Kubernetes 集群和数据库)放入VPC 中,无需额外费用

手动配置您自己的专用网络可能需要高级服务器配置和网络知识。设置 VPC 网络的另一种方法是在您的服务器之间使用 VPN 连接。如果您使用的是 Ubuntu 或 CentOS,则可以按照此如何在 Ubuntu 20.04 上设置和配置 OpenVPN 服务器
教程进行操作。

对于 Ubuntu 服务器之间不太复杂的 VPN,请遵循如何在 Ubuntu 18.04 上安装 Tinc 和设置基本 VPN
教程。

服务审计

安全的很大一部分涉及分析我们的系统,了解可用的攻击面,并尽我们所能锁定组件。

服务审计图

服务审计是一种了解给定系统上正在运行哪些服务、它们使用哪些端口进行通信以及接受哪些协议的方法。此信息可帮助您配置哪些服务应可公开访问、防火墙设置以及监控和警报。

服务审计如何增强安全性?

服务器可以出于内部目的运行进程并处理外部客户端。每个正在运行的服务,无论是内部的还是公共的,都代表着恶意用户的扩展攻击面。您运行的服务越多,漏洞影响您的软件的可能性就越大。

一旦您对机器上正在运行的网络服务有了很好的了解,您就可以开始分析这些服务。当您执行服务审计时,问自己以下有关每个正在运行的服务的问题:

  • 这个服务应该运行吗?
  • 服务是否在不应在其上运行的网络接口上运行?
  • 服务应该绑定到公共网络接口还是私有网络接口?
  • 我的防火墙规则的结构是否可以将合法流量传递到此服务?
  • 我的防火墙规则是否阻止了不合法的流量?
  • 我是否有接收有关这些服务中每一项的漏洞的安全警报的方法?

在您的基础架构中配置任何新服务器时,这种类型的服务审计应该是标准做法。每隔几个月执行一次服务审计还可以帮助您捕获任何可能无意更改配置的服务。

如何执行服务审计

要审核系统上运行的网络服务,请使用该ss命令列出服务器上正在使用的所有 TCP 和 UDP 端口。显示用于侦听 TCP 和 UDP 流量的程序名称、PID 和地址的示例命令是:

  • sudo ss -plunt

您将收到类似于以下内容的输出:

Output
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=812,fd=3)) tcp LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=69226,fd=6),("nginx",pid=69225,fd=6)) tcp LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=812,fd=4)) tcp LISTEN 0 511 [::]:80 [::]:* users:(("nginx",pid=69226,fd=7),("nginx",pid=69225,fd=7))

需要注意的主要列是 Netid、Local Address:Port 和 Process name 列。如果本地地址:端口是0.0.0.0,则该服务正在接受所有 IPv4 网络接口上的连接。如果地址是,[::]则该服务正在接受所有 IPv6 接口上的连接。在上面的示例输出中,SSH 和 Nginx 都在侦听 IPv4 和 IPv6 网络堆栈上的所有公共接口。

使用此示例输出,您可以决定是要允许 SSH 和 Nginx 侦听两个接口,还是仅侦听其中一个接口。通常,您应该禁用在未使用的接口上运行的服务。例如,如果您的站点只能通过 IPv4 访问,您将明确阻止服务侦听 IPv6 接口以减少暴露的服务数量。

无人值守更新

使用补丁使您的服务器保持最新状态是确保良好的基本安全级别的必要条件。过时的服务器和不安全的软件版本是造成大多数危害的原因,但定期更新可以缓解漏洞并防止攻击者在您的服务器上立足。

传统更新需要管理员手动检查并安装其服务器上各种软件包的更新;这可能会占用大量时间,并且可能会忘记或错过重大更新。相比之下,无人值守更新允许系统自动更新大多数软件包。

无人值守更新如何增强安全性?

实施无人值守更新可降低保持服务器安全所需的工作量,并缩短服务器可能容易受到已知错误影响的时间。如果存在影响服务器上软件的漏洞,无论您运行更新需要多长时间,您的服务器都将容易受到攻击。每日无人值守升级将确保您不会错过任何程序包,并且一旦修复可用,任何易受攻击的软件都会被修补。

结合前面提到的服务审计,自动执行更新可以大大减少您遭受攻击的风险并减少维护服务器安全所花费的时间

如何实施无人值守更新

大多数服务器发行版现在都提供无人值守更新作为选项。例如,在 Ubuntu 上,管理员可以运行:

  • sudo apt install unattended-upgrades

有关如何实施无人值守更新的更多详细信息,请查看Ubuntu(在自动更新下)和Fedora 的这些指南

[注意]
注意:这些机制只会自动更新通过系统包管理器安装的软件。确保您可能正在运行的任何其他软件(如 Web 应用程序)配置为自动更新或定期手动检查。

禁用目录索引

大多数 Web 服务器默认配置为在用户访问缺少索引文件的目录时显示目录索引。例如,如果您要downloads在没有任何额外配置的情况下创建一个在您的 Web 服务器上调用的目录,则所有浏览该目录的人都可以看到所有文件。在许多情况下,这不是安全问题,但很可能会泄露机密信息。例如,如果您要在 Web 服务器上为您的网站创建一个索引目录,该目录可能包含您网站主页的文件和一个包含网站后端数据库凭据的配置文件。如果不禁用目录的索引,则浏览该目录的任何人都可以看到文件夹中的两个文件。

禁用目录索引如何增强安全性?

目录索引有正当的用途,但它们经常无意中将文件暴露给访问者。禁用目录索引作为您的 Web 服务器的默认设置,通过使访问者不可见目录文件来消除意外数据丢失、泄漏或利用的风险。如果文件存在于目录中,访问者仍然可以访问这些文件,但禁用索引会使文件更难以无意中发现。

如何禁用目录索引

在大多数情况下,禁用目录索引只需在 Web 服务器配置中添加一行即可。

  • Nginx 默认禁用目录索引,因此如果您使用 Nginx,则不需要进行任何更改。
  • 关于Apache维基DirectoryListings页介绍了如何禁用目录列表。确保将Options -Indexes此处列出选项用于任何 ApacheDirectory配置块。

经常备份

虽然不是严格的安全措施,但备份对于保存受感染的系统和数据以及分析系统是如何被攻陷的至关重要。例如,如果您的服务器受到勒索软件(一种加密文件的恶意工具或病毒,并且只有在向攻击者支付一定金额时才会解密它们),缺乏备份可能意味着您唯一的选择是支付数据回来。如果您的系统和数据得到定期和安全的备份,您将能够访问和恢复您的数据,而无需与受感染的系统进行交互。

频繁备份如何增强安全性?

频繁备份有助于在意外删除的情况下恢复数据,以及在发生数据被删除或损坏的攻击的情况下。在任何一种情况下,它们都可以通过保留意外删除之前或攻击发生之前的数据副本来帮助降低数据丢失的风险。

除了勒索软件案例外,定期备份还有助于对长期攻击进行取证分析。如果您没有数据的历史记录,则很难甚至不可能确定攻击何时开始以及哪些数据遭到破坏。

如何实施频繁备份

在为您的系统实施备份时,将受损或删除数据的可验证恢复作为目标。问问自己:如果我的服务器明天消失,需要采取哪些步骤以最少的工作量使其恢复并安全运行?

以下是制定灾难恢复计划时需要考虑的其他一些问题:

  • 是否应该始终使用最新的备份?根据您的数据更改频率以及发生危害或删除的时间,改为默认使用较旧的备份可能会降低风险。
  • 恢复备份的实际过程是什么?您是否需要创建新服务器或恢复现有服务器?
  • 如果没有这个服务器,你能活多久?
  • 您需要异地备份吗?

信息

如果您使用的是 DigitalOcean Droplets,您可以按照
本指南从控制面板启用每周备份

如何使用 Restic Backup Client 将数据备份到对象存储服务是一个教程,您可以使用它来设计自己的备份系统,该系统将加密您的备份并将它们存储在您的生产系统之外。本教程适用于服务器,甚至本地台式机和笔记本电脑。

VPN 和专用网络

专用网络是仅对某些服务器或用户可用的网络。VPN 或虚拟专用网络是一种在远程计算机之间创建安全连接并将连接呈现为本地专用网络的方法。这提供了一种方法来配置您的服务,就像它们在专用网络上一样,并通过安全连接连接远程服务器。

VPN图

例如,DigitalOcean 专用网络可以实现同一区域内同一帐户或团队中的服务器之间的隔离通信

它们如何增强安全性?

考虑到两者之间的选择,使用私有而不是公共网络进行内部通信几乎总是可取的。但是,由于数据中心内的其他用户能够访问同一网络,您仍然必须实施额外的措施来保护服务器之间的通信。

使用 VPN 是一种有效的映射专用网络的方法,只有您的服务器才能看到。通信将是完全私密和安全的。其他应用程序可以配置为通过 VPN 软件公开的虚拟接口传递其流量。这样,只有公共 Internet 上的客户端可以使用的服务才需要在公共网络上公开。

实施起来有多难?

在具有此功能的数据中心中使用专用网络就像在服务器创建期间启用接口以及配置应用程序和防火墙以使用专用网络一样简单。请记住,数据中心范围的专用网络与使用同一网络的其他服务器共享空间。

至于 VPN,初始设置涉及更多,但对于大多数用例而言,增加的安全性是值得的。VPN 上的每台服务器都必须安装和配置建立安全连接所需的共享安全和配置数据。VPN 启动并运行后,必须将应用程序配置为使用 VPN 隧道。要了解如何设置 VPN 以安全地连接您的基础设施,请查看我们的OpenVPN 教程

公钥基础设施和 SSL/TLS 加密

公钥基础设施或 PKI 是指旨在创建、管理和验证用于识别个人和加密通信的证书的系统。SSL 或 TLS 证书可用于相互验证不同的实体。认证后,它们还可用于建立加密通信。

SSL图

它们如何增强安全性?

为您的服务器建立证书颁发机构 (CA) 并管理证书允许您基础架构中的每个实体验证其他成员的身份并加密他们的流量。这可以防止中间人攻击,其中攻击者模仿您的基础设施中的服务器来拦截流量。

每个服务器都可以配置为信任一个集中的证书颁发机构。之后,可以隐式信任权威机构签署的任何证书。如果您用于通信的应用程序和协议支持 TLS/SSL 加密,则这是一种无需 VPN 隧道(通常在内部也使用 SSL)开销即可加密您的系统的方法。

实施起来有多难?

配置证书颁发机构和设置其余的公钥基础设施可能涉及相当多的初始工作。此外,当需要创建、签署或撤销新证书时,管理证书会增加额外的管理负担。

对于许多用户来说,随着他们基础设施需求的增长,实施成熟的公钥基础设施将更有意义。使用 VPN 保护组件之间的通信可能是一个很好的权宜之计,直到您达到 PKI 值得额外管理成本的程度。

如果您想创建自己的证书颁发机构,可以根据您使用的 Linux 发行版参考我们的如何设置和配置证书颁发机构 (CA)指南之一。

文件审计和入侵检测系统

文件审核是将当前系统与系统处于已知良好状态时的文件和文件特征记录进行比较的过程。这用于检测可能已授权的系统更改。

文件审核图

入侵检测系统或 IDS 是一种软件,用于监控系统或网络是否存在未经授权的活动。许多基于主机的 IDS 实现使用文件审计作为检查系统是否已更改的方法。

它们如何增强安全性?

与上述服务级别审计类似,如果您认真确保系统安全,那么能够对您的系统执行文件级审计是非常有用的。这可以由管理员定期完成,也可以作为 IDS 中自动化过程的一部分。

这些策略是确保您的文件系统没有被某些用户或进程更改的唯一方法。出于多种原因,入侵者通常希望保持隐藏状态,以便他们可以在很长一段时间内继续利用服务器。他们可能会用受损版本替换二进制文件。对文件系统进行审计将告诉您是否有任何文件被更改,让您对服务器环境的完整性充满信心。

实施起来有多难?

实施 IDS 或进行文件审计可能是一个非常密集的过程。初始配置包括将您对服务器所做的任何非标准更改告知审计系统,并定义应排除以创建基线读数的路径。

它还使日常操作更加复杂。它使更新过程变得复杂,因为您需要在运行更新之前重新检查系统,然后在运行更新后重新创建基线以捕获对软件版本的更改。您还需要将报告卸载到另一个位置,以便入侵者无法更改审计以掩盖他们的踪迹。

虽然这可能会增加您的管理负担,但能够根据已知良好的副本检查您的系统是确保文件不会在您不知情的情况下被更改的唯一方法之一。一些流行的文件审计/入侵检测系统是TripwireAide

独立的执行环境

隔离执行环境是指单个组件在它们自己的专用空间内运行的任何方法。

隔离环境图

这可能意味着将您的离散应用程序组件分离到它们自己的服务器上,或者可能是指将您的服务配置为在chroot环境或容器中运行。隔离级别在很大程度上取决于您的应用程序要求和基础设施的实际情况。

它们如何增强安全性?

将您的流程隔离到单独的执行环境中可以提高您隔离可能出现的任何安全问题的能力。类似于舱壁和隔间如何帮助遏制船舶的船体破裂,分离您的各个组件可以限制入侵者对您基础设施其他部分的访问。

实施起来有多难?

根据您选择的遏制类型,隔离您的应用程序可能具有不同程度的复杂性。通过将您的各个组件打包在容器中,您可以快速实现某种程度的隔离,但请注意,Docker 并不将其容器化视为一项安全功能。

chroot为每个部分设置一个环境也可以提供一定程度的隔离,但这也不是一种万无一失的隔离方法,因为通常有多种方法可以打破chroot环境。将组件移动到专用机器是最好的隔离级别,在许多情况下可能是最不复杂的,但由于需要额外的机器会产生额外的成本。

结论

本教程中概述的策略概述了可以用来提高系​​统安全性的一些步骤。重要的是要认识到,您等待实施的时间越长,安全措施的有效性就会降低。因此,安全性不应是事后才考虑的,必须在您首次配置基础设施时实施。一旦您建立了一个安全的基础,您就可以开始部署您的服务和应用程序,并确保它们默认在安全环境中运行。

即使有一个安全的起始环境,请记住安全是一个持续和迭代的过程。良好的安全性需要始终保持警惕和意识的心态。一定要始终问问自己任何更改可能对安全有什么影响,以及您可以采取哪些步骤来确保始终为您的软件创建安全的默认配置和环境。

觉得文章有用?

点个广告表达一下你的爱意吧 !😁