An Apache Cassandra cluster that still accepts CQL connections without credentials lets any reachable client run queries under the default open configuration. Enabling password authentication makes the native protocol require a database role before cqlsh, drivers, or application clients can execute CQL.

Cassandra controls client authentication with the authenticator setting in /etc/cassandra/cassandra.yaml for package installs, or conf/cassandra.yaml for tarball installs. PasswordAuthenticator stores role names and hashed passwords in the system_auth keyspace, so that keyspace needs a replication layout that stays available before the setting is rolled across the cluster.

Apply the change from one selected node, create a replacement administrative role, and restart the remaining nodes one at a time. Authentication does not encrypt client traffic, grant table permissions, or secure JMX by itself; pair it with client TLS, role grants, and JMX controls when the cluster is reachable outside a trusted administration network.

Steps to enable Apache Cassandra authentication:

  1. Confirm the selected node currently accepts CQL.
    $ cqlsh -e "SELECT release_version FROM system.local;"
    
     release_version
    -----------------
               5.0.8
    
    (1 rows)

    Run the bootstrap work from one node first. Keep application clients away from that node until replacement roles and credentials are ready.

  2. Set system_auth replication for the cluster.
    $ cqlsh -e "ALTER KEYSPACE system_auth WITH replication = {'class': 'NetworkTopologyStrategy', 'datacenter1': 3};"

    Replace datacenter1 with the datacenter name shown by nodetool status or system.local. Use a replication factor that the datacenter can satisfy; a one-node lab uses 1, while production clusters normally use at least 3 per datacenter.

  3. Repair system_auth if the replication setting changed on an existing cluster.
    $ nodetool repair system_auth

    Run repair before relying on the new auth replicas. A new one-node lab that kept replication at 1 does not need this step.

  4. Open the active cassandra.yaml file.
    $ sudo vi /etc/cassandra/cassandra.yaml

    For a tarball install, edit conf/cassandra.yaml under the Cassandra install directory instead of /etc/cassandra/cassandra.yaml.

  5. Set PasswordAuthenticator and keep CassandraRoleManager.
    /etc/cassandra/cassandra.yaml
    authenticator: PasswordAuthenticator
    role_manager: CassandraRoleManager

    PasswordAuthenticator requires Cassandra's role manager because login roles and password hashes are stored in system_auth.

  6. Restart the selected Cassandra node.
    $ sudo systemctl restart cassandra

    Restart only the selected node at this point. Wait for it to rejoin before changing the next node.
    Related: How to check Apache Cassandra service status

  7. Verify unauthenticated CQL is rejected.
    $ cqlsh -e "DESCRIBE KEYSPACES"
    Connection error: ('Unable to connect to any servers', {'127.0.0.1:9042': AuthenticationFailed('Remote end requires authentication')})

    This rejection confirms the native protocol now asks clients to authenticate before returning schema or data.

  8. Log in with the default Cassandra superuser on the selected node.
    $ cqlsh -u cassandra -p cassandra -e "LIST ROLES;"
    
     role      | super | login | options | datacenters
    -----------+-------+-------+---------+-------------
     cassandra |  True |  True |        {} |         ALL
    
    (1 rows)

    The default cassandra credentials are a bootstrap path only. Replace them before reconnecting normal clients. For routine use, avoid putting passwords in shell history and use a cqlsh credentials file or an interactive password prompt.

  9. Create a replacement superuser role.
    $ cqlsh -u cassandra -p cassandra -e "CREATE ROLE cluster_admin WITH SUPERUSER = true AND LOGIN = true AND PASSWORD = 'UseALongUniquePasswordHere!2026';"

    Replace the sample password with a unique secret from the cluster's password process before running the command.

  10. Disable login and superuser status on the default role from the replacement role.
    $ cqlsh -u cluster_admin -p 'UseALongUniquePasswordHere!2026' -e "ALTER ROLE cassandra WITH SUPERUSER = false AND LOGIN = false;"
  11. Verify the replacement role and the disabled default role.
    $ cqlsh -u cluster_admin -p 'UseALongUniquePasswordHere!2026' -e "LIST ROLES;"
    
     role          | super | login | options | datacenters
    ---------------+-------+-------+---------+-------------
         cassandra | False | False |        {} |         ALL
     cluster_admin |  True |  True |        {} |         ALL
    
    (2 rows)
  12. Create application login roles before reconnecting clients.
    $ cqlsh -u cluster_admin -p 'UseALongUniquePasswordHere!2026' -e "CREATE ROLE app_service WITH LOGIN = true AND PASSWORD = 'UseADifferentLongPasswordHere!2026' AND SUPERUSER = false;"

    Authentication proves client identity. Use authorization grants separately when the role should be limited to specific keyspaces, tables, or functions.
    Related: How to grant permissions to an Apache Cassandra role

  13. Repeat the authenticator file change on each remaining Cassandra node.

    Restart one node at a time, wait for it to return to UN in nodetool status, and verify authenticated cqlsh access before moving to the next node.
    Related: How to check Apache Cassandra cluster status with nodetool