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