如何保障内网微服务应用相互间的安全访问?

前言

某次code review 时,发现一个令人费解的代码实现。code review 的这套系统是基于Restful API微服务架构风格的,如下图。


image.png

费解的点在于a、b、c三个微服务应用都是同一个团队开发的,为啥a服务每次Restful API访问 b/c 时都在http header带上一个HTTP Basic Authentication? 我刚开始时以为是终端用户的的用户名、密码,但再一想觉得不对。

分析

HTTP Basic Authentication(HTTP 基本认证)是 HTTP 1.0 提出的一种认证机制。
基本原理是:客户端发送 HTTP Request 给服务器时,把用户名和密码用 BASE64 加密后,放在 Authorization Header 中发送给服务器。服务器将 Authorization Header 中的用户名密码取出,进行验证, 如果验证通过,将根据请求,发送资源给客户端。

这种认证方式已经是非常古老了,基本都不再使用。Base64只是一种编码转换,并不是真的加密。这套系统(microservice application a、b、c)部署于内网,没有使用https只是使用了http。而且细看代码发现,每次访问都会带上这个Basic Authentication Header,密码验证只是简单的对比配置文件所配置的用户名、密码。配置文件中有限的几个用户名、密码显然不可能是终端用户的。那它是干啥用的?

带着这样的疑问,百思不解,只好找到开发这个程序的老员工问问了。据说,是不想microservice-b / microservice-c 被其它微服务应用程序所访问,目前只开放给microservice-a访问。所以通过这种方式控制。这......让我有种被雷击的感觉。一般来说部署于内网(server-farm网络区域)的微服务,是不会直接对外暴露,外来请求只能通过api-gw的认证授权才能进来。而且每一个内网的微服务应用相互间的访问接口也不是说直接点个按钮或者配置一个地址就能访问,一般也是经过需求分析、沟通开发、集成测试、部署上线,微服务应用间才打通访问的。所以内网的微服务相互间一般是可以相互信任的。这个Basic Authentication显得多余了。前面说的是内网的微服务间,不同于终端用户(客户端)的认证鉴权问题,后者可以参考《David Borsos 在伦敦的微服务大会上提出的四种方案》。

但凭这想要说服团队放弃这种Basic Authentication的用法,说服力是不够的。业务需求总是多种多样的,总有各种奇奇怪怪的的需求。遥想7年前,就曾被人问过,假设microservice-c是一个账户记账服务,在整个公司的所有应用系统中都是一个至关重要的微服务应用,毕竟涉及到金钱的来往。那有什么更好的解决方案吗?当年还没有流行K8S,也还没有容器化,是基于VM部署的。当年的解决办法也很简单 ,直接ip-table,在Linux系统上限定网络防火墙设置,只有有限的几个IP地址可以访问记账服务。那现在基于K8S部署,Pod的IP地址是可以漂移的,ip-table不好使啊。虽然也有各种技术可以解决,绑定静态ip , 基于k8s dns ,service vip 等。但这要求对K8S非常熟悉,也比较耗费运维人员的精力。

再来思考上面Basic Authentication 的方案,即使http替换为https也不够安全。以Application作为授权主体,在配置文件中分配固定的用户名密码,由服务提供者分发给服务消费者,而开发人员相互间的沟通是很广泛的。开发microservice-a的同学,在新开发microservice-e时,可能懒得再走一遍沟通的流程了,直接在microservice-e上配上了microservice-a所用的用户名、密码。嗯,也能跑通了。最终形同虚设。

调查

为了验证猜想,是否真的形同虚设。我抽查了N多个应用,查看其配置的用户名、密码及检查Basic Authentication的源代码。发现真的是形同虚设,有些不同的Application使用同一个用户名,密码设置也很随意。而且基本每一个microservice 都有关于Basic Authentication的这段源代码,里面有很多注释都是一样的,很明显的copy paste 痕迹。

解决方案一:保留Basic Authentication

如果仍然保留Basic Authentication的思路,就得在项目管理流程努力。技术上要改两个点:

  1. http替换为https;
  2. 用户名、密码保存在配置中心,而不是本地配置文件,例如Apollo这样的独立配置系统加密配置,并且生产环境只授权给运维人员才有权配置。

缺点:很明显,很费运维人员。而且一旦Basic Authentication Header落地日志,也废了。只能说聊胜于无,也能解决小规模应用的问题。

解决方案二:利用服务注册中心授权

内网的微服务应用程序相互间的通信基于TLS/HTTPS双向认证,这要求Microservice Application每一个部署实例都同时部署有一张CA证书。其实Nginx / Tomcat / Jetty 或其它各种Web Server都是直接支持的。只是默认很多是单向认证,这里需要配置为双向认证。为了省钱,可以由运维团队自己颁发证书,不一定需要买商业CA机构的。

Application作为服务提供者:

  1. 当应用启动时,向服务注册中心双向认证各自的身份,获得服务注册中心的公钥(pub-key)。这个公钥会用于后续接受服务消费者的请求时验签。
  2. 服务提供者向服务注册中心,登记自己所能提供的服务。
  3. 当消费者访问时,从其请求头部中获得token,使用pub-key 验签。验签通过后可允许服务消费者访问真正的服务。

Application作为服务消费者:

  1. 当应用启动时,向服务注册中心双向认证各自的身份。
  2. 消费者向服务注册中心登记自己将来需要访问的服务。服务注册中心查看授权表,签发允许授权的令牌(token内明确消费者名字、提供者名字、服务接口名字/URL)。缓存令牌。
  3. 消费者向提供者直接访问服务时,带上注册中心授予的令牌。

服务注册中心作为大统一的管理平台:

  1. 负责登记所有微服务的提供、消费关系及基于这些关系的授权。以树状记录于etcd/zookeeper。但对Application的认证已经交给证书所负责,可以比较简单的解决。
  2. 可以展示依赖关系(网状),application name as consumer ---- (micro-service-interface-name)----> application name as provider 。
  3. 可以报告每一个服务提供者的就绪状态(在线的列表)。
  4. 可以报告每一个服务消费者的就绪状态(其所需要的服务是否在线),授权状态(获得的令牌列表)。

优点: 支持大规模微服务治理,对于大量微服务应用相互间授权访问的情况,可以统一集中的管理,管理成本低。
缺点: 技术复杂一些。但有些开源的服务注册中心有支持,可以根据公司实际需要,稍微修改即可。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容