PostgreSQL 15 添加对安全调用程序视图的支持。
安全调用者视图检查访问它的权限,使用用户的权限的基础基础关系,视图,而不是视图所有者的权限。此外,如果任何基本关系都是启用 RLS 的表,策略用视图的用户,而不是视图所有者的用户。
这允许定义视图而不放弃额外的对基础基础关系的特权,并匹配一个类似的其他数据库系统中可用的功能。
它还允许视图使用 RLS 更自然地操作,而无需影响对用户的策略分配。
Christoph Heiss,还有我的一些额外的黑客攻击。审核人
劳伦兹阿尔贝和沃尔夫冈瓦尔特。
讨论:https : //postgr.es/m/b66dd6d6-ad3e-c6f2-8b90-47be773da240 %40cybertec.at
这是很酷的事情。
当您拥有表时,您可以对它们拥有权限,允许某些用户访问,而有些则不允许。
现在,当您拥有函数时,通常以调用它们的用户身份运行这些函数。例如,如果我运行:
$ psql -U depesz
...
=$ select some_function();
然后 some_functions 将调用它的所有主体,包括所有查询,作为用户depesz。
但是,有时创建绕过安全检查的函数是有意义的(例如,因为它做了一些用户不应该“手动”做的事情)。这些被称为“安全定义器”函数,因为函数标记为这样,当被调用时,会以创建函数的用户的权限执行,而不是调用它的用户。
视图始终是“安全定义者”。其想法是,如果您创建视图,则可以微调视图的权限,但表的权限并不重要(那么多)。
现在,我们可以改变它。
让我们做一个测试:
$ psql -X -U depesz -c 'create user test'
CREATE ROLE
$ psql -X -U depesz -c 'create table source_data as select id from generate_series(1,10) id'
SELECT 10
$ psql -X -U depesz -c 'create view old_type_view as select * from source_data'
CREATE VIEW
$ psql -X -U depesz -c 'grant select on old_type_view to test'
GRANT
$ psql -X -U depesz -c 'create view new_type_view with (security_invoker = true ) as select * from source_data'
CREATE VIEW
$ psql -X -U depesz -c 'grant select on new_type_view to test'
GRANT
现在,通过用户测试:
$ psql -X -U test -d depesz -c "select * from old_type_view"
id
----
1
2
3
4
5
6
7
8
9
10
(10 rows)
$ psql -X -U test -d depesz -c "select * from new_type_view"
ERROR: permission denied for table source_data
旧类型的视图,实际上是security_invoker = false允许选择,即使没有对基础表的特权,但是新的,security_invoker = true将失败。
文章来源:https://www.depesz.com/2022/03/22/waiting-for-postgresql-15-add-support-for-security-invoker-views/
最后修改时间:2022-05-24 12:09:23
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




