我们需要考虑安全,包括数据从一个点到另一个点的传输过程的安全,也包括底层操作系统及网络的安全。
1、身份验证和授权:在安全领域中,身份验证是确认他是谁的过程,对于一个人通常使用用户名和密码来验证。
常见的单点登录实现:SSO单点登录是身份验证和授权的一种常用方法。SAML和 OpenID Connect提供了该功能。
单点登录网关: 设置单点登录网关,重定向到身份验证服务,将已授权的主体信息放到HTTP头上,去访问其他服务。这样可以集中处理重定向用户的行为,只在一个地方执行验证即可。但是这种方式定位问题比较复杂,同时网关负责的事情也比较多。
细粒度的授权:网关可以提供相当有效的粗粒度的身份验证,关于角色以及更细粒度的授权应该放到微服务本身来处理。
2、服务间的身份验证和授权
在边界内允许一切:第一种方式就是边界内对服务的任何调用都是默认可信的,这种方式可能通信使用HTTPS,但是这样有一些风险。
Https基本身份验证:使用HTTPS,可以以安全的方式发送用户名和密码。但是,这样无法保证信息来源于哪里。
使用SAML或OpenID Connect:如果客户端创建账户,服务进行细粒度身份验证,这样就需要考虑安全的存储凭证。并且这样的做身份验证需要很多繁琐的代码。SAML或OpenID Connect支持的都不是特别好。
客户端证书:确认客户端身份的另一种方法是TLS安全传输层协议。每个客户端都安装一个X.509证书,用于客户端和服务器之间建立通信链路。这种方法,证书管理的工作要比只使用服务端证书更加繁重。
Http之上的HMAC:HMAC基于哈希的消息码对请求进行签名。请求主体和私有密钥一起被哈希处理,生成的哈希值随请求一起发送。然后,服务器使用请求主体和自己的私钥副本重建哈希值,如果匹配便接受请求。这种方式可以理解为防篡改。但是这种方法只能保证第三方无法篡改请求,且私钥本身不会泄露。但请求中所带的其他数据,对网络嗅探来说仍然是可见的。
API密钥:可以使用非对称加密,或对称加密。具体采用什么方式需要根据具体技术来确定。
代理问题:有一种漏洞叫做混淆代理人。指的是在服务间通信的上下文中,攻击者采用一些措施欺骗代理服务,让它调用其下游服务,从而做到一些他不应该能做的事情。这种问题处理会比较复杂,以订单举例,第一种方法是检查订单是谁的,拒绝别人访问不属于自己的订单。第二种方式是当在线商店给订单服务发送请求时,它不仅要说明想要哪个订单,还要说明以谁的名义来调用。
3、静态数据的安全:数据加密是一种责任,尤其是敏感数据。
使用众所周知的加密算法:AES-128,AES-256常用加密算法。密码可以考虑加盐密码哈希的技术。
一切皆与密钥相关:存储密码尽量存储到数据库之外,可以选择使用单独的安全设备来加密解密数据,也可以使用单独的密钥库。密钥的生命周期管理是非常重要的。
选择你的目标:加密整个库的存储是不建议的,需要限制加密到一组指定的表,及选定自己的加密目标。
按需解密:第一次看到数据的时候就对它加密。只在需要时进行解密,并确保解密后的数据不会存储到任何地方。
加密备份:备份数据,也需要加密。
4、深度防御:
防火墙:设置防火墙,设置允许的入口和出口,确保主机安全。
日志:日志可以查看一些已发生过的事情,日志的信息一定不要把敏感信息。
入侵检测和防御系统:IDS入侵检测系统可以监控网络或主机,当发现可疑行为时报告问题。IPS入侵防御系统,也会监控可疑行为,并进一步阻止它的发生。
网络隔离:微服务系统中,把服务放进不同的网段,以进一步控制服务间的通信。例如AWS提供自动创建VPN的能力,它允许主机处在不同的子网中。
操作系统:给操作系统的用户尽量少的权限,定期为软件打补丁。
5、保持节俭:节俭磁盘空间。尽量删掉那些不需要的信息。
6、内建安全:培养开发人员的安全意识。有助于从最开始减少问题。
7、外部验证:由外部方实施的类似渗透测试这样的实验。
10、小结:了解系统不同部分的威胁级别,就可以知道什么时候需要考虑传输中的安全,什么时候考虑静态安全等。要理解深度防御的重要性,给操作系统持续打补丁,不要自己实现加密算法。