RLS policy issue - Mailing list pgsql-general

From Ted Toth
Subject RLS policy issue
Date
Msg-id CAFPpqQGSfU_ah938xtbeoy+Oq7wauQCLVAJzW3EAzYZJDiT7tw@mail.gmail.com
Whole thread Raw
Responses Re: RLS policy issue
List pgsql-general
I'm work on understanding and implementing RLS. Since I work on
systems using SELinux (MLS policy) I'm using the sepgsql module that
I've modified slightly i.e. I've added a function named
sepgsql_check_row_perm that I'm using in the policy for example I have
a 'reports' table that looks like:

                                                     Table "public.reports"
     Column     |      Type       |                      Modifiers
                  | Storage  | Stats target | Description

----------------+-----------------+------------------------------------------------------+----------+--------------+-------------
 id             | integer         | not null default
nextval('reports_id_seq'::regclass) | plain    |              |
 report         | json            |
                  | extended |              |
 message_id     | integer         | not null
                  | plain    |              |
 location       | geometry(Point) |
                  | main     |              |
 security_label | text            | default sepgsql_getcon()
                  | extended |              |
Policies:
    POLICY "check_report_delete_selinux" FOR DELETE
      USING sepgsql_check_row_perm(security_label, sepgsql_getcon(),
'delete'::text)
    POLICY "check_report_insert_selinux" FOR INSERT
      WITH CHECK sepgsql_check_row_perm(security_label,
sepgsql_getcon(), 'insert'::text)
    POLICY "check_report_select_selinux" FOR SELECT
      USING sepgsql_check_row_perm(sepgsql_getcon(), security_label,
'select'::text)
    POLICY "check_report_update_selinux" FOR UPDATE
      USING sepgsql_check_row_perm(security_label, sepgsql_getcon(),
'update'::text)
      WITH CHECK sepgsql_check_row_perm(security_label,
sepgsql_getcon(), 'update'::text)

When I do a select I expect sepgsql_check_row_perm to be called and at
least output the elog message I added here's part of the patch I apply
to add the sepgsql_check_row_perm funstion to the module:

 /*
+ * BOOL sepgsql_check_row_perm(TEXT, TEXT, TEXT)
+ *
+ * Check if perm allowed for tuple.
+ * This is a variant of sepgsql_avc_check_perms_label which allows the
+ * specifying of both the source and target contexts. For MLS
+ * (write up read down) dominance purposes in the case of
+ * INSERT/UPDATE/DELETE (write) the source is the tuples context
+ * and it must dominate the peers context however in the case of
+ * SELECT (read) the source is the peers context and it must dominate
+ * the tuples context.
+ */
+PG_FUNCTION_INFO_V1(sepgsql_check_row_perm);
+Datum
+sepgsql_check_row_perm(PG_FUNCTION_ARGS)
+{
+       const char *scontext;
+       const char *tcontext;
+       const char *perm_name;
+       access_vector_t av_perm;
+
+       elog(DEBUG1, "sepgsql_check_row_perm");

I'd also expect that the "rewrite" would have added the POLICY SELECT
USING clause to the query but I don't see any indication of that in
the details that follow:

< 2015-05-21 16:59:39.030 CDT >STATEMENT:  select * from reports
< 2015-05-21 16:59:39.030 CDT >LOG:  rewritten parse tree:
< 2015-05-21 16:59:39.030 CDT >DETAIL:  (
       {QUERY
       :commandType 1
       :querySource 0
       :canSetTag true
       :utilityStmt <>
       :resultRelation 0
       :hasAggs false
       :hasWindowFuncs false
       :hasSubLinks false
       :hasDistinctOn false
       :hasRecursive false
       :hasModifyingCTE false
       :hasForUpdate false
       :hasRowSecurity true
       :cteList <>
       :rtable (
          {RTE
          :alias <>
          :eref
             {ALIAS
             :aliasname reports
             :colnames ("id" "report" "message_id" "location" "security_label")
             }
          :rtekind 0
          :relid 19116
          :relkind r
          :lateral false
          :inh true
          :inFromCl true
          :requiredPerms 2
          :checkAsUser 0
          :selectedCols (b 9 10 11 12 13)
          :modifiedCols (b)
          :securityQuals <>
          }
       )
       :jointree
          {FROMEXPR
          :fromlist (
             {RANGETBLREF
             :rtindex 1
             }
          )
          :quals <>
          }
       :targetList (
          {TARGETENTRY
          :expr
             {VAR
             :varno 1
             :varattno 1
             :vartype 23
             :vartypmod -1
             :varcollid 0
             :varlevelsup 0
             :varnoold 1
             :varoattno 1
             :location 7
             }
          :resno 1
          :resname id
          :ressortgroupref 0
          :resorigtbl 19116
          :resorigcol 1
          :resjunk false
          }
          {TARGETENTRY
          :expr
             {VAR
             :varno 1
             :varattno 2
             :vartype 114
             :vartypmod -1
             :varcollid 0
             :varlevelsup 0
             :varnoold 1
             :varoattno 2
             :location 7
             }
          :resno 2
          :resname report
          :ressortgroupref 0
          :resorigtbl 19116
          :resorigcol 2
          :resjunk false
          }
          {TARGETENTRY
          :expr
             {VAR
             :varno 1
             :varattno 3
             :vartype 23
             :vartypmod -1
             :varcollid 0
             :varlevelsup 0
             :varnoold 1
             :varoattno 3
             :location 7
             }
          :resno 3
          :resname message_id
          :ressortgroupref 0
          :resorigtbl 19116
          :resorigcol 3
          :resjunk false
          }
          {TARGETENTRY
          :expr
             {VAR
             :varno 1
             :varattno 4
             :vartype 17780
             :vartypmod 4
             :varcollid 0
             :varlevelsup 0
             :varnoold 1
             :varoattno 4
             :location 7
             }
          :resno 4
          :resname location
          :ressortgroupref 0
          :resorigtbl 19116
          :resorigcol 4
          :resjunk false
          }
          {TARGETENTRY
          :expr
             {VAR
             :varno 1
             :varattno 5
             :vartype 25
             :vartypmod -1
             :varcollid 100
             :varlevelsup 0
             :varnoold 1
             :varoattno 5
             :location 7
             }
          :resno 5
          :resname security_label
          :ressortgroupref 0
          :resorigtbl 19116
          :resorigcol 5
          :resjunk false
          }
       )
       :withCheckOptions <>
       :returningList <>
       :groupClause <>
       :havingQual <>
       :windowClause <>
       :distinctClause <>
       :sortClause <>
       :limitOffset <>
       :limitCount <>
       :rowMarks <>
       :setOperations <>
       :constraintDeps <>
       }
    )

Should I see something in the rewrite details related to the policy?
As I've shown the the table has policy defined and the details show
hasRowSecurity true why might my policy not be getting applied to the
query?


pgsql-general by date:

Previous
From: "Karsten Hilbert"
Date:
Subject: Re: date with month and year
Next
From: Stephen Frost
Date:
Subject: Re: RLS policy issue