简单的云加固

作者: Kyle Rankin

应用一些基本的加固原则来保护您的云环境安全。

我过去曾写过关于简单服务器加固技术的文章。那些文章的部分灵感来自于我当时正在撰写的Linux Hardening in Hostile Networks这本书,其想法是将您可能想要在服务器上执行的许多不同的加固步骤提炼为每个人都应该做的几个简单步骤。在本文中,我采取相同的方法,只是特别关注云基础设施的加固。我最熟悉AWS,所以我的加固步骤是针对该平台并使用AWS术语(例如安全组和VPC),但由于我不喜欢供应商锁定,我尝试包含一些足够通用的步骤,以便您能够将它们应用到其他提供商。

新账户是(相对)免费的;使用它们

云基础设施的一大优势是能够对您的基础设施进行分compartmentalize。如果您在一排机架中安装了一堆服务器,这可能很困难,但在云基础设施上,您可以利用该技术将一个客户与另一个客户隔离,并将您的一种基础设施类型与另一种隔离。虽然这并非完全免费(它在您设置时会增加一些额外的开销),但为了它在环境之间提供的强大隔离,这是值得的。

您应该采取的首要安全措施之一是将您的每个环境分离到其自身的高级帐户中。AWS允许您生成许多不同的帐户并将它们连接到中央计费帐户。这意味着您可以将您的开发、暂存和生产环境(以及您可能创建的任何其他环境)完全隔离到它们自己的独立帐户中,这些帐户拥有自己的网络、自己的凭据和自己的角色,与其他帐户完全隔离。通过将每个环境分离到其自己的帐户中,您可以将攻击者如果破坏一个基础设施所能造成的损害限制在该帐户中。您还可以更容易地查看每个环境自身的成本。

在开发和生产环境位于一起的传统基础设施中,更容易在这两个环境之间创建意外的依赖关系,并使一个环境中的错误影响另一个环境。将环境拆分到单独的帐户中可以保护它们免受彼此的影响,并且这种独立性可以帮助您识别环境之间需要拥有的任何合法链接。一旦您识别出这些链接,就可以更容易地在这些帐户之间设置防火墙规则或其他限制,就像您希望您的基础设施与第三方通信一样。

锁定安全组

云基础设施的一个优势是您可以更严格地控制防火墙规则。AWS安全组允许您定义入口和出口防火墙规则,既可以针对整个互联网,也可以在安全组之间定义。由于您可以将多个安全组分配给一个主机,因此在定义主机之间的网络访问方面,您有很大的灵活性。

我的第一个建议是默认拒绝所有入口和出口流量,并在您需要时向安全组添加特定规则。这是网络安全的基本最佳实践,它适用于安全组,也适用于传统防火墙。如果您使用默认安全组,这一点尤其重要,因为它默认允许无限制的互联网出口流量,因此这应该是首先要禁用的事情之一。虽然默认禁用到互联网的出口流量可能会使事情开始时有点棘手,但这仍然比事后尝试添加那种限制要容易得多。

您可以使用安全组使事情变得非常复杂;但是,我的建议是尽量保持简单。为每个服务器角色(例如Web、应用程序、数据库等)提供其自己的安全组,该安全组适用于该角色中的每个服务器。这使您可以轻松了解您的防火墙规则是如何应用的以及它们应用于哪些服务器。如果特定角色中的一台服务器需要与角色中其他服务器不同的网络权限,则这是一个很好的迹象,表明它可能应该有自己的角色。

基于角色的安全组模型运行良好,但是当您希望防火墙规则应用于您的所有主机时,可能会很不方便。例如,如果您使用集中式配置管理,您可能希望允许每个主机与其通信。对于这样的规则,我利用默认安全组,并确保每个主机都是它的成员。然后,我将其(以非常有限的方式)用作定义我想应用于所有主机的任何防火墙规则的中心位置。我特别定义的一个规则是允许出口流量到默认安全组中的任何主机——这样,当我想让一个安全组中的主机与另一个安全组中的主机通信时,我就不必在一个组中编写重复的入口规则,而在另一个组中编写出口规则。

使用私有子网

在云基础设施上,您可以定义具有互联网可路由IP的主机和仅具有内部IP的主机。在AWS虚拟私有云 (VPC) 中,您可以通过设置第二组私有子网并在这些子网中而不是默认的公共子网中生成主机来定义这些主机。

将默认公共子网视为DMZ,并且仅当主机真正需要访问互联网时才将其放置在那里。将所有其他主机放入私有子网。通过这种做法,即使私有子网中的主机被入侵,它们也无法直接与互联网通信,即使攻击者想要这样做,这也使得在不设置复杂的隧道的情况下下载rootkit或其他持久性工具变得更加困难。

如今,似乎几乎每个服务都希望无限制地访问互联网上其他主机上的Web端口,但是私有子网方法的一个优势是,您无需制定到特定外部IP的出口防火墙规则,而是可以在DMZ中设置一个具有更广泛互联网访问权限的Web代理服务,然后通过主机名而不是IP来限制私有子网中的主机。这还有一个额外的好处,即在代理主机上为您提供一个很好的审计跟踪,记录您的基础设施正在访问的所有外部主机。

最小化使用帐户访问控制列表

AWS通过IAM提供了一套丰富的访问控制列表工具。这使您可以使用非常复杂的语法来设置关于帐户或角色可以访问哪些AWS资源的非常精确的规则。虽然IAM为您提供了一些预定义的规则来帮助您入门,但它仍然存在所有丰富的访问控制列表都存在的问题——复杂性使得很容易创建错误,这些错误授予人们超出他们应该拥有的访问权限。

我的建议是仅在必要时使用IAM来锁定基本的AWS帐户访问权限(例如系统管理员帐户或编排工具),即使这样,也要尽可能保持IAM规则的简单性。如果您需要进一步限制对资源的访问,请在另一个级别使用访问控制来实现它。虽然看起来给予AWS帐户相对广泛的IAM权限不如深入研究并拥抱最小权限原则那么安全,但在实践中,您的规则越复杂,您就越有可能犯错误。

结论

云环境为安全提供了许多复杂的选项;但是,更重要的是设定一个良好的简单安全实践基线,团队中的每个人都可以理解。本文提供了一些基本的、常识性的实践,这些实践应该使您的云环境更安全,同时又不会使其过于复杂。

Kyle Rankin是Linux Journal的技术编辑和专栏作家,也是Purism的首席安全官。他是Linux Hardening in Hostile NetworksDevOps TroubleshootingThe Official Ubuntu Server BookKnoppix HacksKnoppix Pocket ReferenceLinux Multimedia HacksUbuntu Hacks的作者,也是许多其他O'Reilly书籍的贡献者。Rankin经常在安全和开源软件方面发表演讲,包括在BsidesLV、O'Reilly Security Conference、OSCON、SCALE、CactusCon、Linux World Expo和Penguicon上。您可以在@kylerankin上关注他。

加载Disqus评论