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> 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