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

介绍

大多数时候,您的主要重点将是实现您的云应用程序并运行。作为您的安装和部署过程的一部分,在它们公开可用之前,重要的是为您的系统和应用程序建立强大而彻底的安全措施。

本指南突出了您在配置和设置服务器基础设施时可以采取的一些实用安全措施. 本列表不是您可以为保护服务器所能做的所有事情的完整列表,但这为您提供了可以建立起点的起点。

SSH 密钥

SSH,或安全壳,是一种用于管理和与服务器通信的加密协议. 当您与服务器合作时,您可能会花大部分时间在通过 SSH 连接到您的服务器的终端会话中。

使用 SSH 密钥,为身份验证目的创建一对私钥和公钥对。私钥由用户保密和安全,而公共密钥可以共享。

SSH Keys diagram

要配置 SSH 密钥身份验证,您需要将公共 SSH 密钥放置在预期位置的服务器上(通常是 `~/.ssh/authorized_keys)。

SSH 密钥如何增强安全性?

然而,当允许基于密码的登录时,恶意用户可以反复,自动尝试访问服务器,特别是如果它有一个面向公众的IP地址。尽管有方法可以从同一IP的多个失败尝试后锁定访问,而恶意用户在实践中会受到如何快速尝试登录到您的服务器的限制,但任何情况下,用户可以通过反复的 brute force 攻击试图获得访问您的堆栈都会构成安全风险。

设置 SSH 密钥身份验证允许您禁用基于密码的身份验证。 SSH 密钥通常具有比密码更多的数据 - 您可以从 12 个字符密码中创建 128 个字符的 SSH 密钥哈希 - 使它们更具挑战性。

如何实现SSH密钥

SSH 密钥是远程登录任何 Linux 服务器环境的推荐方法. 一对 SSH 密钥可以使用ssh命令在本地机器上生成,然后您可以将公共密钥转移到远程服务器。

要在您的服务器上设置 SSH 密钥,您可以遵循 How To Set Up SSH Keys 用于 Ubuntu、Debian 或 CentOS。

对于需要密码访问或容易遭到暴力攻击的堆栈的任何部分,您可以在服务器上实施一个解决方案,例如 fail2ban,以限制密码猜测。

最好是不允许用户直接通过 SSH 登录的。相反,作为非特权用户登录,然后根据需要升级权限(使用sudo等工具)(https://andsky.com/tech/tutorials/how-to-create-a-new-sudo-enabled-user-on-ubuntu-20-04-quickstart)。这种限制权限的方法被称为最少特权原则(https://en.wikipedia.org/wiki/Principle_of_least_privilege)。一旦您连接到您的服务器并创建了一个非特权帐户,您可以通过在您的服务器上设置允许RootLogin No指令来禁用root登录,然后使用一个命令,如sudo systemctl restart sshd来重新启动服务器的 SSH 过程。

防火墙

防火墙是一个软件或硬件设备,控制服务如何暴露于网络,以及允许进入和离开某个服务器或服务器的流量类型。

Firewall diagram

在典型的服务器上,一些服务可能默认运行,这些服务可以分为以下组:

防火墙可以确保对您的软件的访问受到限制,根据上述类别而具有不同程度的细微性。公共服务可以被打开并可用于互联网,而私人服务可以根据不同的标准受到限制,例如连接类型。

防火墙如何增强安全性?

即使您的服务实现了安全功能或仅限于您希望使用的界面,防火墙也可以作为基本的保护层,在应用程序处理流量之前限制到您的服务和服务的连接。

一个正确配置的防火墙会限制访问除了你需要保持开放的特定服务之外的所有东西,通常只打开与这些服务相关的端口,例如,SSH通常在端口22上运行,并且通过网页浏览器访问HTTP/HTTPS通常在端口80和443上运行。

如何使用防火墙

对于 Linux 系统来说,有许多防火墙可用,有些是比其他系统更复杂的,一般来说,当你对服务器上运行的服务进行更改时,你只需要对防火墙配置进行更改。

](https://andsky.com/tech/tutorials/iptables-essentials-common-firewall-rules-and-comands) 请注意,一些其他软件本身实施端口规则,如Docker,也会直接写到iptables,并且可能与您使用UFW创建的规则相冲突,因此在这种情况下,了解如何阅读iptables配置是有用的。

<$>[注] **注:**许多托管提供商,包括DigitalOcean,将允许您将防火墙配置为在云服务器(s)上作为外部层运行的服务,而不是需要直接实施防火墙。这些配置,在网络边缘使用管理工具实现,在实践中往往不那么复杂,但可能更具挑战性的脚本和复制。

请确保您的防火墙配置是默认的,以阻止未知的流量,这样你部署的任何新服务都不会意外暴露在互联网上,相反,你将不得不明确允许访问,这将迫使你评估服务是如何运行的,访问的,以及谁应该能够使用它。

VPC网络

虚拟私有云(VPC)网络是基础设施资源的私有网络,VPC网络提供了资源之间更安全的连接,因为网络的界面无法从公共互联网访问。

VPC网络如何增强安全性?

某些托管服务提供商会默认地将您的云服务器分配一个公共网络接口和一个私人网络接口. 在您的基础设施部分上禁用您的公共网络接口只会允许这些实例通过内部网络的私人网络接口相互连接,这意味着您的系统之间的流量不会通过公共互联网路由,在那里它可能会被曝光或拦截。

通过将仅限于几个专用互联网网关,也称为 _ingress_网关,作为VPC网络资源与公共互联网之间的唯一接入点,您将有更多的控制和可见性,对连接到您的资源的公共流量。

如何部署VPC网络

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

<$>[注] 注: 如果您正在使用DigitalOcean并希望设置自己的VPC网关,您可以遵循 如何将Droplet配置为VPC网关指南来学习如何在Debian、Ubuntu和基于CentOS的服务器上。

手动配置自己的私人网络可能需要先进的服务器配置和网络知识. 设置VPC网络的替代方案是使用服务器之间的VPN连接。

VPN和私人网络

VPN,或虚拟私人网络,是创建远程计算机之间的安全连接的一种方式,并将连接呈现为本地私人网络,这提供了配置您的服务的方式,就像它们是在私人网络上,并通过安全连接连接远程服务器。

VPN diagram

例如,DigitalOcean私人网络允许在同一区域内的同一帐户或团队中的服务器之间进行隔离通信(https://andsky.com/tech/tutorials/digitalocean-private-networking-faq)。

VPN如何增强安全性?

使用VPN是描绘只有你的服务器才能看到的私人网络的一种方式。通信将完全私密和安全。其他应用程序可以配置以通过VPN软件暴露的虚拟接口传输流量。

如何使用VPN

使用私人网络通常需要您在首次部署服务器时做出有关网络接口的决定,并配置您的应用程序和防火墙以优先选择这些接口。相比之下,部署VPN需要安装额外的工具和创建额外的网络路径,但通常可以部署在现有架构上。VPN上的每个服务器必须具有建立VPN连接所需的共享安全和配置数据。

如果您正在使用Ubuntu或CentOS,您可以遵循 如何在Ubuntu 20.04 上设置和配置OpenVPN服务器教程。

Wireguard 是另一个流行的VPN部署,一般来说,VPN遵循相同的原则,通过在几个入口点后实施一系列私人网络接口来限制进入您的云服务器,但在VPC配置通常是核心基础设施考虑的情况下,VPN可以更具体地部署。

服务审计

良好的安全性包括分析您的系统,了解可用的攻击表面,并尽可能地锁定组件。

Service auditing diagram

服务审核是了解在某个系统上运行哪些服务、他们使用的通信端口以及这些服务正在使用的协议的一种方式,这些信息可以帮助您配置哪些服务应该是公开可用、防火墙设置、监控和警报。

服务审计如何提高安全性?

每个运行服务,无论是内部还是公开的,都代表了恶意用户的扩展攻击面积,您运行的服务越多,影响软件的漏洞的可能性就越大。

一旦您对计算机上正在运行的网络服务有很好的了解,您就可以开始分析这些服务。

  • 该服务是否应该运行?
  • 该服务是否运行在不应该运行的网络接口上?
  • 该服务是否应该绑定到公共或私人网络接口?
  • 我的防火墙规则是结构化的,以便将合法的流量传送到该服务?
  • 我的防火墙规则是否阻止了非合法的流量?
  • 我是否有方法接收每个服务的安全漏洞警报?

在配置基础设施中的任何新服务器时,这种类型的服务审核应该是标准做法,每隔几个月进行服务审核也会帮助您捕捉任何可能意外改变配置的服务。

如何实施服务审计

要审核在您的系统上运行的网络服务,请使用ss命令列出在服务器上使用的所有 TCP 和 UDP 端口。

1sudo ss -plunt

p,l,u,nt选项如下:

●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●

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

1[secondary_label Output]
2Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
3tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:*         users:(("sshd",pid=812,fd=3))
4tcp LISTEN 0 511 0.0.0.0:80 0.0.0.0:*         users:(("nginx",pid=69226,fd=6),("nginx",pid=69225,fd=6))
5tcp LISTEN 0 128                         [::]:22                       [::]:*         users:(("sshd",pid=812,fd=4))
6tcp 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 在两种接口上收听,或者仅在其中一个接口上。

未知更新

保持服务器的更新是必要的,以确保良好的基本安全级别. 运行过时的服务器和不安全的软件版本负责大多数安全事件,但定期更新可以减轻漏洞,并防止攻击者在您的服务器上获得支撑。

未经监督的更新如何增强安全性?

实施未经监督的,即自动更新降低了保持服务器安全所需的努力水平,并缩短了服务器可能对已知错误易受攻击的时间。在影响服务器上的软件漏洞的情况下,服务器将易受攻击,只要您需要运行更新,服务器将易受攻击。

如何执行未经监督的更新

您可以参阅 如何更新Ubuntu服务器以了解如何在Ubuntu上实施未经监督的更新。

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

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

SSL diagram

PKI如何提高安全性?

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

每个服务器可以配置为信任一个集中式证书授权机构,随后,任何由该授权机构签署的证书都可以被默认信任。

如何实施PKI

配置证书授权机构并设置其他公共密钥基础设施可能需要大量的初始努力,此外,当需要创建、签署或撤销新证书时,管理证书可能会产生额外的管理负担。

对于许多用户来说,实现全面的公钥基础设施只会随着基础设施需求的增长而有意义。使用VPN来确保组件之间的通信可能是一个更好的中间措施,直到您达到PKI值得额外的管理成本的地步。

如果您想创建自己的证书权限,您可以参阅 如何设置和配置证书权限(CA)]指南,取决于您正在使用的 Linux 发行版。

结论

在本教程中描述的策略是您可以采取的一些步骤的概述,以改善您的系统的安全性。重要的是要认识到,安全措施的有效性会随着时间的推移而减少。安全不应该是后期考虑,并且必须在您首先提供基础设施时实施。一旦您有安全的基础来建立,您可以开始部署您的服务和应用程序,并保证它们在默认情况下在安全环境中运行。

即使在安全的启动环境中,请记住,安全性是一个持续和迭代的过程,请务必问自己任何更改的安全影响是什么,以及您可以采取哪些步骤来确保您始终为您的软件创建安全的默认配置和环境。

Published At
Categories with 技术
comments powered by Disqus