微服务设计安全篇 - 深度防御

不把鸡蛋放在一个篮子里面

March 31, 2017 - 1 minute read -
web service security

除了传输数据的安全以及静态数据的安全,还有其他防护方法可以帮助我们吗?

1. 防火墙

有一个或多个防火墙是一个非常明智的预防措施。有些非常简单,只在特定端口限制特定的通信类型。其他的则要复杂一些。例如,ModSecurity是一种应用程序防火墙,可以在特定的IP范围限制连接数,并检测其他类型的恶意攻击。

多个防火墙是有价值的。你可能决定在本地主机上使用IPTable,设置允许的人口和出口,以确保这个主机的安全。这些规则可以根据本地运行的服务进行定制,而外围的防火墙则控制一般访问。

2. 日志

好的日志实践,特别是聚合多个系统的日志能力,虽然不能起到预防的作用,但可以帮助检测出发生了不好的事情,以便之后进行恢复。例如,在应用安全补丁后,你经常能够在日志中看到是否有人曾经利用过某种安全漏洞。打补丁可以确保它不再发生,但如果已经发生了,你可能需要进入恢复模式。

日志可以让你事后看看是否有不好的事情发生过。但是请注意,我们必须小心那些存储在日志里的信息!敏感信息需要被剔除,以确保没有泄露重要的数据到日志里,如果泄露的话,最终可能会成为攻击者的重要目标。

3. 入侵检测(和预防)系统

IDS(Intrusion Detection Systems)可以监控网络或主机,当发生可疑行为时报告问题。IPS(Intrusion Prevention Systems),也会监控可疑行为,并进一步阻止它的发生。不同于防火墙主要是对外阻止坏事进来,IDS和IPS是在可信范围内积极寻找可疑行为。当你从零开始时,IDS可能更有意义。这些系统是基于启发式的(正如很多的应用防火墙),很有可能刚开始的通用规则,对于你的服务行为来说过于宽松或过于严格。

使用在告警方面相对更加积极的IPS之前,应该先使用相对被动的IDS,因为在这种情况下更容易优化规则。

4. 网络隔离

对于单块系统而言,我们在通过构造网络来提供额外的保护方面能做的很有限。不过,在微服务系统中,你可以把服务放进不同的网段,以进一步控制服务间的通信。例如,AWS提供自动创建VPC(Virtual Private Cloud,虚拟私有云)的能力,它允许主机处在不同的子网中。然后你可以通过定义对等互连规则(peering rules),指定那个VPC可以跟对方通信,甚至可以通过网关把数据路由到代理中,实际上,它提供了多个网络范围,在其中可以实施额外的安全措施。

这允许你基于团队的所有权或者风险水平来进行网络分段。

5. 操作系统

我们的系统依赖于大量的不是我们自己编写的软件,即操作系统和其他的支持工具,其中的安全漏洞有可能会暴露我们的应用程序。在这里,基本的建议能让你走得很远。给操作系统的用户尽可能少的权限,开始时也许只能运行服务,以确保即使这种账号被盗,造成的伤害也最小。

接下来,定期为你的软件打补丁。这需要自动化,并且你需要知道机器是否与最新的补丁级别不同步。像微软的SCCM,或者红帽的Spacewalk这样的工具,在这方面能提供帮助,因为它们可以帮助你查看机器是否已更新到最新的补丁,如果没有的话发起更新。如果使用像Ansible,Puppet或Chef这样的工具,很可能对你自动化推送更新已经相当满意了。这些工具也可以帮助你走很长的路,但不会为你做一切。

这确实是最基本的东西,但令人惊讶的是,我经常看到很多重要的软件运行在未安装补丁的、陈旧的操作系统上。你可能拥有世界上最好的受保护的应用程序级安全,但如果有一个旧版本的Web服务器作为root用户运行在你的机器上,而机器没有应用缓冲区溢出的漏洞补丁,那么你的系统仍然是极其脆弱的。

如果你正在使用的是Linux操作系统,另一件事是,看看操作系统本身安全模块的发展。例如,AppArmour,允许你自定义应用程序的预期行为,内核会对其进行监控。如果它开始做一些不该做的事情,内核就会介入。AppArmour已经存在一段时间了,SELinux也是。尽管从技术上说,它们俩在任何新版Linux系统上应该都可以用,但实际上,某些发行版对其中一个的支持会比另外一个要好。例如,Ubuntu和SuSE默认使用AppArmour,而RedHat一直以来都支持SELinux。一个新的选择是G人Security,旨在扩展AppArmour和SELinux功能的同时,增强易用性,但它需要一个定制的内核才能工作。我建议你三个工具都看看,然后挑选一个最适合自己使用场景的工具,但我喜欢在工作中多加一层保护和预防的想法。