文章目录
文档用途
了解为什么普通用户可以访问系统目录
详细信息
当我们新创建一个用户A,用户A可以访问pg_database,pg_class等系统试图。在一些权限控制严格的场景中,你可能不禁会问为什么。为什么用户A在没有授权的情况下可以访问这些系统字典呢?
答案就在数据库的权限体系中。
- 数据库中有一个特殊的名为PUBLIC的"角色"。普通用户会继承PUBLIC的权限。
- 数据库默认将某些类型对象的权限授予PUBLIC。包括但不限于针对数据库的CONNECT和TEMPORARY(创建临时表)权限; 针对函数和程序的EXECUTE权限;以及针对语言和数据类型(包括域)的USAGE权限。
下面我们看一下有关这些系统试图的授权情况。以pg_database为例
sql
highgo=# select * from information_schema.table_privileges where table_name like 'pg_database';
grantor | grantee | table_catalog | table_schema | table_name | privilege_type | is_grantable | with_hierarchy
---------+---------+---------------+--------------+-------------+----------------+--------------+----------------
sysdba | PUBLIC | highgo | pg_catalog | pg_database | SELECT | NO | YES <<<
sysdba | sysdba | highgo | pg_catalog | pg_database | INSERT | YES | NO
sysdba | sysdba | highgo | pg_catalog | pg_database | SELECT | YES | YES
sysdba | sysdba | highgo | pg_catalog | pg_database | UPDATE | YES | NO
sysdba | sysdba | highgo | pg_catalog | pg_database | DELETE | YES | NO
sysdba | sysdba | highgo | pg_catalog | pg_database | TRUNCATE | YES | NO
sysdba | sysdba | highgo | pg_catalog | pg_database | REFERENCES | YES | NO
sysdba | sysdba | highgo | pg_catalog | pg_database | TRIGGER | YES | NO
(8 行记录)
public角色拥有这个系统试图的select权限。因此普通用户可以访问这个系统试图。
当然你也可以回收这些默认权限。回收权限时指定的角色PUBLIC而不是用户A,因为从以上的权限结果中可知,对pg_database有select权限的是PUBLIC而不是用户A。以下是回收权限的示例
sql
revoke select on pg_database from public;
通常这些默认权限时有意义的。在使用数据库过程中,普通用户可能会用到这些权限。因此不建议"随意"回收这些权限。如过因安全需求不得不进行权限回收,那么要经过严格测试再进行操作。