Skip to content

AxonOps — AI-Native Control Plane for Open Source Data Platforms

Cassandra Privileged Access Management

Privileged Access Management (PAM) systems provide centralized control over database credentials, enabling automatic rotation, audit logging, and integration with enterprise security policies. This guide covers integration patterns for HashiCorp Vault and CyberArk with Cassandra.


Traditional static credentials present several challenges:

ChallengeDescription
Credential sprawlPasswords stored in config files, environment variables, and code
Manual rotationTime-consuming process prone to errors and service disruptions
Limited auditingDifficult to track who accessed which credentials
Long-lived secretsCompromised credentials remain valid until manually changed

PAM solutions address these issues:

ApplicationPAM System(Vault/CyberArk)CassandraCluster1. Request credentials(authenticated)3. Return credentials(time-limited)2. Create dynamicrole (optional)5. Revoke on expiry4. Connect
ApproachDescriptionUse Case
Dynamic secretsVault/CyberArk creates temporary Cassandra rolesHigh-security environments, automated pipelines
Static secret retrievalApplication retrieves pre-configured credentialsLegacy applications, simpler deployments
Password rotationPeriodic automated credential changesCompliance requirements, service accounts

HashiCorp Vault provides dynamic secret management for Cassandra through its database secrets engine. Key capabilities include:

  • Automatic credential rotation
  • Short-lived credentials for applications
  • Centralized secret management
  • Comprehensive audit logging
HashiCorp VaultApplicationsCassandra ClusterAuth Methods(AppRole, K8s, etc.)Database SecretsEngineAudit LogService AService BETL PipelineNode 1Node 2Node 3Authorized

Before configuring Vault integration:

  1. Vault server running and accessible from applications
  2. Cassandra cluster with authentication enabled (PasswordAuthenticator)
  3. Vault admin role in Cassandra with role management permissions
  4. Network connectivity between Vault and Cassandra nodes

Enable and configure the database secrets engine:

Terminal window
# Enable the database secrets engine
vault secrets enable database
# Configure Cassandra connection
vault write database/config/cassandra \
plugin_name=cassandra-database-plugin \
hosts=cassandra1.example.com,cassandra2.example.com \
port=9042 \
username=vault_admin \
password='VaultAdminP@ss!2024' \
tls=true \
insecure_tls=false \
protocol_version=4 \
allowed_roles="app-readonly,app-readwrite,etl-pipeline"

Configuration parameters:

ParameterDescription
plugin_nameMust be cassandra-database-plugin
hostsComma-separated list of Cassandra nodes
portCQL native transport port (default: 9042)
usernameVault admin role in Cassandra
passwordVault admin role password
tlsEnable TLS for Cassandra connection
protocol_versionCQL protocol version (3 or 4)
allowed_rolesVault roles permitted to use this connection

Create a dedicated role for Vault to manage credentials:

-- Vault admin role - can only manage roles, not access data
CREATE ROLE vault_admin WITH PASSWORD = 'VaultAdminP@ss!2024'
AND LOGIN = true
AND SUPERUSER = false;
-- Vault needs to create/drop roles
GRANT CREATE ON ALL ROLES TO vault_admin;
GRANT DROP ON ALL ROLES TO vault_admin;
-- Vault needs to grant permissions to created roles
GRANT AUTHORIZE ON KEYSPACE production TO vault_admin;
GRANT AUTHORIZE ON KEYSPACE analytics TO vault_admin;
-- Vault should NOT have data access
-- No SELECT, MODIFY, or schema permissions

Principle of Least Privilege

The Vault admin role should only have permissions necessary for role management. It should never have direct data access (SELECT, MODIFY) or schema modification capabilities (ALTER, CREATE KEYSPACE).

Define Vault roles that map to Cassandra access patterns:

Read-Only Role:

Terminal window
vault write database/roles/app-readonly \
db_name=cassandra \
creation_statements="CREATE ROLE '{{username}}' WITH PASSWORD = '{{password}}' AND LOGIN = true; \
GRANT SELECT ON KEYSPACE production TO '{{username}}';" \
revocation_statements="DROP ROLE '{{username}}';" \
default_ttl="1h" \
max_ttl="24h"

Read-Write Role:

Terminal window
vault write database/roles/app-readwrite \
db_name=cassandra \
creation_statements="CREATE ROLE '{{username}}' WITH PASSWORD = '{{password}}' AND LOGIN = true; \
GRANT SELECT ON KEYSPACE production TO '{{username}}'; \
GRANT MODIFY ON KEYSPACE production TO '{{username}}';" \
revocation_statements="DROP ROLE '{{username}}';" \
default_ttl="1h" \
max_ttl="24h"

ETL Pipeline Role:

Terminal window
vault write database/roles/etl-pipeline \
db_name=cassandra \
creation_statements="CREATE ROLE '{{username}}' WITH PASSWORD = '{{password}}' AND LOGIN = true; \
GRANT SELECT ON KEYSPACE raw_data TO '{{username}}'; \
GRANT SELECT ON KEYSPACE processed_data TO '{{username}}'; \
GRANT MODIFY ON KEYSPACE processed_data TO '{{username}}';" \
revocation_statements="DROP ROLE '{{username}}';" \
default_ttl="4h" \
max_ttl="12h"

Role parameters:

ParameterDescription
creation_statementsCQL to create role and grant permissions
revocation_statementsCQL to remove role on lease expiry
default_ttlDefault credential lifetime
max_ttlMaximum credential lifetime (cannot be exceeded)

Applications request credentials from Vault:

Terminal window
# Request credentials
vault read database/creds/app-readonly
# Response:
# Key Value
# --- -----
# lease_id database/creds/app-readonly/abc123xyz
# lease_duration 1h
# lease_renewable true
# username v-approle-app-readonly-xyz789abc
# password A1b2C3d4E5f6G7h8I9j0

Application integration example (Python):

import hvac
from cassandra.cluster import Cluster
from cassandra.auth import PlainTextAuthProvider
# Connect to Vault
vault_client = hvac.Client(url='https://vault.example.com:8200')
vault_client.auth.approle.login(
role_id='app-role-id',
secret_id='app-secret-id'
)
# Retrieve Cassandra credentials
creds = vault_client.secrets.database.generate_credentials(
name='app-readonly'
)
# Connect to Cassandra with dynamic credentials
auth_provider = PlainTextAuthProvider(
username=creds['data']['username'],
password=creds['data']['password']
)
cluster = Cluster(
contact_points=['cassandra1.example.com'],
auth_provider=auth_provider
)
session = cluster.connect()

Vault supports automatic rotation of the root credentials:

Terminal window
# Rotate Vault admin password in Cassandra
vault write -force database/rotate-root/cassandra

Root Rotation

After rotation, the old password is invalidated. Ensure Vault is the only system using the vault_admin credentials before rotating.

Terminal window
# View active leases
vault list sys/leases/lookup/database/creds/app-readonly
# Revoke specific lease (immediate credential revocation)
vault lease revoke database/creds/app-readonly/abc123xyz
# Revoke all leases for a role
vault lease revoke -prefix database/creds/app-readonly

CyberArk Privileged Access Manager (PAM) provides enterprise credential management with features including:

  • Credential vaulting and retrieval
  • Automated password rotation
  • Session recording and monitoring
  • Integration with enterprise identity systems
CyberArk PAMApplicationsDigital VaultCentral PolicyManager (CPM)Password VaultWeb AccessCentral CredentialProvider (CCP)Application AccessManager (AAM)Service AService BCassandraClusterStore/RotatePasswordRotationREST APISDKRetrieveRetrieve
ComponentFunction
Digital VaultSecure storage for credentials
Central Policy Manager (CPM)Automates password rotation
Central Credential Provider (CCP)REST API for credential retrieval
Application Access Manager (AAM)SDK-based credential retrieval
Privileged Session Manager (PSM)Session recording (optional)

Configure Cassandra accounts in CyberArk:

  1. Create Safe for Cassandra credentials

  2. Add Account with platform type "Cassandra Database"

    • Address: Cassandra contact point hostname
    • Username: Cassandra role name
    • Password: Current role password
    • Port: 9042
  3. Configure CPM for automatic rotation:

    • Set rotation schedule (e.g., every 30 days)
    • Define password policy
    • Configure verification settings

CyberArk CPM requires a privileged account to perform password changes:

-- CyberArk CPM admin role
CREATE ROLE cyberark_cpm WITH PASSWORD = 'InitialCPMP@ss!2024'
AND LOGIN = true
AND SUPERUSER = false;
-- CPM needs to alter roles for password changes
GRANT ALTER ON ALL ROLES TO cyberark_cpm;
-- Optional: If CPM creates new accounts
GRANT CREATE ON ALL ROLES TO cyberark_cpm;

CPM connection configuration:

ParameterValue
ProtocolCQL
Port9042
Connection CommandCustom CQL connector
Change Password CommandALTER ROLE {username} WITH PASSWORD = '{newpassword}'
Verify CommandSELECT * FROM system.local

Using CyberArk CCP (REST API):

import requests
from cassandra.cluster import Cluster
from cassandra.auth import PlainTextAuthProvider
# CyberArk CCP endpoint
ccp_url = "https://cyberark.example.com/AIMWebService/api/Accounts"
# Request credentials
params = {
"AppID": "cassandra-app",
"Safe": "CassandraCredentials",
"Object": "cassandra-app-readonly"
}
response = requests.get(
ccp_url,
params=params,
cert=('/path/to/client.crt', '/path/to/client.key'),
verify='/path/to/ca-bundle.crt'
)
creds = response.json()
# Connect to Cassandra
auth_provider = PlainTextAuthProvider(
username=creds['UserName'],
password=creds['Content']
)
cluster = Cluster(
contact_points=['cassandra1.example.com'],
auth_provider=auth_provider
)
session = cluster.connect()

Using CyberArk AAM (Credential Provider SDK):

import com.cyberark.aim.PasswordSDK;
// Java application using CyberArk Credential Provider
PSDKPassword password = PasswordSDK.getPassword(
"cassandra.example.com", // Address
"cassandra-app", // AppID
"CassandraCredentials", // Safe
"app_production_rw" // Object name
);
String username = password.getUserName();
String passwd = password.getContent();
// Use with Cassandra driver
PlainTextAuthProvider authProvider =
new PlainTextAuthProvider(username, passwd);
Cluster cluster = Cluster.builder()
.addContactPoint("cassandra1.example.com")
.withAuthProvider(authProvider)
.build();

CyberArk Credential Providers support local caching to reduce vault queries:

credentialfile.xml
<CredFile>
<Entry Name="cassandra-app-readonly">
<Username>app_readonly</Username>
<Address>cassandra.example.com</Address>
<Safe>CassandraCredentials</Safe>
<CacheLifetime>300</CacheLifetime>
</Entry>
</CredFile>

Cache Security

Cached credentials are stored locally. Ensure appropriate file system permissions and consider the security trade-offs of caching versus vault latency.


FeatureHashiCorp VaultCyberArk PAM
Dynamic secretsNative supportLimited (primarily rotation)
Open source optionYes (Vault OSS)No
Cloud-nativeStrong (containers, K8s)Improving (Secrets Hub)
Enterprise featuresVault EnterpriseCore product
Audit loggingBuilt-inBuilt-in
Session recordingVia pluginsNative (PSM)
Learning curveModerateSteeper
Pricing modelOpen coreEnterprise licensing

Choose HashiCorp Vault when:

  • Cloud-native or Kubernetes environments
  • Need for dynamic, short-lived credentials
  • DevOps-centric workflows
  • Budget constraints (OSS option)

Choose CyberArk when:

  • Enterprise PAM already deployed
  • Regulatory requirements for session recording
  • Integration with existing identity governance
  • Complex compliance requirements

  1. Minimize TTL: Use the shortest practical credential lifetime
  2. Automate rotation: Never rely on manual password changes
  3. Monitor usage: Alert on unusual credential access patterns
  4. Audit regularly: Review which applications access which credentials
Network SecurityAuthenticationSecret ManagementFirewall rulesVault/CyberArk <-> CassandraTLS everywhereApplication authto credential managerMutual TLSfor service accountsShort TTLs(1-4 hours)Automated rotationComprehensive auditing
AreaRecommendation
MonitoringAlert on failed credential retrievals
High availabilityDeploy credential managers in HA configuration
Disaster recoveryInclude credential manager in DR plans
TestingVerify credential rotation in non-production first
DocumentationDocument credential dependencies for each application

Vault: "permission denied" when creating roles

Terminal window
# Verify vault_admin has required permissions
cqlsh -u vault_admin -p 'password' -e "LIST ALL PERMISSIONS OF vault_admin"
# Check for missing AUTHORIZE permission
GRANT AUTHORIZE ON KEYSPACE target_keyspace TO vault_admin;

CyberArk: CPM fails to rotate password

-- Verify CPM account permissions
LIST ALL PERMISSIONS OF cyberark_cpm;
-- CPM needs ALTER on the target role
GRANT ALTER ON ROLE target_role TO cyberark_cpm;

Credential retrieval latency

  • Enable caching in CyberArk Credential Provider
  • Use Vault agent for credential caching and renewal
  • Consider connection pooling in applications

Stale credentials after rotation

  • Reduce Cassandra credential cache validity:
    # cassandra.yaml (4.1+ syntax)
    credentials_validity: 2000ms
    # Pre-4.1 syntax (deprecated)
    # credentials_validity_in_ms: 2000
  • Ensure applications handle authentication failures gracefully