安全——《微服务设计》读书笔记

身份认证和授权

      1.单点登录(SSO

当主体试图访问一个资源,他会被定向到一个身份提供者那里进行身份验证,身份提供者验明正向后会发消息给服务提供者,让服务提供者来决定是否允许它访问资源。

SAML和OpenID Connect/OAuth2.0是企业领域中占据统治地位的单点解决方案。

      2.单点登录网关

现在问题来了,多个微服务是不是也要单独地与单点登录系统交互,显然这样是不合理的,这意味着大量的重复工作。我们可以使用单点登录网关来帮助我们完成这一工作,在使用者通过单点登录网关后,可以将用户名和角色等用户信息放入HTTP头信息,传递给下游服务。

同时,网关应该提供的是粗粒度的身份验证,而不应该过于具体,如我们可以使用它来完成对是否登录、取角色、是否访问某个服务这类的验证,而不应该具体到“是拥有view.html页面50条还是100条数据的导出权限”。

网络传输和服务间传输的身份验证和授权

从浏览器中输入用户和密码,到真正的服务提供者,这中间是一个漫长的过程,通过HTTP有很高的风险,因为用户和密码并没有以安全的方式发送,任何中间方都可以看到HTTP头的信息并读取里面的数据,因此HTTP基本身份验证通常应该使用HTTPS进行通信。

使用HTTPS时,浏览器到服务器的通信将获得强有力的保证,但是服务器端要管理的SSL证书,这有一个额外的行政和运营负担,同时SSL上的流量不能被反向代码服务器(如Varnish或Squid)所缓存,这意味着,如果你需要缓存信息,就不得不在服务端或浏览器内部实现,你可以在负载均衡中把HTTPS的请求转成HTTP请求,然后在负载均衡之后就可以使用缓存了。

如果你已经在使用SAML或OpenID Connect作为身份验证和授权方案,你可以在服务之间的交互中也使用它们。你可以针对服务也创建一些凭证,如果凭证被泄露,只需要撤销有限的受影响的凭证即可。(这里我感觉像配置Git的SSH PublicKey和PrivateKey一样。)

同时我们也可以使用TLS(Transport Layer Security安全传输协议),在这里,每个客户端都安装了一个X.509证书,用于客户端和服务器端之间建立通信链路,服务器端可以验证客户端证书的真实性。当你特别关注所发数据的敏感性,或无法控制发送数据所使用的网络时,才考虑使用这种技术。

另一种方式,我们还可以使用HTTP之上的HMAC(Hash-based Message Authentication Code基于哈希的消息码)对请求进行签名,它是OAuth规范的一部分。使用HMAC,请求主体和私有密钥一起被哈希处理,生成的哈希值随请求一起发送,服务器使用请求主体和自己的私钥副本重建哈希值,如果匹配则接受请求。这样做的好处是,如果一个中间人更改了请求,那么哈希值会不匹配,服务器便知道该请求被篡改过,且私钥永远不会随请求发送,因此不会存在传输过程中泄露的问题,而且通信更容易被缓存,生成哈希的开销要低于处理HTTPS的开销。

HMAC也存在缺点,首先客户端和服务器端需要一个共享的、以某种方式交流的密钥,其次这是一个模式而不是标准,可以参看AWS的S3 API,最后请求中所带的其他数据,对网络嗅探来说仍然是可见的。

另外,在大部分的组织内部,服务间的通信被认为是安全的,而没有采取任何防备。我们也可以采用上面的方式对组织内部的通信进行安全加固。

提供出的公共API安全:API密钥

API密钥允许服务识别出是谁进行调用,然后对他们能做的进行限制,限制通常不仅限于对特定资源的访问,还可以扩展到类似于针对特定的调用者限速,以保护其他人服务调用的质量。

通常情况下,我们会在系统中集中管理API密钥,API网关(API Gateway)模型在这个领域很受欢迎。

一个问题:代理人欺骗

当我登录了系统后,我再通过尝试,看是否能够获得其他客户或者订单的信息,它们原来不属于我,但由于接口只是提供order/12345之类的规则,并没有验证信息,万一这样成功了呢?那么我就可以作为一个假的代理人去欺骗系统的数据。

解决这个问题的方法是在应用程序中加入验证,使这个人只能查询自己的订单,也可以在请求中加入原始的凭证。

静态数据的安全

有些组织中,服务器中的静态数据是完全没有加密的,这有可能会生成安全漏洞。有一些产品已经提供了加密算法,比如SqlServer和Oracle就提供了可以加密表的某一列值的功能,同时我们可以采用已知的加密算法(不要自己去尝试写一套加密算法)对静态数据进行加密,同时对备份也进行加密。

全面防御

我们应该从浏览器到应用程序服务器再到数据库都存在安全防御措施,防火墙(设置允许的入口和出口)、日志(不要将敏感的数据写到日志中)、入侵检测系统(IDS,可以监控网络或主机,当发现可疑行为时报告问题)、入侵预防系统(IPS,监控可疑行为并阻止它的发生)、网络隔离(我们可以把服务放进不同的网段)、操作系统(自动定时打补丁、设置OS的安全策略等)。

举个例子

先看一下不安全的架构

在这里,所有的请求都使用普通的HTTP传输,但我们希望在传输的过程中数据不要被篡改;同时我们要限制公共API的使用范围和使用频率;另外我们希望第三方系统与我们的交互是受保护的,而避免被竞争对手所获取;我们希望客户服务中的数据是完全加密的,这样即使发生拖库的情况,黑客也不能获取相应的数据。

基于这些设定,我们提供了一种安全的架构,如下所示:

一些可供借鉴的法则和实践

OWASP十大列表和SP安全测试框架

微软安全开发生命周期(http://www.microsoft.com/en-us/sdl/default.aspx

参考

《微服务设计》(Sam Newman 著 / 崔力强 张骏 译)

时间: 2024-08-25 15:35:45

安全——《微服务设计》读书笔记的相关文章

《微服务设计》笔记-微服务集成推荐方案

为前端服务的后端 BFF(Backends For Frontends,为前端服务的后端)它允许团队在专注于给定UI的同时,也会处理与之相关的服务端组件.后端虽然嵌入在服务器,但它也是用户界面的组成部分.一些类型的UI只需要服务端的最小化足迹(footprint)即可,而其他一些可能需要的更多.API认证和授权层可以处在BFF和UI之间. 与第三方软件集成方案

《微服务设计》读书笔记大纲

cha1:微服务的概念--<微服务设计>读书笔记 cha2:微服务架构师的职责--<微服务设计读书笔记> cha3:建模:确定服务的边界--<微服务设计>读书笔记 cha4:微服务集成--<微服务设计>读书笔记 服务的协作:服务间的消息传递--<微服务设计>读书笔记 cha5:拆分:分解单块系统--<微服务设计>读书笔记 cha6:部署:持续集成(CI)与持续交付(CD)--<微服务设计>读书笔记 cha7:测试--<

规模化微服务——《微服务设计》读书笔记

    系列文章目录:     <微服务设计>读书笔记大纲 改变思维的角度:故障无处不在 当微服务规模化后,故障是无可避免的,以往我们总是想尽力避免故障的发生,而当故障实际发生时,我们往往束手无策.我们花了很多时间在流程设计和应用设计的层面上来阻止故障的发生,但实际上很少花费时间思考如何第一时间从故障中恢复过来. 一些公司喜欢组织活动,活动当天系统会被关掉以模拟故障发生,然后不同团队演练如何应对这种情况.这些项目中最著名的是混乱猴子(Chaos Monkey),在一天的特定时间随机停掉服务器,

微服务集成——《微服务设计》读书笔记

一.理想的集成应该是什么样的? 1.避免破坏性修改 如果在一个微服务的响应中添加一个字段,服务的消费方不应该受到影响. 2.保证API的技术无关性 微服务之间的通信应该是与技术无关的. 3.使服务的消费方易于使用 如果消费方使用该服务比登天还难,那么无论该微服务多漂亮都没用任何意义.但同时,易于使用的服务可能内部封装了很多细节,这会增加耦合. 4.隐藏内部实现细节 消费方与服务方的内部细节应该是分开的,如果与细节绑定,则意味着改变服务内部的一些变化,消费方也要跟着修改,这会增加修改的成本. 二.

测试——《微服务设计》读书笔记

一.测试象限(Brain Marick) 二.测试金字塔(Mike Cohn)       1.单元测试 通常只测试一个函数或方法调用,通过TDD或者基于属性而写的测试就属于这一类,在UnitTest中,我们不会启动服务,对且对外部文件和网络连接的使用也很有限,通常我们需要大量的单元测试. 单元测试是帮助开发人员,是面向技术而非业务的.       2.服务测试 对于包含多个服务的系统,一个服务测试只测试其中一个单独服务的功能.只测试一个单独的服务可以提高测试的隔离性,这样我们可以更快地定位并解

建模:确定服务的边界——《微服务设计》读书笔记

什么样的服务才是好的服务? 高内聚.松耦合的服务才是好的服务.简而言之,就是把相关性强的放在一起,相关性不强的分开,物以类聚,人以群分,服务的划分也是这样.这就需要确定什么要放在一起,什么是要分开的,这个寻找的过程就是确定服务边界的过程. 限界上下文 限界上下文确定了这个边界内它所承担的职责. Evans在<领域驱动设计>中作喻:细胞之所以会存在,是因为细胞膜定义了什么在细胞内,什么在细胞外,并且确定了什么物质可以通过细胞.这是限界上下文的绝好比喻. 任何一个给定的领域都包含多个限界上下文.限

拆分:分解单块系统——《微服务设计》读书笔记

通常,我们可能已有有一个巨大的单块系统,如何实现微服务,我们需要把它分解. 从哪里开始拆分:接缝 接缝:从接缝处可以抽取相对独立的一部分代码,对这部分代码的修改不会影响系统的其他部分.这些接缝就可以作为服务的边界. 那如何识别出接缝呢?我们可以使用前面所提到的限界上下文,也可通过程序中的命名空间来帮助我们,也可以通过工具来帮助我们,如structure101这样的工具来可视化包之间的依赖. 杂乱依赖的根源:数据库 为什么这么说?因为,通常情况下,我们在业务层的代码已经通过分层组织到相应的包中了,

部署:持续集成(CI)与持续交付(CD)——《微服务设计》读书笔记

一.CI(Continuous Integration)简介  CI规则1:尽量频繁地把代码签入到分支中以进行集成 CI规则2:不光要对语法进行验,也要提供一系列的自动化来验证 CI规则3:CI失败后,要把修复CI当做第一优先级的事情 说明:作为CI流程的一部分,我们提供的制品应该每次只生成一次,然后在所有的部署一切使用,这不仅避免多次重复做一件事情,还可以保证部署上线的制品与测试通过的那是同一个. 二.把CI映射到微服务 这里有几种做法:     做法1:所有的东西都放在一起,向代码库的任何一

微服务设计笔记——几种远程过程调用方法

微服务设计中提到服务间常见的PRC 有如下几种:SOAP.Thrift.Protocol Buffers. 为了搞清楚几种RPC背后的机理以及应用场景,特意研究了一番: SOAP(Simple Object Access Protocol) 简单对象访问协议是在分散或分布式的环境中交换信息的简单的协议,是一个基于XML的协议,它包括四个部分: SOAP封装(envelop),封装定义了一个描述消息中的内容是什么,是谁发送的,谁应当接受并处理它以及如何处理它们的框架: SOAP编码规则(encod