Rotar las credenciales de Cassandra en HashiCorp Vault

Información general

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

  • Rota las credenciales de Cassandra en HashiCorp Vault.
  • Vuelve a las credenciales de Cassandra anteriores en Vault en caso de que haya algún problema durante la rotación de contraseñas.
  • Cambia la contraseña de Cassandra de una región cada vez para asegurarte de que el impacto en la disponibilidad del servicio sea mínimo y mantener el control sobre el proceso de cambio.
  • Monitoriza el 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 empezar

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

  • Crea una copia de seguridad de tu base de datos de Cassandra. Esta copia de seguridad se realiza para asegurar que se puedan recuperar las credenciales anteriores a la rotación.
  • Asegúrate de que el clúster esté en buen estado (es decir, que todos los recursos de Apigee estén en ejecución y que no haya cambios de estado pendientes).

Configuración de una sola región

  1. Crea un recurso de SecretProviderClass Kubernetes en tu espacio de nombres de Apigee para las nuevas credenciales de Cassandra. Consulta Almacenar secretos de Cassandra en HashiCorp Vault para ver una plantilla que puedes usar. De esta forma, un rol de Vault puede acceder a los secretos de los espacios de nombres de Kubernetes.
  2. Crea un recurso personalizado 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: nombre único del trabajo de rotación. Deberá asignar a metadata.name un valor único para la tarea de comprobación previa de la rotación y otro para la tarea de rotación. Por ejemplo, sr-1-precheck seguido de sr-1.
    • ROTATION_ID: asigna a spec.rotationId un identificador personalizado, como rotation-1-precheck.
    • NEW_SPC_NAME: asigna a spec.cassandra.newSecretProviderClass el nombre de la nueva clase de proveedor de secretos que has creado en el paso anterior.
    • OLD_SPC_NAME: asigna a spec.cassandra.oldSecretProviderClass el nombre del SPC que usa actualmente el ApigeeDatastore.
  3. Activa el trabajo de comprobación previa de la rotación aplicando el archivo rotation.yaml.
    kubectl -n APIGEE_NAMESPACE apply -f rotation.yaml
  4. Comprueba el estado del trabajo para verificar cuándo se ha completado el trabajo de comprobación previa.
    kubectl -n APIGEE_NAMESPACE get job sr-(rotationId)-(rotate|rollback|cleanup)-job
  5. Una vez que se haya completado la comprobación previa de la rotación, cambia el valor de metadata.name y asigna spec.precheck a false. Vuelve a aplicar el archivo para realizar la rotación.
    kubectl -n APIGEE_NAMESPACE apply -f rotation.yaml
  6. Una vez que se haya completado el trabajo de rotación y hayas validado que el tráfico sigue fluyendo correctamente, limpia el proceso siguiendo estos dos pasos:
    1. Actualiza el valor de metadata.name y asigna el valor CLEANUP a spec.cassandra.jobType.
    2. Activa el trabajo de limpieza aplicando el archivo.
      kubectl -n APIGEE_NAMESPACE apply -f rotation.yaml

    Cuando se complete el trabajo de limpieza, el proceso de rotación habrá finalizado.

  7. Crea una copia de seguridad de tu base de datos de Cassandra. Esta copia de seguridad se hace para asegurar que se puedan recuperar las credenciales después de la rotación.
  8. Elimina las credenciales, el rol y la política de Cassandra antiguos 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 del resto de las regiones.

  1. Completa los siguientes pasos en la primera región antes de empezar con las siguientes.
    1. Crea un recurso de SecretProviderClass Kubernetes en el espacio de nombres APIGEE_NAMESPACE para las nuevas credenciales de Cassandra. Consulta Almacenar secretos de Cassandra en HashiCorp Vault para ver una plantilla que puedes usar. De esta forma, un rol de Vault puede acceder a los secretos de los espacios de nombres de Kubernetes.
    2. Crea un recurso personalizado 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: nombre único del trabajo de rotación. Deberá asignar a metadata.name un valor único para la tarea de comprobación previa de la rotación y otro para la tarea de rotación. Por ejemplo, sr-1-precheck seguido de sr-1.
      • ROTATION_ID: asigna a spec.rotationId un identificador personalizado, como rotation-1-precheck.
      • NEW_SPC_NAME: asigna a spec.cassandra.newSecretProviderClass el nombre de la nueva clase de proveedor de secretos que has creado en el paso anterior.
      • OLD_SPC_NAME: asigna a spec.cassandra.oldSecretProviderClass el nombre del SPC que usa actualmente el ApigeeDatastore.
    3. Activa el trabajo de comprobación previa de la rotación aplicando el archivo rotation.yaml.
      kubectl -n APIGEE_NAMESPACE apply -f rotation.yaml
    4. Comprueba el estado del trabajo para verificar cuándo se ha completado el trabajo de comprobación previa.
      kubectl -n APIGEE_NAMESPACE get job sr-(rotationId)-(rotate|rollback|cleanup)-job
    5. Una vez que se haya completado la tarea de comprobación previa de la rotación:
      • Cambia el valor de metadata.name; por ejemplo, de sr-1-precheck a sr-1.
      • Define spec.precheck como false para desactivar la comprobación previa y realizar la rotación.
      • Asigna un nuevo identificador a spec.rotationId, por ejemplo, rotation-1.
    6. Vuelve a aplicar el archivo para realizar la rotación.
      kubectl -n APIGEE_NAMESPACE apply -f rotation.yaml
    7. Comprueba el estado de SecretRotation y espera a que sea complete.
      kubectl -n APIGEE_NAMESPACE get sr SR_NAME
  2. En cada región posterior, sigue estos pasos:
    1. Crea un recurso de SecretProviderClass Kubernetes en tu espacio de nombres de Apigee para las nuevas credenciales de Cassandra. Consulta Almacenar secretos de Cassandra en HashiCorp Vault para ver una plantilla que puedes usar. Debe ser la misma definición que en el paso 1a.
    2. Actualiza overrides.yaml y asigna a cassandra.auth.secretProviderClass el valor de spec.cassandra.newSecretProviderClass en el archivo rotation.yaml.
      cassandra:
        auth:
          secretProviderClass: NEW_SPC_NAME
    3. Aplica el gráfico de operadores:
      helm upgrade operator apigee-operator/ \
        --namespace APIGEE_NAMESPACE \
        --atomic \
        -f OVERRIDES_FILE
    4. Se creará un nuevo ReplicaSet. Comprueba que los nuevos pods de controller-manager estén usando 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 haya definido 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 Datastore:
      helm upgrade datastore apigee-datastore/ \
        --namespace APIGEE_NAMESPACE \
        --atomic \
        -f OVERRIDES_FILE
    6. El almacén de datos pasará al estado de lanzamiento. Espera hasta que el almacén de datos haya terminado de lanzarse y esté en el estado de ejecución.
      kubectl -n APIGEE_NAMESPACE get apigeedatastore DATASTORE_NAME

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

    7. Comprueba que los nuevos pods de almacén de datos estén usando 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 haya definido 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 se hayan completado las versiones de la organización y los entornos y hayan vuelto al estado en ejecución.
      kubectl -n APIGEE_NAMESPACE get apigeeorg ORG_NAME
      kubectl -n APIGEE_NAMESPACE get apigeeenv ENV_NAME
    9. Comprueba que los nuevos pods de MART, de tiempo de ejecución y de sincronizador estén usando 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 haya definido 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 todas las regiones y comprobar que el tráfico sigue fluyendo correctamente, limpia el proceso en la primera región con los dos pasos siguientes:
    1. En la primera región, actualice el valor de metadata.name y asigne spec.cassandra.jobType a CLEANUP.
    2. Activa el trabajo de limpieza aplicando el archivo.
      kubectl -n APIGEE_NAMESPACE apply -f rotation.yaml
    3. Comprueba el estado del trabajo y consulta los registros para verificar cuándo se ha completado el trabajo de limpieza.

    Cuando se complete el trabajo de limpieza, el proceso de rotación habrá finalizado.

  4. Crea una copia de seguridad de tu base de datos de Cassandra. Esta copia de seguridad se hace para asegurar que se puedan recuperar las credenciales después de la rotación.
  5. Elimina las credenciales, el rol y la política de Cassandra antiguos de Vault.