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所示。认证流程如下。