大多数时候,您的主要关注点是启动和运行您的云应用程序。作为您的设置和部署过程的一部分,在您的系统和应用程序公开可用之前,为您的系统和应用程序构建强大而全面的安全措施非常重要。在部署应用程序之前实施本教程中的安全措施将确保您在基础架构上运行的任何软件都具有安全的基本配置,而不是可能在部署后实施的临时措施。
本指南重点介绍了您在配置和设置服务器基础架构时可以采取的一些实用安全措施。此列表并非详尽无遗地列出了您可以采取的所有措施来保护您的服务器,但它为您提供了一个可以构建的起点。随着时间的推移,您可以开发出更加量身定制的安全方法,以满足您的环境和应用程序的特定需求。
SSH 密钥
SSH,或安全外壳,是一种用于管理服务器和与服务器通信的加密协议。使用服务器时,您可能会将大部分时间花在通过 SSH 连接到服务器的终端会话中。作为基于密码登录的替代方案,SSH 密钥使用加密来提供一种安全的登录服务器的方式,建议所有用户使用。
使用 SSH 密钥,会创建一对私钥和公钥以用于身份验证。私钥由用户保密和安全,而公钥可以共享。这通常称为非对称加密,您可能会在其他地方看到这种模式。
要配置 SSH 密钥身份验证,您需要将您的公共 SSH 密钥放在服务器上的预期位置(通常是~/.ssh/authorized_keys
)。要了解有关基于 SSH 密钥的身份验证如何工作的更多信息,请阅读了解 SSH 加密和连接过程。
SSH 密钥如何增强安全性?
使用 SSH,任何类型的身份验证——包括密码身份验证——都是完全加密的。但是,当允许基于密码的登录时,恶意用户可以反复自动尝试访问服务器,尤其是当它具有面向公众的 IP 地址时。尽管在从同一 IP 多次尝试失败后有多种方法可以锁定访问权限,并且恶意用户在实践中会受到他们尝试登录您的服务器的速度的限制,但用户可以合理地尝试获得访问权限的任何情况通过反复的暴力攻击对您的堆栈造成安全风险。
设置 SSH 密钥身份验证允许您禁用基于密码的身份验证。SSH 密钥的数据位通常比密码多得多——您可以从 12 个字符的密码创建一个 128 个字符的 SSH 密钥散列——这使得它们更难被暴力破解。尽管如此,一些加密算法仍被认为是可破解的,因为它试图在足够强大的计算机上对密码哈希进行足够多次的逆向工程。其他密钥,包括由现代 SSH 客户端生成的默认 RSA 密钥,尚无法破解。
如何实现 SSH 密钥
SSH 密钥是远程登录任何 Linux 服务器环境的推荐方式。可以使用该命令在您的本地计算机上生成一对 SSH 密钥ssh
,然后您可以将公钥传输到远程服务器。
要在您的服务器上设置 SSH 密钥,您可以按照如何为 Ubuntu、Debian 或 CentOS设置 SSH 密钥进行操作。
对于堆栈中需要密码访问或容易受到暴力攻击的任何部分,您可以在服务器上实施类似fail2ban的解决方案来限制密码猜测。
最佳做法是不允许root
用户直接通过 SSH 登录。相反,以非特权用户身份登录,然后根据需要使用sudo
. 这种限制权限的方法被称为最小权限原则。一旦你连接到你的服务器并创建了一个你已经验证可以使用 SSH 的非特权帐户,你可以通过在你的服务器上设置指令来禁用root
登录,然后使用类似命令重新启动服务器的 SSH 进程。PermitRootLogin no
/etc/ssh/sshd_config
sudo systemctl restart sshd
防火墙
防火墙是一种软件或硬件设备,用于控制服务如何暴露于网络,以及允许哪些类型的流量进出给定服务器。正确配置的防火墙将确保只有应该公开可用的服务才能从您的服务器或网络外部访问。
在典型的服务器上,许多服务可能默认运行。这些可以分为以下几组:
- 互联网上任何人都可以访问的公共服务,通常是匿名访问。这方面的一个例子是为您的实际网站提供服务的网络服务器。
- 只能由一组选定的授权帐户或从特定位置访问的私人服务。例如,像 phpMyAdmin 这样的数据库控制面板。
- 内部服务应该只能从服务器本身访问,而不会将服务暴露给公共互联网。例如,一个应该只接受本地连接的数据库。
防火墙可以确保根据上述类别以不同程度的粒度限制对软件的访问。公共服务可以保持开放并可供互联网使用,而私人服务可以根据不同的标准(例如连接类型)进行限制。可以使内部服务完全无法访问 Internet。对于未使用的端口,在大多数配置中访问都被完全阻止。
防火墙如何增强安全性?
即使您的服务实现了安全功能或仅限于您希望它们在其上运行的接口,防火墙也可以作为基础保护层,在应用程序处理流量之前限制进出您的服务的连接。
正确配置的防火墙将限制对除您需要保持打开的特定服务之外的所有内容的访问,通常只打开与这些服务关联的端口。例如,SSH 一般运行在 22 端口,而通过 Web 浏览器进行的 HTTP/HTTPS 访问通常分别运行在 80 和 443 端口。仅公开少量软件可减少服务器的攻击面,从而限制易受攻击的组件。
如何实施防火墙
有许多适用于 Linux 系统的防火墙,有些比其他的更复杂。通常,当您更改服务器上运行的服务时,您只需要更改防火墙配置。以下是启动和运行的一些选项:
- UFW 或 Uncomplicated Firewall 在某些 Linux 发行版(如 Ubuntu)上默认安装。您可以在如何在 Ubuntu 20.04 上使用 UFW 设置防火墙中了解更多信息
- 如果您使用的是 Red Hat、Rocky 或 Fedora Linux,您可以阅读如何使用 firewalld 设置防火墙以使用它们的默认工具。
- 许多软件防火墙,如 UFW 和 firewalld 会将它们配置的规则直接写入一个名为
iptables
. 要了解如何直接使用iptables
配置,您可以查看Iptables Essentials:通用防火墙规则和命令 。请注意,其他一些自行实现端口规则的软件(例如 Docker)也会直接写入,并且可能与您使用 UFW 创建的规则冲突,因此在这种情况下iptables
了解如何读取配置会很有帮助。iptables
注意:许多托管服务提供商,包括 DigitalOcean,将允许您将防火墙配置为一项服务,该服务作为云服务器上的外部层运行,而不需要直接实施防火墙。这些配置使用托管工具在网络边缘实施,在实践中通常不那么复杂,但编写和复制脚本可能更具挑战性。可以参考DigitalOcean的 云防火墙的文档。
确保您的防火墙配置默认为阻止未知流量。这样,您部署的任何新服务都不会无意中暴露在 Internet 上。相反,您将必须明确允许访问,这将迫使您评估服务的运行方式、访问方式以及谁应该能够使用它。
专有网络
虚拟私有云 (VPC) 网络是基础设施资源的私有网络。VPC 网络在资源之间提供更安全的连接,因为网络的接口无法从公共互联网访问。
VPC 网络如何增强安全性?
一些主机商会默认为你的云服务器分配一个公网接口和一个私网接口。在部分基础设施上禁用公共网络接口将只允许这些实例通过内部网络使用它们的专用网络接口相互连接,这意味着您的系统之间的流量将不会通过公共互联网路由,而它可能是暴露或拦截。
通过有条件地仅公开几个专用互联网网关(也称为入口网关)作为 VPC 网络资源和公共互联网之间的唯一访问点,您将对连接到您的资源的公共流量有更多的控制和可见性。像 Kubernetes 这样的现代容器编排系统有一个定义非常明确的入口网关概念,因为它们默认创建了许多私有网络接口,需要有选择地公开这些接口。
如何实施 VPC 网络
许多云基础架构提供商使您能够在其数据中心内创建资源并将其添加到 VPC 网络。
注意:如果您正在使用 DigitalOcean 并希望设置自己的 VPC 网关,您可以按照如何将 Droplet 配置为 VPC 网关指南来了解如何在基于 Debian、Ubuntu 和 CentOS 的服务器上进行操作。
手动配置您自己的专用网络可能需要高级服务器配置和网络知识。设置 VPC 网络的另一种方法是在服务器之间使用 VPN 连接。
VPN 和专用网络
VPN 或虚拟专用网络是一种在远程计算机之间创建安全连接并将连接呈现为本地专用网络的方法。这提供了一种方法来配置您的服务,就好像它们在专用网络上一样,并通过安全连接连接远程服务器。
例如,DigitalOcean 私有网络可以实现同一地区内同一账户或团队的服务器之间的隔离通信。
VPN 如何增强安全性?
使用 VPN 是一种绘制只有您的服务器可以看到的专用网络的方法。通信将是完全私密和安全的。其他应用程序可以配置为通过 VPN 软件公开的虚拟接口传递它们的流量。这样,只有打算由公共互联网上的客户端使用的服务才需要在公共网络上公开。
如何实施 VPN
使用专用网络通常需要您在首次部署服务器时就网络接口做出决定,并配置您的应用程序和防火墙以优先使用这些接口。相比之下,部署 VPN 需要安装额外的工具并创建额外的网络路由,但通常可以部署在现有架构之上。VPN 上的每个服务器都必须具有建立 VPN 连接所需的共享安全和配置数据。VPN 启动并运行后,应用程序必须配置为使用 VPN 隧道。
如果您使用的是 Ubuntu 或 CentOS,则可以按照如何在 Ubuntu 20.04 上设置和配置 OpenVPN 服务器 教程进行操作。
Wireguard 是另一种流行的 VPN 部署。通常,VPN 遵循通过在几个入口点后面实施一系列专用网络接口来限制进入云服务器的相同原则,但是 VPC 配置通常是核心基础设施考虑因素,VPN 可以部署在更临时的基础上.
服务审计
良好的安全性包括分析您的系统、了解可用的攻击面并尽可能锁定组件。
服务审计是了解给定系统上正在运行哪些服务、它们使用哪些端口进行通信以及这些服务正在使用哪些协议的一种方式。此信息可帮助您配置哪些服务应可公开访问、防火墙设置、监控和警报。
服务审计如何增强安全性?
每个正在运行的服务,无论是内部服务还是公共服务,都代表了恶意用户的扩展攻击面。您运行的服务越多,漏洞影响您的软件的可能性就越大。
一旦您对计算机上运行的网络服务有了很好的了解,就可以开始分析这些服务。当您执行服务审核时,请问自己以下有关每个正在运行的服务的问题:
- 该服务应该运行吗?
- 服务是否在不应运行的网络接口上运行?
- 该服务应该绑定到公共网络接口还是专用网络接口?
- 我的防火墙规则的结构是否可以将合法流量传递到此服务?
- 我的防火墙规则是否阻止了不合法的流量?
- 我是否有一种方法可以接收有关这些服务中每一项服务漏洞的安全警报?
在您的基础架构中配置任何新服务器时,这种类型的服务审核应该是标准做法。每隔几个月执行一次服务审核也将帮助您发现配置可能已无意更改的任何服务。
如何实施服务审计
要审核系统上运行的网络服务,请使用命令ss
列出服务器上正在使用的所有 TCP 和 UDP 端口。显示用于侦听 TCP 和 UDP 流量的程序名称、PID 和地址的示例命令是:
p
、l
、u
、n
和选项的工作方式t
如下:
p
显示使用给定套接字的特定进程。l
仅显示正在主动侦听连接的套接字。u
包括 UDP 套接字(除了 TCP 套接字)。n
显示数字流量值。t
包括 TCP 套接字(除了 UDP 套接字)。
您将收到类似于此的输出:
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 列。如果 Local Address:Port 是0.0.0.0,则该服务正在接受所有 IPv4 网络接口上的连接。如果地址是,[::]则服务正在接受所有 IPv6 接口上的连接。在上面的示例输出中,SSH 和 Nginx 都在 IPv4 和 IPv6 网络堆栈上的所有公共接口上进行侦听。
您可以决定是否要允许 SSH 和 Nginx 在两个接口上侦听,或者只在一个或另一个上侦听。通常,您应该禁用在未使用的接口上运行的服务。
无人值守更新
为确保良好的基本安全级别,必须使用补丁程序使您的服务器保持最新状态。运行过时的服务器和不安全的软件版本是大多数安全事件的罪魁祸首,但定期更新可以缓解漏洞并防止攻击者在您的服务器上站稳脚跟。无人值守更新允许系统自动更新大部分软件包。
无人值守更新如何增强安全性?
实施无人值守(即自动)更新可降低保持服务器安全所需的工作量,并缩短服务器易受已知错误影响的时间。如果出现影响服务器上软件的漏洞,无论您运行更新需要多长时间,您的服务器都将容易受到攻击。每日无人值守升级将确保您不会遗漏任何软件包,并且一旦修复程序可用,任何易受攻击的软件都会得到修补。
如何实现无人值守更新
您可以参考如何保持 Ubuntu 服务器更新,了解在 Ubuntu 上实现无人值守更新的概述。
公钥基础设施和 SSL/TLS 加密
公钥基础设施或 PKI 是指旨在创建、管理和验证用于识别个人和加密通信的证书的系统。SSL 或 TLS 证书可用于相互验证不同的实体。经过身份验证后,它们还可以用于建立加密通信。
PKI 如何增强安全性?
为您的服务器建立证书颁发机构 (CA) 和管理证书允许您的基础设施中的每个实体验证其他成员的身份并加密他们的流量。这可以防止攻击者模仿您的基础架构中的服务器来拦截流量的中间人攻击。
每个服务器都可以配置为信任一个集中的证书颁发机构。之后,可以隐式信任由该机构签署的任何证书。
如何实施 PKI
配置证书颁发机构和设置其他公钥基础结构可能涉及相当多的初始工作。此外,当需要创建、签署或撤销新证书时,管理证书会增加额外的管理负担。
对于许多用户来说,实施成熟的公钥基础设施只有在他们的基础设施需求增长时才有意义。使用 VPN 保护组件之间的通信可能是一种更好的中间措施,直到您达到 PKI 值得额外管理成本的地步。
如果您想创建自己的证书颁发机构,可以参考如何设置和配置证书颁发机构 (CA)指南,具体取决于您使用的 Linux 发行版。
结论
本教程中概述的策略是对您可以用来提高系统安全性的一些步骤的概述。重要的是要认识到,您等待实施安全措施的时间越长,其有效性就会降低。安全不应该是事后才想到的,必须在您首次配置基础设施时实施。一旦您有了一个安全的基础,您就可以开始部署您的服务和应用程序,并确保它们默认在安全的环境中运行。
即使有一个安全的起始环境,请记住安全是一个持续和迭代的过程。始终务必问问自己任何更改可能带来的安全影响是什么,以及您可以采取哪些步骤来确保始终为您的软件创建安全的默认配置和环境。