本文翻译自: https://www.cybertec-postgresql.com/en/pg_permission-inspecting-your-postgresql-security-system/?from=groupmessage&isappinstalled=0
安全性是一个很重要的话题。它不仅仅只存在于PostgreQL中,整个IT系统中都是如此。然而数据库会有特殊的安全要求。数据库通常存放的是机密数据,因此数据得到合适的保护是有意义的。安全第一!
在PostgreSQL中获取授予用户的所有权限概述可能相当困难。但是,如果您想要保护您的系统,获取一个概述真的很重要 — 忘记这里或那里的权限很容易,这可能给我们解决问题带来不小的困难。为了让操作更加的简单,Cybertec实现了pg_permission(https://github.com/cybertec-postgresql/pg_permission)。有两件事可以通过pg_permission来实现:
l 获取一个列出所有权限的快速概述
l 把你的“期望状态”与你得到的值作比对
l 立即修复错误
简而言之:pg_permission权限可以做的不仅仅是列出存在的内容。但是,让我们先从简单的例子开始 — 列出所有权限。pg_permission提供了几个视图,一旦部署了扩展,就可以直接访问它。下面是一个例子:
test=# \xExpanded display is on.test=# SELECT * FROM all_permissions WHERE role_name = 'workspace_owner';-[ RECORD 1 ]-------------------------------------------------------object_type | TABLErole_name | workspace_ownerschema_name | publicobject_name | bcolumn_name | permission | SELECTgranted | t-[ RECORD 2 ]-------------------------------------------------------object_type | TABLErole_name | workspace_ownerschema_name | publicobject_name | bcolumn_name | permission | INSERTgranted | t-[ RECORD 3 ]-------------------------------------------------------object_type | TABLErole_name | workspace_ownerschema_name | publicobject_name | bcolumn_name | permission | UPDATEgranted | f
最简单的办法是使用“all_permissions”视图来获取所有内容的概述。但是如果你只对函数、表、字段、模式感兴趣,那么会有更多的视图供你使用。“all_permissions”将简单的向您显示以下内容:
CREATE VIEW all_permissions ASSELECT * FROM table_permissionsUNION ALLSELECT * FROM view_permissionsUNION ALLSELECT * FROM column_permissionsUNION ALLSELECT * FROM sequence_permissionsUNION ALLSELECT * FROM function_permissionsUNION ALLSELECT * FROM schema_permissionsUNION ALLSELECT * FROM database_permissions;
当您的应用较小时,保护您的应用不是一件困难的事 — 但是,如果您的数据模型正在改变,小的错误和缺陷可能会潜入,从长远来看会造成严重的安全问题。pg_permissions解决了这个问题:你可以声明,世界是怎样的。那是什么意思?这里有一个例子:”所有bookkeepers都应被允许读取bookeeping模式中的数据。” 或者“所有人都应拥有所有模式的USAGE权限”。你现在所能做的就是将这个世界与你想要的世界进行比较。它的工作原理如下:
INSERT INTO public.permission_target (id, role_name, permissions, object_type, schema_name)VALUES (3, 'appuser', '{USAGE}', 'SCHEMA', 'appschema');
用户还需要对该模式中的appseq序列具有USAGE权限:
INSERT INTO public.permission_target (id, role_name, permissions, object_type, schema_name, object_name)VALUES (4, 'appuser', '{USAGE}', 'SEQUENCE', 'appschema', 'appseq');SELECT * FROM public.permission_diffs();missing | role_name | object_type | schema_name | object_name | column_name | permission---------+-----------+-------------+-------------+-------------+-------------+------------ f | hans | VIEW | appschema | appview | | SELECT t | appuser | TABLE | appschema | apptable | | DELETE(2 rows)
你会立即得到一个概述并看到,你的理想状态和当前状态之间存在哪些差异。通过在部署过程中直接检查差异, 我们的扩展将允许您快速响应和解决问题。
一但您知道有哪些权限可能丢失,哪些是错误的,您可能需要修复这些问题。基本上有两种选择:您可以手动修复内容并逐个分配权限。那会很痛苦,会导致很多工作。所以为什么不直接更新“all_permissions”视图呢?pg_permissions允许您这样做……您可以简单地更新视图,pg_permissions将为您执行所需的更改(在后台执行GRANT和REVOKE语句操作)。通过这种方式,您可以使用简单的update语句更改数百甚至数千个权限。保护数据库从未如此简单。
许多人正在GRANT和REVOKE语句里挣扎。因此,能够使用UPDATE可能会使许多PostgreSQL用户的操作更简单。
我们想让pg_permission更加完善。所以,如果有什么好主意,随时联系我们。我们热切地寻找新的想法,甚至更好的概念。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69917105/viewspace-3135860/ ,如需转载,请注明出处,否则将追究法律责任。