海山数据库(He3DB)技术分享:客户端认证

客户端认证核心参数

1.pg_hba.conf 参数文件定义了允许哪些主机以什么样的方式连接到哪些数据库。主要参数如表1.1所示:
表1.1 pg_hba.conf 参数

名称 概述
type 连接类型,如 host(通过 TCP/IP 连接)、local(Unix 域套接字)、hostssl(仅通过 SSL 连接的 TCP/IP 连接)、hostnossl(非 SSL 的 TCP/IP 连接)。
database 目标数据库名称,可以是 all(所有数据库)、具体数据库名或多个数据库名。
user 用户名,可以是 all(所有用户)、具体用户名或多个用户名。
auth_method 认证方法(如 trust、password、md5、scram-sha-256、peer、cert)。
auth_option 认证选项(如 SSL 客户端证书要求)。
address 客户端 IP 地址或地址范围

核心结构体

  1. Port 结构体,位于 src/include/libpq/be.h,保存客户端连接的信息。
c 复制代码
typedef struct Port
   {
    pgsocket sock;   /*网络文件描述符,表示连接的套接字。 */
   bool  noblock;  /*套接字是否处于非阻塞模式。 */
   ProtocolVersion proto;  /* 使用的协议版本,指示前端和后端的协议版本。 */
   SockAddr laddr;   /* 本地地址,即服务器端的地址。 */
   SockAddr raddr;   /* 远程地址,即客户端的地址。 */
   char    *remote_host; /* 远程主机的名称或 IP 地址的文本表示。 */
   char    *remote_hostname; /*远程主机的主机名(如果可用) */
   int   remote_hostname_resolv; /* 远程主机名解析状态,可能包含解析的结果或状态码。*/
   int   remote_hostname_errcode; /* 远程主机名解析错误码,指示解析失败的原因。*/
   char    *remote_port; /* 远程端口的文本表示。 */
   CAC_state canAcceptConnections; /* 表示后端是否能接受连接的状态。 */
   char    *database_name;  /*数据库名称,客户端请求连接的数据库。*/
   char    *user_name;   /*用户名,客户端用来连接数据库的用户。*/
   char    *cmdline_options; /*命令行选项,启动连接时的额外参数。*/
   List    *guc_options; /*选项列表,用于配置的全局设置。*/
   char    *application_name; /*应用程序名称,客户端提供的应用名称。*/
   HbaLine    *hba; /*配置行,用于验证客户端的连接。*/
   const char *authn_id; /*身份验证标识符,用于跟踪身份验证状态。*/
   int   default_keepalives_idle;  /*默认的 TCP 保活空闲时间。*/
   int   default_keepalives_interval;  /*默认的 TCP 保活间隔时间。*/
   int   default_keepalives_count; /*默认的 TCP 保活重试次数。*/
   int   default_tcp_user_timeout; /*默认的 TCP 用户超时时间。*/
   int   keepalives_idle; /*当前设置的 TCP 保活空闲时间。*/
   int   keepalives_interval; /*当前设置的 TCP 保活间隔时间。*/
   int   keepalives_count; /*当前设置的 TCP 保活重试次数。*/
   int   tcp_user_timeout; /*当前设置的 TCP 用户超时时间。*/
   #if defined(ENABLE_GSS) || defined(ENABLE_SSPI) 
   pg_gssinfo *gss;
   #else
   void    *gss;
   #endif
   bool  ssl_in_use; /*表示是否使用了 SSL(安全套接字层)加密。*/
   char    *peer_cn; /*对等方的证书主题名(Common Name)。*/
   char    *peer_dn; /*对等方的证书主体名(Distinguished Name)。*/
   bool  peer_cert_valid; /*对等方证书是否有效。*/
   #ifdef USE_OPENSSL 
    SSL     *ssl;
    X509    *peer;
   #endif
   } Port;
  1. HbaLine 结构体用于描述 PostgreSQL 的主机基于认证(HBA)配置中的一行。HBA 配置用于定义客户端如何连接到数据库以及如何进行身份验证。
c 复制代码
typedef struct HbaLine
{
	int			linenumber; /*配置文件中该行的行号。*/
	char	   *rawline; /*原始的配置行文本,以字符串形式保存。*/
	ConnType	conntype; /*连接类型,例如本地连接、TCP/IP 连接等。*/
	List	   *databases; /*允许连接的数据库列表。如果为空,表示允许连接到所有数据库。*/
	List	   *roles; /* 允许连接的角色(用户)列表。如果为空,表示允许所有角色连接。*/
	struct sockaddr_storage addr; /*客户端 IP 地址,用于允许连接的来源地址。*/
	int			addrlen;		/*字段的有效长度,如果没有有效地址,则为零。 */
	struct sockaddr_storage mask; /*网络掩码,用于地址匹配。*/
	int			masklen;		/*字段的有效长度,如果没有有效掩码,则为零。 */
	IPCompareMethod ip_cmp_method;  /*IP 地址比较方法,指示如何处理地址匹配(例如精确匹配或子网匹配)。*/
	char	   *hostname; /*允许连接的主机名。*/
	UserAuth	auth_method;  /*认证方法,例如密码、Kerberos、LDAP 等。*/
	char	   *usermap; /*用户映射规则,用于将数据库用户映射到系统用户。*/
	char	   *pamservice; /*服务名称,如果使用 PAM 进行身份验证。*/
	bool		pam_use_hostname; /*如果为 true,则 PAM 身份验证使用主机名进行匹配。*/
	bool		ldaptls; /*如果为 true,则启用 LDAP 传输层安全(TLS)。*/
	char	   *ldapscheme; /*连接的协议方案(例如 ldap、ldaps)。*/
	char	   *ldapserver; /*LDAP 服务器的地址。*/
	int			ldapport; /*LDAP 服务器的端口。*/
	char	   *ldapbinddn; /*LDAP 绑定 DN(Distinguished Name),用于与 LDAP 服务器进行绑定的凭据。*/
	char	   *ldapbindpasswd; /*LDAP 绑定密码,用于绑定的凭据。*/
	char	   *ldapsearchattribute; /*LDAP 搜索属性,用于匹配用户。*/
	char	   *ldapsearchfilter; /*LDAP 搜索过滤器,用于过滤用户。*/
	char	   *ldapbasedn; /*LDAP 基础 DN,用于搜索的起始点。*/
	int			ldapscope; /*LDAP 搜索范围,例如 base、onelevel 或 sub。*/
	char	   *ldapprefix; /*LDAP 用户名前缀,用于拼接 LDAP 绑定 DN。*/
	char	   *ldapsuffix; /*LDAP 用户名后缀,用于拼接 LDAP 绑定 DN。*/
	ClientCertMode clientcert; /*客户端证书模式,定义客户端证书的验证方式。*/
	ClientCertName clientcertname; /*客户端证书名称,用于匹配客户端证书。*/
	char	   *krb_realm; /*Kerberos 领域名称,用于 Kerberos 认证。*/
	bool		include_realm; /*如果为 true,则包括领域名称进行匹配。*/
	bool		compat_realm; /*如果为 true,则启用领域名称兼容模式。*/
	bool		upn_username; /*如果为 true,则支持 UPN(User Principal Name)用户名格式。*/
	List	   *radiusservers; /*RADIUS 服务器列表,用于 RADIUS 认证。*/
	char	   *radiusservers_s; /*RADIUS 服务器的文本表示。*/
	List	   *radiussecrets; /*RADIUS 密码列表,用于与 RADIUS 服务器通信的密码。*/
	char	   *radiussecrets_s; /*RADIUS 密码的文本表示。*/
	List	   *radiusidentifiers; /*RADIUS 标识符列表,用于识别 RADIUS 服务器。*/
	char	   *radiusidentifiers_s; /*RADIUS 标识符的文本表示。*/
	List	   *radiusports; /*端口列表,用于 RADIUS 服务器的端口配置。*/
	char	   *radiusports_s; /*RADIUS 端口的文本表示。*/
} HbaLine;

客户端认证核心函数栈

  1. PostmasterMain:实例的入口函数,负责初始化并启动数据库服务器。主要步骤包含:
    (1)初始化共享内存和信号处理。
    (2)解析命令行参数和配置文件。
    (3)创建各种子进程(如后台写进程、检查点进程等)。
    (4)进入主循环(ServerLoop)。
  2. ServerLoop:处理来自客户端的连接请求并创建相应的后端进程。主要步骤包含:
    (1)监听新连接请求。
    (2)在接收到新连接时,创建后端进程处理该连接。
  3. BackendStartup启动新的后端进程以处理客户端连接。主要步骤包含:
    (1)初始化后端进程环境。
    (2)进行用户身份验证(调用 ClientAuthentication)。
    (3)初始化会话和用户 ID(调用 Initpostgre)。
  4. Initpostgre:初始化后端进程的基本环境,包括设置用户和数据库等。主要步骤包含:
    (1)初始化内存上下文。
    (2)设置会话用户和数据库。
    (3)加载系统配置。
  5. ClientAuthentication:处理客户端的认证请求。
    (1)读取 pg_hba.conf 文件,加载认证规则(调用 load_hba)。
    (2)选择适当的认证方法并进行认证(调用 PerformAuthentication)。
  6. CheckPasswordAuth:处理 MD5 密码认证。
    (1)验证客户端提供的密码。
    (2)返回认证结果。

核心函数栈如下:

复制代码
PostmasterMain
  +--> ServerLoop
            +--> BackendStartup
                       +--> Initpostgres
                       |     +--> InitializeSessionUserId
                       +--> ClientAuthentication
                                    +--> load_hba
                                    +--> CheckPasswordAuth
                                    +--> CheckSCRAMAuth

客户端认证核心参数代码框架


代码框架

相关推荐
异世界贤狼转生码农1 小时前
MongoDB Windows 系统实战手册:从配置到数据处理入门
数据库·mongodb
QuZhengRong1 小时前
【数据库】Navicat 导入 Excel 数据乱码问题的解决方法
android·数据库·excel
码农阿豪1 小时前
Windows从零到一安装KingbaseES数据库及使用ksql工具连接全指南
数据库·windows
时序数据说7 小时前
时序数据库市场前景分析
大数据·数据库·物联网·开源·时序数据库
听雪楼主.10 小时前
Oracle Undo Tablespace 使用率暴涨案例分析
数据库·oracle·架构
我科绝伦(Huanhuan Zhou)10 小时前
KINGBASE集群日常维护管理命令总结
数据库·database
妖灵翎幺11 小时前
Java应届生求职八股(2)---Mysql篇
数据库·mysql
HMBBLOVEPDX11 小时前
MySQL的事务日志:
数据库·mysql
weixin_4196583113 小时前
MySQL数据库备份与恢复
数据库·mysql
专注API从业者14 小时前
基于 Flink 的淘宝实时数据管道设计:商品详情流式处理与异构存储
大数据·前端·数据库·数据挖掘·flink