本文介绍如何创建用户,查看用户,授权权限和pg_hba.conf配合修改以及删除用户一些用户相关的测试。
目录
Greenplum用户管理和权限管理
1 role和权限
1.1 角色和权限的安全最佳实践
1.2角色的属性
1.3 角色的继承性
1.4 对象权限
1.5 用户和角色区别
2 相关测试
2.1 创建一个登录角色
2.2 为test(create role)创建的role赋予login权限和create db权限
2.3 修改用户和role的密码
2.4 赋予其他权限的测试
2.5 创建Groups
2.6 注意地方
2.7 创建role和修改pg_hba.conf的测试
Greenplum数据库使用roles管理数据库访问权限。角色的概念包含用户和组的概念。一个角色可以是一个数据库用户、一个数据库组或者两者间距。角色可以拥有数据库对象(例如表),并可以将这些对象上的权限赋予其他角色,依此来控制对对象的访问。角色可以是其他角色的成员,因此成员角色可以继承其父角色的对象权限。
Greenplum数据库使用roles管理数据库访问权限。角色的概念包含用户和组的概念。一个角色可以是一个数据库用户、一个数据库组或者两者间距。角色可以拥有数据库对象(例如表),并可以将这些对象上的权限赋予其他角色,依此来控制对对象的访问。角色可以是其他角色的成员,因此成员角色可以继承其父角色的对象权限。
为登录的每个用户分配不同的角色。为了记录和审计,允许每个允许登录Greenplum数据库的用户拥有自己的数据库角色。对于应用程序或Web服务,考虑为每个应用程序或服务创建不同的角色。
使用组来管理访问权限。
限制具有SUPERUSER角色属性的用户
属性 | 描述 |
---|---|
SUPERUSER | NOSUPERUSER | 确定角色是否为超级用户。您必须自己是超级用户才能创建新的超级用户。默认值是NOSUPERUSER。 |
CREATEDB | NOCREATEDB | 确定是否允许角色创建数据库。默认值是NOCREATEDB。 |
CREATEROLE | NOCREATEROLE | 确定是否允许角色创建和管理其他角色。默认值是NOCREATEROLE。 |
INHERIT | NOINHERIT | 确定角色是否继承其所属角色的权限。 具有INHERIT属性的角色继承可以自动使用已授予其直接或间接成员的所有角色的任何数据库权限。 默认值是INHERIT。 |
LOGIN | NOLOGIN | 确定是否允许角色登录。具有该LOGIN属性的角色可以被认为是用户。没有此属性的角色对于管理数据库权限(组)非常有用。 默认值是NOLOGIN。 |
CONNECTION LIMIT connlimit | 如果角色可以登录,则指定角色可以使用的并发连接数。默认值-1表示没有限制。 |
CREATEEXTTABLE | NOCREATEEXTTABLE | 确定是否允许角色创建外部表。 默认值是NOCREATEEXTTABLE。具有该CREATEEXTTABLE属性的角色,默认外部表类型是可读的,注意使用文件或执行的外部表只能由超级用户创建。 |
PASSWORD 'password' | 设置角色的密码。如果您不打算使用密码身份验证,则可以省略此选项。 如果未指定密码,则密码将设置为空,并且该用户的密码验证将始终失败。可以选择将空密码明确写为PASSWORD NULL。 |
ENCRYPTED | UNENCRYPTED | 控制是否将新密码在pg_authid系统目录中存储为哈希字符串。如果没有指定ENCRYPTED,或者指定UNENCRYPTED,则默认行为由password_encryption配置参数决定,该参数默认值为on。如果提供password字符串已经是哈希格式,无论是否指定ENCRYPTED或UNENCRYPTED都原样存储。有关保护登录密码的其他信息,参阅保护Greenplum数据库中的密码。 |
VALID UNTIL 'timestamp' | 设置角色密码失效的日期和时间。如果省略,密码将始终有效。 |
RESOURCE QUEUE queue_name | 将角色分配给指定的资源队列以进行工作负载管理。任何角色问题的声明都受资源队列限制的约束。 注意RESOURCE QUEUE属性不可继承; 必须为每个用户级别(LOGIN)角色分别设置。 |
DENY {deny_interval | deny_point} | 限制时间间隔期间的访问,按日期或日期时间指定 |
角色属性LOGIN、SUPERUSER、CREATEDB、CREATEROLE、CREATEEXTTABLE和RESOURCEQUEUE永远不会像数据库对象上的普通权限那样被继承。用户成员实际上必须SET ROLE具有这些属性的特定角色,才能使用该属性。
对象类型 | 权限 |
---|---|
表、视图、序列 | SELECT INSERT UPDATE DELETE RULE ALL |
外部表 | SELECT RULE ALL |
数据库 | CONNECT CREATE TEMPORARY | TEMP ALL |
函数 | EXECUTE |
过程语言 | USAGE |
模式 | CREATE USAGE ALL |
自定义协议 | SELECT INSERT UPDATE DELETE RULE ALL |
对象权限对象类型权限表、视图、序列SELECTINSERTUPDATEDELETERULEALL外部表SELECTRULEALL数据库CONNECTCREATETEMPORARY|TEMPALL函数EXECUTE过程语言USAGE模式CREATEUSAGEALL自定义协议SELECTINSERTUPDATEDELETERULEALLNote:您必须单独为每个对象授予权限。例如,授予数据库上ALL权限,并不授予对该数据库中的对象的完全访问权限。它只授予数据库级别的(CONNECT、CREATE、TEMPORARY)到数据库本身的权限。
角色概念把用户(user)和组(group)的概念包括在内。一个角色可能是一个数据库用户、一个组或者两者兼具。角色可以拥有数据库对象(例如表)并且可以那些对象上的特权分配给其他角色来控制对对象的访问。角色可以是其他角色的成员,因此一个成员角色能够继承其父角色的对象特权。
在greenplum后续版本中,已经将使用role取代了user,所以创建用户就是create role:
role可以分为登录角色和组角色,
CREATE ROLE创建的用户默认不带LOGIN属性,而CREATE USER创建的用户默认带有LOGIN属性
Greenplum数据库不支持行级访问或行级标记的安全性。可以使用视图来限制所选行的行来模拟行级访问。
用户级角色被视为可以登录数据库并启动数据库会话的数据库角色。因此,当你使用CREATE ROLE命令创建新的用户级角色时,必须指定LOGIN权限。例如:
create role test_login_role with login; create role test ; create user testuer; \du archdata=# create role test_login_role with login; NOTICE: resource queue required -- using default resource queue "pg_default" CREATE ROLE archdata=# create role test ; NOTICE: resource queue required -- using default resource queue "pg_default" CREATE ROLE archdata=# create user testuer; NOTICE: resource queue required -- using default resource queue "pg_default" CREATE ROLE archdata=# archdata=# \du List of roles Role name | Attributes | Member of -----------------+---------------------------------------------------------------------------------------------------------------------------------+----------- gpadmin | Superuser, Create role, Create DB, Ext gpfdist Table, Wri Ext gpfdist Table, Ext http Table, Ext hdfs Table, Wri Ext hdfs Table | {} gpmon | Superuser, Create DB | {} test | Cannot login | {} test_login_role | | {} testuer | | {} archdata=# archdata=#
说明默认的创建role是没有login权限,创建user是有的。
alter role test createdb login; ^ archdata=# alter role test createdb login; ALTER ROLE archdata=# archdata=# archdata=# archdata=# archdata=# du archdata-# \du List of roles Role name | Attributes | Member of -----------------+---------------------------------------------------------------------------------------------------------------------------------+----------- gpadmin | Superuser, Create role, Create DB, Ext gpfdist Table, Wri Ext gpfdist Table, Ext http Table, Ext hdfs Table, Wri Ext hdfs Table | {} gpmon | Superuser, Create DB | {} test | Create DB | {} test_login_role | | {} testuer | | {} archdata-# \x Expanded display is on. archdata-# \du List of roles ... -[ RECORD 3 ]------------------------------------------------------------------------------------------------------------------------------- Role name | test Attributes | Create DB Member of | {} -[ RECORD 4 ]------------------------------------------------------------------------------------------------------------------------------- Role name | test_login_role Attributes | Member of | {} -[ RECORD 5 ]------------------------------------------------------------------------------------------------------------------------------- Role name | testuer Attributes | Member of | {}
alter user testuer PASSWORD '123456'; alter role test PASSWORD '123456'; archdata=# alter user testuer PASSWORD '123456'; ALTER ROLE archdata=# alter role test PASSWORD '123456'; ALTER ROLE archdata=#
\du alter user testuer WITH CREATEROLE; -- /*赋予创建角色的权限*/ alter role test WITH CREATEROLE; -- /*赋予创建角色的权限*/ alter user testuer WITH PASSWORD '654321';/*修改密码* ALTER ROLE test VALID UNTIL 'JUL 7 14:00:00 2020 +8'; /*设置角色的有效期* ALTER ROLE testuer DENY DAY 'Sunday'; --/* 限制时间间隔期间的访问,按日期或日期时间指定 */ \du archdata=# alter user testuer WITH CREATEROLE; ALTER ROLE archdata=# alter role test WITH CREATEROLE; ALTER ROLE archdata=# alter user testuer WITH PASSWORD '654321'; ALTER ROLE archdata=# ALTER ROLE test VALID UNTIL 'JUL 7 14:00:00 2020 +8'; ALTER ROLE archdata=# ALTER ROLE testuer DENY DAY 'Sunday'; ALTER ROLE archdata=# \du List of roles -[ RECORD 1 ]------------------------------------------------------------------------------------------------------------------------------- Role name | gpadmin Attributes | Superuser, Create role, Create DB, Ext gpfdist Table, Wri Ext gpfdist Table, Ext http Table, Ext hdfs Table, Wri Ext hdfs Table Member of | {} -[ RECORD 2 ]------------------------------------------------------------------------------------------------------------------------------- Role name | gpmon Attributes | Superuser, Create DB Member of | {} -[ RECORD 3 ]------------------------------------------------------------------------------------------------------------------------------- Role name | test Attributes | Create role, Create DB Member of | {} -[ RECORD 4 ]------------------------------------------------------------------------------------------------------------------------------- Role name | test_login_role Attributes | Member of | {} -[ RECORD 5 ]------------------------------------------------------------------------------------------------------------------------------- Role name | testuer Attributes | Create role Member of | {} archdata=#
Role也是一个Group,使用GRANT和REVOKE来增加和删除role。 例如: =# CREATE ROLE admin1 CREATEROLE CREATEDB CREATEEXTTABLE ; =# GRANT admin1 TO test, testuer; =# REVOKE admin FROM testuer; 可以针对独立对象权限进行授权: =# GRANT ALL ON TABLE mytable TO admin; =# GRANT ALL ON SCHEMA myschema TO admin; =# GRANT ALL ON DATABASE mydb TO admin;
角色属性LOGIN、SUPERUSER、CREATEDB、 CREATEROLE、CREATEEXTTABLE和RESOURCE QUEUE 永远不会像数据库对象上的普通权限那样被继承。用户成员实际上必须SET ROLE具有这些属性的特定角色,才能使用该属性。在上面的例子中,我们给出了CREATEDB和CREATEROLE到了admin角色。如果sally是admin角色的成员,她可以发出以下命令来承担父角色的角色属性:
=> SET ROLE admin;
create role yanwei with login password 'yanwei'; archdata=# alter role yanwei createdb createrole; -[ RECORD 8 ]------------------------------------------------------------------------------------------------------------------------------- Role name | yanwei Attributes | Create role, Create DB Member of | {} archdata-# vim /data/master/gpseg-1/pg_hba.conf host all gpadmin 10.102.254.24/32 md5 host all yanwei 10.102.254.24/32 md5 :wq! [gpadmin@mdw gpseg-1]$ gpstop -u 20200503:22:35:43:024417 gpstop:mdw:gpadmin-[INFO]:-Starting gpstop with args: -u 20200503:22:35:43:024417 gpstop:mdw:gpadmin-[INFO]:-Gathering information and validating the environment... 20200503:22:35:43:024417 gpstop:mdw:gpadmin-[INFO]:-Obtaining Greenplum Master catalog information 20200503:22:35:43:024417 gpstop:mdw:gpadmin-[INFO]:-Obtaining Segment details from master... 20200503:22:35:43:024417 gpstop:mdw:gpadmin-[INFO]:-Greenplum Version: 'postgres (Greenplum Database) 5.10.2 build commit:b3c02f3acd880e2d676dacea36be015e4a3826d4' 20200503:22:35:43:024417 gpstop:mdw:gpadmin-[INFO]:-Signalling all postmaster processes to reload . [gpadmin@mdw gpseg-1]$ [gpadmin@mdw gpseg-1]$ vim pg_hba.conf host all gpadmin 10.102.254.27/32 md5 host all yanwei 10.102.254.27/32 md5 [gpadmin@mdw gpseg-1]$ gpstop -u 20200503:22:35:43:024417 gpstop:mdw:gpadmin-[INFO]:-Starting gpstop with args: -u 20200503:22:35:43:024417 gpstop:mdw:gpadmin-[INFO]:-Gathering information and validating the environment... 20200503:22:35:43:024417 gpstop:mdw:gpadmin-[INFO]:-Obtaining Greenplum Master catalog information 20200503:22:35:43:024417 gpstop:mdw:gpadmin-[INFO]:-Obtaining Segment details from master... 20200503:22:35:43:024417 gpstop:mdw:gpadmin-[INFO]:-Greenplum Version: 'postgres (Greenplum Database) 5.10.2 build commit:b3c02f3acd880e2d676dacea36be015e4a3826d4' 20200503:22:35:43:024417 gpstop:mdw:gpadmin-[INFO]:-Signalling all postmaster processes to reload . [gpadmin@mdw gpseg-1]$ psql -U yanwei -h 10.102.254.24 -d archdata psql: could not connect to server: Connection refused Is the server running on host "10.102.254.24" and accepting TCP/IP connections on port 5432? [gpadmin@mdw gpseg-1]$ vim pg_hba.conf [gpadmin@mdw gpseg-1]$ psql -U yanwei -h 10.102.254.27 -d archdata psql: FATAL: no pg_hba.conf entry for host "10.102.254.27", user "yanwei", database "archdata", SSL off [gpadmin@mdw gpseg-1]$ gpstop -u 20200503:22:37:26:024512 gpstop:mdw:gpadmin-[INFO]:-Starting gpstop with args: -u 20200503:22:37:26:024512 gpstop:mdw:gpadmin-[INFO]:-Gathering information and validating the environment... 20200503:22:37:26:024512 gpstop:mdw:gpadmin-[INFO]:-Obtaining Greenplum Master catalog information 20200503:22:37:26:024512 gpstop:mdw:gpadmin-[INFO]:-Obtaining Segment details from master... 20200503:22:37:26:024512 gpstop:mdw:gpadmin-[INFO]:-Greenplum Version: 'postgres (Greenplum Database) 5.10.2 build commit:b3c02f3acd880e2d676dacea36be015e4a3826d4' 20200503:22:37:26:024512 gpstop:mdw:gpadmin-[INFO]:-Signalling all postmaster processes to reload . [gpadmin@mdw gpseg-1]$ psql -U yanwei -h 10.102.254.27 -d archdata Password for user yanwei: psql (8.3.23) Type "help" for help. archdata=> archdata=> select * from current_user archdata-> ; current_user -------------- yanwei (1 row) archdata=> select * from pg_stat_activity ; datid | datname | procpid | sess_id | usesysid | usename | current_query | waiting | query_start | backend_start | client_addr | client_port | application_name | xact_start | waiting_reason | rsgid | rsgname | rsgqueueduration -------+----------+---------+---------+----------+---------+----------------------------------+---------+-------------------------------+--------------------------- ----+---------------+-------------+------------------+-------------------------------+----------------+-------+---------+------------------ 16384 | archdata | 24570 | 8628 | 17552 | yanwei | select * from pg_stat_activity ; | f | 2020-05-03 22:41:22.011469+08 | 2020-05-03 22:37:34.545236 +08 | 10.102.254.27 | 56909 | psql | 2020-05-03 22:41:22.011469+08 | | 0 | unknown | (1 row) archdata=> 当前连接的数据库 postgres=> select current_database(); current_database ------------------ postgres (1 row) postgres=> select current_user(); ERROR: syntax error at or near "(" LINE 1: select current_user(); ^ --当前连接的用户 postgres=> select current_user; current_user -------------- yanwei (1 row) postgres=> --搜索路径 postgres=> show search_path; search_path ---------------- "$user",public (1 row) postgres=> 启动database的时间 postgres=> select pg_postmaster_start_time(); pg_postmaster_start_time ------------------------------- 2020-04-27 23:07:33.462681+08 (1 row) postgres=>