On May29, 2012, at 13:37 , Kohei KaiGai wrote:
> 2012/5/27 Alastair Turner <b...@ctrlf5.co.za>:
>> Excerpts from Kohei KaiGai <kai...@kaigai.gr.jp> wrote on Fri, May 25,
>> 2012 at 11:08 PM:
>>> If we assume RLS is applied when user has
>>> no privileges on tables, the current ExecCheckRTEPerms()
>>> always raises an error towards unprivileged users, prior to
>>> execution of queries.
>>> Isn't it preferable behavior to allow unprivileged users to
>>> reference a table (or columns) when it has RLS policy?

I don't think so. Per-table and per-column permission checks should still
apply independent from any RLS policy. You can always grant SELECT access
to PUBLIC if want to rely solely on the RLS policy...

>> Rather than assuming the the RLS checks will be applied when there are
>> no privileges it would make sense to regard RLS as a limitation on the
>> scope of a particular privilege. This makes RLS a property of a
>> particular grant of a privilege rather than of the table. Viewed this
>> way it is possible to control which users are subject to restrictions
>> imposed by the RLS function, which will avoid RLS overhead for
>> operations which don't require it while allowing checks for those that
>> do, provide a mechanism exempting object owners from RLS checks and
>> make it possible to avoid pg_dump calling user defined code.
>> 
>> This suggests an alternative declaration syntax, to use the salesman example:
>> 
>> GRANT SELECT ON TABLE client_detail TO super_sales_group;
>> GRANT SELECT TABLE ON client_detail TO limited_sales_group WITH
>> (QUALIFICATION FUNCTION sales_view_check);
>> 
>> and since more easily usable security features will be used more
>> effectively, a possible future inlining of the condition:
>> 
>> GRANT SELECT ON TABLE client_detail TO limited_sales_group WHERE
>> sales_rep = my_sales_rep();
>> 
> It seems to me an interesting proposition, because I didn't thought such kind 
> of
> statement to provide row-level policies.

Note, though, that due to role inheritance, multiple such QUALIFICATION 
FUNCTIONS
could be "in scope" for a single table. In that case, I guess you'd have to
OR them together, i.e. hide a row only if all of them return false.

> We have a common issue for the idea that check privileges of underlying 
> tables;
> when we should check the privileges and make a decision whether RLS policy is
> appended, or not.
> Due to query optimization reason, the RLS policy should be appended prior to
> the query optimization. At least, we want to utilize RLS policy for index 
> scans,
> rather than sequential scan.

Agreed. With the current design, the RLS policy has to be applied before 
planning,
not during execution.

> One other issue is whether we should allow any users with enough privileges
> to bypass RLS, or only superusers. I'm still not sure how the existing checks
> perform with RLS.

Every user who has the power to disable the RLS policy should also at least be
able to circumvent it temporarily, I think. This includes superusers, the table
owner (since he's presumably allowed to do ALTER TABLE .. RESET ROW POLICY),
and maybe the database owner.

> If and when Alice has SELECT permission on column X and Y of TBL with RLS,
> but her query tries to reference X,Y and Z. In this case, existing privilege
> mechanism shall raise an error, but the criteria with underlying table allows 
> to
> run this query. It seems to me it is a straightforward criteria to
> limit superusers
> to bypass RLS…

I'm not sure I understand. Do you mean the Alice references only columns X
and Y in her query, but the RLS policy adds the reference to column Z?

best regards,
Florian Pflug


-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to