Repository navigation
fix: add row level security over shared tables - #303
AndrewJackson2020 wants to merge 5 commits into
Conversation
|
@AndrewJackson2020 I wonder if this is the right design 🤔 :
1 would be a major redesign, 2 would keep it but seems more messy than yours. Since we're going to do a breaking change soon, perhaps we should try 1 anyways? WDYT? |
maybe, maybe not. hoping we can figure this out. I will say that this design is consistent with pg_cron so there is prior art to draw from. The only thing analogous in postgres contrib is probably pg_stat_statements which uses a hybrid shared memory data structure/on disk flat file. the pg_stat_statements approach is a lot more complex than an RLS table.
This is an interesting idea. It's a lot more true to the interface of other asynchronous frameworks. I also feel like it is harder for users to reason about. It also feels like much higher touch than this PR. I don't think I have a good opinion on this right now.
This also feels a bit higher touch than the proposed solution. Interesting idea though. What would the interface look like? You would just provide the schema/tablename of the intended request/response tables to the function calls? The user would just need to make sure that the table is set up with the correct schema and update it accordingly if we ever decide to add/remove a column, change a data type, etc? I think it would allow more granular ability to grant access though. I can definitely see the row level security change breaking applications where one user executes a requests and lets another user pick up the response and do some processing on it or whatever. |
TIL about that https://github.com/citusdata/pg_cron/blob/main/pg_cron.sql#L29. That does give more confidence in extensions working fine with RLS.
Agree.
Right, looks more complex and prone to failure.
Seems acceptable to do on next major release. |
Currently any user that has any ability to read the pg_net request or queue tables also has the ability to read every other users data on these tables. This is particularly problematic if users are using secrets (passwords, API keys, etc) in a multi tenant database environment.
7f66c23 to
9aa4224
Compare
|
I went ahead and refactored this in a way that I think will solve a lot of the security issues that people have with pg_net without breaking changes. The idea now is that instead of a username column we have a role name column which RLS is based off of. By default this column will get 'public' inserted into it. If the user wants to restrict who sees their rows they can insert their own username or a role. RLS will allow all users to access 'public' rows but will restrict based on identity/group membership if something other than public is in there. Eventually we may want to do a breaking change to force people to select who they want to see their stuff but I think we can deploy this first without breaking change and decide on that later. @utkarash2991 @steve-chavez lmk what you guys think. |
36b79e4 to
a2d966e
Compare
Looks good to not cause a breaking change 👍 |
| timeout_milliseconds int not null | ||
| timeout_milliseconds int not null, | ||
| rolename text not null default 'public' | ||
| ); |
There was a problem hiding this comment.
@AndrewJackson2020 just adding here for completeness. We need to make required changes here too : https://github.com/supabase/postgres/blob/develop/ansible/files/admin_api_scripts/pg_upgrade_scripts/complete.sh#L157 to handle the migration scripts correctly
| case | ||
| when rolename = 'public' then true | ||
| else pg_has_role(current_user, rolename, 'member') | ||
| end |
There was a problem hiding this comment.
Also correct me if I am wrong, dont we need any upgrade script ? sql/pg_net--X--Y.sql change ?
There was a problem hiding this comment.
Those changes def need to be made and would not merge without that.
| char *method; | ||
| CURL *ez_handle; | ||
| char *rejected_reason; // set when the request must not be sent | ||
| char *rolename; // set when the request must not be sent |
There was a problem hiding this comment.
nit: remove the comment . I think it got pasted from above.
|
@AndrewJackson2020 change looks good to me . I have added some comments. Let me know what you think about it ? Approving the change to unblock you. |
Thanks, agree with all of the above. If your sure that this is truly a non breaking change as I am then I'm good. Also was hoping to merge this one first to eliminate the possibility of spit brain in migrations as you pointed out above but it still has issues I need to fix. |
Currently any user that has any ability to read the pg_net request or queue tables also has the ability to read every other users data on these tables. This is particularly problematic if users are using secrets (passwords, API keys, etc) in a multi tenant database environment.
@steve-chavez would appreciate any feedback on this PR in terms of the historical goals/design decisions of pg_net.