gpt4 book ai didi

PostgreSQL - 查找组的所有权限

转载 作者:行者123 更新时间:2023-11-29 13:21:31 26 4
gpt4 key购买 nike

我一直在尝试从 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 显示了 future 数据库添加的默认权限。我试图运行 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. 我找到并修改了一个脚本,以显示每个数据库的所有权限。我可以给它传递一个 Role 来简化搜索。它也没有将 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 上遇到类似问题:

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

有 4 列:Owner、Schema、Type 和 Access Privilege。您将需要这些列中的每一列来生成 ALTER PRIVILEGES 命令:

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

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

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

为了执行此命令,您必须以所有者或所有者组成员的身份登录到 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";

关于PostgreSQL - 查找组的所有权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40747903/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com