暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PG数据库用户权限管理(中)

原创 唐祖亮 2020-06-14
1703

修改用户属性


ALTER USER role_specification [ WITH ] option [ ... ]

where option can be:

      SUPERUSER | NOSUPERUSER
    | CREATEDB | NOCREATEDB
    | CREATEROLE | NOCREATEROLE
    | INHERIT | NOINHERIT
    | LOGIN | NOLOGIN
    | REPLICATION | NOREPLICATION
    | BYPASSRLS | NOBYPASSRLS
    | CONNECTION LIMIT connlimit
    | [ ENCRYPTED ] PASSWORD 'password' | PASSWORD NULL
    | VALID UNTIL 'timestamp'

ALTER USER name RENAME TO new_name

ALTER USER { role_specification | ALL } [ IN DATABASE database_name ] SET configuration_parameter { TO | = } { value | DEFAULT }
ALTER USER { role_specification | ALL } [ IN DATABASE database_name ] SET configuration_parameter FROM CURRENT
ALTER USER { role_specification | ALL } [ IN DATABASE database_name ] RESET configuration_parameter
ALTER USER { role_specification | ALL } [ IN DATABASE database_name ] RESET ALL

where role_specification can be:

    role_name
  | CURRENT_USER
  | SESSION_USER

示例:
注意:option选项里的用户都可以通过alter role进行修改

修改用户为超级/非超级用户


alter role caocao with superuser/nosuperuser;

修改用户为可/不可登陆用户

alter role caocao with nologin/login;

修改用户名:


alter role caocao rename to youxing;

修改用户密码,移除密码用NULL


 alter role youxing with password 'youxing';

修改用户参数,该用户登陆后的以该参数为准


 alter role demo in database demo SET geqo to 0/default;

控制访问文件 pg_hba.conf


 
local      database  user  auth-method  [auth-options]
host       database  user  address  auth-method  [auth-options]
hostssl    database  user  address  auth-method  [auth-options]
hostnossl  database  user  address  auth-method  [auth-options]
host       database  user  IP-address  IP-mask  auth-method  [auth-options]
hostssl    database  user  IP-address  IP-mask  auth-method  [auth-options]
hostnossl  database  user  IP-address  IP-mask  auth-method  [auth-options]


local:匹配使用Unix域套接字的连接,如果没有此类型的记录,则不允许使用Unix域套接字连接。
host:匹配使用TCP/IP进行的连接,主机记录匹配SSL或非SSL连接,需要配置listen_addresses。
hostssl:匹配使用TCP/IP进行的连接,仅限于使用SSL加密进行连接,需要配置ssl参数。
hostnossl:匹配通过TCP/IP进行的连接,不使用SSL的连接。
database:匹配的数据库名称,all指定它匹配所有数据库。如果请求的数据库与请求的用户具有相同的名称则可以使用samerole值。复制(replication)不指定数据库,多个数据库可以用逗号分隔。
user:匹配的数据库用户名,值all指定它匹配所有用户。 可以通过用逗号分隔来提供多个用户名。
address:匹配的客户端计算机地址,可以包含主机名,IP地址范围。如:172.20.143.89/32、172.20.143.0/24、10.6.0.0/16、:: 1/128。 0.0.0.0/0表示所有IPv4地址,:: 0/0表示所有IPv6地址。要指定单个主机,请使用掩码长度32(对于IPv4)或128(对于IPv6)。all以匹配任何IP地址。
IP-address、IP-mask:这两个字段可用作IP地址/掩码长度,如:127.0.0.1 255.255.255.255。
auth-method:指定连接与此记录匹配时要使用的身份验证方法:trust、reject、scram-sha-256、md5、password、gss、sspi、ident、peer、ldap、radius、cert、pam、bsd。


trust:允许无条件连接,允许任何PostgreSQL用户身份登录,而无需密码或任何其他身份验证。
reject:拒绝任何条件连接,这对于从组中“过滤掉”某些主机非常有用。
scram-sha-256:执行SCRAM-SHA-256身份验证以验证用户的密码。
md5:执行SCRAM-SHA-256或MD5身份验证以验证用户的密码。
password:要提供未加密的密码以进行身份​​验证。由于密码是通过网络以明文形式发送的,因此不应在不受信任的网络上使用。
gss:使用GSSAPI对用户进行身份验证,这仅适用于TCP / IP连接。
sspi:使用SSPI对用户进行身份验证,这仅适用于Windows。
ident:通过联系客户端上的ident服务器获取客户端的操作系统用户名,并检查它是否与请求的数据库用户名匹配。 Ident身份验证只能用于TCP / IP连接。为本地连接指定时,将使用对等身份验证。
peer:从操作系统获取客户端的操作系统用户名,并检查它是否与请求的数据库用户名匹配。这仅适用于本地连接。
ldap:使用LDAP服务器进行身份验证。
radius:使用RADIUS服务器进行身份验证。
cert:使用SSL客户端证书进行身份验证。
pam:使用操作系统提供的可插入身份验证模块(PAM)服务进行身份验证。
bsd:使用操作系统提供的BSD身份验证服务进行身份验证。

auth-options:在auth-method字段之后,可以存在name = value形式的字段,用于指定认证方法的选项。
例子:


# TYPE  DATABASE    USER   ADDRESS   METHOD
local          all               all                         trust
--在本地允许任何用户无密码登录
local          all                all                        peer
--操作系统的登录用户和pg的用户是否一致,一致则可以登录
local          all                all                        ident
--操作系统的登录用户和pg的用户是否一致,一致则可以登录
host          all                all    192.168.163.0/24   md5
--指定客户端IP访问通过md5身份验证进行登录
host          all                all     192.168.163.132/32   password
--指定客户端IP通过passwotd身份验证进行登录

host    all             all     192.168.54.1/32         reject
host    all             all     192.168.0.0/16           ident  
host    all             all     127.0.0.1       255.255.255.255     trust
...

设置完之后可以通过查看表来查看hba:


demo=# select * from pg_hba_file_rules;
 line_number | type  |   database    | user_name |    address    |                 netmask                 | auth_method | options | error 
-------------+-------+---------------+-----------+---------------+-----------------------------------------+-------------+---------+-------
          87 | host  | {all}         | {all}     | 192.168.163.0 | 255.255.255.0                           | md5         |         | 
          92 | local | {all}         | {all}     |               |                                         | peer        |         | 
          94 | host  | {all}         | {all}     | 127.0.0.1     | 255.255.255.255                         | md5         |         | 
          96 | host  | {all}         | {all}     | ::1           | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff | md5         |         | 
          99 | local | {replication} | {all}     |               |                                         | peer        |         | 
         100 | host  | {replication} | {all}     | 127.0.0.1     | 255.255.255.255                         | md5         |         | 
         101 | host  | {replication} | {all}     | ::1           | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff | md5         |         | 

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


postgres=# select pg_reload_conf();
 pg_reload_conf 
----------------
 t

日常使用

现在按照一个正常项目上线的流程来创建一个应用账号为例,看看需要怎么操作。

比如一个项目demo上线:用管理账号来操作

创建数据库:


 postgres=# create database demo;
CREATE DATABASE

创建账号:账号和数据库名字保持一致(search_path)


 postgres=# create user demo with password 'demo';
CREATE ROLE

创建schema:不能用默认的public的schma


 postgres=# \c demo
You are now connected to database "demo" as user "postgres".
demo=# create schema demo;
CREATE SCHEMA

授权:

#访问库


demo=# grant connect on database demo to demo;
GRANT

#访问schmea


demo=# grant usage on schema demo to demo;
GRANT

#访问表


demo=# grant select,insert,update,delete on all tables in schema demo to demo;
GRANT

#如果访问自增序列,需要授权


demo=# grant select,update on all sequences in schema demo to demo;
GRANT

注意:上面的授权只对历史的一些对象授权,后期增加的对象是没有权限的,需要给个默认权限

#默认表权限


demo=# ALTER DEFAULT PRIVILEGES IN SCHEMA demo GRANT select,insert,update,delete ON TABLES TO demo;
ALTER DEFAULT PRIVILEGES

#默认自增序列权限


demo=# ALTER DEFAULT PRIVILEGES IN SCHEMA demo GRANT select,update ON sequences TO demo;
ALTER DEFAULT PRIVILEGES

查看用户的权限


testdb=> select * from information_schema.table_privileges where grantee='test';
 grantor  | grantee | table_catalog | table_schema | table_name | privilege_type | is_grantable | with_hierarchy 
----------+---------+---------------+--------------+------------+----------------+--------------+----------------
 test     | test    | testdb        | test         | t_test     | INSERT         | YES          | NO
 test     | test    | testdb        | test         | t_test     | SELECT         | YES          | YES
 test     | test    | testdb        | test         | t_test     | UPDATE         | YES          | NO
 test     | test    | testdb        | test         | t_test     | DELETE         | YES          | NO
 test     | test    | testdb        | test         | t_test     | TRUNCATE       | YES          | NO
 test     | test    | testdb        | test         | t_test     | REFERENCES     | YES          | NO
 test     | test    | testdb        | test         | t_test     | TRIGGER        | YES          | NO
 test     | test    | testdb        | test         | t2         | INSERT         | YES          | NO
 test     | test    | testdb        | test         | t2         | SELECT         | YES          | YES
 test     | test    | testdb        | test         | t2         | UPDATE         | YES          | NO
 test     | test    | testdb        | test         | t2         | DELETE         | YES          | NO
 test     | test    | testdb        | test         | t2         | TRUNCATE       | YES          | NO
 test     | test    | testdb        | test         | t2         | REFERENCES     | YES          | NO
 test     | test    | testdb        | test         | t2         | TRIGGER        | YES          | NO
 test     | test    | testdb        | test         | t3         | INSERT         | YES          | NO
 test     | test    | testdb        | test         | t3         | SELECT         | YES          | YES
 test     | test    | testdb        | test         | t3         | UPDATE         | YES          | NO
 test     | test    | testdb        | test         | t3         | DELETE         | YES          | NO
 test     | test    | testdb        | test         | t3         | TRUNCATE       | YES          | NO
(19 rows)
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论