一、用户权限管理
1.1 创建用户并授权
postgre中主要有create role和create user两个语法来创建角色或者用户,两者从功能上来讲基本一致,create user是create role的变种,唯一的区别是 create user 中默认为login,而create role默认为nologin。
1、create user语法
CREATE USER name [ [ WITH ] option [ ... ] ]
这里 option 可以是:
| SUPERUSER | NOSUPERUSER //是否为“超级账号”的权限,默认NOSUPERUSER
| CREATEDB | NOCREATEDB //是否可以创建数据库的权限,默认NOCREATEDB
| CREATEROLE | NOCREATEROLE //是否可以创建新用户的权限,默认NOCREATEROLE
| INHERIT | NOINHERIT //当该用户是其他用户的角色是,其他用户是否可以继承该用户的权限,默认INHERIT
| LOGIN | NOLOGIN //是否允许登录数据库,默认NOLOGIN
| REPLICATION | NOREPLICATION //是否具有复制相关权限,默认NOREPLICATION
| BYPASSRLS | NOBYPASSRLS //是否可以绕过安全策略,默认NOBYPASSRLS
| CONNECTION LIMIT connlimit //用户并发连接限制,默认-1表示无限制
| [ ENCRYPTED ] PASSWORD 'password' | PASSWORD NULL //用户密码设置
| VALID UNTIL 'timestamp' //密码失效日期
| IN ROLE role_name [, ...] //
| IN GROUP role_name [, ...] //是in role的一种已经废弃的写法
| ROLE role_name [, ...] //
| ADMIN role_name [, ...]
| USER role_name [, ...]
| SYSID uid
2、一些常见授权场景
1)创建数据库账号密码,该账号默认有读写权限
--创建用户并授权该用户
db1=# create user sansi_rw password '123';
CREATE ROLE
2)创建只读用户
- 创建一个用户名为sansi_ro,密码为123的用户
-- 创建只读数据库账号
CREATE USER sansi_ro WITH ENCRYPTED PASSWORD '123';
ALTER USER sansi_ro SET default_transaction_read_only=on;
-- 对只读数据库账号授予所有库把的usage权限
GRANT USAGE ON SCHEMA public to sansi_ro;
-- 进入到指定数据库,对只读账号授予该数据库下的查询权限
\c dbname
GRANT SELECT ON ALL TABLES IN SCHEMA public TO sansi_ro;
3)为已存在用户授予一些除DML权限之外的权限,如创建DB
alter user sansi_rw with CREATEDB;
1.2 postgres用户登录验证
1、pg_hba.conf文件
pg_hba.conf文件为pg的认证配置文件,无论是我们用户登录还是主从复制,都需要在该文件下填写相关的认证配置,保证可正常联通数据库。pg_hba.conf主要由5个参数组成:Type(主机类型)、Database(数据库名)、User(用户名)、Address(IP地址和掩码)、 Method(加密方法)
1)Type:指定允许的连接方式
"local"表示使用 Unix-domain socket 进行连接;
"host" 表示可以使用 ssl或者非ssl加密的 TCP/IP socket 进行连接;
"hostssl" 表示必须通过ssl加密的 TCP/IP socket 进行连接;
"hostnossl" 表示通过使用非ssl的 TCP/IP socket 进行连接。
2)Database : 指定允许访问数据库信息
可以为 “all”, “sameuser”, “samerole”, “replication”,或者业务数据库名称。“all"并不包括"replication”,若需要方通replication需要单独编写放通规则;多个数据库使用逗号分隔
3)User : 指定允许用户
表示认证配置的数据库用户信息,可以为"all"也可以指定某个数据库用户,多个用户授权可使用逗号分隔;可引用外部文件中配置信息信息认证配置,@${filename}
4)Address : 指定允许主机IP信息
表示认证配置的主机IP信息,可以是一个主机名,也可以是IP+掩码;0.0.0.0/0表示所有主机
5)Method : 指定认证策略
表示认证策略,可以设置为"trust", “reject”, “md5”, “password”, “scram-sha-256”, “gss”, “sspi”, “ident”, “peer”, “pam”, “ldap”, “radius” or “cert”;password表示以明文方式发送密码;
2、常见配置文件编写参考
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all postgres trust
local all all md5
# IPv4 local connections:
host all all 127.0.0.1/32 md5
host all all 0.0.0.0/0 md5
# IPv6 local connections:
host all all ::1/128 md5
# 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
【local all postgres trust】这条记录要注意,该记录存在一定的危险性,当我们忘记超级账号密码等情况我们可以新增该记录,在数据库服务器上免密登录数据库,进行账号密码修改。修改完配置文件后,记得使用 pg_ctl -reload,重新加载一下配置文件。