Rotación de credenciales de Cassandra en Hashicorp Vault

Descripción general

Esta función permite a los administradores de la plataforma hacer lo siguiente:

  • Rota las credenciales de Cassandra en Hashicorp Vault.
  • Revierte a las credenciales de Cassandra anteriores en Vault en caso de que haya algún problema durante la rotación de contraseñas.
  • Rota la contraseña de Cassandra para una región a la vez, de modo que puedas garantizar un impacto mínimo en la disponibilidad del servicio y mantener el control sobre el proceso de rotación.
  • Haz un seguimiento del inicio, el progreso y la finalización de la rotación de una sola región.

Esta función está disponible en Apigee Hybrid 1.13.1 y versiones posteriores.

Antes de comenzar

Antes de configurar la rotación de credenciales, haz lo siguiente:

  • Crea una copia de seguridad de tu base de datos de Cassandra. Esta copia de seguridad se realiza para garantizar que se pueda recuperar las credenciales rotadas previamente.
  • Asegúrate de que el clúster esté en buen estado (es decir, que todos los recursos de Apigee se estén ejecutando y que no haya cambios de estado pendientes).

Configuración de una sola región

  1. Crea un nuevo recurso de Kubernetes SecretProviderClass en tu espacio de nombres de Apigee para las nuevas credenciales de Cassandra. Consulta Almacena secretos de Cassandra en Hashicorp Vault para obtener una plantilla que puedas usar. Esto permite que un rol de Vault acceda a los secretos dentro de los espacios de nombres de Kubernetes.
  2. Crea un nuevo recurso personalizado de SecretRotation con la siguiente plantilla:
    # rotation.yaml
    
    apiVersion: apigee.cloud.google.com/v1alpha1
    kind: SecretRotation
    metadata:
      name: ROTATION_PROCESS_NAME
      namespace: APIGEE_NAMESPACE
    spec:
      organizationId: ORG_NAME
      rotationId: ROTATION_ID
      timeoutMinutes: 480 # optional. overrides the default (480m == 8hr).
                          # less than or equal to 0 means infinite timeout.
      precheck: true
      cassandra:
        oldSecretProviderClass: OLD_SPC_NAME
        newSecretProviderClass: NEW_SPC_NAME
        jobType: ROTATE
    
    • ROTATION_PROCESS_NAME: Es un nombre único para la tarea de rotación. Deberás establecer metadata.name en un valor único para el trabajo de verificación previa a la rotación y, nuevamente, para el trabajo de rotación. Por ejemplo, sr-1-precheck seguido de sr-1.
    • ROTATION_ID: Establece spec.rotationId en un identificador personalizado, por ejemplo, rotation-1-precheck.
    • NEW_SPC_NAME: Establece spec.cassandra.newSecretProviderClass en el nuevo nombre de clase del proveedor de secretos que creaste en el paso anterior.
    • OLD_SPC_NAME: Establece spec.cassandra.oldSecretProviderClass en el nombre de SPC que usa actualmente ApigeeDatastore.
  3. Aplica el archivo rotation.yaml para activar el trabajo de verificación previa de la rotación.
    kubectl -n APIGEE_NAMESPACE apply -f rotation.yaml
  4. Verifica el estado de la tarea para comprobar cuándo se completa la tarea de verificación previa.
    kubectl -n APIGEE_NAMESPACE get job sr-(rotationId)-(rotate|rollback|cleanup)-job
  5. Una vez que se complete la tarea de verificación previa a la rotación, cambia el valor de metadata.name y establece spec.precheck en false. Vuelve a aplicar el archivo para realizar la rotación.
    kubectl -n APIGEE_NAMESPACE apply -f rotation.yaml
  6. Una vez que se complete el trabajo de rotación y hayas validado que el tráfico sigue fluyendo correctamente, limpia el proceso con los siguientes dos pasos:
    1. Actualiza el valor de metadata.name y establece spec.cassandra.jobType en CLEANUP.
    2. Aplica el archivo para activar el trabajo de limpieza.
      kubectl -n APIGEE_NAMESPACE apply -f rotation.yaml

    Cuando se completa el trabajo de limpieza, se completa el proceso de rotación.

  7. Crea una copia de seguridad de tu base de datos de Cassandra. Esta copia de seguridad se realiza para garantizar que se pueda recuperar las credenciales rotadas posteriormente.
  8. Borra las credenciales, el rol y la política de Cassandra anteriores de Vault.

Configuración multirregional

Los procedimientos de configuración multirregional se dividen en dos secciones: configuración de la primera región y configuración de las regiones restantes.

  1. Completa los siguientes pasos en la primera región antes de comenzar con las regiones posteriores.
    1. Crea un nuevo recurso de Kubernetes SecretProviderClass en el espacio de nombres APIGEE_NAMESPACE para las nuevas credenciales de Cassandra. Consulta Almacena secretos de Cassandra en Hashicorp Vault para obtener una plantilla que puedas usar. Esto permite que un rol de Vault acceda a los secretos dentro de los espacios de nombres de Kubernetes.
    2. Crea un nuevo recurso personalizado de SecretRotation con la siguiente plantilla:
      # rotation.yaml
      
      apiVersion: apigee.cloud.google.com/v1alpha1
      kind: SecretRotation
      metadata:
        name: ROTATION_PROCESS_NAME
        namespace: APIGEE_NAMESPACE
      spec:
        organizationId: ORG_NAME
        rotationId: ROTATION_ID
        timeoutMinutes: -1 # this value is required and should not be changed.
        precheck: true
        cassandra:
          oldSecretProviderClass: OLD_SPC_NAME
          newSecretProviderClass: NEW_SPC_NAME
          jobType: ROTATE
      
      • ROTATION_PROCESS_NAME: Es un nombre único para la tarea de rotación. Deberás establecer metadata.name en un valor único para el trabajo de verificación previa a la rotación y, nuevamente, para el trabajo de rotación. Por ejemplo, sr-1-precheck seguido de sr-1.
      • ROTATION_ID: Establece spec.rotationId en un identificador personalizado, por ejemplo, rotation-1-precheck.
      • NEW_SPC_NAME: Establece spec.cassandra.newSecretProviderClass en el nuevo nombre de clase del proveedor de secretos que creaste en el paso anterior.
      • OLD_SPC_NAME: Establece spec.cassandra.oldSecretProviderClass en el nombre de SPC que usa actualmente ApigeeDatastore.
    3. Aplica el archivo rotation.yaml para activar el trabajo de verificación previa de la rotación.
      kubectl -n APIGEE_NAMESPACE apply -f rotation.yaml
    4. Verifica el estado de la tarea para comprobar cuándo se completa la tarea de verificación previa.
      kubectl -n APIGEE_NAMESPACE get job sr-(rotationId)-(rotate|rollback|cleanup)-job
    5. Una vez que se complete el trabajo de verificación previa a la rotación, haz lo siguiente:
      • Cambia el valor de metadata.name, por ejemplo, de sr-1-precheck a sr-1.
      • Establece spec.precheck en false para desactivar la verificación previa y realizar la rotación.
      • Establece spec.rotationId en un identificador nuevo, por ejemplo, rotation-1.
    6. Vuelve a aplicar el archivo para realizar la rotación.
      kubectl -n APIGEE_NAMESPACE apply -f rotation.yaml
    7. Verifica el estado de SecretRotation y espera hasta que sea complete.
      kubectl -n APIGEE_NAMESPACE get sr SR_NAME
  2. En cada región posterior, completa los siguientes pasos:
    1. Crea un nuevo recurso de Kubernetes SecretProviderClass en tu espacio de nombres de Apigee para las nuevas credenciales de Cassandra. Consulta Almacena secretos de Cassandra en Hashicorp Vault para obtener una plantilla que puedas usar. Esta debe ser la misma definición que en el paso 1a.
    2. Actualiza tu overrides.yaml y establece cassandra.auth.secretProviderClass para que coincida con el valor de spec.cassandra.newSecretProviderClass en el archivo rotation.yaml.
      cassandra:
        auth:
          secretProviderClass: NEW_SPC_NAME
    3. Aplica el gráfico del operador:
      helm upgrade operator apigee-operator/ \
        --namespace APIGEE_NAMESPACE \
        --atomic \
        -f OVERRIDES_FILE
    4. Se creará un ReplicaSet nuevo. Verifica que los nuevos Pods de controlador-administrador usen el nuevo SPC:
      export POD=NEW_CONTROLLER_MANAGER_POD_NAME
      kubectl -n APIGEE_NAMESPACE get pods $POD -o jsonpath='{.spec.volumes[?(@.name=="apigee-external-secrets")].csi.volumeAttributes.secretProviderClass}'
      

      El resultado debe coincidir con el valor que estableciste para spec.cassandra.newSecretProviderClass en rotation.yaml, por ejemplo:

      kubectl -n apigee get pods $POD -o jsonpath='{.spec.volumes[?(@.name=="apigee-external-secrets")].csi.volumeAttributes.secretProviderClass}'
      
      my-new-spc
    5. Aplica el gráfico de almacén de datos:
      helm upgrade datastore apigee-datastore/ \
        --namespace APIGEE_NAMESPACE \
        --atomic \
        -f OVERRIDES_FILE
    6. El almacén de datos pasará a un estado de lanzamiento. Espera a que el almacén de datos termine de lanzarse y esté en estado de ejecución.
      kubectl -n APIGEE_NAMESPACE get apigeedatastore DATASTORE_NAME

      DATASTORE_NAME es default en la mayoría de las instalaciones.

    7. Verifica que los nuevos Pods del almacén de datos usen el nuevo SPC:
      export POD=NEW_DATASTORE_POD_NAME
      kubectl -n APIGEE_NAMESPACE get pods $POD -o jsonpath='{.spec.volumes[?(@.name=="apigee-external-secrets")].csi.volumeAttributes.secretProviderClass}'
      

      El resultado debe coincidir con el valor que estableciste para spec.cassandra.newSecretProviderClass en rotation.yaml, por ejemplo:

      kubectl -n apigee get pods $POD -o jsonpath='{.spec.volumes[?(@.name=="apigee-external-secrets")].csi.volumeAttributes.secretProviderClass}'
      
      my-new-spc
    8. Espera a que la organización y los entornos terminen de lanzarse y vuelvan al estado de ejecución.
      kubectl -n APIGEE_NAMESPACE get apigeeorg ORG_NAME
      kubectl -n APIGEE_NAMESPACE get apigeeenv ENV_NAME
    9. Verifica que los nuevos Pods de MART, entorno de ejecución y sincronizador usen el nuevo SPC:
      export POD=NEW_MART_POD_NAME
      kubectl -n APIGEE_NAMESPACE get pods $POD -o jsonpath='{.spec.volumes[?(@.name=="apigee-external-secrets")].csi.volumeAttributes.secretProviderClass}'
      export POD=NEW_RUNTIME_POD_NAME
      kubectl -n APIGEE_NAMESPACE get pods $POD -o jsonpath='{.spec.volumes[?(@.name=="apigee-external-secrets")].csi.volumeAttributes.secretProviderClass}'
      export POD=NEW_SYNCHRONIZER_POD_NAME
      kubectl -n APIGEE_NAMESPACE get pods $POD -o jsonpath='{.spec.volumes[?(@.name=="apigee-external-secrets")].csi.volumeAttributes.secretProviderClass}'
      

      El resultado debe coincidir con el valor que estableciste para spec.cassandra.newSecretProviderClass en rotation.yaml, por ejemplo:

      kubectl -n apigee get pods $POD -o jsonpath='{.spec.volumes[?(@.name=="apigee-external-secrets")].csi.volumeAttributes.secretProviderClass}'
      
      my-new-spc
  3. Después de completar los pasos en cada región y validar que el tráfico siga fluyendo correctamente, limpia el proceso en la primera región con los siguientes dos pasos:
    1. En la primera región, actualiza el valor de metadata.name y establece spec.cassandra.jobType en CLEANUP.
    2. Aplica el archivo para activar el trabajo de limpieza.
      kubectl -n APIGEE_NAMESPACE apply -f rotation.yaml
    3. Verifica el estado de la tarea y observa los registros para comprobar cuándo se completa la tarea de limpieza.

    Cuando se completa el trabajo de limpieza, se completa el proceso de rotación.

  4. Crea una copia de seguridad de tu base de datos de Cassandra. Esta copia de seguridad se realiza para garantizar que se pueda recuperar las credenciales rotadas posteriormente.
  5. Borra las credenciales, el rol y la política de Cassandra anteriores de Vault.