postgresql登陆验证功能提供了trust, reject, md5, password, gss, sspi,ident, peer, pam, ldap, radius,cert等多种验证方式。用户可使用其中的任何一种方式用来进行登陆验证,固然DBA能够针对不一样的客户端采用不一样的验证方式。本文主要介绍下GSS方式在postgresql中的实现原理。html
GSS是Generic security service的简写,其API称为GSS-API(Generic Security service Application Program Interface)。GSS-API在对等应用程序之间提供安全通讯。GSS-API还提供验证、完整性和保密性服务。在Solaris中实现的GSS-API可使用Kerberos v五、SPNEGO和Diffie-Hellman加密。GSS-API主要用于设计或实现安全的应用程序协议。GSS-API能够向其余类型的协议(如SASL)提供服务。GSS-API经过SASL来向LDAP提供服务。更多能够参考oracle的文档说明。sql
GSS在默认条件下编译出来的数据库版本是不支持gss的。直接配置验证方式为gss会在启动时直接报以下的错误:数据库
这是由于代码中使用了下面所示的宏来隔离GSS的相关的实现:api
查看configure --help,能够看到有--with-gssapi的选项,经过这个选项来编译支持GSS。安全
postgresql的登陆验证方式都是在pg_hba.conf文件中配置的,能够在对应的客户端的验证方式修改成GSS,以下所示:服务器
从上面的内容,能够看到全部的客户端登陆到服务端都是采用gss的验证方式的。也能够经过指定具体的IP地址来指定具体的客户端的验证方式。oracle
GSS的创建过程的说明是根据postgresql中的代码来讲的,不一样的程序可能有不一样的创建的过程。ide
1)客户端先调用gss_import_name函数导入服务器的名称。函数
其中conn->krbsvrname默认状况下为NULL,conn->pghost是主机IP地址。post
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中。提取出客户端的用户名与服务端的用户名想比较,若是相同则验证经过,不然就出现错误。