第9章 可靠通信微服务提倡 分散治理,不追求统一的技术平台。9.1 零信任网络边界安全:着重对经过网络区域边界的流量进行检查,对可信任区域(内网)内部的机器之间的流量则给与直接信任或者较为宽松的处理策略。9.1.1 零信任安全模型的特征零信任安全的中心思想是:不应当以某种固有特征来自动信任任何流量,除非明确得到了代表请求来源的身份凭证,否则一律不会有默认的信任关系。传统网络安全模型与云原生时代零信任安全模型对比:1.传统、边界安全模型 / 2.云原生、零信任模型 / 3.具体需求a) 基于防火墙等设施,认为边界内可信;b) 服务到服务通信需认证,环境内的服务之间默认没有信任c) 保护网络边界(仍然有效);服务之间默认没有信任a) 用于特定的IP和硬件(机器)b) 资源利用率更高,重用、共享效果更好,包括ip和硬件c) 受信任的机器运行来源已知的代码a) 基于IP的身份b) 基于服务的身份c) 同上a) 服务运行已知的、可预期的服务机器上 b) 服务运行在环境中的任何地方,包括私有云/公有云混合部署c) 同上a) 安全相关的需求由应用来实现,每个应用单独实现 b) 由基础设施来实现,基础设施中集成了共享的安全性要求c) 集中策略实施点,一致的应用到所有服务a) 对服务如何构建、评审、实施的安全需求的约束力较弱b) 安全相关的需求一致的应用到所有服务c) 同上a) 安全组件的客观测性较弱b) 有安全策略及其是否生效的全局视图c) 同上a) 发布不标准,发布频率较低b) 标准化的构建和发布流程,每个微服务变更独立,变更频繁c) 简单、自动、标准化的变更发布流程a) 工作负载通常作为虚拟机部署或部署到物理机,并使用物理机或管理程序进行隔离b) 封装的工作负载及其进程在共享的操作系统中运行,并由管理平台提供的某种机制来进行隔离c) 在共享的操作系统的工作负载之间进行隔离2.论文的主要观点1.零信任网络不等同于放弃在边界上的保护措施虽然防火墙等位于网络边界的设施是属于边界安全而不是零信任安全的概念,但它仍然是一种提升安全性的有效且必要的做法。在微服务集中的前端部署防火墙,把内部服务节点间的流量与来自互联网的流量隔离开,这种做法无论何时都值得提倡的,至少能够让内部服务避开来自互联网未经授权流量的饱和攻击,如ddos。2.身份只来源于服务传统应用一般是部署在特定的服务器上,这些机器的ip、MAC地址很少会发生变化,此时系统的拓扑状态是相对静态的。基于这个前提,安全策略才会使用ip地址、主机名等作为身份标识符,无条件信任具有特性身份表示的服务。在如今的微服务系统,尤其是云原生环境中的微服务系统中,虚拟化基础设施已经得到大范围应用,这使得服务所部署的ip地址、服务实例的数量随时可能发生变化,因此,身份只能来源于服务本身所能初始的身份凭证(通常是数字证书),而不再是服务所在的ip地址、主机名或者其他特征。3.服务之间没有固定的信任关系这点决定了只有已知的、明确的授权的调用者此案访问服务,阻止攻击者通过某个服务节点中的代码漏洞来越权调用其他服务。如果某个服务节点被成功入侵,这一原则可以阻止攻击者扩大其入侵范围,与微服务设计模式中使用断路器、舱壁隔离实现容错来防止雪崩效应类似,在安全方面也应当采用这种"不信任"的模式来减小入侵危害的影响范围。4.集中、共享的安全策略实施点这点与微服务的分散治理刚好相反,微服务提倡每个服务自己独立的负载自身所有的功能性和非功能性需求。而google这个观点相当于为分散治理原则做了一个补充---分散治理,但涉及安全的非功能性需求(如身份管理、安全传输层、数据安全层)最好除外。一方面,要写出高度安全的代码极不容易,为此付出的精力甚至远高于业务逻辑本身。另外一方面,也是更重要的一方面,让服务各自处理安全问题很容易出现实现不一致或者出现漏洞时要反复修改多处地方的情况。还有一些安全问题如果不立足于全局是很难彻底解决的。因此,google明确提出应该有集中式的"安全策略实施点",安全需求应该从微服务的应用代码下沉至云原生的基础设施里。5.受信的机器运行已知的代码这点限制了服务只能使用认证过的代码和配置,并且只能运行在认证过的环境中。分布式软件除了促使软件架构发生重大变化之外,也使软件的发布流程发生较大的改变,使其严重依赖持续集成和持续部署。从开发人员编写代码、到自动化测试、自动集成,再到漏洞扫描,最后发布上线,这整套CI/CD流程被称作"软件供应链"。安全不仅仅局限于软件的运行阶段。为此,零信任安全针对软件供应链的每一步都加入了安全控制策略。6.自动化、标准化的变更管理这点也是为何提倡通过基础设施而不是应用代码去实现安全功能的另外一个重要理由。如果将安全放在应用上,由于应用本身的分散治理,决定了安全也必然是难以统一和标准化的。做不到标准化就意味着做不到自动化,相反,一套独立于应用的安全基础设施,可以让运维人员轻松了解基础设施变更对安全性的影响,也可以在几乎不影响生产环境的情况下发布安全补丁程序。7.强隔离的工作负载"工作负载"的概念贯穿了google内部的Borg系统和后来的Kubernetes系统,它是指在虚拟化技术的支持下运行的一组能够协同提供服务的镜像。容器化,它仅仅是虚拟化的一个子集。与传统虚拟机相比,容器的隔离能力是有所降低的,这种设计针对性能非常有利,却对安全相对不利,因此在强调安全性的应用里,会有专门关注强隔离性的容器运行的工具出现。9.1.2 Google的实践探索google 认为零信任安全模型的最终目标是实现整个基础设施之上的自动化安全控制,服务所需的安全能力可以与服务自身一起,以相同的方式自动进行伸缩扩展。对于程序来说,安全是日常,风险是例外;对于人类来说,做到袖手旁观是日常,主动干预是例外。google设计了一系列内部工具,才最终得以实现前面所说的安全原则:1.为了在网络边界上保护内部服务免受ddos攻击,设计了名为 Google Front End(最终用户访问请求的终点)的边缘代理,负责保证此后所有流量都在TLS之上传输,并自动将流量路由到合适的可用区域之中;2.为了强制身份只来源于服务,设计了名为 Application Layer Transport Security(应用层传输安全)的服务认证机制,这是一个用于双向认证和传输加密的系统,可以自动将服务于它的身份标识符绑定,使得所有服务间流量都不必再使用服务名称、主机IP来判断对方的身份。3.为了确保服务间不再有默认的信任关系,设计了 Service Access Policy(服务访问策略)来管理一个服务向另外一个服务发起请求时所需提供的认证、鉴权和审计策略,并支持全局视角的访问控制和分析,以满足"集中、共享的安全策略实施点"的原则。4.为了实现仅以受信的机器来运行来源已知的代码,设计了 Binary Authorization(二进制授权)的部署时检查机制,确保在软件供应链的每一个阶段,都符合内部安全检查策略,并对此进行授权与鉴权。同时设计了 Host Integrity(宿主主机完整性)的机器安全启动程序,在创建宿主时自动验证包括BIOS、BMC、Bootloader和操作系统内核的数字签名。5.为了工作负载能够具有强隔离性,设计了名为 gVisor 的轻量级虚拟化方案,这个方案与此前由Intel 发起的Kaka Containers的思路有异曲同工之妙。目的都是弥补容器共享操作系统内核而导致隔离性不足的安全缺陷,做法都是为每个容器提供一个独立的虚拟Linux内核,譬如gVisor是用Go写的一个名为Sentry的能够提供传统操作系统内核功能的进程。严格来说,无论是gVisor还是Kaka Containers,尽管披着容器运行时的外衣,但本质上都是轻量级虚拟机。在微服务时代以前,传统的软件系统与研发模式的确很难承受零信任安全模型引发的代价,只有带了云原生时代,虚拟化的基础设施长足发展,能将复杂性隐藏于基础设置之内,开发者不需要为达成每一条安全原则而专门开发或引入可感知的安全设施;只有容器与虚拟化网络的性能足够高,可以弥补安全隔离于安全通信的额外的损耗的前提下,零信任网络的安全模型才能生根发芽。9.2 服务安全9.2.1 建立信任零信任网络里不存在默认的信任关系,一切服务调用、资源访问成功与否,均需以调用者与提供者间已建立的信任关系为前提。真实世界里,能够达成信任的基本途径不外乎基于 共同私密信息的信任和基于权威公证人的信任两种。在网络世界里,因为客户端和服务端之间一般没有什么共同的私密信息,所以真正才能的就只能是基于权威公证人的信任,这种信任有个标准的名字:公开密钥基础设施(Public Key Infrastructure,PKI)。PKI是构建在传输安全层(Transport Layer Security,TLS)的必要基础。在任何网络设施都不可信任的假设前提下,无论是dns服务器、代理服务器、负载均衡还是路由器,传输路径上的每一个节点都有可能监听或者篡改通信双方传输的信息。要保证通信过程不受到中间人的攻击,启用tls对传输通道本身进行加密,让发送者发出去的内容只有接收者可以解密唯一具备可行的方案。建立tls传输,说起来似乎不复杂,只要在部署服务器时预置好CA根证书,以后该CA为部署的服务签发tls证书便是。微服务中tls认证的频次也显著的高于传统的应用,比起公众互联网中单向的tls认证,在零信任网络中,往往要启用双向tls认证(Mutual TLS Authentication,常简写为 mTLS),即不仅要确认服务器的身份,还要确认调用者的身份。1.单向TLS认证只需要服务端提供证书,客户端通过服务端证书验证服务器的身份,但服务器并不验证客户端的身份。单向tls用于公开的服务,即任何客户端都被允许连接到服务进行访问,它保护的重点是客户端免受冒牌服务器的欺骗。2.双向TLS认证客户端、服务端双方都要提供证书,双方各自通过对方提供的证书来验证对方的身份。双向tls用于私密的服务,即服务只允许特定身份的客户端来访问,它除了可以保护客户端不连接到冒牌服务器外,也可以保护服务端不遭受非法用户的越权访问。9.2.2 认证根据认证的目标对象可以把认证分为两种类型:一种是以机器作为认证对象,即访问服务的流量来源是另外一个服务,称为服务认证(Peer Authentication,直译过来是"节点认证");另外一种是以人类作为认证对象,即访问服务的流量来自于最终用户,称为请求认证(Request Authentication)。1.服务认证a) Istio得以于 Istio 提供的基础设施的支持,我们不需要 Google Front End、Application Layer Trasport Security 这些安全组件,也不需要部署PKI和CA,甚至无需改动任何代码就可以启用 mTLS 认证。如果你的分布式系统还没有到达完全云原生的程度,其中仍存在部分不受Istio管理(即未注入边车)的服务端或者客户端,你也可以将 mTLS 传输声明为"宽容模式"(Permissive Mode)。宽容模式的含义是 受 Istio 管理的服务会允许同时接收纯文本和mTLS两种流量。纯文本流量仅用于那些不受Istio管理的节点进行交互,你需要自己解决纯文本流量的认知问题;而对于服务网格内部的流量,就可以用mTLS认证。b) Spring Cloud笔者选择的方案是借用 OAuth 2 协议的客户端模式来进行认证,分为2步:1.每一个要调用服务的客户端都与认证服务器约定好一组只有自己知道的密钥(Client Secret),这个约定的过程应该由运维人员在线下自行完成,通过参数传给服务,而不是由开发人员在源码或者配置文件中直接设定。密钥就是客户端的身份证明,客户端调用服务时,会先使用该密钥向认证服务器申请jwt令牌,然后通过令牌证明自己的身份,最后访问服务。2.每一个对外提供服务的服务端,都扮演者 OAuth 2 中的资源服务器的角色,它们均声明为要求提供客户端模式的凭证。客户端要调用受保护的服务,就必须先出示能证明调用者身份的jwt令牌,否则就会遭到拒绝,这个操作本质上是授权,但是在授权过程中已实现了服务的身份认证。由于每个微服务在都同时具有服务端和客户端两种身份,所以在每个微服务中都应该包含这些代码。面对可能的中间人攻击,tls是唯一可行的办法,言下之意是即使应用层的认证能一定程度上保护服务不被身份不明的客户端越权调用,但对传输过程中内容被监听、篡改,以及被攻击者在传输过程中拿到jwt令牌后去冒充调用者是无能为力的。这种方案不适用于零信任安全模型,只能默认在内网节点间具备信任关系的边界模型上良好工作。2.用户认证a) Istio当来自最终用户的请求进入服务网格时,Istio 会自动根据配置的 JWKS(JSON Web Key Set)验证令牌的合法性,如果令牌没有被篡改过且在有效期内,就信任负载中的用户身份,并从令牌的Iss字段中获得Principal。JWKS 代表一个密钥仓库。我们知道在分布式系统中,JWT应采用非对称的签名算法(RSA SHA256 等,默认的 HMAC SHA256 属于对称加密算法),由认证服务器使用私钥对负载进行签名,再由资源服务器使用公钥对签名进行验证。常与jwt配合使用的JWK(JSON Web Key)就是一种存储密钥的纯文本格式,本质上和 JKS(Java Key Storage)、P12(Predecessor of PKCS#12),PEM(Privacy Enhanced Mail)这些常见的密钥格式在功能上没有什么差别。JKWS顾名思义就是一组JWK的集合,支持JKWS的系统,能通过jwt令牌中的Header中的KID(Key ID)来自动匹配应该使用哪个JWK来验证签名。b) Spring Cloud如果jwt令牌合法,Spring Security 的过滤器就会放行调用请求,并从令牌中提取Principal,放到自己的安全上下文中。实际开发中,你可以根据需要自行决定Principal具体的形式,既可以像Istio中那样直接从令牌中取出来,以字符串形式原样存储,节省一些数据库或者缓存的开销;也可以统一做一些额外的转换处理,以便后续业务使用。9.2.3 授权经过认证之后,合法的调用者就用了可信任的身份,此时就已经不在需要区分调用者到底是机器还是用户了,只根据身份角色来进行权限访问控制即可,即RBAC。

9.凤凰架构:构建可靠的大型分布式系统 --- 可靠通信相关推荐

  1. 周志明:《凤凰架构:构建可靠的大型分布式系统》

    架构模式的每一次演进都是凤凰涅槃 系统架构的每一次迭代都是浴火重生 构成系统的每一个部件都是一只不死鸟 构成大规模系统的每一个部件都可以是不可靠的,会出错,会老朽,甚至是消亡,如何让不可靠部件构成的系 ...

  2. 《架构设计2.0大型分布式系统架构方法论与实践》三高笔记

    目录 前言 高并发 高并发读 动静分离与CDN加速 缓存 并发读与Pipeline 重写轻读 读写分离 批量 高并发写 数据分片 任务分片 异步化 批量 高可靠 七板斧 高可用 高可用架构几个核心问题 ...

  3. 【读书笔记《凤凰架构》- 构架可靠的大型分布式系统.周志明】(一)

    1. 前言 整部书分为5部分,除了第一章讲分布式架构的历史,其他四章都偏技术. 书本的作者提也到,再看书前最好先理解本书的排版的逻辑(尽管每一章都被设计为可以单独阅读) 但除第1部分, 剩下的4个部分 ...

  4. 2.凤凰架构:构建可靠的大型分布式系统 --- 访问远程服务

    第2章 访问远程服务远程服务将计算机的工作范围从单机扩展至网络,从本地延伸至远程,是构建分布式系统的首要基础.2.1 远程服务调用2.1.1 进程间通信举例,一个正常的本地调用需要完成以下几个工作:1 ...

  5. 5.凤凰架构:构建可靠的大型分布式系统 --- 架构安全性

    第5章 架构安全性计算机系统的安全,不仅仅是指"防御系统被黑客攻击"这样狭义的安全,还至少应包括以下问题的具体解决方案:1.认证(Authentication)系统如何正确分辨操作 ...

  6. 8.凤凰架构:构建可靠的大型分布式系统 --- 流量治理

    第8章 流量治理容错性设计是微服务的另一个核心原则.随着拆分出的服务越来越多,随之而来会面临以下2个问题:1.由于某一个服务崩溃,导致所有用到这个服务的其他服务都无法正常工作,一个点的错误经过层层传递 ...

  7. 阿里内部第一本“凤凰架构”,手把手教你构建可靠大型分布式系统

    前言: 一本好的技术书不仅能告诉你某个技术点怎么做.为什么这么做,还会让你明白所有技术点如何协同配合,最终构建出一个完整的技术体系. 本书是一本以"如何构建一套可靠的大型分布式系统" ...

  8. 涅槃重生,字节人力荐大型分布式手册,凤凰架构让你浴火成神

    从大型机到单体架构,从微服务架构到无服务架构,每一次架构模式的演进都是一次涅槃.每一个软件系统都是由大量服务构成的生态体系,个体服务的"死亡"和"重生"是整个系 ...

  9. 涅槃重生,力荐大型分布式手册,凤凰架构让你浴火成神,良心分享

    前言 从大型机到单体架构,从微服务架构到无服务架构,每一次架构模式的演进都是一次涅槃.每一个软件系统都是由大量服务构成的生态体系,个体服务的"死亡"和"重生"是 ...

  10. 涅槃重生!字节大牛力荐大型分布式手册,凤凰架构让你浴火成神

    前言 从大型机到单体架构,从微服务架构到无服务架构,每一次架构模式的演进都是一次涅槃.每一个软件系统都是由大量服务构成的生态体系,个体服务的"死亡"和"重生"是 ...

最新文章

  1. 准备写java学习笔记
  2. matlab subs
  3. python timer使用-python下timer定时器常用的两种实现方法
  4. 解决在ESXi的虚拟化环境中的FreeNAS里Jails插件无法被访问到的问题
  5. 计算机网络实验3:网络设备基本配置
  6. CRM Fiori pipeline应用的背景色问题
  7. 顶级程序员和普通程序员在思维模式上的5个区别!
  8. spark 流式计算_流式传输大数据:Storm,Spark和Samza
  9. 为什么MediaPlayer中onCompletion()每次播放音频时都触发?
  10. DWR入门教程(http://www.cnblogs.com/cyjch/archive/2012/02/16/2353758.html)
  11. 无需教师端极域电子教室的反控制实现
  12. python timepicker_Android DatePicker和TimePicker:时间日期选择器
  13. k8s serviceAccountName填写后应用没有进行挂载问题处理
  14. 精品LowPoly低多边形风格模型插件资源包合集(随时更新)
  15. 2017 网易游戏互娱游戏研发4.21(offer)
  16. Selenium+Python+Pycharm自动化环境搭建具体步骤
  17. 简述python语言的主要功能和特点_计算机考试简答题
  18. 2019 码云 最流行的开源项目 TOP 50
  19. android矢量图之VectorDrawable ,自由又方便的填充色彩
  20. 选择器优先级如何排列?

热门文章

  1. 你家的APS系统有这些功能吗?排程系统功能盘点
  2. 【linux基础】cuDNN版本查询
  3. [leetcode] 11.盛最多水的容器
  4. Spring AOP无法拦截Controller中的方法
  5. NYOJ——————数的长度(斯特林公式的应用)
  6. Linux 终端操纵之扼要疾速指南(2)
  7. ORACLE数据库的模式对象的管理与维护
  8. 鲍尔默先生,请拿出证据
  9. 不敢穷,不敢病,不敢死……我们是独生子女
  10. R语言基于S3的面向对象编程