Thanks everyone for comments. I would like to close this discussion if there 
are no further comments and continue with the PR for code changes. I prefer 
‘LIST SUPERUSERS’ cql command, please let me know if you prefer different 
command/option.



> On Mar 1, 2024, at 12:44 PM, Sam Tunnicliffe <s...@beobal.com> wrote:
> 
> >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.
> 
> The reason behind the current behaviour is almost irrelevant, the fact is 
> that this is the way that it works and has done since its inception. I 
> implemented RBAC in the first place (CASSANDRA-7653) and I don't remember why 
> we chose to have superuser privilege inherited in this way, though with 
> hindsight I do agree with Bowen that perhaps it would have been better were 
> it not inheritable. Not to say that decisions can never be revisited, but we 
> all know that the cost of changing established behaviour in a database is 
> extremely high even during a major release and so is not something to be 
> undertaken lightly. 
> 
> The discussion here is also rather pre-occupied with the default 
> implementation and any changes to behaviour or semantics would need to 
> consider external/third party implementations. Any solution which involves 
> simply querying the system.roles table in some new way, or updating it 
> somehow differently only works for the default IRoleManager that ships with 
> C*. (On a practical level, dynamically setting the is_super column based on 
> role assignment doesn't work as proposed because it can't differentiate 
> between inherited and granted status). 
> 
> What Shailaja is proposing is essentially just some CQL sugar to expose what 
> Roles::hasSuperUserStatus does internally. That doesn't seem entirely 
> unreasonable as it will work with any backing implementation and saves 
> duplicating that logic in any system that consumes this, particularly the 
> sidecar.
> 
> 
>> On 1 Mar 2024, at 12:04, shailajako...@icloud.com wrote:
>> 
>> - Forgot to mention, is_superuser of roles table cannot be altered as it is 
>> just showing what is persisted in the table. We can think about changing 
>> super column of LIST ROLES command instead.
>> 
>> - Regarding change of the underlying state while we retrieve superusers 
>> info, I believe we do not need a transaction for that, because it can happen 
>> to any column of almost any CQL query. For example, state of 
>> login/options/datacenters etc can also change while we are processing a 
>> query. From my understanding it’s acceptable that user runs the same query 
>> twice and sees difference in the output because of ongoing state changes. 
>> Caller if caching results of a CQL query, may rerun the query periodically 
>> to refresh their cache.
>> 
>> 
>> 
>>> On Mar 1, 2024, at 11:39 AM, shailajako...@icloud.com wrote:
>>> 
>>> Don’t know why is_superuser was not set to true for acquired superusers. 
>>> Now if we change it, may break existing tools/scripts/understanding of 
>>> customers, so do we want to update current understanding of is_superuser 
>>> column or introduce a new column or option instead?
>>> 
>>> 
>>>> On Feb 29, 2024, at 11:30 AM, Štefan Miklošovič 
>>>> <stefan.mikloso...@gmail.com> 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
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>> 
>>> 
>> 
> 

Reply via email to