• PostgreSQL 认证方式


    一、概述

    客户端的身份验证是由配置文件控制的,配置文件为pg_hba.conf,存放位置在数据目录下(show data_directory;)。
    在initdb初始化数据目录时,会生成一个默认的pg_hba.conf文件。也可以将该配置文件存放在其他地方。
    pg_hba.conf文件的常用格式是一组记录,每行一条。空白行和#注释字符后面的文本都将被忽略。
    每条记录指定连接类型、客户端IP地址范围、数据库名称、用户名以及匹配这些参数连接使用的认证方法。
    如果没有匹配的记录,访问将被拒绝。
    还可以当作黑白名单访问控制文件,可以限制某些IP的机器允许访问数据库。

    pg_hba.conf 文件示例:

    cat pg_hba.conf
    # TYPE  DATABASE        USER            ADDRESS                METHOD
    
    # "local" is for Unix domain socket connections only
    local   all             all                                     trust
    # IPv4 local connections:
    host    all             all             127.0.0.1/32            trust
    host    all             all             0/0                     md5
    # IPv6 local connections:
    host    all             all             ::1/128                 trust
    # Allow replication connections from localhost, by a user with the
    # replication privilege.
    local   replication     all                                     trust
    host    replication     all             127.0.0.1/32            trust
    host    replication     all             ::1/128                 trust
    
    ## ip/数值参数说明
    ip/32:表示只允许该ip地址访问,如:192.168.1.1
    host    all       all         192.168.1.1/32      md5
    
    ip/24:表示允许一个ip段之间的地址访问,如:192.168.1.1~192.168.1.255
    host    all       all         192.168.1.0/24      md5
    
    ip/16:表示允许两个ip段之间的地址访问,如:192.168.1.1~192.168.255.255
    host    all       all         192.168.0.0/16      md5
    
    ip/8:表示允许所有ip段之间的地址访问,如:192.1.1.1~192.255.255.255
    host    all       all         192.0.0.0/8         md5
    
    ip/0:表示允许所有ip地址访问
    host    all       all         0.0.0.0/0           md5
    
    • 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
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    二、认证方式

    2.1.trust

    无条件的允许连接。
    这种方法允许任何可以与PostgreSQL服务器连接的用户以任意PostgreSQL数据库用户身份登入,而不需要口令或者其他认证。
    此方式一般与UNIX域套接字的连接认证组合使用,对于单用户的本地连接是非常安全和方便的。
    为了防止系统其他普通用户连接到数据库,可以设置套接字文件(/tmp/.s.PGSQL.5432)的权限限制访问。
    可以设置unix_socket_directories和unix_socket_permissions参数(重启生效)或操作系统层面设置 chmod 770 .s.PGSQL.5432。

    ## 配置示例
    cat pg_hba.conf
    # "local" is for Unix domain socket connections only
    local   all             all                                     trust
    # IPv4 local connections:
    host    all             all             127.0.0.1/32            trust
    host    all             all             0/0                     trust
    
    ## 使更改生效
    pg_ctl reload
    
    ## 验证
    [postgres@postgresql ~]$ psql 
    psql (15.4)
    Type "help" for help.
    
    postgres=# 
    
    [postgres@postgresql ~]$ psql -h 192.168.80.239 -p 5432 postgres postgres
    psql (15.4)
    Type "help" for help.
    
    postgres=# 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    2.2.md5

    连接时需要提供口令进行验证,口令以md5方式加密,此方式安全性较高。

    ## 配置示例
    cat pg_hba.conf
    # "local" is for Unix domain socket connections only
    local   all             all                                     md5
    # IPv4 local connections:
    host    all             all             127.0.0.1/32            trust
    host    all             all             0/0                     md5
    
    ## 使更改生效
    pg_ctl reload
    
    ## 验证
    [postgres@postgresql ~]$ psql 
    Password for user postgres: 
    [postgres@postgresql ~]$ psql -h 192.168.80.239 -p 5432 postgres postgres
    Password for user postgres:
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    2.3.password

    连接时需要提供口令进行验证,口令以明文的形式在网络上传输,存在一定的安全隐患,不建议使用。

    ## 配置示例
    cat pg_hba.conf
    # "local" is for Unix domain socket connections only
    local   all             all                                     password
    # IPv4 local connections:
    host    all             all             127.0.0.1/32            trust
    host    all             all             0/0                     password
    
    ## 使更改生效
    pg_ctl reload
    
    ## 验证
    [postgres@postgresql ~]$ psql 
    Password for user postgres:
    [postgres@postgresql ~]$ psql -h 192.168.80.239 -p 5432 postgres postgres
    Password for user postgres:
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    2.4.reject

    无条件的拒绝连接。
    可以阻止一个特定的主机连接,而允许其他主机连接数据库,相当于设置了访问黑名单。

    ## 配置示例
    cat pg_hba.conf
    # "local" is for Unix domain socket connections only
    local   all             all                                     trust
    # IPv4 local connections:
    host    all             all             127.0.0.1/32            trust
    host    all             all             192.168.10.132          reject
    
    ## 使更改生效
    pg_ctl reload
    
    ## 验证
    会出现类似的错误现象:FATAL: pg hba.conf rejects connection for host "192.168.10.132",user "postgres", database "postgres", no encryption
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    2.5.ident

    ident认证方式是通过联系客户端的ident服务器获取客户端操作系统的用户名,并且检查它是否匹配被请求的数据库用户名。
    ident认证只能在TCP/IP连接上使用。当为本地连接指定这种认证方式时,将用peer认证来代替。
    服务器为了确定接收到的连接请求确实是客户端机器上的某个用户发起的,而不是这台机器上其他用户发起的假冒请求,会向客户端机器上的ident服务发起请求,让ident服务查看此TCP连接是否是该用户发起的,如果不是,则认证失败。
    如果客户端通过本地连接连接到服务器,因为客户端与服务器在同一台机器上,数据库服务器可以直接检查客户端用户的操作系统用户身份,就不需要向ident服务发送请求进行判断了。

    实际上每个类 Unix 操作系统都带着一个默认监听 TCP 113 端口的 ident 服务器。这个过程的缺点是它依赖于客户端的完整性:如果客户端机器不可信或者被攻破,攻击者可能在 113 端口上运行任何程序并且返回他们选择的任何用户。因此这种认证方法只适用于封闭的网络,这样的网络中的每台客户端机器都处于严密的控制下并且数据库和操作系统管理员操作时可以方便地联系。换句话说,你必须信任运行 ident 服务器的机器。

    此验证方式需要配合pg_ident.conf使用。
    (远程操作系统的当前用户名和数据库的用户名一致时,可以直接使用此用户名登录而不需要密码。)

    ## 安装oidentd服务
    yum install -y oidentd
    或
    rpm -ivh oidentd-2.0.8-20.el7.x86_64.rpm 
    
    ## 开启oidentd服务
    systemctl start oidentd.service
    systemctl status oidentd.service
    systemctl enable oidentd.service
    
    ss -tlnp | grep 113
    LISTEN     0      128         *:113         *:*           users:(("oidentd",pid=19188,fd=4))
    
    ## 配置示例
    cat pg_hba.conf
    # "local" is for Unix domain socket connections only
    local   all             all                                     trust
    # IPv4 local connections:
    host    all             all             127.0.0.1/32            trust
    host    all             all             0.0.0.0/0               ident map=cs
    
    cat pg_ident.conf
    # MAPNAME       SYSTEM-USERNAME         PG-USERNAME
    cs              postgres                postgres
    cs              admin                   test
    
    ## 使更改生效
    pg_ctl reload
    
    ## 验证
    [root@postgresql tmp]# su - postgres
    [postgres@postgresql ~]$ psql -U postgres -h 192.168.80.239 -p 5432
    psql (15.4)
    Type "help" for help.
     
    postgres=# select user;
       user   
    ----------
     postgres
    (1 row)
    
    [root@postgresql ~]# su - admin
    [admin@postgresql ~]$ psql -U test -h 192.168.80.239 -p 5432 postgres
    psql (15.4)
    Type "help" for help.
    
    postgres=> select user;
     user 
    ------
     test
    (1 row)
    
    • 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
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51

    2.6.peer

    从操作系统获得客户端的操作系统用户,并且检查它是否匹配被请求的数据库用户名,这只对本地连接可用。
    数据库端允许客户端上的特定操作系统用户连接到数据库。
    这种认证方式的使用场景如下:客户端是主机上某个操作系统用户,已经通过了操作系统的身份认证,是数据库服务器可以信任的用户,不需要在数据库层面再次检测其身份。

    ## 配置示例
    cat pg_hba.conf
    # "local" is for Unix domain socket connections only
    local   all             all                                     peer map=cs
    # IPv4 local connections:
    host    all             all             127.0.0.1/32            trust
    
    cat pg_ident.conf
    # MAPNAME       SYSTEM-USERNAME         PG-USERNAME
    cs              postgres                postgres
    cs              admin                   test
    
    ## 使更改生效
    pg_ctl reload
    
    ## 验证
    [root@postgresql tmp]# su - admin
    [admin@postgresql ~]$ psql -U test postgres
    psql (15.4)
    Type "help" for help.
    
    postgres=> select user;
     user 
    ------
     test
    (1 row)
    
    • 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
    • 26
  • 相关阅读:
    excel表格怎么求和一行
    wget同时下载多个文件
    AQS之排斥锁分析
    【干货】VS2017简介、编译、启动单项目和启动多项目
    北斗导航 | LAMBDA方法:整周模糊度估计——原理实现
    IDEA 之 在不更改操作系统用户名的情况下更改 ${USER} 变量?
    紫光同创FPGA 多路视频处理:图像缩放+视频拼接显示,OV7725采集,提供PDS工程源码和技术支持
    C++初识 - 引用
    Element+Vue+OpenLayers webgis实战
    安全测试工具分为 SAST、DAST和IAST 您知道吗?
  • 原文地址:https://blog.csdn.net/loveLAxin/article/details/134014744