您的位置:首页 > 数据库

postgresql 登录使用GSS方式验证的实现原理分析

2016-06-21 00:00 253 查看
postgresql登录验证功能提供了trust, reject, md5, password, gss, sspi,ident, peer, pam, ldap, radius,cert等多种验证方式。用户可以使用其中的任何一种方式用来进行登录验证,当然DBA可以针对不同的客户端采用不同的验证方式。本文主要介绍下GSS方式在postgresql中的实现原理。

1. GSS简介

GSS是Generic security service的简写,其API称为GSS-API(Generic Security service Application Program Interface)。GSS-API在对等应用程序之间提供安全通信。GSS-API还提供验证、完整性和保密性服务。在Solaris中实现的GSS-API可以使用Kerberos v5、SPNEGO和Diffie-Hellman加密。GSS-API主要用于设计或实现安全的应用程序协议。GSS-API可以向其他类型的协议(如SASL)提供服务。GSS-API通过SASL来向LDAP提供服务。更多可以参考oracle的文档说明

2. GSS使用的条件

GSS在默认条件下编译出来的数据库版本是不支持gss的。直接配置验证方式为gss会在启动时直接报如下的错误:



这是因为代码中使用了下面所示的宏来隔离GSS的相关的实现:



查看configure --help,可以看到有--with-gssapi的选项,通过这个选项来编译支持GSS。

3. 使用GSS的配置方法

postgresql的登录验证方式都是在pg_hba.conf文件中配置的,可以在对应的客户端的验证方式修改为GSS,如下所示:



从上面的内容,可以看到所有的客户端登录到服务端都是采用gss的验证方式的。也可以通过指定具体的IP地址来指定具体的客户端的验证方式。

4. GSS的建立过程

GSS的建立过程的说明是根据postgresql中的代码来说的,不同的程序可能有不同的建立的过程。

1)客户端先调用gss_import_name函数导入服务器的名称。



其中conn->krbsvrname默认情况下为NULL,conn->pghost是主机IP地址。

2)客户端调用gss_init_sec_context函数启动安全上下文



当成功创建上下文时,函数gss_init_sec_context返回GSS_S_COMPLETE,或者返回GSS_S_CONTINUE_NEEDED,需要继续调用函数来创建安全上下文。

3)服务端调用gss_accept_sec_context函数来接收安全上下文



其中port->gss->ctx是空上下文GSS_C_NO_CONTEXT ,port->gss->cred是缺省凭证GSS_C_NO_CREDENTIAL。gbuf保存从客户端发送过来的令牌。

4)服务端调用gss_display_name函数获取客户端名称



通过上面的函数调用,就把客户端的名称保存到了gbuf中。提取出客户端的用户名与服务端的用户名想比较,如果相同则验证通过,否则就出现错误。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: