PostgreSql之连接访问权限

2,229 阅读4分钟

本文已参与好文召集令活动,点击查看:后端、大前端双赛道投稿,2万元奖池等你挑战!

若把数据库看做一间屋子的话,那今天学习的就是怎么灵活地控制屋子的门,让想进来的人可以进来。

涉及到了 postgresql.conf、pg_hba.conf、pg_ident.conf 三个文件。

postgresql.conf 文件

数据库集簇安装部署完成后,都要更改其中的监听地址,否则默认只监听数据库服务器本地地址,另外确保监听的端口号要通畅,不被防火墙或其他网络安全策略所限制。

listen_addresses = '*'
port = 5432

pg_hba.conf 文件

访问控制文件。

# TYPE       DATABASE      USER        ADDRESS      METHOD
 local            all       all                      ident
  host            all       all   127.0.0.1/32       trust
  host            all       all        ::1/128       trust
 local    replication       all                      trust
  host    replication       all   127.0.0.1/32       trust
  host    replication       all        ::1/128       trust

TYPE,数据库连接方式,有如下四种

  • local:匹配使用Unix域套接字的连接,如果没有此类型的记录,则不允许使用Unix域套接字连接。
  • host:匹配使用TCP/IP进行的连接,主机记录匹配SSL或非SSL连接,需要配置listen_addresses。
  • hostssl:匹配使用TCP/IP进行的连接,仅限于使用SSL加密进行连接,需要配置ssl参数。
  • hostnossl:匹配通过TCP/IP进行的连接,不使用SSL的连接。

DATABASE:指定哪些数据库可以被连接

  • 匹配的数据库名称,all指定它匹配所有数据库。
  • 复制(replication)不指定数据库。
  • 多个数据库可以用逗号分隔。

USER:指定哪些用户可以连接

  • 匹配的数据库用户名,all指定它匹配所有用户。
  • 可以通过用逗号分隔来提供多个用户名。

ADDRESS:指定哪些IP地址可以连接

  • 匹配的客户端计算机地址,all以匹配任何IP地址。
  • 0.0.0.0/0表示所有IPv4地址。
  • :: 0/0表示所有IPv6地址。
  • 192.168.100.101/32 允许这个ip登录。
  • 192.168.100.0/24 允许19.168.100.0~192.168.100.255网段登录数据库

METHOD:客户端认证方式

  • trust:只要知道数据库用户名就不需要密码或ident就能登录,建议不要在生产环境中使用。
  • md5:是常用的密码认证方式,如果你不使用ident,最好使用md5。密码是以md5形式传送给数据库,较安全,且不需建立同名的操作系统用户。
  • password:以明文密码传送给数据库,建议不要在生产环境中使用。
  • ident:Linux下PostgreSQL默认的local认证方式,凡是能正确登录操作系统用户(注:不是数据库用户)就能使用本用户映射的数据库用户不需密码登录数据库。操作系统名,数据库用户名,数据库名一致。
  • reject:拒绝认证,这对于从组中“过滤掉”某些主机非常有用。

修改完pg_hba.conf文件之后,需要重新加载配置,不用重启数据库:

select pg_reload_conf();

pg_ident.conf 文件

数据库映射文件,ident认证方式的扩展,标注操作系统用户与数据库用户的映射关系,配合pg_hba.conf使用。

pg_ident.conf 文件
# MAPNAME    SYSTEM-USERNAME    PG-USERNAME
      ss                aaa            test
      ss           postgres        postgres
      ss                syd             syd
      
pg_hba.conf 文件
# TYPE       DATABASE      USER        ADDRESS      METHOD
 local            all       all                      ident map=ss
  host            all       all   127.0.0.1/32       trust
  host            all       all        ::1/128       trust
 local    replication       all                      trust
  host    replication       all   127.0.0.1/32       trust
  host    replication       all        ::1/128       trust
  • MAPNAME:映射名,自定义配置在 pg_hba.conf 文件中。
  • SYSTEM-USERNAME:系统用户名。
  • PG-USERNAME :数据库用户名。

配置完成后,切换对应系统用户后即可直接通过psql命令,无需密码,连接访问数据库(每个用户的系统环境变量中已配置PGUSER,且数据库集簇中存在对应的用户和数据库)

--aaa 操作系统用户免密连接 test 数据库用户,登录 test 数据库。
[root@dj ~]# su - aaa
[aaa@dj ~]$ psql
psql (12.4)
Type "help" for help.
test=> select user;
user
------
test
(1 row)

--postgres 操作系统用户免密连接 postgres 数据库用户,登录 postgres 数据库。
[root@dj ~]# su - postgres
[postgres@dj ~]$ psql
psql (12.4)
Type "help" for help.
postgres=# select user;
user
----------
postgres
(1 row)

--syd 操作系统用户免密连接 syd 数据库用户,登录 syd 数据库。
[root@dj ~]# su - syd
[syd@dj ~]$ psql
psql (12.4)
Type "help" for help.
syd=> select user;
user
------
syd
(1 row)

最后补充下创建的数据库用户,需要有登录数据库的权限。PostgreSql中有用户(user)和角色(role)的概念,两者唯一区别为 user 建完后自带登录权限,而 role 需要额外授权登录权限,才可登录数据库。

--创建角色ce1,用户ce2。
postgres=# create role ce1 password 'ce1';
CREATE ROLE
postgres=# create user ce2 password 'ce2';
CREATE ROLE

--查看权限可发现角色ce1没有登录权限。
postgres=# \du
                                   List of roles
 Role name |                         Attributes                         | Member of 
-----------+------------------------------------------------------------+-----------
 ce1       | Cannot login                                               | {}
 ce2       |                                                            | {}
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 repmgr    | Superuser                                                  | {}
 syd       |                                                            | {}
 test      |                                                            | {}

--切换连接用户也可看到ce1角色没有登录权限。
postgres=# \c - ce1;
FATAL:  role "ce1" is not permitted to log in
Previous connection kept
postgres=# \c - ce2;
You are now connected to database "postgres" as user "ce2".
postgres=> \c - postgres

--ce1授予登录权限后,可切换。
postgres=# alter role ce1 with login;
ALTER ROLE
postgres=# \du
                                   List of roles
 Role name |                         Attributes                         | Member of 
-----------+------------------------------------------------------------+-----------
 ce1       |                                                            | {}
 ce2       |                                                            | {}
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 repmgr    | Superuser                                                  | {}
 syd       |                                                            | {}
 test      |                                                            | {}

postgres=# \c - ce2;
You are now connected to database "postgres" as user "ce2".