暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Curve 安全加固:基于Kerberos的鉴权系统

OpenCurve 2023-09-15
359

背景

Curve 是云原生计算基金会 (CNCF) Sandbox 项目,是网易主导自研和开源的高性能、易运维、云原生的分布式存储系统。
目前 Curve 系统并未对集群的“用户”进行任何身份验证,这里的用户包括 curve-client、tools、各服务组件等集群参与者,在不安全的网络环境中可能存在数据安全问题。例如,在攻破网络环境的情况下,攻击者能够轻松操作集群。所以我们希望能为 Curve 系统设计一个鉴权系统,使得只有具有相应权限的用户才能够访问对应服务的特定资源。

认证协议

Curve 系统鉴权的思路基于 Kerberos 认证协议,为了便于对后续认证过程的理解,首先对 Kerberos 进行简要介绍,协议中主要有三种角色:

  1. client:发送请求的一方

  2. server: 接收请求的一方

  3. KDC(Key Distribution Center):秘钥分发中心,一般由三部分组成

  • AS(Authentication Server): 认证服务器,用于认证客户端的身份,并发放客户端用于访问 TGS(Ticket Granting Server)的TGT(Ticket Granting Ticket)
  • TGS: 发放整个认证过程和客户端访问服务端时所需的服务授予票据(Ticket)
  • DB: 一个用于存储认证信息的数据库

如何证明“我就是我”?

在 Kerberos 协议中,通信双方需要在通信前互证自己的身份是可靠并具有访问权限的,直接将身份信息携带在请求中,对方是无法确认身份信息的真实性(可能被冒充),所以借助可信第三方 KDC, KDC 能够提前知道各方角色的身份和权限信息,所以,通信方可以去 KDC 进行自身身份验证,通过认证后会获得访问服务的 Ticket, 服务方只需要验证 Ticket 的合法性即可。
关键问题:
KDC 如何验证来获取 Service Ticket 的客户端的身份?
服务端如何验证 Ticket 的合法性?
认证的前置条件:
需要提前在 KDC 中添加用户,包括身份信息、秘钥和权限等;
认证过程采用对称加密,即所有用户和 KDC 共享密钥。
认证的过程
通信前的认证过程如下,涉及 client 和 KDC 的三次通信过程:

1. 认证的第一次通信

client 发送明文身份标识到 KDC(AS), AS 会在 DB 中查找该用户是否存在,存在则返回图示的两个信息:

2. 认证的第二次通信
client 收到第一次返回的信息后,使用自己的秘钥解密第二部分内容(如果是伪造的 client 这步解密会失败),获取到下步通信的 TGS 和用于通信的 CT_SK (Client to TGS Session Key)。client 会向 TGS 发送包括想要访问 server 在内的三种信息,TGS 同样会先在 DB 中查找该 server 是否存在,存在则使用自己的密钥解密 TGT, 验证有效期并获取到 client info from db 和 CT_SK,使用 CT_SK 解密 client 发送的身份信息,验证 client 发送的身份信息和 db 中记录的是否一致,如果一致则返回图示的两部分信息。

3. 认证的第三次通信

client 使用 CT_SK 解密获取与 server 通信的 session key(CS_SK),最后向 server 发送图示两部分内容进行最后的验证。

整个 kerberos 认证的过程较为复杂,三次通信中都使用了密钥,且密钥的种类一直在变化,并且为了防止网络拦截密钥,这些密钥都是临时生成的 Session Key, 即他们只在一次 Session 会话中起作用,即使密钥被劫持,等到密钥被破解可能这次会话都早已结束。


Curve的认证过程

同样首先考虑核心三种角色:

  • Client: curve-client、tools、mds、chunkserver
  • Server: mds、chunkserver、snapshotcloneserver
  • KDC: 考虑到目前 Curve 自身的架构,可以在 MDS 中新增 AuthServive, 让 MDS 兼任 KDC 的角色并合并 AS 和 TGS 的功能,密钥和用户身份信息可存储在 ETCD 中。

加密算法

整个认证过程采用 AES-128 对称加密算法,具有较高安全性和加解密性能。
用户管理和密钥分发
用户的身份信息、秘钥和权限存储在 ETCD 中,可通过工具进行用户的管理。由于认证使用对称加密,所以服务和 MDS(KDC) 共享相同的秘钥,通过 Curveadm 进行秘钥分发,例如在集群部署和新增服务时,通过 Curveadm 生成密钥,分发到各服务和 MDS(KDC) 中。
Ticket的获取与更新
开启服务身份验证功能后,请求发起方需要先获取相应服务的 Ticket, 在过期之前可从缓存中直接获取,Ticket 失效后需要从 MDS 获取新的 Ticket.
验证信息的传递

client 和server 端之间的认证信息传递和认证有两种方式:

1.在所有 request 中携带认证信息,server 端在收到请求后先进行权限验证。
  • 优点:比较灵活,可适应使用不同 rpc 框架的 client 和 server。
  • 缺点:每个请求都需要进行验证,性能会有一定损耗。

2.使用 brpc 框架提供的基于连接的认证,用户只需要继承实现 Authenticator 即可。

  • 优点:基于连接的认证在 TCP 连接建立后,会发送验证包,认证通过后该连接的后续请求不需要再验证,对性能损耗较小。
  • 缺点:不够灵活,一般只能携带本机的静态信息,且不能适应不同框架间的通信(rpc client是 grpc 而 rpc server 是 brpc)。
秘钥的轮换
为了提高系统安全性,避免因密钥泄露带来系统风险,秘钥需要进行轮换,目前 Curve 考虑采用基于事件的主动轮换策略,即人为主动的触发秘钥轮换,为保证在秘钥轮换过程中服务的平滑过度,采用服务支持多秘钥设计,使得在秘钥轮换过程中服务的新老秘钥可在一段时间内同时有效。


<原创作者,王海,Curve maintainer>




------ END. ------
🔥 社区资讯:
Curve 社区上半年 Roadmap 进展及下半年规划
🔥 用户案例:
Curve 文件存储在 Elasticsearch 冷热数据存储中的应用实践
扬州万方:基于申威平台的 Curve 块存储在高性能和超融合场景下的实践
创云融达:基于 Curve 块存储的超融合场景实践 
🔥 技术解析:
探索 : CurveBS 模拟 RBD 接口对接 OpenStack
Curve 混闪之性能优化记录
CurveBS RDMA & SPDK 部署指南



关于 Curve 

Curve 是一款高性能、易运维、云原生的开源分布式存储系统。可应用于主流的云原生基础设施平台:对接 OpenStack 平台为云主机提供高性能块存储服务;对接 Kubernetes 为其提供 RWO、RWX 等类型的持久化存储卷;对接 PolarFS 作为云原生数据库的高性能存储底座,完美支持云原生数据库的存算分离架构。

Curve 亦可作为云存储中间件使用 S3 兼容的对象存储作为数据存储引擎,为公有云用户提供高性价比的共享文件存储。

  • GitHub:https://github.com/opencurve/curve
  • 官网https://opencurve.io/
  • 用户论坛:https://ask.opencurve.io/
    微信群:搜索群助手微信号 OpenCurve_bot



文章转载自OpenCurve,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论