【问题标题】:PostgreSQL - Find ALL Privileges for a GroupPostgreSQL - 查找组的所有权限
【发布时间】:2016-11-23 21:55:12
【问题描述】:

我一直在尝试从 AWS PostgreSQL 实例中删除组角色,但我遇到了问题。我已经成功地从组中删除了所有依赖项,除了 6 个,我不知道那些可能是什么。我将解释我试图用什么来找到这些缺失的特权,我真的很感激一些关于我下一步可以看的方向。这些步骤中的每一个都在实例中的所有数据库和模式上执行:

  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 管理员)拥有的所有表空间
    • \dtisv = 没有
    • \ddp = 此命令是唯一显示 Application_Access 的命令 Results of \ddp Command
  3. 我了解 \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 行。
  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 
    

***根据您在上面看到的所有内容,是否有任何人能想到我遗漏了,或者没有正确/完全做的事情?如何解决默认权限 - ALTER PRIVILEGES REVOKE ALL 不起作用。感谢您的帮助。

【问题讨论】:

    标签: postgresql


    【解决方案1】:

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

    我很接近我的 ALTER PRIVILEGES 命令。在这个截图中(psql 命令\ddp)-

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

    • 所有者 - 这是将更改权限的用户/组 - 我也觉得很奇怪。 :)
    • 架构 - 这是包含分配默认权限的命令的架构
    • 类型 - 这将告诉您需要使用哪种类型的 REVOKE 命令
    • 访问权限 - 这是您不能删除的用户/组,因为“它具有依赖项”

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

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

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

    我必须执行 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";
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-26
      • 2021-08-07
      • 2017-09-25
      • 1970-01-01
      • 2018-09-29
      • 2017-04-07
      • 2017-12-14
      • 2014-04-24
      相关资源
      最近更新 更多