CockroachDB supports user AuthN using the following methods:
- password
- cert (TLS client cert)
- cert-password (either cert or password)
- trusted (always authenticate)
- reject (always reject)
- gss (Use GSSAPI e.g. Kerberos)
By default every user can authenticate using either the cert or password methods.
In this brief blog, we outline the high level steps required to configure Kerberos AuthN in place of cert/password AuthN.
1 - Create Kerberos SPN and Keytab
In most organizations, you might have to find and ask another department to create the SPN and its keytab on your behalf.
Below the command to create the SPN, assuming we've access to the KDC server.
The keytab default location is /etc/krb5.keytab
.
In our case, we add a Principal for the LB address only: we are permitting connection to the cluster only via the LB, that is, you can't point to a CockroachDB node directly.
This is to avoid endusers hardcoding a connection to a single node.
With this implementation, we ensure endusers go to the load-balancer for connection, which is the intended behavior.
Please note: user root
bypasses Kerberos AuthN so it can connect from any node as long as the root key+crt are available.
# create principal named 'cockroach'
kadmin.local addprinc -pw <password> cockroach/<load-balancer-IP>@<YOUR.REALM>
kadmin.local addprinc -pw <password> cockroach/<load-balancer-hostname>@<YOUR.REALM>
# create the principal keytab at /etc/krb5.keytab
kadmin.local ktadd cockroach/<load-balancer-IP>@<YOUR.REALM>
kadmin.local ktadd cockroach/<load-balancer-hostname>@<YOUR.REALM>
Each CockroachDB User must have an equally named Principal.
# Principal and DB username is 'fabio'
kadmin.local addprinc -pw <password> fabio@<YOUR.REALM>
2 - Configure keytab on CockroachDB nodes
Download keytab file etc/krb5.keytab
locally, then upload it to every CockroachDB cluster node.
The keytab file should be located inside the CockroachDB config directory, by default is /var/lib/cockroach
.
It is customary to rename the file to cockroach.keytab
.
Also, we assume a Linux user cockroach
was created for running CockroachDB.
# assume krb5.keytab is available in the current directory
sudo mv krb5.keytab /var/lib/cockroach/cockroach.keytab
# ensure permissions and ownership are set correctly
sudo chmod 644 /var/lib/cockroach/cockroach.keytab
sudo chown cockroach:cockroach /var/lib/cockroach/cockroach.keytab
CockroachDB will look for this file by querying the environment variable KRB5_KTNAME
.
You make this env var available to CockroachDB via the Environment
parameter in systemd unit file.
Here's an example systemd unit file, notice the Environment
parameter.
[Unit]
Description=Cockroach Database cluster node
Requires=network.target
[Service]
Type=notify
WorkingDirectory=/var/lib/cockroach
Environment="KRB5_KTNAME=/var/lib/cockroach/cockroach.keytab"
ExecStart=/usr/local/bin/cockroach start \
--certs-dir=/var/lib/cockroach/certs \
--store=/mnt/cockroach \
--listen-addr=0.0.0.0:26257 \
--advertise-addr=host1:26257 \
--cache=.25 \
--max-sql-memory=.25 \
--http-addr=0.0.0.0:8080 \
--join=host1,host2,host3 \
--locality=region=us-east4,zone=a
TimeoutStopSec=300
LimitNOFILE=65000
Restart=always
RestartSec=10
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=cockroach
User=cockroach
[Install]
WantedBy=default.target
Reload systemd service files, and restart each CockroachDB node
# repeat for each CockroachDB node
systemctl daemon-reload
systemctl restart cockroachdb
3 - Configure CockroachDB for Kerberos AuthN
As an admin user, login into CockroachDB and enter these commands at the SQL prompt.
Please note, you need an enterprise license for this feature.
-- enable Kerberos AuthN for all users from all hosts
SET cluster setting server.host_based_authentication.configuration = 'host all all all gss include_realm=0';
-- if not present already, create user 'fabio'
-- the password is only used for logging into the DB Console.
-- The password doesn't have to match the
-- password you gave for the Kerberos Principal, they
-- are not related.
CREATE USER fabio WITH password 'cockroach';
-- apply required grants to the user
GRANT admin TO fabio;
More info on the cluster setting value is available with great details here.
4 - Test
Login into the app server or any other server setup so that you can kinit
(or equivalent in your favorite programming language).
# get the kerberos ticket
kinit fabio
You can use klist
to verify the ticket is valid.
Now you're ready to connect to the database.
cockroach sql --url "postgresql://fabio@<load-balancer-hostname>:26257/defaultdb?sslmode=verify-full&sslrootcert=ca.crt&krbsrvname=cockroach"
krbsrvname=cockroach
this is where you tell CockroachDB what is the SPN user you created in step 1.
To confirm, destroy the ticket and re-attempt connection.
It should fail AuthN of the user.
# destroy all kerberos tickets
kdestroy
# there's no ticket, AuthN will fail
cockroach sql --url "postgresql://fabio@<load-balancer-hostname>:26257/defaultdb?sslmode=verify-full&sslrootcert=ca.crt&krbsrvname=cockroach"
References
Helpful blogs:
Top comments (0)