- In the example you listed below, role2 doesn’t lose superuser status because it was created as a superuser (based on the point 2). The scenario you mentioned can happen if role2 was initially not created as a superuser. When we create a role as a superuser, we persist that info in roles table, i.e, a role doesn’t lose that state by removal of a grant. Whereas acquired superuser status is not persisted, it is calculated on they fly looking at each role in the hierarchy
- Regarding removal of inheriting superuser role needs broader discussion. There must be a reason why it was done and removing this feature may impact existing use cases. So I believe we need a separate discussion just for that. > On Feb 29, 2024, at 12:36 PM, Bowen Song via dev <dev@cassandra.apache.org> > wrote: > > I believe that opens the door to this kind of situations: > > create superuser role "role1" > create superuser role "role2" > add "role2" to members of "role1" > remove "role2" from the members of "role1" > "role2" now inexplicitly lost the superuser state > TBH, my preferred solution is making superuser roles not inheritable. If a > role has members, it cannot be made superuser; and if a role is superuser, no > members can be added to it. > > It doesn't make much sense to inherit from a superuser role, because it has > unrestricted permissions, which renders any permission explicitly set on the > child roles useless. This enforces the role to be made superuser explicitly, > which makes all the display or filtering issues related to the inheritance > goes away. > > On 29/02/2024 11:30, Štefan Miklošovič wrote: >> Why don't we just update the is_superuser column of a role when it >> effectively achieves a superuser status when it is granted some superuser >> role? Similarly, we would remove its superuser status when there are no >> superuser roles granted to it anymore. >> >> I think that at least for the second case (when a superuser role is revoked >> and there is none anymore), there would need to be some transaction because >> as it checks if there are any superuser roles or not to set it to false, >> somebody else might grant that superuser role to it again so we might end up >> with having is_superuser set to false while it might still have a superuser >> role granted. >> >> I am not sure if this is achievable and I am sorry if this was already >> answered / rejected elsewhere. >> >> On Thu, Feb 29, 2024 at 11:33 AM <shailajako...@icloud.com >> <mailto:shailajako...@icloud.com>> wrote: >>> Hi Maxwell, >>> >>> Currently system_auth.roles table doesn’t have acquired superuser info >>> available in columns to filter on it. Below is the system_auth.roles table >>> for the example I have listed in the previous email. If you notice, though >>> role1 and role11 acquired superuser status through grants, is_superuser >>> column is False for these roles and acquired superuser status is not >>> apparent directly from the columns of this table. member_of column shows >>> immediate parent/grant of a given role. But these grants can result in a >>> huge tree of roles hierarchy and there may be a role anywhere up in the >>> hierarchy which is a superuser. >>> >>> cassandra@cqlsh> select * from system_auth.roles; >>> >>> role | can_login | is_superuser | member_of | salted_hash >>> -----------+-----------+--------------+------------+-------------------------------------------------------------- >>> role2 | False | False | null | >>> null >>> role11 | False | False | {'role1'} | >>> null >>> super1 | False | True | null | >>> null >>> role1 | False | False | {'super1'} | >>> null >>> >>> >>> Thanks, >>> Shailaja >>> >>> >>>> On Feb 29, 2024, at 2:11 AM, guo Maxwell <cclive1...@gmail.com >>>> <mailto:cclive1...@gmail.com>> wrote: >>>> >>>> Hi , >>>> 1. can this cql "SELECT role from system_auth.roles where is_superuser = >>>> True ALLOW FILTERING ;" meet your needs if the user to execute the cql >>>> have the right to do so ? >>>> 2. I think may be we can also add the ability to filter on list role/user >>>> grammar, for example : list user where super = True; >>>> >>>> >>>> >>>> Shailaja Koppu <s_ko...@apple.com <mailto:s_ko...@apple.com>> >>>> 于2024年2月28日周三 20:40写道: >>>>> Hi Team, >>>>> >>>>> Currently LIST ROLES command doesn’t indicate if a role has superuser >>>>> privilege, if acquired through a grant in roles hierarchy (LIST ROLES has >>>>> super column true only if the role is created with SUPERUSER=true). For >>>>> example, in the below example, super1 is a superuser, role1 acquired >>>>> superuser status through grant of super1 and role11 acquired superuser >>>>> status through grant of role1. LIST ROLES output has super column true >>>>> only for super1. >>>>> >>>>> >>>>> cassandra@cqlsh> create role super1 WITH SUPERUSER = true; >>>>> cassandra@cqlsh> create role role1; >>>>> cassandra@cqlsh> create role role11; >>>>> cassandra@cqlsh> create role role2; >>>>> cassandra@cqlsh> grant super1 to role1; >>>>> cassandra@cqlsh> grant role1 to role11; >>>>> cassandra@cqlsh> list roles; >>>>> >>>>> role | super | login | options | datacenters >>>>> -----------+-------+-------+---------+------------- >>>>> role1 | False | False | {} | ALL >>>>> role11 | False | False | {} | ALL >>>>> role2 | False | False | {} | ALL >>>>> super1 | True | False | {} | ALL >>>>> >>>>> >>>>> One way to check has a role acquired superuser status is by running LIST >>>>> ROLES of <rolename> and looking for at least one row with super column >>>>> true. This works fine to check superuser status of a given role. >>>>> >>>>> cassandra@cqlsh> list roles of role11; >>>>> >>>>> role | super | login | options | datacenters >>>>> --------+-------+-------+---------+------------- >>>>> role1 | False | False | {} | ALL >>>>> role11 | False | False | {} | ALL >>>>> super1 | True | False | {} | ALL >>>>> >>>>> >>>>> But if we need to get list of all roles having superuser status (acquired >>>>> through grant as well), there is no easy way to retrieve this from C*. >>>>> This can be a requirement for an external service interacting with C* and >>>>> performing their own checks (for example, Sidecar). So I am proposing a >>>>> new CQL command LIST SUPERUSERS, which lists all roles having superuser >>>>> status (acquired as well). We will ensure that the user running this >>>>> command has DESCRIBE permission on root roles resource, i.e, to run this >>>>> command user must be either a superuser or granted DESCRIBE permission on >>>>> ALL ROLES. Here is the Jira >>>>> <https://issues.apache.org/jira/browse/CASSANDRA-19417> and sample output >>>>> for the above example. >>>>> >>>>> cassandra@cqlsh> list superusers; >>>>> >>>>> role >>>>> ----------- >>>>> role1 >>>>> role11 >>>>> super1 >>>>> >>>>> Alternatives thought of so far, >>>>> - LIST ROLES SUPERUSERSONLY >>>>> - LIST ROLES superuseronly=true >>>>> - LIST USERS superuseronly=true command : I have a question here, is >>>>> LIST USERS command deprecated? I see this link saying that >>>>> https://docs.datastax.com/en/cql-oss/3.3/cql/cql_reference/cqlListUsers.html. >>>>> if LIST USERS and LISR ROLES commands are same, why don’t we just pick >>>>> one so we don’t have to maintain two different commands ? >>>>> - LIST ROLES command default i.e, without NORECURSIVE clause : to print >>>>> super column true for acquired superusers as well, but this may break >>>>> existing tools/scripts of customers as we are changing the default >>>>> behavior >>>>> >>>>> >>>>> I prefer LIST SUPERUSERS command because - This command looks neat and >>>>> simple and we don’t have to worry about handling/breaking other >>>>> options/columns supported by these existing commands. For example we >>>>> don’t have to worry about handling/breaking OF clause of LIST ROLES >>>>> command. And any new options we add to these commands in the future, >>>>> don’t have to worry about handling/breaking of SUPERUSERS option. Please >>>>> let me know your thoughts on this. >>>>> >>>>> >>>>> Thanks, >>>>> Shailaja >>>>> >>>>> >>>>> >>>