Sentinel 2.0 微服务零信任的探索与实践
从古典朴素的安全哲学谈起
Aliware
a. 认证就是确认你是谁。
b. 鉴权就是确认你有什么权利。
Istio:零信任的优秀构建者
Aliware
控制面 Istiod:每个服务网络中存在一个 Istiod,作为控制面,统筹管理服务网络中的所有应用。
用户应用:用户运行的应用。
数据面 proxy:每个运行在服务网络中的用户应用均拥有一个 proxy 容器,其代理了用户应用的所有流量。所有从用户应用出的流量和入的流量均需经过 proxy 容器。
在服务网络中,关于零信任最核心的两个功能,认证和鉴权的具体行为如下:
认证:在 proxy 启动时,proxy 会携带 k8s 塞在容器里面的 token 向 istiod拿取证书。之后任何服务之间的调用均需双向认证。例如 A 向 B 发起请求,A需要验证 B 的证书,B 也需要验证 A 的证书。 鉴权:控制面 istiod 会向所有 proxy 分发鉴权规则,每个 proxy 会根据规则,放行请求或者拒绝请求。
c. 在鉴权规则方面:Istio 的鉴权规则粒度十分细,但是有许多规则匹配与 K8s 的概念强依赖,例如要求请求必须来源于某个 namespace;其次仍有部分规则的缺失,例如应用部署环境级别的鉴权等等。
Sentinel 2.0:我们期望微服务下的安全底座该是什么样?
Aliware
Obtain the certificate from the external data source and use it to configure https when the web service is enabled.
Obtains authentication rules from the external data source and permits or blocks each request based on the authentication rules.
OpenSergo:作为规则管理与下发的中心放,定位类似于服务网络中的控制面。 Sentinel:作为依赖包被应用引入,定位类似于服务网络中的一个数据面。
对于零信任的两个核心功能认证和鉴权,Sentinel 和 OpenSergo 将会如下做:
认证:Sentinel 携带 token 向 OpenSergo 获取相应的证书。OpenSergo 会根据相应的策略判断 token 的合法性,颁发相应的身份证书,Sentinel 会在证书过期时自动轮转证书。Sentinel 首先会支持与 Istio 的 k8s-apiserver 的认证策略,并在后续继续支持 OPA、IDaas 等认证策略。
鉴权:用户可以配置鉴权的 CRD 至 OpenSergo,OpenSergo 将会转化为标准的 XDS 下发至 Sentinel,Sentinel 会保存关于本应用的所有鉴权规则,并根据鉴权规则为应用自动放行或者拒绝请求。鉴权规则总共包含 JWT 规则、deny 规则和 allow 规则。
b. JWT: JWT 策略,如何验证请求中符合 JWT 规范的 token。
c. Auth:鉴权策略,判断何种请求会通过,何种请求会不通过。
apiVersion: security.istio.io/v1beta1kind: AuthorizationPolicymetadata:name: httpbinnamespace: defaultspec:action: DENYrules:- from:- source:# 需要匹配的身份principals: [ "principal1","principal2" ]# 需要不匹配的身份notPrincipals: [ "notPrincipal1","notPrincipal2" ]# 需要匹配的JWT中iss+"/"+subrequestPrincipals: [ "jwtp1","jwtp2" ]# 需要不匹配的JWT中iss+"/"+subnotRequestPrincipals: [ "notjwtp1","notjwtp2" ]# 需要匹配的命名空间namespaces: [ "namespace1","namespace2" ]# 需要不匹配的命名空间notNamespaces: [ "notNamespace1","notNamespace2" ]# 需要匹配的直接来源ipipBlocks: [ "10.1.1.1","10.1.1.0/24" ]# 需要不匹配的直接来源ipnotIpBlocks: [ "11.1.1.1","11.1.1.0/24" ]# 需要匹配的请求最初ip,最初请求的来源ip来自于header中X-Forwarded-For的值remoteIpBlocks: [ "12.1.1.1","12.1.1.0/24" ]# 需要不匹配的请求最初ip ,最初请求的来源ip来自于header中X-Forwarded-For的值notRemoteIpBlocks: [ "13.1.1.1","13.1.1.0/24" ]- source:principals: [ "principal3" ]to:- operation:# 需要匹配的到达域名hosts: [ "www.host1.com","www.host2.com" ]# 需要不匹配的到达域名notHosts: [ "www.nothost1.com","www.nothost2.com" ]# 需要匹配的到达端口ports: [ "8080","443" ]# 需要不匹配的到达端口notPorts: [ "18080","1443" ]# 需要匹配的请求方法methods: [ "GET","POST" ]# 需要不匹配的请求方法notMethods: [ "PUT","DELETE" ]# 需要匹配的请求pathpaths: [ "/info1*","/info2" ]# 需要不匹配的请求pathnotPaths: [ "/notinfo1*","/info2" ]- operation:hosts: [ "www.host3.com" ]
我们也在 OpenSergo 社区提了相关的 issue[2],希望可以建设起规范的零信任 CRD。
The CRD will be expanded to be compatible with istio.
The CRD involves three aspects in total, namely
1. TlsMode: Authentication policy, whether to authenticate both parties.
2. JWT: JWT policy, how to verify tokens in a request that comply with the JWT specification.
3. Auth: Authentication policy that determines which requests are approved and which requests are rejected.
extension:在 sentinel 的 extension 包中将会完成证书拉取、XDS 的接收、鉴权规则的转换。 core:在 sentinel 的 core 层定义证书、鉴权规则的实体,并存储证书、鉴权规则。 adapter:在 sentinel 的 adapter 层将会提供适配于 mvc、webflux、dubbo 的各种适配器。
Spring Cloud Alibaba、Dubbo、Spring Boot 应用可以使用适配器或者直接使用 core 的实体让证书以及规则生效。
SpringCloud Alibaba 适配
如何适配 TlsMode:
适配 JWT、RBAC:
Dubbo 适配
适配 TlsMode:
适配 JWT:
Dubbo 的传输协议中无 header 和 params 的概念,但是存在 Attachments 的字段, 对于 CRD 中的 fromHeaders 映射从 Attachments 字段拿取。 对于 CRD 中的 fromParams 规则失效。
对于 CRD 中 header 的规则生效于 Dubbo 的 Attachments 字段。 对于 CRD 中的 methods 的规则无效。 对于 CRD 中的 paths 规则变为 /package.service/method
Optional. A list of paths as specified in the HTTP request. See the Authorization Policy Normalization for details of the path normalization. For gRPC service, this will be the fully-qualified name in the form of “/package.service/method”.
If not set, any path is allowed. Must be used only with HTTP.
平滑升级:微服务零信任仍需努力的道路
Aliware
最终,在用户最终态时,所有应用均接入了零信任能力,所有的调用链路均需为 https 协议。
STRICT(严格模式,终态):应用之间必须使用 https 通信。
PERMISSIVE(兼容模式,中间态):应用之间优先选用 https 协议通信。例如,对于调用链路应用 A->应用 B(如图中的切换中间态,实例 1 开启 https 端口,实例 2 还未开启 https 端口),应用 A 选择实例 1 通信时使用 https 端口,选择实例 2 通信时使用 http 端口。
DISABLE(明文模式,初始态):应用之间必须使用 http 通信。
那么如果用户选择升级应用实例,使其最终从 http 变为 https,并且在过程中流量不能损失,可以根据如下步骤升级应用实例:
让微服务应用无感、平滑升级至零信任方案,这是零信任方案是否能被大规模使用的关键条件之一,我们希望能够帮助我们企业微服务做到无感的默认安全。
展望
Aliware
a. CI/CD 集成:将零信任的规则集成在 CI/CD 中,更加自动化的配置安全策略
b. 自适应调整:当一个应用外部环境改变,比如部署环境改变、应用从属部门改变,安全策略自适应的改变。
相关链接:
[1] issue
https://github.com/alibaba/Sentinel/issues/3166
https://github.com/opensergo/opensergo-specification/issues/85