Re: [PoC/RFC] Multiple passwords, interval expirations - Mailing list pgsql-hackers
From | Gurjeet Singh |
---|---|
Subject | Re: [PoC/RFC] Multiple passwords, interval expirations |
Date | |
Msg-id | CABwTF4VLNXvMLYHvySmGJOBRuO1h6L7Wq4JWnKd7F2etJU5eXA@mail.gmail.com Whole thread Raw |
In response to | Re: [PoC/RFC] Multiple passwords, interval expirations (Jeff Davis <pgsql@j-davis.com>) |
Responses |
Re: [PoC/RFC] Multiple passwords, interval expirations
|
List | pgsql-hackers |
On Fri, Oct 6, 2023 at 1:29 PM Jeff Davis <pgsql@j-davis.com> wrote: > > On Thu, 2023-10-05 at 14:28 -0700, Gurjeet Singh wrote: > > > This way there's a notion of a 'new' and 'old' passwords. > > IIUC, you are proposing that there are exactly two slots, NEW and OLD. > When adding a password, OLD must be unset and it moves NEW to OLD, and > adds the new password in NEW. DROP only works on OLD. Is that right? Yes, that's what I was proposing. But thinking a bit more about it, the _implicit_ shuffling of labels 'new' and 'old' doesn't feel right to me. The password that used to be referred to as 'new' now automatically gets labeled 'old'. > It's close to the idea of deprecation, except that adding a new > password implicitly deprecates the existing one. I'm not sure about > that -- it could be confusing. +1 > We could also try using a verb like "expire" that could be coupled with > a date, and that way all old passwords would always have some validity > period. Forcing the users to pick an expiry date for a password they intend to rollover, when an expiry date did not exist before for that password, feels like adding more burden to their password rollover decision making. The dates and rules of password rollover may be a part of a system external to their database, (wiki, docs, calendar, etc.) which now they will be forced to translate into a timestamp to specify in the rollover commands. I believe we should fix the _names_ of the slots the 2 passwords are stored in, and provide commands that manipulate those slots by respective names; the commands should not implicitly move the passwords between the slots. Additionally, we may provide functions that provide observability info for these slots. I propose the slot names FIRST and SECOND (I picked these because these keywords/tokens already exist in the grammar, but not yet sure if the grammar rules would allow their use; feel free to propose better names). FIRST refers to the the existing slot, namely rolpassword. SECOND refers to the new slot we'd add, that is, a pgauthid column named rolsecondpassword. The existing commands, or when neither FIRST nor SECOND are specified, the commands apply to the existing slot, a.k.a. FIRST. The user interface might look like the following: -- Create a user, as usual CREATE ROLE u1 PASSWORD 'p1' VALID UNTIL '2020/01/01'; -- This automatically occupies the 'first' slot -- Add another password that the user can use for authentication. ALTER ROLE u1 ADD SECOND PASSWORD 'p2' VALID UNTIL '2021/01/01'; -- Change both the passwords' validity independently; this solves the -- problem with the previous '2-element stack' approach, where we -- could not address the password at the bottom of the stack. ALTER ROLE u1 SECOND PASSWORD VALID UNTIL '2022/01/01'; ALTER ROLE u1 [ [ FIRST ] PASSWORD ] VALID UNTIL '2022/01/01'; -- If, for some reason, the user wants to get rid of the latest password added. ALTER ROLE u1 DROP SECOND PASSWORD; -- Add a new password (p3) in 'second' slot ALTER ROLE u1 ADD SECOND PASSWORD 'p3' VALID UNTIL '2023/01/01'; -- Attempting to add a password while the respective slot is occupied -- results in error ALTER ROLE u1 ADD [ [ FIRST ] PASSWORD ] 'p4' VALID UNTIL '2024/01/01'; ERROR: first password already exists ALTER ROLE u1 ADD SECOND PASSWORD 'p4' VALID UNTIL '2024/01/01'; ERROR: second password already exists -- Users can use this function to check whether a password slot is occupied => select password_exists('u1', 'first'); password_exists ----- t => select password_exists('u1', 'second'); password_exists ----- t -- Remove all passwords from the role. Both, 'first' and 'second', passwords are removed. ALTER ROLE u1 DROP ALL PASSWORD; Best regards, Gurjeet http://Gurje.et
pgsql-hackers by date: