文档章节

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

harris2016
 harris2016
发布于 2016/06/21 15:37
字数 712
阅读 83
收藏 0

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中。提取出客户端的用户名与服务端的用户名想比较,如果相同则验证通过,否则就出现错误。

 

© 著作权归作者所有

harris2016
粉丝 10
博文 54
码字总数 30661
作品 0
杭州
程序员
私信 提问
PostgreSQL DBA(44) - Privileges & User Management

本文简单介绍了PostgreSQL的权限和用户管理基础知识,原文详见 PostgreSQL Privileges & User Management - What You Should Know ,有所删减和调整. Roles PostgreSQL使用基于角色的权限管理系...

设计费
06/28
0
0
PostgreSQL连接和认证选项

Linux下面经常用到psql命令。 切换Linux系统账号到root账号。 该账号下即可输入psql命令。演示代码如下 psql帮助信息如下 PostgreSQL默认不允许非本机连接,非本机连接数据库服务器需要修改p...

白豆腐徐长卿
2017/11/06
0
0
如何打造 PostgreSQL 闪回环境?

作者介绍 Lottu(乐途),目前就职于深圳宜搜科技有限公司,担任数据库DBA,主要承PostgreSQL、Oracle数据库维护工作以及数据库去O工作。 引言 在 PostgreSQL 数据库;目前是不支持类似 Oracle...

PostgreSQL中文社区
01/16
0
0
pgsql ident鉴权方式实现无密码登录,无需.pgpass

PostgreSQL 命令行 psql,pg_dump等不支持口令参数,也就无法像mysql那样无需人工干预(输入口令)执行备份、恢复数据库的命令。 网上搜索有多种解决办法,比如通过设置PostgreSQL的环境变量...

mark35
2012/05/24
0
0
PostgreSQL远程连接配置管理/账号密码分配(解决:致命错误: 用户 "postgres" Ident 认证失败)

问题:致命错误: 用户 "postgres" Ident 认证失败 说明:这个是由于没有配置远程访问且认证方式没改造成的,只需要更改使用账号密码认证即可。 解决:找到pghba.conf(find / -name pghba.co...

easonjim
2018/05/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

抽象同步队列AQS——AbstractQueuedSynchronizer锁详解

AQS——锁的底层支持 谈到并发,不得不谈ReentrantLock;而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)! 类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资...

须臾之余
今天
3
0
springboot配置百度UEditor 富文本详解

富文本简介 UEditor是由百度web前端研发部开发所见即所得富文本web编辑器,具有轻量,可定制,注重用户体验等特点,开源基于MIT协议,允许自由使用和修改代码... 准备工作 ueditor需要单独文...

wotrd
昨天
4
0
mysql 5.7之my.cnf配置大全

[client]port = 3306socket = /tmp/mysql.sock[mysqld]###############################基础设置######################################Mysql服务的唯一编号 每个mysql服务...

Online_Reus
昨天
3
0
MAVEN打包时引入外部链接的包

1.项目引入了ORACLE的jar包,MAVEN配置如下 2.打jar包的时候需要指定下main入口函数mainClass <dependency> <groupId>com.oracle</groupId> <artifactId>ojdbc6</artifactId> ......

Cobbage
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部