从古典朴素的安全哲学谈起
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 规则。
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


