On Mon, Sep 14, 2015 at 03:29:16AM -0400, Noah Misch wrote:
> On a related topic, check_enable_rls() has two kinds of RLS bypass semantics.
> Under row_security=off|on, superusers bypass every policy, and table owners
> bypass policies of their own tables.  Under row_security=off only, roles with
> BYPASSRLS privilege additionally bypass every policy; BYPASSRLS doesn't affect
> semantics under row_security=on.  Is that distinction a good thing?  Making
> BYPASSRLS GUC-independent, like superuser bypass, would simplify things for
> the user and would make row_security no longer a behavior-changing GUC.
> row_security would come to mean simply "if a policy would otherwise attach to
> one of my queries, raise an error instead."  Again, if you have cause to
> toggle BYPASSRLS, use multiple roles.  Implementing that with GUCs creates
> harder problems.

Having pondered this further in the course of finalizing commit 537bd17,
arming BYPASSRLS independent of the row_security GUC is indeed a good thing.
Right now, if a BYPASSRLS user creates a SECURITY DEFINER function, any caller
can change that function's behavior by toggling the GUC.  Users won't test
accordingly; better to have just one success-case behavior.

On Wed, Jul 29, 2015 at 09:09:27AM -0400, Stephen Frost wrote:
> For superuser (the only similar precedent that we have, I believe), we
> go based on the view owner, but that isn't quite the same as BYPASSRLS.
> 
> The reason this doesn't hold is that you have to use a combination of
> BYPASSRLS and row_security=off to actually bypass RLS, unlike the
> superuser role attribute which is just always "on" if you've got it.  If
> having BYPASSRLS simply always meant "don't do any RLS" then we could
> use the superuser precedent to use what the view owner has, but at least
> for my part, I'm a lot happier with BYPASSRLS and row_security than with
> superuser and would rather we continue in that direction, where the user
> has the choice of if they want their role attribute to be in effect or
> not.

If I make BYPASSRLS GUC-independent, I should then also make it take effect
when the BYPASSRLS role owns a view.  Barring objections, I will change both.

I do share your wish for an ability to suppress privileges temporarily.  I
have no specific design in mind, but privilege activation and suppression
should be subject to the approval of roles affected.  GUCs probably can't
serve here; apart from the grandfathered search_path, functions can ignore
them.  GUCs are mostly a property of the whole session.


By the way, is there a reason for RI_Initial_Check() to hard-code the rules
for RLS enablement instead of calling check_enable_rls(..., InvalidOid, true)
twice?  I refer to this code:

>       /*
>        * Also punt if RLS is enabled on either table unless this role has the
>        * bypassrls right or is the table owner of the table(s) involved which
>        * have RLS enabled.
>        */
>       if (!has_bypassrls_privilege(GetUserId()) &&
>               ((pk_rel->rd_rel->relrowsecurity &&
>                 !pg_class_ownercheck(pkrte->relid, GetUserId())) ||
>                (fk_rel->rd_rel->relrowsecurity &&
>                 !pg_class_ownercheck(fkrte->relid, GetUserId()))))
>               return false;


-- 
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