Dragonfly Instance Authentication
This guide provides step-by-step instructions for setting up Dragonfly with authentication. Currently, Dragonfly supports two types of authentication:
- Password-based authentication through a secret
- TLS-based authentication through a secret
Prerequisites
- A Kubernetes cluster with Dragonfly installed
Password-based authentication
Password-based authentication is the simplest way to secure your Dragonfly instance. In this method, you can set a password for your Dragonfly instance through a secret. The password is then used to authenticate the clients.
Create a secret
kubectl create secret generic dragonfly-auth --from-literal=password=dragonfly
Deploy Dragonfly with authentication
kubectl apply -f - <<EOF
apiVersion: dragonflydb.io/v1alpha1
kind: Dragonfly
metadata:
  name: dragonfly-auth
spec:
    authentication:
      passwordFromSecret:
        name: dragonfly-auth
        key: password
    replicas: 2
EOF
Check the status of the Dragonfly instance
kubectl describe dragonflies.dragonflydb.io dragonfly-auth
Connecting to Dragonfly
kubectl run -it --rm --restart=Never redis-cli --image=redis:7.0.10 -- redis-cli -h dragonfly-auth.default
if you don't see a command prompt, try pressing enter.
dragonfly-auth.default:6379> GET 1
(error) NOAUTH Authentication required. 
dragonfly-auth.default:6379> AUTH dragonfly
OK
dragonfly-auth.default:6379> GET 1
(nil)
dragonfly-auth.default:6379> SET 1 2
OK
dragonfly-auth.default:6379> GET 1
"2"
dragonfly-auth.default:6379> exit
TLS-based authentication
TLS-based authentication is a more secure way to secure your Dragonfly instance. First, you need TLS configured on your Dragonfly instance. Then, you can specify a list of CA certificates that are trusted by the Dragonfly instance. The clients must present a certificate signed by one of the trusted CAs to connect to the Dragonfly instance.
Create a TLS secret for Dragonfly through cert-manager
Install cert-manager
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.13.0/cert-manager.yaml
Create a self-signed certificate
kubectl apply -f - <<EOF
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
  name: ca-issuer
spec:
  selfSigned: {}
EOF
Request a TLS certificate
kubectl apply -f - <<EOF
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: dragonfly-sample
spec:
  secretName: dragonfly-sample
  duration: 2160h # 90d
  renewBefore: 360h # 15d
  subject:
    organizations:
      - dragonfly-sample
  privateKey:
    algorithm: RSA
    encoding: PKCS1
    size: 2048
  dnsNames:
    - dragonfly-sample.com
    - www.dragonfly-sample.com
  issuerRef:
    name: ca-issuer
    kind: Issuer
    group: cert-manager.io
EOF
Generate a client certificate signed by a client CA
Create a Client CA
kubectl apply -f - <<EOF
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
  name: client-ca-issuer
spec:
  selfSigned: {}
EOF
Request a Client certificate
kubectl apply -f - <<EOF
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: dragonfly-client-ca
spec:
    secretName: dragonfly-client-ca
    duration: 2160h # 90d
    renewBefore: 360h # 15d
    subject:
        organizations:
        - dragonfly-client-ca
    privateKey:
        algorithm: RSA
        encoding: PKCS1
        size: 2048
    dnsNames:
        - dragonfly-client-ca.com
        - www.dragonfly-client-ca.com
    usages:
        - client auth
    issuerRef:
        name: client-ca-issuer
        kind: Issuer
        group: cert-manager.io
EOF
Create a Dragonfly instance with TLS
kubectl apply -f - <<EOF
apiVersion: dragonflydb.io/v1alpha1
kind: Dragonfly
metadata:
  name: dragonfly-sample
spec:
    authentication:
      clientCaCertSecret:
        name: dragonfly-client-ca
        key: ca.crt
    replicas: 2
    tlsSecretRef:
      name: dragonfly-sample
EOF
Verify the Dragonfly instance is ready
kubectl describe dragonflies.dragonflydb.io dragonfly-sample
Connecting to Dragonfly With TLS
You should be able to connect to the Dragonfly instance only if you have a client certificate signed by the client CA.
kubectl run -it --rm redis-cli --image=redis:7.0.10 --restart=Never --overrides='
{
    "spec": {
        "containers": [
            {
                "name": "redis-cli",
                "image": "redis:7.0.10",
                "tty": true,
                "stdin": true,
                "command": [
                    "redis-cli",
                    "-h",
                    "dragonfly-sample.default",
                    "--tls",
                    "--cacert",
                    "/etc/ssl/ca.crt",
                    "--cert",
                    "/etc/tls/tls.crt",
                    "--key",
                    "/etc/tls/tls.key"
                ],
                "volumeMounts": [
                    {
                        "name": "ca-certs",
                        "mountPath": "/etc/ssl",
                        "readOnly": true
                    },
                    {
                        "name": "client-certs",
                        "mountPath": "/etc/tls",
                        "readOnly": true
                    }
                ]
            }
        ],
        "volumes": [
            {
                "name": "ca-certs",
                "secret": {
                    "secretName": "dragonfly-sample"
                }
            },
            {
                "name": "client-certs",
                "secret": {
                    "secretName": "dragonfly-client-ca"
                }
            }
        ]
    }
}'