简介
大多数时候,您的主要关注点将是让您的云应用程序运行起来。在您的设置和部署过程中,重要的是在系统和服务公开之前,为它们构建强大而全面的安全措施。在部署应用程序之前实施本教程中的安全措施,将确保您在基础设施上运行的任何软件都有一个安全的基础配置,而不是在部署后可能实施的临时措施。
本指南强调了一些实用的安全措施,您在配置和设置服务器基础设施时可以采取这些措施。这个列表不是您可以用来保护服务器的所有措施的详尽清单,但为您提供了一个可以构建的起点。随着时间的推移,您可以开发出更符合您的环境和应用程序特定需求的定制安全方法。
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密钥,然后将公钥传输到远程服务器。
在 Ubuntu、Debian 或 CentOS 上设置 SSH 密钥时,您可以参考 《如何在 Ubuntu、Debian 或 CentOS 上设置 SSH 密钥》。
对于任何可能受到暴力攻击的堆栈部分,例如需要密码访问的部分,您可以实施类似 《使用 fail2ban 限制服务器上的密码猜测尝试》 的解决方案。
最佳实践是不允许 root 用户直接通过 SSH 登录。相反,应该使用像 sudo
这样的工具以最小特权原则来提升权限。一旦您通过 SSH 连接到您的服务器并创建了一个您已经验证可以工作的非特权账户,您就可以在服务器的 /etc/ssh/sshd_config
中设置 PermitRootLogin no
指令,然后重新启动服务器的 SSH 进程,使用命令如 sudo systemctl restart sshd
。
防火墙
防火墙是一个软件或硬件设备,它控制服务如何向网络公开,以及允许哪种类型的流量进入和离开给定服务器或服务器群。正确配置的防火墙将确保只有应该公开可用的服务可以从您的服务器或网络外部访问。
在典型服务器上,默认可能运行着多种服务。这些可以归类为以下几组:
- 公共服务,任何互联网上的人都可以访问,通常是匿名的。例如,提供您实际网站的网页服务器。
- 私有服务,应该只有一组选定的授权账户或从特定位置访问。例如,数据库控制面板如phpMyAdmin。
- 内部服务,应该只能从服务器内部访问,而不向公共互联网公开服务。例如,只应接受本地连接的数据库。
防火墙可以确保根据上述类别以不同粒度限制对软件的访问。公共服务可以保持开放并可供互联网访问,私有服务可以根据不同标准(如连接类型)进行限制。内部服务可以完全对互联网不可访问。对于未使用的端口,在大多数配置中,访问会被完全阻止。
防火墙如何增强安全性?
即使您的服务实施了安全功能或仅在您希望它们运行的接口上运行,防火墙也作为基本保护层,在流量被应用程序处理之前限制对服务的连接。
一个正确配置的防火墙将限制除特定服务需要保持开放以外的所有访问,通常通过打开与这些服务相关的端口来实现。例如,SSH一般运行在端口22上,HTTP/HTTPS访问(通常通过网页浏览器)通常运行在端口80和443上。只暴露几个软件组件可以减少服务器受到攻击的表面区域,限制了易受利用的组件。
如何实施防火墙
Linux系统上有许多防火墙可供选择,其中一些比其他防火墙更复杂。一般来说,你只需要在服务器的防火墙配置中做出更改,以允许特定的端口。以下是几种流行的方法:
-
UFW,即不复杂的防火墙,在像Ubuntu这样的某些Linux发行版上默认安装。您可以在如何在Ubuntu 20.04上使用UFW设置防火墙
-
如果您使用的是Red Hat、Rocky或Fedora Linux,可以阅读如何使用firewalld设置防火墙来使用它们的默认工具。
-
许多软件防火墙,如UFW和firewalld,将它们配置的规则直接写入名为
iptables
的文件中。要了解如何直接处理iptables
配置,您可以查看Iptables基础:常见防火墙规则和命令
。请注意,一些其他实现端口规则的自有软件,如Docker,也会直接写入iptables
,并且可能与您使用UFW创建的规则发生冲突,因此在这种情况下,了解如何阅读iptables
配置是很有帮助的。
注意:许多托管服务提供商,包括DigitalOcean,允许您配置一个作为外部层运行的防火墙服务,它运行在您的云服务器之上,而不是直接实现防火墙。这些配置是在网络边缘使用管理工具实现的,实际上通常不太复杂,但可能难以脚本化和复制。您可以参考DigitalOcean的云防火墙文档。
请确保您的防火墙配置默认为阻止未知流量。这样,您部署的任何新服务都不会不小心暴露给互联网。相反,您需要明确允许访问,这将迫使您评估服务的运行方式、访问方式以及谁应该能够使用它。
虚拟私有云(VPC)网络
虚拟私有云(VPC)网络是为您的基础设施资源提供的安全网络。VPC网络为资源之间的连接提供更加安全的保障,因为网络接口无法从公共互联网访问。
VPC网络如何提高安全性?
一些托管提供商将默认为您分配一个公共网络接口和一个私有网络接口。禁用部分基础设施的公网接口只会允许这些实例使用私有网络接口在内部网络上相互连接,这意味着您的系统之间的通信将不会通过外部互联网路由,从而暴露或被拦截的风险较低。
通过仅将几个专用互联网网关(也称为入口网关)作为您VPC网络资源与公共互联网之间连接的唯一点来有条件地暴露,您可以更好地控制和监控连接到您的资源的公共流量。现代容器编排系统如Kubernetes具有非常明确的入站网关概念,因为它们通常创建许多私有网络接口,需要选择性地将其暴露。
如何实施VPC网络
许多云基础设施提供商都支持您在其数据中心内创建和添加VPC网络中的资源。
注意:如果您想在DigitalOcean上设置自己的VPC网关,可以参考如何在Debian、Ubuntu和CentOS服务器上配置Droplet为VPC网关指南。
自定义私有网络需要高级服务器配置和网络知识。另一种设置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端口。一个示例命令显示程序名、PID和用于监听TCP和UDP流量的地址:
p
、l
、u
、n
和t
选项的工作原理如下:
-
–
p
仅显示使用给定套接字的特定进程。 -
–
l
仅显示正在主动监听连接的套接字。 -
–
u
包括UDP套接字(以及TCP套接字)。 -
–
n
显示数字流量值。 - 翻译如下:
t
包括TCP套接字(除了UDP套接字)。
您将收到类似这样的输出:
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名称列。如果本地地址:端口是0.0.0.0
,则服务正在接受来自所有IPv4网络接口的连接。如果地址是[:]
,则服务正在接受来自所有IPv6接口的连接。在上述示例输出中,SSH和Nginx都在监听所有公共接口,同时监听IPv4和IPv6网络堆栈。
您可以决定是否允许SSH和Nginx同时在两个接口上监听,或者只在其中一个或另一个接口上监听。通常,你应该禁用运行在未使用接口上的服务。
无人值守更新
保持您的服务器更新到最新版本对于确保基本的安全水平至关重要。运行过时且不安全的软件的服务器负责大多数安全事件,但定期更新可以减轻漏洞并防止攻击者获得对服务器的立足点。无人值守更新允许系统自动更新大多数包。
无人值守更新如何增强安全性?
实施无人值守,即自动更新,可以降低保持服务器安全所需的努力程度,并缩短服务器可能受到已知漏洞影响的时间。在影响您服务器上软件的漏洞出现时,您的服务器将在您运行更新之前保持易受攻击状态。每日的无人值守升级将确保您不会错过任何软件包,并且任何易受攻击的软件都会在修复程序可用时立即得到修补。
如何实现无人值守更新
您可以参考如何保持Ubuntu服务器更新以了解在Ubuntu上实施无人值守更新的概述。
公钥基础设施和SSL/TLS加密
公共密钥基础设施(PKI)是指一种设计用于创建、管理和验证数字证书的系统,这些证书用于标识个人和加密通信。SSL或TLS证书可以用来认证不同的实体并建立加密通信。
PKI如何增强安全性?
通过建立证书颁发机构(CA)并管理服务器证书,您可以为您的网络中的每个实体验证其他成员的身份并加密其流量。这可以防止中间人攻击,即攻击者模仿您的基础设施中的服务器来拦截流量。每个服务器都可以配置为信任一个集中的证书颁发机构。之后,由该权威签署的任何证书都可以隐式信任。
如何实施PKI
配置证书颁发机构以及设置其他公钥基础设施可能需要相当多的初始努力。此外,管理证书在新证书需要创建、签名或撤销时可能会带来额外的管理负担。
对于许多用户来说,只有在他们的基础设施需求增长时,实施完整的公钥基础设施才有意义。在达到公钥基础设施值得额外管理成本之前,使用VPN保护组件之间的通信可能是一个更好的中间措施。
如果您想创建自己的证书颁发机构,可以根据您使用的Linux发行版参考如何设置和配置证书颁发机构(CA)指南。
结论
本教程中概述的策略是一些您可以采取的提高系统安全性的步骤的概述。重要的是要认识到,安全措施的效果会随着您等待实施它们的时间越长而降低。安全不应事后考虑,必须在您首次配置基础设施时实施。一旦您有了可以构建的安全基础,您就可以开始部署您的服务和应用程序,并有一定的信心,默认情况下它们正在一个安全的环境中运行。
即使具有安全的初始环境,也应记住安全是一个持续迭代的过程。始终要确保问自己任何更改的安全影响可能是什么,以及可以采取哪些步骤来确保您始终为您的软件创建安全默认配置和环境。
Source:
https://www.digitalocean.com/community/tutorials/7-security-measures-to-protect-your-servers