[转帖]PostgreSQL ident和peer基于操作系统用户的认证
PostgreSQL ident和peer基于操作系统用户的认证
https://yq.aliyun.com/articles/55898 其实 local和127. 还是有区别的 这里面应该就是对应了 local -> peer 127.0.0.1 -> ident 不同的登录方式 时用不同的认证方式.
摘要: PostgreSQL支持的认证方法非常多,除了自身的密码认证以外,还支持很多其他认证服务。 trust md5 password GSSAPI SSPI Ident Peer LDAP RADIUS PAM Certificate BSD 详见https://
PostgreSQL支持的认证方法非常多,除了自身的密码认证以外,还支持很多其他认证服务。
trust
md5
password
GSSAPI
SSPI
Ident
Peer
LDAP
RADIUS
PAM
Certificate
BSD
详见
https://www.postgresql.org/docs/9.6/static/auth-methods.html
本文主要给大家讲一下ident认证和peer认证。
ident和peer认证的原理
这两种认证方法的目的是获取客户端连接数据库的操作系统用户,检查MAP中是否存在,判断是否允许连接数据库。
ident 认证,客户端和数据库建立TCP会话后(假设会话的连接信息是client_ip:12345 <-> db_ip:5432),数据库通过ident协议询问客户端所在IP地址的ident server (默认是113监听端口),询问内容:使用client_ip:12345端口连接db_ip:5432的操作系统用户是谁?
协议可以参考一下RFC 文档。
如图: 
peer认证,目的和ident认证一样,都是要拿到客户端的操作系统用户名,只不过peer对应的是unix socket连接(客户端和数据库在同一个操作系统中),所以是通过系统调用来获取客户端的用户名,系统调用是getpeereid().
如图: 
在获取到客户端的OS用户名之后,PostgreSQL会通过pg_hba.conf中配置的map名与pg_ident.conf中配置的映射关系,以及客户端提供的数据库用户名,判断是否允许登陆数据库。
如图 
例子
我这里举一个peer认证的例子
postgresql.conf
#ident_file = 'ConfigDir/pg_ident.conf'
pg_hba.conf
# TYPE DATABASE USER ADDRESS METHOD
local all all ident map=mm
pg_ident.conf
# MAPNAME SYSTEM-USERNAME PG-USERNAME
mm digoal postgres
这个配置的含义:
当客户端使用unix socket连接数据库时,使用ident认证。 当客户端的OS用户是digoal时,允许它以数据库用户postgres连接数据库。
$ whoami
digoal
$ psql -h $PGDATA -p 1921 -U postgres
psql (9.5.3)
Type "help" for help.
当连接的数据库用户不在map中时,报错。
$ psql -h $PGDATA -p 1921 -U digoal
psql: FATAL: Peer authentication failed for user "digoal"
pg_ident.conf还支持规则表达式,具体用法见
https://www.postgresql.org/docs/9.6/static/auth-username-maps.html
https://www.postgresql.org/docs/9.6/static/functions-matching.html#POSIX-SYNTAX-DETAILS
ident的方法略复杂,需要在客户端部署ident server,可参考以下文档进行配置
https://wiki.archlinux.org/index.php/Identd_Setup
小结
- ident针对TCP会话,即通过TCP连接数据库时。
- peer针对UNIX SOCKET会话,即通过unix socket 连接数据库时。
安全建议
如果你的主机是数据库和其他业务共用,或者你不太相信你的OS环境的话,如何加固你的数据库呢?
假设ROOT用户是可信任的,启动数据库的digoal用户是可信任的,你可以这样加固。
禁止所有的trust认证,同时对root和digoal用户,使用peer认证方法。
其他用户要连,对不起,不允许,请提供密码。
(这种加固,仅仅针对不能修改pg_hba.conf的用户,所以说root和启动数据库的用户必须是可信任的)
例子
.1. 使用某个非启动数据库的普通用户通过unix socket连接并监控数据库。
root 超级用户
digoal 启动数据库的用户
nobody 某监控用户(没有login shell,不允许登陆)
配置
允许nobody使用postgres用户,通过unix socket连接数据库.
nobody 是不允许登陆shell的,但是可以用它来执行监控脚本。 如下
postgresql.conf
#ident_file = 'ConfigDir/pg_ident.conf'
pg_hba.conf
# TYPE DATABASE USER ADDRESS METHOD
local all all ident map=mm
pg_ident.conf
# MAPNAME SYSTEM-USERNAME PG-USERNAME
mm digoal postgres
mm nobody postgres
监控脚本示例
cp -r /home/digoal/pgsql9.5 /tmp
vi /tmp/test.sh
#!/bin/bash
export LD_LIBRARY_PATH=/tmp/pgsql9.5/lib:$LD_LIBRARY_PATH
export PATH=/tmp/pgsql9.5/bin:$PATH
for ((i=1;i>0;))
do
psql -h /tmp -p 1921 -U postgres postgres -c "select now();" >> /tmp/pg_1921.log 2>&1
sleep 1
done
chown nobody test.sh
chmod 700 test.sh
以nobody用户运行监控脚本
# sudo -u nobody -s bash -c "nohup /tmp/test.sh >/dev/null 2>&1 &"
参考
https://wiki.archlinux.org/index.php/Identd_Setup
https://www.postgresql.org/docs/9.6/static/auth-methods.html#AUTH-IDENT
https://www.postgresql.org/docs/9.6/static/auth-username-maps.html
[转帖]PostgreSQL ident和peer基于操作系统用户的认证的更多相关文章
- [转帖]PostgreSQL 昨天,今天和明天
PostgreSQL 昨天,今天和明天 http://www.postgres.cn/v2/news/viewone/1/52 原作者:何伟平(laser) 创作时间:2005-01-15 11:44 ...
- GJM :用JIRA管理你的项目(三)基于LDAP用户管理 [转载]
感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...
- SharePoint 2013 配置基于AD的Form认证
前 言 配置SharePoint 2013基于AD的Form认证,主要有三步: 1. 修改管理中心的web.config: 2. 修改STS Application的web.config: 3. 修改 ...
- 问题: Oracle Database 10g 未在当前操作系统中经过认证
问题: Oracle Database 10g 未在当前操作系统中经过认证 在Windows 7中安装Oracle 10g. 使用的Orcale版本是10g. 步骤1: 在Orcale官网上下载,下载 ...
- EBS R12.2安装,使用的操作系统用户
在安装时,错误使用了oracle rdbms的对应的操作系统用户,导致安装前,验证时"web server install prerequisites"选项验证失败: (本图其它两 ...
- WebService基于SoapHeader实现安全认证(一)
本文转载:http://www.cnblogs.com/houleixx/archive/2009/08/22/webservice-soapheader-security.html WebServi ...
- sharepoint:基于AD的FORM认证
//来源:http://www.cnblogs.com/jindahao/archive/2012/05/07/2487351.html 需求: 1. 认证要基于AD 2. 登入方式要页面的方式(fo ...
- oracle高级查询(实例基于scott用户四张表)
oracle高级查询(实例基于scott用户四张表) 分组查询 多表查询 子查询 综合实例 ====================================================== ...
- Asp.Net Core 2.0 项目实战(10) 基于cookie登录授权认证并实现前台会员、后台管理员同时登录
1.登录的实现 登录功能实现起来有哪些常用的方式,大家首先想到的肯定是cookie或session或cookie+session,当然还有其他模式,今天主要探讨一下在Asp.net core 2.0下 ...
随机推荐
- 一种循环C字符数组的骚操作
#include <stdio.h> #include <stdlib.h> int main() { char wenwa[] = "程劲小盆友在做什么" ...
- 【NOIP2016提高A组模拟8.17】(雅礼联考day1)总结
考的还ok,暴力分很多,但有点意外的错误. 第一题找规律的题目,推了好久.100分 第二题dp,没想到. 第三题树状数组.比赛上打了个分段,准备拿60分,因为时间不够,没有对拍,其中有分段的20分莫名 ...
- python+selenium封装UI自动化框架
seleinum框架 框架的思想: 解决我们测试过程中的问题:大量的重复步骤,用自动化来实现 1)配置和程序的分离 2)测试数据和程序的分离 3)不懂编程的人员可以方便使用:使用的 ...
- [人物存档]【AI少女】【捏脸数据】两个人物
点击下载(城通网盘):8bcd58f40ad162d9c1fd6f641edfa9ec8b13cdf8.png 点击下载(城通网盘):AISChaF_20191110015122738.png
- registry搭建及镜像管理
registry 的搭建 docker pull registry:2 docker run -d -v /opt/registry:/var/lib/registry -p 5000:5000 -- ...
- floor函数用法
floor(x),也写做Floor(x),其功能是“向下取整”,或者说“向下舍入”,即取不大于x的最大整数(与“四舍五入”不同,下取整是直接取按照数轴上最接近要求值的左边值,即不大于要求值的最大的那个 ...
- Android学习笔记之数据的Sdcard存储方法及操作sdcard的工具类
FileService.java也就是操作sdcard的工具类: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 ...
- JMS学习八(ActiveMQ消息持久化)
ActiveMQ的消息持久化机制有JDBC,AMQ,KahaDB和LevelDB,还有一种内存存储的方式,由于内存不属于持久化范畴,而且如果使用内存队列,可以考虑使用更合适的产品,如ZeroMQ.所以 ...
- 20道JS原理题助你面试一臂之力!(转)
20道JS原理题助你面试一臂之力! 前言 本文针对目前常见的面试题,仅提供了相应的核心原理及思路,部分边界细节未处理.后续会持续更新,希望对你有所帮助. 1. 实现一个call函数 // 思路:将要改 ...
- tp 下载
public function download() { //文件名 $filename=input('filename'); // $file_dir = $_SERVER["DOCUME ...