文档章节

postgresql ident验证机制的实现

harris2016
 harris2016
发布于 2016/06/22 16:55
字数 655
阅读 14
收藏 0

  postgresql 数据库中提供了ident验证机制。postgresql中的ident验证机制的实现方式是向客户端的113号端口发送消息来查询系统用户信息。通过系统用户信息来验证客户的安全性。

1. 113号端口

   113号端口是一个许多计算机上运行的协议,用于鉴别TCP连接的用户。使用标准的这种服务可以获得许多计算机的信息。但是它可作为许多服务的记录器,尤其是FTP、POP、IMAP、SMTP和IRC等服务。

2. ident验证机制的使用

    1)配置pg_ident.conf文件

    这个文件配置的是系统用户与数据库用户之间的一种映射关系。这个文件的配置方法如下所示:

上面的例子是来自postgres官方文档,其中omicron是map name,一个map name可以对应多个系统用户与数据库用户的映射。在编写好这个映射文件后就需要配置pg_hba.conf文件。

2)配置pg_hba.conf文件

上图中172.30.12.0的客户端的验证方式是ident,map name为omicron。

3. 实现的原理

ident验证方式的实现函数是ident_inet。

1)创建一个socket

sock_fd = socket(ident_serv->ai_family, ident_serv->ai_socktype,
					 ident_serv->ai_protocol);
	if (sock_fd == PGINVALID_SOCKET)
	{
		ereport(LOG,
				(errcode_for_socket_access(),
				 errmsg("could not create socket for Ident connection: %m")));
		ident_return = false;
		goto ident_inet_done;
	}

2)绑定sock_fd到本地地址上面

rc = bind(sock_fd, la->ai_addr, la->ai_addrlen);
if (rc != 0)
{
	ereport(LOG,
			(errcode_for_socket_access(),
			 errmsg("could not bind to local address \"%s\": %m",
					local_addr_s)));
	ident_return = false;
	goto ident_inet_done;
}

3. 建立到客户端的连接

rc = connect(sock_fd, ident_serv->ai_addr,ident_serv->ai_addrlen);
if (rc != 0)
{
	ereport(LOG,
			(errcode_for_socket_access(),
			 errmsg("could not connect to Ident server at address \"%s\", port %s: %m",
					remote_addr_s, ident_port)));
	ident_return = false;
	goto ident_inet_done;
}

4.发送查询到客户端

/* The query we send to the Ident server */
snprintf(ident_query, sizeof(ident_query), "%s,%s\r\n",
		 remote_port, local_port);

/* loop in case send is interrupted */
do
{
	rc = send(sock_fd, ident_query, strlen(ident_query), 0);
} while (rc < 0 && errno == EINTR);

5. 接收并解析数据

do
{
	rc = recv(sock_fd, ident_response, sizeof(ident_response) - 1, 0);
} while (rc < 0 && errno == EINTR);

if (rc < 0)
{
	ereport(LOG,
			(errcode_for_socket_access(),
			 errmsg("could not receive response from Ident server at address \"%s\", port %s: %m",
					remote_addr_s, ident_port)));
	ident_return = false;
	goto ident_inet_done;
}

ident_response[rc] = '\0';
ident_return = interpret_ident_response(ident_response, ident_user);
if (!ident_return)
	ereport(LOG,
		(errmsg("invalidly formatted response from Ident server: \"%s\"",
				ident_response)));

接收到的数据类似于2000:USERID::harris\r\n这样的格式。其中2000是端口号,harris是系统用户名。通过interpret_ident_response函数解析出系统用户名。

6. 通过user map判断用户是否合法

if (ident_return)
		/* Success! Check the usermap */
		return check_usermap(port->hba->usermap, port->user_name, ident_user, false);

则合法就认为验证通过,否则认为验证失败。通过上面的整个过程来看ident的实现还是比较简单的。

 

© 著作权归作者所有

共有 人打赏支持
harris2016
粉丝 10
博文 53
码字总数 30227
作品 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
05/18
0
0
fedora 20中安装postgresql数据库

在fedora 20中在我2014-8-27日安装pg时,pg版本是9.3.5.1我不知是会由pg开发组自动更新还是别的,但安装后一般是最新的版本了。安装: yum install postgresql yum install postgresql-serv...

上海李浩
2014/08/27
0
1
PostgreSQL中路径相关的配置参数。

路径相关的配置参数主要有下面这几个: datadirectory : 数据库所在的目录。 configfile : 设置配置参数的文件。 hbafile : host based authentication文件。 identfile : ident身份验证相关...

zkill
2012/09/22
0
0
centos7部署posgresql和kong总结

  之前在macos系统测试安装psql和kong,但是实际环境中,大部分是部署在linux服务器上。下面记录了在centos7上部署postgresql和kong的总结以及遇到的一些问题的解决。 查看centos版本: $ ...

zhoujie0111
06/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

白话SpringCloud | 第十章:路由网关(Zuul)进阶:过滤器、异常处理

前言 简单介绍了关于Zuul的一些简单使用以及一些路由规则的简单说明。而对于一个统一网关而言,需要处理各种各类的请求,对不同的url进行拦截,或者对调用服务的异常进行二次处理等等。今天,...

oKong
28分钟前
1
0
详解nohup和& 区别

详解nohup和& 区别 2017年11月29日 16:57:38 King-Long 阅读数:7266 版权声明:本文为博主原创文章,欢迎转载。 https://blog.csdn.net/u011095110/article/details/78666833 nohup 一、【解...

linjin200
40分钟前
3
0
Character的static方法

基本类型char的包装类是Character,使用的比较多,大家是比较熟悉的。 我只是觉得里面有很多static方法,平时不怎么用,学习一下怎么实现的,或许日后就用到了。 static int compare(char x,...

woshixin
41分钟前
1
0
正则介绍_sed

10月17日任务 9.4/9.5 sed sed工具 匹配打印 -n 只打印匹配行,不然其他行也会打印出来 p 打印(配合-n使用) [root@centos7 tmp]# sed -n '/root/'p passwd root:x:0:0:root:/root:/bin/ba...

robertt15
41分钟前
2
0
轻松解码类似eval(function(p,a,c,k,e,d){}))的JavaScript代码

轻松解码类似eval(function(p,a,c,k,e,d){}))的JavaScript代码 2013年05月22日 15:18:05 秋实先生 阅读数:14826 这里解码百度访问统计代码构造函数为示例: 百度访问统计代码JavaScript源码:...

_纵横捭阖_
50分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部