什么GRANT使用SCHEMA准确地做?
我试图创build一个Postgres数据库,所以这可能是一个愚蠢的问题。 我分配了基本的只读权限的数据库angular色,必须从我的PHP脚本访问数据库,我有一个好奇心:如果我执行
GRANT some_or_all_privileges ON ALL TABLES IN SCHEMA schema TO role;
有没有需要执行也
GRANT USAGE ON SCHEMA schema TO role;
?
从文档 :
用法:对于模式,允许访问包含在指定模式中的对象(假设对象自己的特权要求也被满足)。 本质上这允许被授权者在模式中“查找”对象。
我认为,如果我可以select或操纵模式中包含的任何数据,我可以访问模式本身的任何对象。 我错了吗? 如果不是,那么GRANT USAGE ON SCHEMA
上使用哪些GRANT USAGE ON SCHEMA
? 那么这个文档究竟意味着什么呢?“假设对象本身的特权要求也得到了满足”?
GRANT
不同的对象是分开的。 授予数据库不授予其中的模式的权利。 类似地,授予模式不会授予其中的表的权限。
如果您有权从表中SELECT
,但不能在包含它的模式中查看它,则无法访问表。
权利testing按顺序完成:
Do you have `USAGE` on the schema? No: Reject access. Yes: Do you also have the appropriate rights on the table? No: Reject access. Yes: Check column privileges.
您的困惑可能是由于public
架构默认授予angular色public
的所有权利(每个用户/组都是其成员)。 所以每个人都已经有了这个模式的用法。
阶段:
(假设也满足对象自己的特权要求)
是说你必须在架构上使用USAGE
来使用架构中的对象,但是在架构上USAGE
并不足以使用架构中的对象,您还必须拥有对象本身的权限。
这就像一个目录树。 如果你创build一个目录somedir
并在其中包含文件somefile
,那么设置它,以便只有你自己的用户可以访问目录或文件(模式rwx------
在dir,mode rw-------
on该文件),那么没有其他人可以列出目录,看到该文件存在。
如果您要授予文件(模式rw-r--r--
)的rw-r--r--
读取权限,但不更改目录权限,则不会有任何区别。 没有人可以看到该文件,以便阅读它,因为他们没有权限列出目录。
如果你在目录上设置了rwx-r-xr-x
,设置它,这样人们可以列出和遍历目录,但不能更改文件的权限,人们可以列出文件,但不能读取它,因为他们不能访问文件。
您需要为人们设置两个权限才能查看该文件。
同样的事情在Pg。 您需要架构USAGE
权限和对象权限来对对象执行操作,例如从表中SELECT
。
(比较起来,PostgreSQL没有行级安全性,所以用户仍然可以通过直接从pg_class
SELECT
来“看到”表中存在的表,它们不能在不pipe怎样,只是“列表”部分不完全相同。)
对于生产系统,您可以使用此configuration:
--ACCESS DB REVOKE CONNECT ON DATABASE nova FROM PUBLIC; GRANT CONNECT ON DATABASE nova TO user; --ACCESS SCHEMA REVOKE ALL ON SCHEMA public FROM PUBLIC; GRANT USAGE ON SCHEMA public TO user; --ACCESS TABLES REVOKE ALL ON ALL TABLES IN SCHEMA public FROM PUBLIC ; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only ; GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO read_write ; GRANT ALL ON ALL TABLES IN SCHEMA public TO admin ;