Couchbase Encryption At Rest

      +
      How to configure Couchbase Server with encryption at rest. This guide covers operator-managed keys, AWS KMS-backed keys, and KMIP-backed keys,

      Couchbase Server supports encryption at rest. This is a feature that allows you to encrypt the data at rest on the disk.

      Prerequisites

      • Couchbase Server 8.0.0 or later

      Overview

      In Couchbase 8.0.0 Encryption at Rest was introduced which allows data on the Couchbase Nodes to be encrypted at rest. The data that can be encrypted at rest includes:

      • Data in buckets

      • Cluster configuration

      • Logs

      • Audit

      Couchbase offers three types of Keys that can be used to encrypt data:

      • Couchbase Server Managed Keys

      • AWS KMS Keys

      • KMIP Keys

      Enabling Encryption at Rest Management

      To use any Encryption at Rest features through the Operator, you must first enable encryption at rest management on the Couchbase Cluster resource.

      apiVersion: couchbase.com/v2
      kind: CouchbaseCluster
      metadata:
        name: my-cluster
      spec:
        security:
          encryptionAtRest:
            managed: true (1)
      1 Enable operator-managed encryption at rest. By default, this is disabled.

      Once enabled, the operator will manage encryption keys and apply encryption settings to your cluster.

      Selecting Encryption Keys

      By default, the operator will use all CouchbaseEncryptionKey resources in the same namespace as the cluster. You can use a label selector to control which keys the operator manages:

      apiVersion: couchbase.com/v2
      kind: CouchbaseCluster
      metadata:
        name: my-cluster
      spec:
        security:
          encryptionAtRest:
            managed: true
            selector: (1)
              matchLabels:
                cluster: my-cluster
      1 Only encryption keys with the label cluster: my-cluster will be managed for this cluster.

      Managing Couchbase Server Managed Keys

      Couchbase Server Managed Keys (also called AutoGenerated keys) are the simplest type of encryption key. These keys are generated and managed automatically by Couchbase Server without requiring external key management services.

      Basic Example

      apiVersion: couchbase.com/v2
      kind: CouchbaseEncryptionKey
      metadata:
        name: my-key
      spec:
        keyType: AutoGenerated

      Usage

      Keys can be used to encrypt different types of data, and this usage can be enforced by setting the usage of the key. Setting the usage of the key restricts what it can be be used to encrypt, with the options being:

      • Keys

      • Configuration

      • Logs

      • Audit

      • Buckets

      By default keys can be used to encrypt anything. To restrict the usage of the key the spec.usage object on the key can be used to set the usage of the key.

      apiVersion: couchbase.com/v2
      kind: CouchbaseEncryptionKey
      metadata:
        name: my-key
      spec:
        keyType: AutoGenerated
        usage:
          configuration: true (1)
          key: true (2)
          log: true (3)
          audit: true (4)
          allBuckets: true (5)
      1 The spec.usage.configuration field defines whether the key should be used for configurations. This is set to true by default.
      2 The spec.usage.key field defines whether the key should be used for keys. This is set to true by default.
      3 The spec.usage.log field defines whether the key should be used for logs. This is set to true by default.
      4 The spec.usage.audit field defines whether the key should be used for audit. This is set to true by default.
      5 The spec.usage.allBuckets field defines whether the key should be used for all buckets. This is set to true by default.

      Additional Options

      apiVersion: couchbase.com/v2
      kind: CouchbaseEncryptionKey
      metadata:
        name: my-key
      spec:
        keyType: AutoGenerated
        autoGenerated:
          rotation:
            intervalDays: 30 (1)
            StartTime: 2025-01-01T00:00:00Z (2)
          canBeCached: true
      1 The spec.autoGenerated.rotation.intervalDays field defines the interval in days at which the key should be rotated.
      2 The spec.autoGenerated.rotation.startTime field defines the first time at which the key rotation will start.

      Key Encryption with Another Key

      For enhanced security, AutoGenerated keys can be encrypted with another encryption key instead of the cluster’s master password:

      apiVersion: couchbase.com/v2
      kind: CouchbaseEncryptionKey
      metadata:
        name: master-key
      spec:
        keyType: AutoGenerated
        usage: (1)
          configuration: false
          key: true (2)
          log: false
          audit: false
          allBuckets: false
      ---
      apiVersion: couchbase.com/v2
      kind: CouchbaseEncryptionKey
      metadata:
        name: bucket-key
      spec:
        keyType: AutoGenerated
        autoGenerated:
          encryptWithKey: master-key (3)
        usage:
          configuration: false
          key: false
          log: false
          audit: false
          allBuckets: true (4)
      1 Restrict the master key’s usage to only encrypt other keys (Key Encryption Key).
      2 Allow this key to be used for encrypting other keys.
      3 Encrypt this key using the master-key encryption key.
      4 This key will only be used to encrypt bucket data.

      Managing AWS KMS Keys

      AWS Key Management Service (KMS) is a fully managed service that makes it easy to create, manage, and control cryptographic keys used to protect your data. AWS KMS Keys can be used to encrypt the data at rest in the Couchbase Cluster. To use AWS KMS Keys you will need to provide a way to authenticate with AWS, either using IMDS or providing a secret with credentials.

      Prerequisites

      • An AWS account with KMS key creation permissions

      • A KMS key created in AWS

      • Either:

        • AWS credentials with permission to use the KMS key, or

        • IAM role attached to the Kubernetes nodes with KMS permissions (for IMDS)

      Basic Example with AWS Credentials

      To provide AWS credentials via a Kubernetes secret a secret with the AWS credentials must be created. The credentials file should follow the standard AWS credentials format:

      [default]
      aws_access_key_id = YOUR_ACCESS_KEY_ID
      aws_secret_access_key = YOUR_SECRET_ACCESS_KEY

      The secret can be created using the following command:

      Step 1: Create an AWS credentials secret
      kubectl create secret generic aws-credentials \
        --from-file=credentials=/path/to/.aws/credentials
      Step 2: Create the encryption key resource
      apiVersion: couchbase.com/v2
      kind: CouchbaseEncryptionKey
      metadata:
        name: my-aws-key
      spec:
        keyType: AWS (1)
        awsKey:
          keyARN: "arn:aws:kms:us-east-1:123456789012:key/abcd1234-ab12-cd34-ef56-abcdef123456" (2)
          keyRegion: "us-east-1" (3)
          credentialsSecret: "aws-credentials" (4)
          profileName: <optional profile name> (5)
      1 Specifies that this is an AWS KMS key.
      2 The ARN of your KMS key from AWS.
      3 The AWS region where the KMS key is located.
      4 The name of the Kubernetes secret containing AWS credentials.
      5 The optional profile name to use for the AWS credentials if multiple profiles are present in the credentials file.

      Authenticating with IMDS

      When running in AWS (EKS or Kubernetes on EC2), you can use Instance Metadata Service (IMDS) to authenticate using the IAM role attached to the nodes:

      apiVersion: couchbase.com/v2
      kind: CouchbaseEncryptionKey
      metadata:
        name: my-aws-key-imds
      spec:
        keyType: AWS
        awsKey:
          keyARN: "arn:aws:kms:us-east-1:123456789012:key/abcd1234-ab12-cd34-ef56-abcdef123456"
          keyRegion: "us-east-1"
          useIMDS: true (1)
      1 Enable authentication using IMDS. No credentials secret is required.

      Managing KMIP Keys

      Key Management Interoperability Protocol (KMIP) is an OASIS standard for communication between key management systems and applications. KMIP allows you to use external key management solutions from vendors like Thales, IBM, or HashiCorp Vault.

      Prerequisites

      • A KMIP-compliant server

      • Client certificate and private key in PKCS#8 format

      • KMIP server host and port

      • A key ID for an existing key on the KMIP server

      Basic Example

      Step 1: Create a Kubernetes secret with client credentials
      apiVersion: v1
      kind: Secret
      metadata:
        name: kmip-client-secret
      type: Opaque
      data:
        passphrase: <passphrase base64 encoded>
        tls.key: <tls-key base64 encoded>
        tls.crt: <tls-crt base64 encoded>

      The secret must contain three keys :

      • tls.crt - The client certificate

      • tls.key - The client private key in encrypted PKCS#8 format

      • passphrase - The passphrase for decrypting the private key

      Step 2: Create the KMIP encryption key resource
      apiVersion: couchbase.com/v2
      kind: CouchbaseEncryptionKey
      metadata:
        name: my-kmip-key
      spec:
        keyType: KMIP (1)
        kmipKey:
          host: "kmip.example.com" (2)
          port: 5696 (3)
          timeoutInMs: 5000 (4)
          clientSecret: "kmip-client-cert" (5)
          verifyWithSystemCA: true (6)
          verifyWithCouchbaseCA: true (7)
          keyID: "existing-key-identifier" (8)
      1 Specifies that this is a KMIP-managed key.
      2 The hostname of your KMIP server.
      3 The port number of your KMIP server (standard KMIP port is 5696).
      4 Connection timeout in milliseconds (must be between 1000 and 300000).
      5 The name of the Kubernetes secret containing client certificates.
      6 Verify the KMIP server certificate against the system CA bundle.
      7 Verify the KMIP server certificate against the Couchbase CA bundle.
      8 The unique identifier of the existing key in the KMIP server.

      Encryption Approaches

      KMIP supports two encryption approaches:

      apiVersion: couchbase.com/v2
      kind: CouchbaseEncryptionKey
      metadata:
        name: my-kmip-key-native
      spec:
        keyType: KMIP
        kmipKey:
          host: "kmip.example.com"
          port: 5696
          timeoutInMs: 5000
          clientSecret: "kmip-client-cert"
          encryptionApproach: NativeEncryptDecrypt (1)
      1 Use native encrypt/decrypt operations on the KMIP server.

      Available approaches:

      • LocalEncrypt (default) - Key material is retrieved and encryption/decryption happens locally on Couchbase nodes. Better performance.

      • NativeEncryptDecrypt - Encryption/decryption operations are performed by the KMIP server. Key material never leaves the KMIP server. More secure but higher latency.

      Choose NativeEncryptDecrypt when security requirements mandate that key material never leaves the key management system. Choose LocalEncrypt for better performance when the security model allows it.

      Encrypting Cluster Data

      Once encryption keys are created, you can enable encryption for different types of cluster data.

      Encrypting Configuration, Logs, and Audit

      Configuration, logs, and audit logs can be encrypted at the cluster level:

      apiVersion: couchbase.com/v2
      kind: CouchbaseCluster
      metadata:
        name: my-cluster
      spec:
        security:
          encryptionAtRest:
            managed: true
            configuration: (1)
              enabled: true
              keyName: "my-autogen-key" (2)
              keyLifetime: "8760h" (3)
              rotationInterval: "720h" (4)
            audit: (5)
              enabled: true
              keyName: "my-autogen-key"
              keyLifetime: "8760h"
              rotationInterval: "720h"
            log: (6)
              enabled: true
              keyName: "my-autogen-key"
              keyLifetime: "8760h"
              rotationInterval: "720h"
      1 Enable encryption for cluster configuration.
      2 Use the my-autogen-key encryption key. If not specified, the cluster master password is used.
      3 Data Encryption Key (DEK) lifetime in hours. Default is 8760 hours (1 year). Must be at least 720 hours (30 days).
      4 DEK rotation interval in hours. Default is 720 hours (30 days). Must be at least 168 hours (7 days).
      5 Enable encryption for audit logs.
      6 Enable encryption for log files.
      Enabling encryption for log files will break fluent-bit log streaming, as the logs will be encrypted and unreadable by the log collector. Only enable log encryption if you don’t rely on log streaming.

      Using Default Encryption (Master Password)

      You can enable encryption without specifying a key name. In this case, the cluster’s master password is used:

      apiVersion: couchbase.com/v2
      kind: CouchbaseCluster
      metadata:
        name: my-cluster
      spec:
        security:
          encryptionAtRest:
            managed: true
            configuration:
              enabled: true (1)
              # keyName not specified - uses master password
      1 Encrypt configuration using the cluster master password instead of an encryption key.

      Encrypting Buckets

      Individual buckets can be encrypted with specific keys. This is configured at the bucket level:

      apiVersion: couchbase.com/v2
      kind: CouchbaseBucket
      metadata:
        name: my-encrypted-bucket
      spec:
        name: my-encrypted-bucket
        memoryQuota: 512Mi
        encryptionAtRest: (1)
          keyName: "my-autogen-key" (2)
          keyLifetime: "8760h" (3)
          rotationInterval: "720h" (4)
      1 Enable bucket encryption.
      2 The encryption key to use.
      3 DEK lifetime. Default is 8760 hours (1 year).
      4 DEK rotation interval. Default is 720 hours (30 days).