引言

在设置基础结构时,启动和运行应用程序通常是您的首要关注点。 但是,使应用程序正常运行而不解决基础设施的安全需求可能会带来毁灭性的后果。

在本指南中,我们将讨论一些最好在设置应用程序之前或设置应用程序时进行配置的基本安全实践。

Ssh 密钥

Ssh 密钥是一对密码密钥,可用于通过 SSH 服务器的身份验证,以替代基于密码的登录。 在身份验证之前创建一个私有密钥和公共密钥对。 私钥由用户保密和安全,而公钥可以与任何人共享。

要配置 SSH / 密钥认证,必须将用户的公钥放在服务器上的一个特殊目录中。 当用户连接到服务器时,服务器将要求客户端提供关联私钥的证据。 Ssh 客户机将使用私钥以证明私钥所有权的方式进行响应。 然后,服务器将允许客户端连接而不需要密码。 要了解更多关于 SSH 密钥如何工作的信息,请查看我们的文章。

如何加强保安?

使用 SSH,任何类型的身份验证(包括密码身份验证)都是完全加密的。 但是,当允许基于密码的登录时,恶意用户可以重复尝试访问服务器。 随着现代计算能力的增强,通过自动化这些尝试并尝试组合,直到找到正确的密码,就有可能进入服务器。

设置 SSH 密钥认证允许禁用基于密码的身份验证。 Ssh 密钥通常比密码具有更多的数据位,这意味着攻击者需要运行的组合要多得多。 许多 SSH 密钥算法被现代计算硬件认为是不可破解的,因为它们需要太多的时间来运行可能的匹配。

执行起来有多困难?

Ssh 密钥非常容易设置,建议远程登录到任何 Linux 或 Unix 服务器环境。 可以在计算机上生成一对 SSH 密钥,您可以在几分钟内将公钥传输到服务器。

要了解如何设置密钥,请遵循以下指南。 如果您仍然觉得需要密码身份验证,可以考虑在服务器上实现类似于 fail2ban 的解决方案,以限制密码猜测。

防火墙

防火墙是控制向网络公开哪些服务的软件(或硬件)。 这意味着阻止或限制对每个端口的访问,除了那些应该公开可用的端口。

在一个典型的服务器上,默认情况下可能运行一些服务。 这些问题可分为以下几类:

  • 任何人都可以在互联网上访问的公共服务,通常是匿名的。 一个很好的例子就是一个允许访问你的网站的 web 服务器。
  • 只能由一组特定的授权帐户或从某些地点访问的私人服务。 这方面的一个例子可能是数据库控制面板。
  • 只能从服务器本身内部访问的内部服务,而不能将服务公开给外部世界。 例如,这可能是只接受本地连接的数据库。

防火墙可以确保根据以上类别限制对您的软件的访问。 公共服务可以向所有人开放和提供,私人服务可以根据不同的标准加以限制。 内部服务对外部世界来说是完全无法进入的。 对于未使用的端口,在大多数配置中访问完全被阻塞。

如何加强保安?

防火墙是任何服务器配置的重要组成部分。 即使您的服务本身实现了安全特性,或者仅限于您希望它们在其上运行的接口,防火墙仍然是一个额外的保护层。

正确配置的防火墙将限制对所有服务的访问,除了您需要保持开放的特定服务。 只暴露几个软件可以减少服务器的攻击面,限制那些容易被利用的组件。

执行起来有多困难?

有许多可用于 Linux 系统的防火墙,其中一些防火墙的学习曲线比其他防火墙更陡峭。 一般来说,设置防火墙只需要几分钟,并且只需要在服务器的初始设置期间进行,或者当您对计算机上提供的服务进行更改时进行。

一个简单的选择是 UFW 防火墙。 其他选项是使用 iptables 或 CSF 防火墙。

Vpn 和专用网络

专用网络是仅对某些服务器或用户可用的网络。 例如,DigitalOcean 专用网络使同一帐户或同一区域内的团队中的服务器之间能够进行隔离通信。 Vpn,或者虚拟专用网络,是一种在远程计算机之间创建安全连接并将连接表示为本地专用网络的方法。 这提供了一种方法来配置您的服务,就好像它们位于私有网络上一样,并通过安全连接连接远程服务器。

如何加强保安?

利用私人网络而不是公共网络进行内部交流几乎总是可取的,因为要在两者之间作出选择。 但是,由于数据中心内的其他用户可以访问同一网络,因此您仍然必须实现其他措施来保证服务器之间的通信安全。

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

执行起来有多困难?

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

至于 VPN,最初的设置稍微复杂一些,但是对于大多数用例来说,增加安全性是值得的。 Vpn 上的每个服务器都必须具有建立安全连接所需的共享安全性和配置数据。 Vpn 启动并运行后,必须将应用程序配置为使用 VPN 隧道。 要了解如何设置 VPN 来安全连接您的基础设施,请参阅我们的 OpenVPN 教程。

公开密钥基础设施与 ssl / tls 加密

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

如何加强保安?

为服务器建立证书颁发机构和管理证书允许基础结构中的每个实体验证其他成员的标识并加密它们的通信。 这可以防止中间人攻击,即攻击者模仿您的基础结构中的服务器来拦截流量。

可以将每个服务器配置为信任集中的证书颁发机构。 然后,可以隐式信任任何授权签名的证书。 如果您用于通信的应用程序和协议支持 tls / SSL 加密,那么这是一种加密您的系统的方法,而不需要 VPN 通道(通常在内部使用 SSL)的开销。

执行起来有多困难?

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

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

服务审计

到目前为止,我们已经讨论了一些可以实现来提高安全性的技术。 然而,安全性的很大一部分是分析您的系统,了解可用的攻击表面,并尽可能锁定组件。

服务审计是一个发现基础结构中的服务器上运行着哪些服务的过程。 通常,默认操作系统配置为在启动时运行某些服务。 安装附加软件有时会引入一些也是自动启动的依赖项。

服务审计是一种了解系统上运行的服务、它们用于通信的端口以及接受的协议的方法。 此信息可帮助您配置防火墙设置。

如何加强保安?

服务器启动许多流程用于内部目的和处理外部客户机。 每一个都代表了一个针对恶意用户的扩展攻击面。 您运行的服务越多,您的可访问软件中存在漏洞的可能性就越大。

一旦您对计算机上运行的网络服务有了清楚的认识,就可以开始分析这些服务了。 对于每一个问题,你都想问自己一些问题:

  • 这项服务是否应该运行?
  • 服务是否运行在它不需要的接口上? 是否应该绑定到单个 IP?
  • 您的防火墙规则是否允许合法的通信通过此服务?
  • 您的防火墙规则是否阻塞不合法的通信?
  • 是否有方法接收关于这些服务的漏洞的安全警报?

在基础结构中配置任何新服务器时,这种类型的服务审计应该是标准做法。

执行起来有多困难?

进行基本服务审计非常简单。 通过使用 netstat 命令,可以查明哪些服务正在监听每个接口上的端口。 显示用于监听 TCP 和 UDP 流量的程序名、 PID 和地址的一个简单示例是:

sudo netstat -plunt

你会看到这样的输出:

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      887/sshd        
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      919/nginx       
tcp6       0      0 :::22                   :::*                    LISTEN      887/sshd        
tcp6       0      0 :::80                   :::*                    LISTEN      919/nginx

您需要关注的主要列是 Proto、 Local Address 和 pid / program name。 如果地址是0.0.0.0,那么服务接受所有接口上的连接。

文件审计与入侵检测系统

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

入侵检测入侵预防系统,或称 IDS,是一个监控系统或网络的非授权活动的软件。 许多基于主机的 IDS 实现使用文件审核作为检查系统是否已更改的方法。

如何加强保安?

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

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

执行起来有多困难?

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

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

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

独立执行环境

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

这可能意味着将离散的应用程序组件分离到它们自己的服务器上,或者参考配置服务以便在 chroot 环境或容器中操作。 隔离级别在很大程度上取决于应用程序的需求和基础结构的实际情况。

如何加强保安?

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

执行起来有多困难?

根据您选择的容器类型,隔离应用程序可以相对简单。 通过将单个组件打包到容器中,您可以快速实现某种程度的隔离,但请注意,Docker 并不认为它的集装箱化是一种安全特性。

为每个部件设置一个 chroot 环境也可以提供一定程度的隔离,但这也不是一个万无一失的隔离方法,因为通常有很多方法可以突破 chroot 环境。 将组件移动到专用机器是最好的隔离级别,并且在许多情况下可能是最简单的,但是对于额外的机器可能成本更高。

总结

上面概述的策略只是您可以用来改进系统安全性的一些增强。 认识到这一点很重要,虽然晚做总比不做好,但是安全措施的有效性会随着你等待实施的时间的延长而降低。 安全性不能是事后才想到的,必须从一开始就与您正在提供的服务和应用程序一起实现。