PostgreSQL - 查找组的所有权限

时间:2016-11-22 17:18:47

标签: postgresql

我一直在尝试从AWS PostgreSQL实例中删除组角色,而且我已经卡住了。我已经成功删除了该组中的所有依赖项,除了6,我不知道那些可能是什么。我将解释我试图用来找到这些遗失的特权,我真的很感激我可以看到下一步的方向。每个步骤都在Instance:

中的所有数据库和模式上执行
  1. 我使用以下代码撤消组中的所有权限

    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";
    
  2. 我使用psql命令列出所有对象及其权限,这就是我找到的

    • \ z =没有为Application_Access列出任何内容
    • \ du和\ dg = Application_Access - 无继承,无法登录,{}
    • 成员
    • \ d = OurAdmin拥有的所有关系
    • \ db = rdsadmin(AWS Admin)拥有的所有表空间
    • \ dtisv = Nothing
    • \ ddp =此命令是唯一显示Application_Access的命令 Results of \ddp Command
  3. 据我所知,\ ddp显示了未来数据库添加的默认权限。我试图运行ALTER PRIVILEGES命令。它迫使我自己成为Application_Access的成员(错误:必须是Role的成员。为什么?!?)才能运行命令。这将我的所有权限重新分配给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行。
  4. 我找到并修改了一个脚本,以显示每个数据库的所有权限。我可以传递一个角色来简化搜索。它没有将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 
    
  5. ***根据您在上面看到的所有内容,是否有任何人可以想到我遗漏或没有正确/完全做到的事情?如何解决默认权限 - ALTER PRIVILEGES REVOKE ALL无法正常工作。谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

花了几天时间,但我想我终于向谷歌提出了正确的问题。我想我会发布我的解决方案以防任何人在PostgreSQL上遇到类似的问题:

我接近我的ALTER PRIVILEGES命令。在此屏幕截图(psql命令\ ddp)中 - Default Privileges

共有4列:所有者,架构,类型和访问权限。您将需要这些列中的每一列来生成ALTER PRIVILEGES命令:

  • 所有者 - 这是将改变权限的用户/组 - 对我来说似乎也很奇怪。 :)
  • 架构 - 这是包含分配默认权限的命令的架构
  • 类型 - 这将告诉您需要使用哪种类型的REVOKE命令
  • 访问权限 - 这是您无法删除的用户/组,因为“它具有依赖关系”

根据此列表,您的命令结构将类似于此 - 从上面填充{}:

ALTER DEFAULT PRIVILEGES FOR ROLE {Owner} IN SCHEMA {Schema} REVOKE ALL PRIVILEGES ON {Type} FROM {Access Privilege};

要执行此命令,您必须以所有者或所有者组的成员身份登录Postgres数据库,否则,您将收到错误“错误:必须是角色的成员{所有者} 。“

我必须执行2套ALTER PRIVILEGES - 以所有者dbac和Application_Access的身份登录数据库。

以Application_Access身份登录并执行以下命令从\ ddp psql命令的上述屏幕截图中删除了前3行(其中Application_Access是所有者)。

alter default privileges for role "Application_Access" in schema public revoke all privileges on functions from "Application_Access";
alter default privileges for role "Application_Access" in schema public revoke all privileges on sequences from "Application_Access";
alter default privileges for role "Application_Access" in schema public revoke all privileges on tables from "Application_Access";

以dbac身份登录并执行以下命令从psql \ ddp命令的上述屏幕截图中删除了其他行(其中dbac是所有者)。

alter default privileges for role "dbac" in schema public revoke all privileges on functions from "Application_Access";
alter default privileges for role "dbac" in schema public revoke all privileges on sequences from "Application_Access";
alter default privileges for role "dbac" in schema public revoke all privileges on tables from "Application_Access";