openGauss作为新一代自治安全数据库,提供了丰富的数据库基础安全能力,并逐步完善各类高阶安全能力。这些安全能力涵盖了访问登录认证、用户权限管理、审计与追溯及数据安全隐私保护等。本章节将围绕openGauss安全机制进行源码解读,以帮助数据库内核开发者在进行内核开发时正确的理解和使用安全功能接口,持续为产品提供安全保护能力,或基于当前安全能力进一步开发新的安全能力。
1 openGauss安全整体架构
不同于数据库其他业务模块,安全管理模块并非逻辑集中的。安全管理模块中的安全能力是分散化的,在数据库整个业务逻辑的不同阶段提供对应的安全能力,从而构建数据库整体纵深安全防御能力。一个完整的安全管理整体架构如图1下所示:
图1 openGauss安全机制体系
虽然整个安全机制是分散化的,但是每一个安全子模块都独立负责了一个完整的安全能力。如安全认证机制模块主要解决用户访问控制,登录通道安全问题;用户角色管理模块解决用户创建及用户权限管理问题。因此整体的安全管理体系架构的代码解读也将根据整个体系的划分来进行描述。
认证机制子模块从业务流程上看主要包括认证配置文件管理、用户身份识别、口令校验等过程,其核心流程及接口定义如图2所示。
图2 openGauss安全认证代码接口
用户角色管理子模块从业务流程上看主要包括角色创建、修改、删除、授权和回收,由于openGauss并未严格区分用户和角色,因此用户的管理与角色管理共用一套接口,仅在部分属性上进行区分。角色管理子模块涉及的功能及其对应的接口如图3所示。
图3 openGauss角色管理代码接口
对象访问控制子模块从业务流程看主要包括对象授权、对象权限回收以及实际对象操作时的对象权限检查,其核心流程及接口定义如图4所示。
图4 openGauss对象权限管理代码接口
审计机制子模块主要包括审计日志的创建和管理,以及数据库的各类管理活动和业务活动的审计追溯。审计日志管理包括新创建审计日志、审计日志轮转、审计日志清理。审计日志追溯包括活动发生时的日志记录以及审计信息查询接口,其核心流程及接口定义如图5所示。
图5 openGauss审计线程(左)及审计日志记录(右)接口
2 安全认证
安全认证是数据库对外提供的第一道防线,数据库访问者只有完成身份识别,通过认证校验机制,才可以建立访问通道从事数据库管理活动。在整个安全认证过程中,涉及到用户身份管理识别、用户口令安全存储以及完善的认证机制3大模块,下面的小节将围绕这3个子模块进行涉及原理介绍和代码解析。
2.1 身份标识
安全认证机制要解决的核心问题是谁可以访问数据库的问题。因此在定义身份时,除了描述谁,还要清晰定义整个过程中哪个用户以何种方法访问、从何处访问,访问哪个数据库的问题,因此本小节重点介绍身份识别概念及源码。
身份识别是一个广义的概念,实际上定义了数据库系统的访问规则。openGauss的访问规则信息主要被记录在配置文件HBA(Host-Based Authentication File,主机认证)中,HBA文件中的每一行代表一个访问规则,其书写格式如下:
hostssl