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

来自菜鸟教程
跳转至:导航、​搜索

介绍

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

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

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 的非特权帐户,你可以通过在服务器上的 /etc/ssh/sshd_config 中设置 PermitRootLogin no 指令来禁用 root 登录然后使用 sudo systemctl restart sshd 之类的命令重新启动服务器的 SSH 进程。

防火墙

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

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

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

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

防火墙如何增强安全性?

即使您的服务实现了安全功能或仅限于您希望它们在其上运行的接口,防火墙也可以通过在应用程序处理流量之前限制与您的服务的连接来充当基础保护层。

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

如何实施防火墙

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

如果您使用的是 DigitalOcean,您还可以免费使用云防火墙 ,它可以在几分钟内设置


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

VPC 网络

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

VPC 网络如何增强安全性

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

此外,您可以将 Internet 网关设置为 VPC 网络资源和公共 Internet 之间的单一访问点,从而让您对连接到您的资源的公共流量有更多的控制和可见性。

如何实施 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

您将收到与此类似的输出:

OutputNetid       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(在 Automatic Updates 下)和 Fedora 的这些指南。

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


禁用目录索引

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

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

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

如何禁用目录索引

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

  • Nginx 默认禁用目录索引,因此如果您使用 Nginx,则不需要进行任何更改。
  • Apache Wiki 上的 DirectoryListings 页面解释了如何禁用目录列表。 确保将此处列出的 Options -Indexes 选项用于任何 Apache Directory 配置块。

经常备份

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

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

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

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

如何实施频繁备份

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

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

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

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


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

VPN 和专用网络

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

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

它们如何增强安全性?

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

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

这实施起来有多难?

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

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

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

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

它们如何增强安全性?

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

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

这实施起来有多难?

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

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

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

文件审计和入侵检测系统

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

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

它们如何增强安全性?

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

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

这实施起来有多难?

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

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

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

隔离的执行环境

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

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

它们如何增强安全性?

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

这实施起来有多难?

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

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

结论

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

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