Cifrado de secretos

Configuración de cifrado de secretos

RKE2 soporta la encriptación de secretos en reposo, y hará lo siguiente automáticamente:

  • Generar una clave AES-CBC.

  • Generar un archivo de configuración de cifrado con la clave generada.

  • Pasar la configuración al APIServer de Kubernetes como configuración-proveedor-de-cifrado.

Elegir Proveedor de Cifrado

Puerta de Versión

Disponible a partir de las versiones de abril de 2025: v1.30.12+rke2r1, v1.31.8+rke2r1, v1.32.4+rke2r1, v1.33.0+rke2r1.

Conformidad con FIPS

La conformidad con FIPS 140-3 solo está disponible con el aescbc proveedor.

Usando la --secrets-encryption-provider bandera, puedes elegir qué proveedor de cifrado utilizar. El valor por defecto es aescbc.

RKE2 soporta los siguientes proveedores de cifrado:

  • aescbc: AES-CBC con relleno PKCS#7

  • secretbox: XSalsa20 y Poly1305

Migrando Proveedores

Puedes migrar del proveedor aescbc al proveedor secretbox siguiendo estos pasos:

  1. Asegúrate de que el secretbox proveedor sea compatible con tu versión de RKE2.

  2. Actualiza/Añade la secrets-encryption-provider bandera en tu archivo de configuración de RKE2 a secretbox.

  3. Rotar las claves de cifrado, siguiendo la [Encryption Key Rotation] sección a continuación.

Archivo de configuración de cifrado generado

A continuación se muestra un ejemplo del archivo de configuración de cifrado que RKE2 genera con el aescbc proveedor por defecto:

#/var/lib/rancher/rke2/server/cred/encryption-config.json
{
  "kind": "EncryptionConfiguration",
  "apiVersion": "apiserver.config.k8s.io/v1",
  "resources": [
    {
      "resources": [
        "secrets"
      ],
      "providers": [
        {
          "aescbc": {
            "keys": [
              {
                "name": "aescbckey",
                "secret": "xxxxxxxxxxxxxxxxxxx"
              }
            ]
          }
        },
        {
          "identity": {}
        }
      ]
    }
  ]
}

Herramienta de Encriptación de Secretos

RKE2 contiene un subcomando secrets-encrypt, que permite a los administradores realizar las siguientes tareas:

  • Añadir nuevas claves de encriptación

  • Rotar y eliminar claves de encriptación

  • Reencriptar secretos

No seguir el procedimiento adecuado al rotar las claves de cifrado de secretos puede causar pérdida de datos permanente. Se recomienda crear una instantánea antes de rotar. Procede con precaución.

Rotación de Claves de Encriptación

Puerta de Versión

Disponible a partir de las versiones de septiembre de 2024: v1.29.9+rke2r1, v1.30.5+rke2r1, v1.31.1+rke2r1.

Para versiones anteriores, consulta [Encryption Key Rotation Classic].

  • Servidor Único

  • Alta disponibilidad

Para rotar las claves de encriptación de secretos en un clúster de servidor único:

  1. Rotar las claves de cifrado de secretos.

    rke2 secrets-encrypt rotate-keys
  2. Espera a que termine la reencriptación. Observa los registros del servidor, o espera a:

    $ rke2 secrets-encrypt status
    Encryption Status: Enabled
    Current Rotation Stage: reencrypt_finished

Para rotar las claves de encriptación de secretos en configuraciones de alta disponibilidad:

En este ejemplo, se utilizan 3 servidores para un clúster de alta disponibilidad, denominados S1, S2, S3. Se recomienda que elijas un nodo de servidor desde el cual ejecutar los secrets-encrypt comandos.

  1. Rotar las claves de cifrado de secretos en S1.

    rke2 secrets-encrypt rotate-keys
  2. Espera a que termine la reencriptación. Observa los registros del servidor, o espera a:

    $ rke2 secrets-encrypt status
    Encryption Status: Enabled
    Current Rotation Stage: reencrypt_finished
  3. Reinicia secuencialmente RKE2 en S1, S2, S3.

    systemctl restart rke2-server.service

    Espera a que el comando systemctl termine antes de reiniciar el siguiente servidor.

Rotación de claves de cifrado clásica

Nuevo procedimiento

Si utilizas versiones de RKE2 más nuevas que v1.30.1+rke2r1, te recomendamos usar el [Encryption Key Rotation] en su lugar.

  • Servidor Único

  • Alta disponibilidad

Para rotar las claves de cifrado de secretos en un clúster de nodo único:

  1. Preparar:

    rke2 secrets-encrypt prepare
  2. Reinicia el kube-apiserver pod:

    # Get the kube-apiserver container ID export CONTAINER_RUNTIME_ENDPOINT="unix:///var/run/k3s/containerd/containerd.sock" crictl ps --name kube-apiserver # Stop the pod crictl stop <CONTAINER_ID>
  3. Rotar:

    rke2 secrets-encrypt rotate
  4. Reinicia el kube-apiserver pod de nuevo.

  5. Reencriptar:

    rke2 secrets-encrypt reencrypt

Para rotar las claves de encriptación de secretos en configuraciones de alta disponibilidad:

En este ejemplo, se utilizan 3 servidores para un clúster de alta disponibilidad, denominados S1, S2, S3. Aunque no es obligatorio, se recomienda que elijas un nodo de servidor desde el cual ejecutar los comandos secrets-encrypt.

  1. Preparar en S1.

    rke2 secrets-encrypt prepare
  2. Reinicia secuencialmente S1, S2, S3.

    systemctl restart rke2-server.service

    Espera a que el comando systemctl termine antes de reiniciar el siguiente servidor.

  3. Rotar en S1.

    rke2 secrets-encrypt rotate
  4. Reinicia secuencialmente S1, S2, S3.

  5. Reencriptar en S1.

    rke2 secrets-encrypt reencrypt

    Espera hasta que la reencriptación haya finalizado, ya sea mediante los registros del servidor journalctl -u rke2-server o rke2 secrets-encrypt status. El estado devolverá reencrypt_finished cuando se complete.

  6. Reinicia secuencialmente S1, S2, S3.

Estado de encriptación de secretos

El secrets-encrypt status subcomando muestra información sobre el estado actual del cifrado de secretos en el nodo.

Un ejemplo del comando en un nodo de un solo servidor:

$ rke2 secrets-encrypt status
Encryption Status: Enabled
Current Rotation Stage: start
Server Encryption Hashes: All hashes match

Active  Key Type  Name
------  --------  ----
 *      AES-CBC   aescbckey

Otro ejemplo en un clúster de alta disponibilidad, después de rotar las claves, pero antes de reiniciar los servidores:

$ rke2 secrets-encrypt status
Encryption Status: Enabled
Current Rotation Stage: rotate
Server Encryption Hashes: hash does not match between node-1 and node-2

Active  Key Type  Name
------  --------  ----
 *      AES-CBC   aescbckey-2021-12-10T22:54:38Z
        AES-CBC   aescbckey

Los detalles de cada sección son los siguientes:

  • Estado de cifrado: Se muestra si la encriptación de secretos está deshabilitada o habilitada en el nodo

  • Etapa de rotación actual: Indica la etapa de rotación actual en el nodo. Las etapas son: start, prepare, rotate, reencrypt_request, reencrypt_active, reencrypt_finished

  • Hashes de cifrado del servidor: Útil para clústeres HA, esto indica si todos los servidores están en la misma etapa con sus archivos locales. Esto se puede usar para identificar si se requiere un reinicio de los servidores antes de proceder a la siguiente etapa. En el ejemplo de HA anterior, el nodo-1 y el nodo-2 tienen hashes diferentes, lo que indica que actualmente no tienen la misma configuración de encriptación. Reiniciar los servidores sincronizará su configuración.

Tabla de claves Descripción

Activo

El * indica cuáles, si los hay, de las claves se utilizan actualmente para el cifrado de secretos. La clave activa es utilizada por Kubernetes para cifrar cualquier nuevo secreto.

Tipo de clave

RKE2 solo admite el AES-CBC tipo de clave. Encuentra más información aquí.

Nombre

Nombre de la clave de encriptación. El valor por defecto es aescbckey-<DATE_AND_TIME>.