简单的服务器加固,第二部分
在我的上一篇文章中,我讨论了典型的、复杂的方法来加固服务器,这种方法通常在许多加固文档中都能找到,并用一些特定的、简单的加固步骤来反驳它,这些步骤更有效,只需几分钟即可完成。虽然讨论如何最好地加固SSH和sudo可能很有用,但在实际的基础设施中,您还有许多其他依赖的服务,也希望对其进行加固。
因此,在本文中,我将不再选择特定的数据库、应用服务器或Web服务器,而是将简单的加固主题扩展到特定服务之外,讨论更通用的加固方法,这些方法可以应用于您已经运行的软件以及您的整个基础设施。我从一些通用的安全最佳实践开始,然后讨论一些应该避免的事情,最后讨论系统管理和安全最佳实践相结合的领域。
通用最佳实践我不会过多地讨论通用的安全最佳实践,因为我过去在其他文章中已经讨论过它们,而且您可能以前也听说过。即便如此,仍然值得一提几件事,因为这些是您在评估应该实施哪些实践以及应该避免哪些实践时应该应用的原则。作为一个喜欢在系统管理方面严格要求的人,很高兴看到安全最佳实践通常与通用最佳实践相符。在这两种情况下,您通常都不能偷工减料,而走捷径往往会在以后给您带来麻烦。
第一个值得介绍的安全最佳实践是最小权限原则。该原则指出,人们应该拥有他们需要的系统的最低权限级别,并且不超过该级别。例如,如果您不需要授予您组织中的所有工程师在您的服务器上的sudo root权限,则不应该这样做。相反,只需授予他们执行所需任务的权限即可。如果某些工程师类别根本不需要帐户,则最好不要为他们创建帐户。有些环境甚至可以在生产环境中无需任何开发人员帐户即可运行。
系统越简单,就越容易安全。复杂性不仅使故障排除更加困难,而且在您尝试考虑所有不同的攻击场景以及防止攻击的方法时,它也使安全性变得困难。除了简单性之外,您还应该增加防御层,而不是依赖任何单独的安全措施。例如,传统上,组织会通过在所有内容前面添加防火墙来加固网络,然后就认为万事大吉了。如今,安全专家建议,内部网络也应被视为一种威胁。有时,攻击者可能会由于安全漏洞而绕过安全措施,因此,如果您有防御层,他们可能会通过一种安全措施,但随后不得不处理另一种安全措施。
关于安全漏洞,使您系统上的软件保持安全漏洞补丁比以往任何时候都更加重要。安全漏洞被发现到在互联网上被积极利用之间的时间不断缩短,因此,如果您还没有一个可以使您环境中的软件快速轻松升级的系统,则应该对其进行投资。
最后,您应该尽可能多地加密。通过加密文件系统加密静态数据。加密系统之间的网络流量。并在可能的情况下,加密存储在磁盘上的密钥。
应该避免什么除了最佳实践之外,还应避免某些安全实践。第一个是隐蔽式安全。这意味着仅仅通过隐藏而不是加固来保护某些东西。应该避免隐蔽性,因为它实际上并没有阻止攻击;它只是使某些东西更难找到,并可能给您一种虚假的安全感。
这方面的一个很好的例子是将您的SSH端口从默认端口(22)移动到更隐蔽的端口的做法。虽然将SSH移动到端口60022可能会减少日志中暴力破解尝试的次数,但如果您有一个弱密码,那么任何半吊子的攻击者都将能够通过端口扫描和服务发现找到您的SSH端口并进入。
端口敲门(要求服务在防火墙允许客户端通过之前按顺序访问服务器上的随机端口的做法——可以将其视为使用端口的组合锁)也属于这一类,因为客户端和服务器之间的任何路由器都可以看到客户端使用的端口——它们不是秘密——但会给您一种虚假的安全感,即您的服务已通过防火墙隔离免受攻击。如果您非常担心SSH暴力破解攻击,只需按照我在2016年10月刊LJ中本系列第一部分的加固步骤进行操作,即可完全消除它作为一种攻击。
许多其他要避免的做法本质上与最佳实践相反。您应尽可能避免复杂性,并避免依赖任何单独的安全措施(它们最终都会出现安全漏洞或最终失败)。特别是,在选择网络软件时,应避免使用不支持加密通信的软件。在这个时代,我认为不支持加密的网络软件表明它对于生产使用而言仍然有点不成熟。
系统管理和安全最佳实践的交汇之处之前,我提到通用最佳实践和安全最佳实践通常是相同的,而第一个技巧就是一个很好的例子。Puppet、Chef和SaltStack等集中式配置管理工具是系统管理员长期以来使用的工具,以简化在整个基础设施中部署配置文件和其他更改的过程。事实证明,配置管理也使加固变得更简单,因为您可以定义您的黄金标准、加固的配置文件,并轻松地在整个环境中强制执行它们。
例如,如果您使用配置管理来控制您的Web服务器配置,则可以定义一组批准的、安全的、现代的TLS密码套件,并将它们部署到您的所有服务器。如果将来其中一种密码被证明是不安全的,您可以在一个地方进行更改,并知道它将传播到您环境中的所有相关服务器。
配置管理的另一个最佳实践是将您的配置管理配置文件检入到像git这样的源代码控制系统中。这种“配置即代码”的方法对系统管理员有各种好处,包括回滚错误的能力和同行评审的好处。从安全的角度来看,它还提供了环境中所有更改的良好审计跟踪——特别是如果您明确指出仅通过配置管理来更改您的系统。
除了配置管理之外,另一种也有助于安全性的DevOps工具是编排工具——无论是MCollective、Ansible还是SSH for循环。编排工具可以轻松地从中央位置启动命令,这些命令按特定顺序应用于您环境中的特定主机,并且通常用于暂存软件更新。这种部署软件的便利性也提供了巨大的安全优势,因为及时更新安全补丁非常重要。
例如,使用像MCollective这样的编排工具,如果您发现ImageMagick中存在一个新的错误,您可以使用一个命令获取您环境中ImageMagick版本的报告,并使用另一个命令更新所有这些版本。定期安全更新变得更简单,这意味着您更有可能保持最新状态,而更复杂安全更新(如需要重新启动的内核更新)至少变得更易于管理,您可以使用编排软件来确定所有系统何时都已修补。
最后,设置某种集中式日志记录系统。虽然您可以使用grep
做很多事情,但当您有大量主机生成大量日志时,它就无法扩展。Splunk和ELK(Elasticsearch、Logstash和Kibana)等集中式日志记录系统允许您将日志收集在中心位置,对其进行索引,然后快速搜索它们。这为一般的系统管理故障排除提供了巨大的好处,但从安全的角度来看,集中式日志记录意味着攻击者现在更难掩盖他们的踪迹——他们现在也必须破坏日志记录系统。由于您的所有日志都可以在一个地方搜索,因此您还可以构建查询来突出显示(并且在许多系统中也以图形方式显示)可疑的日志事件以供审查。