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