介绍
在设置基础架构时,让应用程序启动并运行通常是您的主要关注点。 但是,使应用程序正常运行,而不解决基础设施的安全需求可能会产生毁灭性的后果。
在本指南中,我们将讨论在设置应用程序之前或设置过程中最好配置的一些基本安全实践。
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加密
公钥基础设施或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和助手 。
孤立的执行环境
隔离执行环境是指其中各个组件在其自己的专用空间内运行的任何方法。
这可能意味着分离出您的离散的应用程序组件自己的服务器,也可以参考配置服务操作chroot
环境或容器。 隔离级别在很大程度上取决于应用程序的要求和基础架构的现实情况。
它们如何增强安全性?
将进程隔离为单独的执行环境可提高隔离任何可能出现的安全问题的能力。 类似如何舱壁和车厢可以帮助遏制船舶船体漏洞,分离你的各个组件可以限制入侵者有基础设施的其他部分的访问。
这是多么困难实现?
根据您选择的安全壳类型,隔离应用程序可能相对简单。 通过将各个组件打包在容器中,您可以快速实现一些隔离措施,但请注意,Docker不会将其容器化作为安全功能。
建立一个chroot
每件环境能够提供隔离的一定程度为好,但这也并不是孤立的万无一失的方法,往往有爆发的一个方式chroot
环境。 将组件移动到专用机器是最好的隔离级别,并且在许多情况下可以是最简单的,但是对于附加机器可能花费更多。
结论
上面列出的策略只是您可以提高的一些增强功能,以提高系统的安全性。 重要的是要认识到,虽然迟到比从未更好,但是安全措施的有效性降低,等待实施它们的时间越长。 安全不能是一个事后的想法,必须从一开始就与您提供的服务和应用程序一起实施。