【发布时间】:2016-11-23 21:55:12
【问题描述】:
我一直在尝试从 AWS PostgreSQL 实例中删除组角色,但我遇到了问题。我已经成功地从组中删除了所有依赖项,除了 6 个,我不知道那些可能是什么。我将解释我试图用什么来找到这些缺失的特权,我真的很感激一些关于我下一步可以看的方向。这些步骤中的每一个都在实例中的所有数据库和模式上执行:
-
我使用以下代码从组中撤消所有权限
REVOKE ALL ON DATABASE {dbname} FROM GROUP "Application_Access"; REVOKE ALL ON SCHEMA public FROM GROUP "Application_Access"; REVOKE ALL ON ALL TABLES IN SCHEMA public FROM GROUP "Application_Access"; REVOKE ALL ON ALL FUNCTIONS IN SCHEMA public FROM GROUP "Application_Access"; REVOKE ALL ON ALL SEQUENCES IN SCHEMA public FROM GROUP "Application_Access"; -
我使用 psql 命令列出了所有对象及其权限,这就是我发现的
- \z = Application_Access 未列出任何内容
- \du 和 \dg = Application_Access - 无继承,无法登录,{} 的成员
- \d = OurAdmin 拥有的所有关系
- \db = rdsadmin(AWS 管理员)拥有的所有表空间
- \dtisv = 没有
- \ddp = 此命令是唯一显示 Application_Access 的命令 Results of \ddp Command
-
我了解 \ddp 显示了未来添加数据库的默认权限。我试图运行 ALTER PRIVILEGES 命令。它迫使我让自己成为 Application_Access 的成员(错误:必须是角色的成员。为什么?!?)才能运行该命令。这将我的所有权限重新分配给 Application_Access,我又回到了原点。
ALTER DEFAULT PRIVILEGES ON ROLE "Application_Access" REVOKE ALL ON DATABASE {dbname} FROM "Application_Access"; ALTER DEFAULT PRIVILEGES ON ROLE "Application_Access" REVOKE ALL ON ALL SCHEMAS FROM "Application_Access"; ALTER DEFAULT PRIVILEGES ON ROLE "Application_Access" REVOKE ALL ON TABLES FROM "Application_Access"; ALTER DEFAULT PRIVILEGES ON ROLE "Application_Access" REVOKE ALL ON FUNCTIONS FROM "Application_Access"; ALTER DEFAULT PRIVILEGES ON ROLE "Application_Access" REVOKE ALL ON SEQUENCES FROM "Application_Access";- 我重新运行了之前的所有步骤,但是,现在当我在所有数据库上运行 \ddp 时,它添加了您在上图中看到的前 3 行。
-
我找到并修改了一个脚本,以显示每个数据库的所有权限。我可以传递一个角色来简化搜索。它也没有将 Application_Access 显示为与任何对象相关联。
SELECT relacl , SUBSTRING( CASE WHEN strpos('r', SPLIT_PART( SPLIT_PART( ARRAY_TO_STRING( RELACL, '|' ), pu.groname, 2 ) , '/', 1 ) ) > 0 THEN ', SELECT' ELSE '' END || CASE WHEN strpos('w', SPLIT_PART( SPLIT_PART( ARRAY_TO_STRING( RELACL, '|' ), pu.groname, 2 ) , '/', 1 ) ) > 0 THEN ', UPDATE' ELSE '' END || CASE WHEN strpos('a', SPLIT_PART( SPLIT_PART( ARRAY_TO_STRING( RELACL, '|' ), pu.groname, 2 ) , '/', 1 ) ) > 0 THEN ', INSERT' ELSE '' END || CASE WHEN strpos('d', SPLIT_PART( SPLIT_PART( ARRAY_TO_STRING( RELACL, '|' ), pu.groname, 2 ) , '/', 1 ) ) > 0 THEN ', DELETE' ELSE '' END || CASE WHEN strpos('R', SPLIT_PART( SPLIT_PART( ARRAY_TO_STRING( RELACL, '|' ), pu.groname, 2 ) , '/', 1 ) ) > 0 THEN ', RULE' ELSE '' END || CASE WHEN strpos('x', SPLIT_PART( SPLIT_PART( ARRAY_TO_STRING( RELACL, '|' ), pu.groname, 2 ) , '/', 1 ) ) > 0 THEN ', REFERENCES' ELSE '' END || CASE WHEN strpos('t', SPLIT_PART( SPLIT_PART( ARRAY_TO_STRING( RELACL, '|' ), pu.groname, 2 ) , '/', 1 ) ) > 0 THEN ', TRIGGER' ELSE '' END || CASE WHEN strpos('X', SPLIT_PART( SPLIT_PART( ARRAY_TO_STRING( RELACL, '|' ), pu.groname, 2 ) , '/', 1 ) ) > 0 THEN ', EXECUTE' ELSE '' END || CASE WHEN strpos('U', SPLIT_PART( SPLIT_PART( ARRAY_TO_STRING( RELACL, '|' ), pu.groname, 2 ) , '/', 1 ) ) > 0 THEN ', USAGE' ELSE '' END || CASE WHEN strpos('C', SPLIT_PART( SPLIT_PART( ARRAY_TO_STRING( RELACL, '|' ), pu.groname, 2 ) , '/', 1 ) ) > 0 THEN ', CREATE' ELSE '' END || CASE WHEN strpos('T', SPLIT_PART( SPLIT_PART( ARRAY_TO_STRING( RELACL, '|' ), pu.groname, 2 ) , '/', 1 ) ) > 0 THEN ', TEMPORARY' ELSE '' END , 3,10000) || namespace ||'.'|| item ||' TO '|| pu.groname ||' ;' AS grantsql FROM (SELECT use.usename AS subject ,nsp.nspname AS namespace ,cls.relname AS item ,cls.relkind AS type ,use2.usename AS owner ,cls.relacl FROM pg_user use CROSS JOIN pg_class cls LEFT JOIN pg_namespace nsp ON cls.relnamespace = nsp.oid LEFT JOIN pg_user use2 ON cls.relowner = use2.usesysid WHERE cls.relowner = use.usesysid AND nsp.nspname NOT IN ('pg_catalog', 'pg_toast', 'information_schema') ORDER BY subject ,namespace ,item ) as x JOIN pg_group pu ON array_to_string(relacl, '|') LIKE '%'|| pu.groname ||'%' WHERE relacl IS NOT NULL AND relacl::text LIKE '%Application%' ORDER BY 2
***根据您在上面看到的所有内容,是否有任何人能想到我遗漏了,或者没有正确/完全做的事情?如何解决默认权限 - ALTER PRIVILEGES REVOKE ALL 不起作用。感谢您的帮助。
【问题讨论】:
标签: postgresql