openGauss源码解析(194)

openGauss源码解析:安全管理源码解析(5)

9.2.4 Kerberos安全认证

Kerberos是一种基于对称密钥技术的身份认证协议。开源组件Kerberos可以解决集群内节点或者进程之间的认证问题,即当开启kerberos之后,恶意用户无法仿冒集群内节点或进程来登录数据库系统,只有内部组件才可以持有用于认证的凭证。从而保证通过Kerberos认证,消减了仿冒风险,提升了数据库系统的安全性。Kerberos协议认证交互如图9-10所示。

图9-10 Kerberos认证标准交互流程

其中各角色和定义如表9-3所示(为下文描述方便均以缩写代替)。

角色

说明

KDC(key distribution center,密钥分发中心)

Kerberos服务程序

Client

需要访问服务的用户(principal),KDC和Service会对用户的身份进行认证

Service

集成了Kerberos的服务,被访问的服务,需要对客户端进行认证

AS(authentication service,认证服务)

AS服务器用于身份的校验, 内部会存储所有的账号信息

TGS(ticket granting service,票据授权服务)

TGT(ticket-granting ticket)票据分发服务

表9-3 Kerberos协议角色

openGauss可在数据库系统部署完毕之后开启Kerberos模式,即Kerberos服务部署在数据库系统机器上,部署过程中会开启Kerberos相关的服务,并派发凭证给集群内部所有的节点,初始化一系列Kerberos需要用到的环境变量,数据库内核中通过调用GSS-API来实现Kebreros标准协议的通信内容。以openGauss主备之间的认证为例,在Kerberos开启后openGauss内部进程之间认证流程如图9-11所示。

图9-11 数据库系统Kerberos认证流程

Kerberos提供用户(数据库管理员)透明的认证机制,数据库管理员无须感知Kerberos进程/部署情况。图9-11中分两部分描述Kerberos交互,左侧虚线框内的Kerberos协议实现部分由OM工具完成。OM工具在Kerberos初始化的时候将KDC服务拉起(krb5kdc进程),KDC服务内置了两个服务:AS和TGS服务。客户端(openGauss主备等数据库服务进程)在登录对端之前会先和KDC交互拿到TGT(ticket granting ticket,根凭证),这个步骤由OM拉起的定时任务调用Kerebros提供刷新票据工具来实现,默认24小时重新获取1次。该获取TGT的过程对应Kerberos标准协议中的AS-REQ、AS-REP、TGS-REQ和TGS-REP模块。

右侧侧虚线框内的数据库内侧认证,主要是图9-11右侧虚线框内的AP-REQ流程实现,简化流程如图9-12所示。

图9-12 数据库系统内核认证交互

数据库内核封装GSS-API数据结构,实现跟外部API交互认证,关键数据结构源代码文件为“src\include\libpq\auth.h”,相关代码如下:

typedef struct GssConn {

int sock;

gss_ctx_id_t gctx; /* GSS 上下文 */

gss_name_t gtarg_nam; /* GSS 名称 */

gss_buffer_desc ginbuf; /* GSS 输入token */

gss_buffer_desc goutbuf; /* GSS 输出token */

} GssConn;

/* 客户端、服务端接口,用于封装标准kerberos协议调用,其中客户端接口用于向服务端 */

/* 发起访问,同时响应服务端接口GssServerAuth发起的票据请求 */

int GssClientAuth(int socket, char* server_host);

int GssServerAuth(int socket, const char* krb_keyfile);

图9-13 数据库内核Kerberos认证时序图

认证交互逻辑时序如图9-13所示。认证流程如下。

(1) 服务端通过数据库配置文件决定使用Kerberos协议对客户端连接进行认证。
(2) 发起认证请求,客户端准备需要Kerberos认证的环境和票证,发’P’报文响应请求并发送票证。
(3) 服务端验证通过后会发送响应’R’报文,完成Kerberos认证。
posted @ 2024-05-06 10:45  openGauss-bot  阅读(2)  评论(0编辑  收藏  举报