Re: [COMMITTERS] pgsql: Row-Level Security Policies (RLS)

From: Dean Rasheed <dean(dot)a(dot)rasheed(at)gmail(dot)com>
To: Stephen Frost <sfrost(at)snowman(dot)net>
Cc: Alvaro Herrera <alvherre(at)2ndquadrant(dot)com>, PostgreSQL Hackers <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: [COMMITTERS] pgsql: Row-Level Security Policies (RLS)
Date: 2015-05-28 07:40:33
Message-ID: CAEZATCXFAj+kmdrYm+eWMqaCrt3B=ndEaiNgoB_xWJJo3=wpDg@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-committers pgsql-hackers

On 27 May 2015 at 14:51, Stephen Frost <sfrost(at)snowman(dot)net> wrote:
>> On 27 May 2015 at 02:42, Stephen Frost <sfrost(at)snowman(dot)net> wrote:
>> > Now, looking at the code, I'm actually failing to see a case where we
>> > use the RowSecurityPolicy->policy_name.. Perhaps *that's* what we
>> > should be looking to remove?
>>
>> If we add support for restrictive policies, it would be possible, and
>> I think desirable, to report on which policy was violated. For that,
>> having the policy name would be handy. We might also arguably decide
>> to enforce restrictive RLS policies in name order, like check
>> constraints. Of course none of that means it must be kept now, but it
>> feels like a useful field to keep nonetheless.
>
> I agree that it could be useful, but we really shouldn't have fields in
> the current code base which are "just in case".. The one exception
> which comes to mind is if we should keep it for use by extensions.
> Those operate on an independent cycle from our major releases and would
> likely find having the name field useful.
>

Hmm, when I wrote that I had forgotten that we already allow
extensions to add restrictive policies. I think it would be good to
allow those policies to have names, and if they do, to copy those
names to any WCOs created. Then, if a WCO is violated, and it has a
non-NULL policy name associated with it, we should include that in the
error report.

> One thing which now occurs to me, however, is that, while the current
> coding is fine, using InvalidOid as an indicator for the default-deny
> policy, in general, does fall over when we consider policies added by
> extensions. Those policies are necessairly going to need to put
> InvalidOid into that field, unless they acquire an OID somehow
> themselves (it doesn't seem reasonable to make that a requirement,
> though I suppose we could..), and, therefore, perhaps we should add a
> boolean field which indicates which is the defaultDeny policy anyway and
> not use that field for that purpose.
>
> Thoughts?
>

Actually I think a new boolean field is unnecessary, and probably the
policy_id field is too. Re-reading the code in rowsecurity.c, I think
it could use a bit of refactoring. Essentially what it needs to do
(for permissive policies at least) is just

* fetch a list of internal policies
* fetch a list of external policies
* concatenate them
* if the resulting list is empty, add a default-deny qual and/or WCO

By only building the default-deny qual/WCO at the end, rather than
half-way through and pretending that it's a fully-fledged policy, the
code ought to be simpler.

I might get some time at the weekend, so I can take a look and see if
refactoring it this way works out in practice.

BTW, I just spotted another problem with the current code, which is
that policies from extensions aren't being checked against the current
role (policy->roles is just being ignored). I think it would be neater
and safer to move the check_role_for_policy() check up and apply it to
the entire concatenated list of policies, rather than having the lower
level code have to worry about that.

Regards,
Dean

In response to

Responses

Browse pgsql-committers by date

  From Date Subject
Next Message Stephen Frost 2015-05-28 07:51:07 Re: [COMMITTERS] pgsql: Row-Level Security Policies (RLS)
Previous Message Stephen Frost 2015-05-28 05:38:14 Re: [COMMITTERS] pgsql: Add pg_audit, an auditing extension

Browse pgsql-hackers by date

  From Date Subject
Next Message Simon Riggs 2015-05-28 07:47:07 Re: pg_upgrade resets timeline to 1
Previous Message Noah Misch 2015-05-28 07:27:21 Re: pg_upgrade resets timeline to 1