Cifrado de secretos estáticos de Kubernetes en etcd

Descubra cómo cifrar los datos de configuración almacenados como secretos de Kubernetes en etcd al utilizar Container Engine for Kubernetes (OKE).

El plano de control de cluster de Kubernetes almacena datos de configuración sensibles (como tokens de autenticación, certificados y credenciales) como objetos secretos de Kubernetes en etcd. Etcd es un almacén de clave-valor distribuido con código abierto que Kubernetes utiliza para la coordinación de clusters y la gestión de estado. En los clusters de Kubernetes creados por Container Engine for Kubernetes, etcd escribe y lee datos hacia y desde volúmenes de almacenamiento en bloque del servicio de Oracle Cloud Infrastructure Block Volume. Por defecto, Oracle cifra los datos en volúmenes en bloque estáticos, incluidos los secretos de etcd y Kubernetes. Oracle gestiona este cifrado por defecto mediante una clave de cifrado maestra, sin necesidad de realizar ninguna acción por su parte. Para obtener un control adicional sobre el ciclo de vida de la clave de cifrado maestra y cómo se utiliza, puede elegir gestionar la clave de cifrado maestra usted mismo, en lugar de que Oracle la gestione por usted.

Si decide gestionar la clave de cifrado maestra usted mismo, especifique la clave que desea utilizar y tendrá control sobre cuándo se rota la clave. La clave de cifrado maestra se almacena en el servicio Almacén de Oracle Cloud Infrastructure (consulte Gestión de claves). Los secretos estáticos de Kubernetes en etcd se cifran mediante una clave de cifrado de datos (una DEK) mediante el algoritmo de cifrado AES-CBC con relleno PKCS#7. Se genera una nueva DEK para cada cifrado. Las claves de cifrado de datos se cifran mediante la clave de cifrado maestra (MEK), un concepto conocido como cifrado de sobres.

Para poder crear un cluster para el que desee gestionar la clave de cifrado maestra usted mismo, debe:

  • Crear una clave de cifrado maestra adecuada en el almacén de claves (u obtener el nombre y el OCID de dicha clave)
  • crear un grupo dinámico que incluya todos los clusters en el compartimento en el que va a crear el nuevo cluster
  • crear una política que autorice el grupo dinámico para utilizar la clave de cifrado maestra

Después de crear el cluster y especificar que desea gestionar la clave de cifrado maestra usted mismo, opcionalmente puede restringir el uso de la clave de cifrado maestra modificando el grupo dinámico para incluir solo ese cluster.

Tenga en cuenta lo siguiente:

  • Solo puede seleccionar la opción para gestionar la clave de cifrado maestra usted mismo al crear un nuevo cluster en el flujo de trabajo "Creación personalizada". No puede elegir gestionar la clave de cifrado maestra al crear un nuevo cluster en el flujo de trabajo 'Creación rápida'. Y no puede elegir gestionar las claves de cifrado maestras para los clusters que creó anteriormente en el flujo de trabajo "Creación personalizada".
Atención

Si selecciona la opción para gestionar la clave de cifrado maestra usted mismo, no suprima posteriormente la clave de cifrado maestra en el servicio Almacén. En cuanto se programa una clave para su supresión en el almacén de claves, los secretos de Kubernetes almacenados para el cluster en etcd se vuelven inaccesibles. Si ya ha programado la clave para su supresión, puede que siga en estado Supresión pendiente. En ese caso, cancele la supresión de la clave programada (consulte Cancelación de una supresión de clave de cifrado maestra) para restaurar el acceso a los secretos de Kubernetes. Si permite que se complete la operación de supresión de clave programada y que se suprima la clave de cifrado maestra, no se podrá acceder de forma permanente a los secretos de Kubernetes almacenados para el cluster en etcd. Como resultado, las actualizaciones de cluster fallarán. En esta situación, no tiene otra opción, excepto suprimir y volver a crear el cluster.

Configuración del acceso a la clave de cifrado maestra

Si decide gestionar la clave de cifrado maestra que cifra los secretos de Kubernetes en el almacén de clave-valor etcd del cluster al crear un nuevo cluster en el flujo de trabajo "Creación personalizada", configure el acceso a la clave de cifrado maestra:

  1. Inicie sesión en la Consola.
  2. Si conoce el OCID de la clave de cifrado maestra que se debe utilizar para cifrar secretos de Kubernetes, vaya directamente al siguiente paso. De lo contrario:

    • Si ya existe una clave de cifrado maestra adecuada en el almacén de datos, pero no está seguro de su OCID, siga las instrucciones en Listado de claves de cifrado maestras y anote el OCID de la clave de cifrado maestra.
    • Si aún no existe una clave de cifrado maestra adecuada en Vault, siga las instrucciones en Creating a Master Encryption Key para crear una, definiendo:
      • Modo de protección para software o HSM.
      • Unidad de clave: algoritmo para AES, RSA o ECDSA.
      • Unidad de clave: longitud para las claves AES (128, 256) y las claves RSA (2048, 3072, 4096) o Unidad de clave: ID de curva para las claves ECDSA (NIST_P256, NIST_P384, NIST_P521).
      Una vez creada una nueva clave de cifrado maestra, anote su OCID.
  3. Otorgue acceso a la clave de cifrado maestra en Vault.

    Puede otorgar acceso a la clave de cifrado maestra de dos formas:

    Crear una nueva política de IAM (recomendado)
    1. Abra el menú de navegación y haga clic en Identidad y seguridad. En Identidad, haga clic en Políticas.
    2. Siga las instrucciones en Para crear una política y asigne un nombre a la política (por ejemplo, acme-oke-kms-policy).
    3. Introduzca una sentencia de política para proporcionar acceso a la clave de cifrado maestra, con el formato:

      Allow any-user to use keys in compartment <compartment-name> where ALL {request.principal.type = 'cluster', target.key.id = '<key-ocid>'}
      

      donde:

      • <compartment-name> es el nombre del compartimento que contiene la clave de cifrado maestra.
      • <key-OCID> es el OCID de la clave de cifrado maestra del almacén de claves.

      Por ejemplo:

      Allow any-user to use keys in compartment acme-kms-key-compartment where ALL {request.principal.type = 'cluster', target.key.id = 'ocid1.key.oc1.iad.annrl______trfg'}
      
    4. Haga clic en Crear para crear la nueva política.
    Crear un nuevo grupo dinámico y, a continuación, crear una nueva política de IAM
    1. Abra el menú de navegación y haga clic en Identidad y seguridad. En Identidad, haga clic en Dominios. En Dominio de identidad, haga clic en Grupos dinámicos.
    2. Siga las instrucciones en Para crear un grupo dinámico y asígnele un nombre al grupo dinámico (por ejemplo, acme-oke-kms-dyn-grp).
    3. Introduzca una regla que incluya todos los clusters en el compartimento con el formato:

      ALL {resource.type = 'cluster', resource.compartment.id = '<compartment-ocid>'}

      donde <compartment-ocid> es el OCID del compartimento en el que desea crear el nuevo cluster.

      Por ejemplo:

      ALL {resource.type = 'cluster', resource.compartment.id = 'ocid1.compartment.oc1..aaaaaaaa23______smwa'}
    4. Haga clic en Crear grupo dinámico.

      Una vez que haya creado un grupo dinámico que incluya todos los clusters del compartimento, puede crear una política para proporcionar al grupo dinámico acceso a la clave de cifrado maestra en el almacén de claves.

    5. Abra el menú de navegación y haga clic en Identidad y seguridad. En Identidad, haga clic en Políticas.
    6. Siga las instrucciones en Para crear una política y asigne un nombre a la política (por ejemplo, acme-oke-kms-dyn-grp-policy).
    7. Introduzca una sentencia de política para proporcionar al grupo dinámico acceso a la clave de cifrado maestra, con el formato:

      Allow dynamic-group <dynamic-group-name> to use keys in compartment <compartment-name> where target.key.id = '<key-OCID>'

      donde:

      • <dynamic-group-name> es el nombre del grupo dinámico que ha creado antes.
      • <compartment-name> es el nombre del compartimento que contiene la clave de cifrado maestra.
      • <key-OCID> es el OCID de la clave de cifrado maestra del almacén de claves.

      Por ejemplo:

      Allow dynamic-group <acme-oke-kms-dyn-grp> to use keys in compartment acme-kms-key-compartment where target.key.id = 'ocid1.key.oc1.iad.annrl______trfg'
    8. Haga clic en Crear para crear la nueva política.
  4. Al crear un nuevo cluster, seleccione la opción Cifrar mediante una clave que gestione y especifique la clave de cifrado maestra (consulte Uso de la consola para crear un cluster con valores definidos explícitamente en el flujo de trabajo "Creación personalizada").

  5. (Opcional) Una vez que ha creado el cluster, para mayor seguridad:

    1. Tome nota del OCID del nuevo cluster que acaba de crear.
    2. Restrinja el uso de la clave de cifrado maestra:

      • si simplemente ha creado una política de IAM, modifique la sentencia de política para incluir explícitamente el OCID del nuevo cluster, en lugar de todos los clusters del compartimento. Por ejemplo:

        Allow any-user to use keys in compartment acme-kms-key-compartment where ALL {request.principal.type = 'cluster', target.key.id = 'ocid1.key.oc1.iad.annrl______trfg', request.principal.id = 'ocid1.cluster.oc1.iad.aaaaaaaaaf______yg5q'}
        
      • si ha creado un grupo dinámico, modifique la regla de grupo dinámico que ha creado anteriormente para especificar explícitamente el OCID del nuevo cluster, en lugar de todos los clusters del compartimento. Por ejemplo:

        resource.id = 'ocid1.cluster.oc1.iad.aaaaaaaaaf______yg5q'

Rotar la clave de cifrado maestra

Si selecciona la opción para gestionar la clave de cifrado maestra usted mismo, puede rotar la clave de cifrado maestra en el servicio Almacén de claves, creando una nueva versión de la clave de cifrado maestra (consulte Rotación de una clave de almacén).

En esta situación, la clave de cifrado maestra no se suprime en sí misma (el recurso de clave de cifrado maestra sigue existiendo, con el mismo OCID), pero la clave de cifrado maestra tiene un nuevo valor. Cualquier secreto de Kubernetes nuevo almacenado para el cluster se cifrará mediante el nuevo valor de la clave de cifrado maestra. Se seguirá accediendo a cualquier secreto de Kubernetes cifrado existente, porque la versión original de la clave de cifrado maestra sigue estando disponible en el servicio Almacén. Si desea que los secretos de Kubernetes existentes se cifren mediante la nueva versión de la clave de cifrado maestra, debe rotar los secretos de Kubernetes para que se vuelvan a cifrar. Por ejemplo, al ejecutar el siguiente comando:
kubectl get secrets --all-namespaces -o json | kubectl annotate --overwrite -f - encryption-key-rotation-time="<time>"

donde <time> es una cadena que indica cuándo realizar la rotación. Por ejemplo:

kubectl get secrets --all-namespaces -o json | kubectl annotate --overwrite -f - encryption-key-rotation-time="20210909_2135"

Claves de cifrado maestras en Otros arrendamientos

Puede crear un cluster en un arrendamiento que utilice una clave de cifrado maestra en un arrendamiento diferente. En este caso, debe escribir políticas de arrendamiento cruzado para activar el cluster en su arrendamiento para acceder a la clave de cifrado maestra en el arrendamiento del servicio Vault. Tenga en cuenta que si desea crear un cluster y especificar una clave de cifrado maestra que esté en un arrendamiento diferente, no puede utilizar la consola para crear el cluster.

Por ejemplo, supongamos que el cluster está en ClusterTenancy y que la clave de cifrado maestra está en KeyTenancy. Los usuarios que pertenecen a un grupo (OKEAdminGroup) en ClusterTenancy tienen permisos para crear clusters. Se ha creado un grupo dinámico (OKEAdminDynGroup) en el cluster, con la regla ALL {resource.type = 'cluster', resource.compartment.id = 'ocid1.compartment.oc1..<unique_ID>'}, por lo que todos los clusters creados en ClusterTenancy pertenecen al grupo dinámico.

En el compartimento raíz de KeyTenancy, las siguientes políticas:

  • utilizar OCID de ClusterTenancy para asignar ClusterTenancy al alias OKE_Tenancy
  • utilizar OCID de OKEAdminGroup y OKEAdminDynGroup para asignarlos a los alias RemoteOKEAdminGroup y RemoteOKEClusterDynGroup, respectivamente
  • proporcionar a RemoteOKEAdminGroup y RemoteOKEClusterDynGroup la capacidad de mostrar, ver y realizar operaciones criptográficas con una clave maestra concreta en KeyTenancy
Define tenancy OKE_Tenancy as ocid1.tenancy.oc1..<unique_ID>
Define dynamic-group RemoteOKEClusterDynGroup as ocid1.dynamicgroup.oc1..<unique_ID>
Define group RemoteOKEAdminGroup as ocid1.group.oc1..<unique_ID>
Admit dynamic-group RemoteOKEClusterDynGroup of tenancy ClusterTenancy to use keys in tenancy where target.key.id = 'ocid1.key.oc1..<unique_ID>'
Admit group RemoteOKEAdminGroup of tenancy ClusterTenancy to use keys in tenancy where target.key.id = 'ocid1.key.oc1..<unique_ID>'

En el compartimento raíz de ClusterTenancy, las siguientes políticas:

  • utilizar OCID de KeyTenancy para asignar KeyTenancy al alias KMS_Tenancy
  • proporcionar a OKEAdminGroup y OKEAdminDynGroup la capacidad de utilizar claves maestras en KeyTenancy
  • permitir que OKEAdminDynGroup utilice una clave maestra específica obtenida de KeyTenancy en ClusterTenancy
Define tenancy KMS_Tenancy as ocid1.tenancy.oc1..<unique_ID>
Endorse group OKEAdminGroup to use keys in tenancy KMS_Tenancy
Endorse dynamic-group OKEAdminDynGroup to use keys in tenancy KMS_Tenancy
Allow dynamic-group OKEAdminDynGroup to use keys in tenancy where target.key.id = 'ocid1.key.oc1..<unique_ID>'

Consulte Acceso a recursos de Object Storage entre arrendamientos para obtener más ejemplos de la escritura de políticas entre arrendamientos.

Una vez introducidas las políticas, puede ejecutar un comando similar al siguiente para crear un cluster en ClusterTenancy que utilice la clave maestra obtenida de KeyTenancy:
oci ce cluster create --name oke-with-cross-kms --kubernetes-version v1.16.8 --vcn-id ocid1.vcn.oc1.iad.<unique_ID> --service-lb-subnet-ids '["ocid1.subnet.oc1.iad.<unique_ID>"]' --compartment-id ocid1.compartment.oc1..<unique_ID> --kms-key-id ocid1.key.oc1.iad.<unique_ID>