翻译自Edge Authentication and Token-Agnostic Identity Propagation。通过本文可以了解到Netflix是如何通过将认证转移到边缘设备来降低系统内容内部的认证流程,以及如何使用统一的认证结构支持系统对身份信息的需求。
正如大多数开发人员认为的那样,对安全协议和身份令牌,以及用户和设备身份验证的处理可能会充满挑战。假设有很多协议,令牌,200M+的用户,以及上千个设备,问题可能随时会在范围内爆发。几年前,我们决定通过发起一个新的计划,组建一个新的团队来解决这种复杂性,将用户和设备身份验证以及各种安全协议和令牌的复杂处理移至(由一组集中式服务和一个团队管理的)边缘网络上。在这个过程中,我们更改了身份在服务之间的传播方式,转而使用支持加密验证且令牌无关的身份对象。
通过本文可以了解到:
如何降低服务所有者的复杂度,服务所有者不需要再了解并负责终结安全协议,以及处理无数的安全令牌;
通过将令牌管理委派给在该领域具有专业知识的服务和团队来提高安全性;
提高审计能力和取证分析。
我们是如何做到的Netflix最初是一个允许会员管理其DVD队列的网站。该网站后来提供了流内容,流设备稍晚一些,但是这些初始设备的功能受到了限制。随着时间的推移,流设备的功能越来越强大,曾经只能通过网站访问的功能也拓展到了流设备上。Netflix服务的扩展非常快速,目前已经支持多达2000种设备类型。
支持这些功能的服务识别多种令牌以及安全协议(用于验证用户和设备,并授权访问这些功能)的负担也越来越重。整个系统变得相当复杂,开发也变得脆弱。加上边缘层的架构已经演化到PaaS模型,我们需要确定如何,以及在哪里处理身份令牌。
复杂度:多个服务处理认证令牌为了展示流的复杂度,下面描述了在架构修改前,用户是如何登录的:
从最高层面看,此流程(大大简化)涉及的步骤如下:
用户输入凭据,然后Netflix客户端将凭据以及设备的ESN传输到边缘网关,即Zuul;
Zuul将用户调用重定向到API/登录终端;
API服务编排后端系统,验证用户身份。
成功验证请求提供的声明后,API服务会返回cookie给上游,包括customerId 和ESN,以及一个到期指令;
Zuul发送Cookies到NetFlix客户端。
该模型有一些问题,如:
外部有效的令牌被深深地嵌入到调用栈中,因此需要一直向上游传播,可能会导致记录不合理的日志或导致潜在的管理问题。
上游系统必须重新打开令牌来识别用户登录,并可能管理多个并行的身份数据结构,很可能导致数据不同步。
多协议&令牌本例展示了处理一个协议(HTTP/S)以及一个令牌类型(Cookies)的流程。在Netflix的流产品中使用了一些协议和令牌,概括如下:
Netflix 的流生态系统会消费(有可能会更改)这些令牌,如:
更复杂的是,可以通过多种方法在系统之间传输这些令牌或令牌中包含的数据。在某些情况下会不断打开令牌,从中抽取身份数据元素,作为API调用使用的简单基元或字符串,或通过请求上下文首部或URL参数在系统间传递。整个过程中并不会检查令牌或令牌中包含的数据的完整性。
Netflix 的规模同时,Netflix 的规模在以指数增长。现在,Netflix 已经有200M+的订阅,以及每月上百万个活动的设备。我们每秒要服务超过2.5百万个请求,相当大一部分用于某种格式的认证。在老的架构中,每一个请求都会触发一个API调用,用来验证请求中声明的内容,如下所示:
加入EdgePaaS后续业务的变动使得情况变得更复杂,边缘工程团队正在将老的API服务架构迁移到一个新的基于PaaS的方式。在我们迁移到EdgePaaS的同时,前后端服务也从基于Java的API迁移到了BFF(backend for frontend),即NodeQuark: