Configura entornos con el administrador de secretos

En esta página, se muestra cómo usar el Administrador de secretos para almacenar las conexiones y secretos de Airflow de forma segura.

Requisitos previos

Para usar el administrador de secretos, tu entorno de Cloud Composer debe usar Airflow 1.10.10 o posterior y Python 3.6 o una versión posterior (Python 2 no es compatible).

Configura tu entorno con el administrador de secretos

  1. Habilita la API de Secret Manager

    API del Administrador de secretos

  2. Agrega conexiones y variables en el Administrador de secretos (consulta Crea secretos y versiones para obtener más detalles).

    Los secretos deben tener el siguiente formato:

    • variable: [variable_prefix][sep][variable_name]

      • El valor predeterminado para [variable_prefix] es airflow-variables.
      • El separador predeterminado [sep] es -
      • Ejemplo: Para el nombre de variable my-var, el nombre del secreto es: airflow-variables-my-var
    • Conexión: [connection_prefix][sep][connection_name]

      • El valor predeterminado para [connection_prefix] es airflow-connections.
      • El separador predeterminado [sep] es -
      • Ejemplo: Para la conexión my-connection, el nombre del secreto es airflow-connections-my-connection
      • Los valores de conexión deben usar la representación de URI, por ejemplo: mysql://myhost:9000. El URI debe estar codificado para URL (codificado como porcentaje). Por ejemplo, el vínculo a Some Page debería ser: [https://myhost:9000/Some%20Page](https://myhost:9000/Some%20Page). Airflow tiene un método de conveniencia para generar URI de conexión. Puedes encontrar un ejemplo de cómo codificar una URL compleja con elementos JSON adicionales en la documentación de Airflow.

    Si quieres usar valores diferentes para [variable_prefix], [connection_prefix] o [sep], usa la configuración opcional de la sección: Habilitar y configurar el backend del administrador de secretos. para crear el adjunto de VLAN de supervisión.

  3. Configurar el control de acceso

    Airflow debe tener acceso a los secretos almacenados en el Administrador de secretos. Otorga una función que incluya el permiso secretmanager.versions.access (como Administrador de secretos del administrador de secretos) a la cuenta de servicio en la que tu entorno de Cloud Composer accederá al administrador de secretos. para crear el adjunto de VLAN de supervisión. Esta función se puede otorgar a nivel secreto, Organización, Proyecto o Organización.

    De forma predeterminada, esta cuenta es la cuenta de servicio predeterminada de Compute Engine, pero se puede especificar una cuenta de servicio personalizada durante la creación del entorno. También puedes anular la cuenta de servicio en la que Airflow accede al administrador de secretos si configuras el parámetro gcp_key_path de la configuración de secrets.backend_kwargs para que apunte a un archivo JSON con las credenciales de la cuenta de servicio. Este método es menos recomendable, ya que requiere el almacenamiento de credenciales de cuentas de servicio en un archivo, lo que aumenta el riesgo de que se vea comprometido.

    Control de acceso

  4. Habilita la serialización de DAG

    En general, solo debes usar el backend de secreto desde los métodos execute() de tus operadores o con las plantillas JINJA de Airflow macros. Por ejemplo, puedes recuperar variables con var.value.my_var. El servidor web de Airflow se ejecuta con una cuenta de servicio diferente con permisos limitados y no podrá acceder a los secretos en Secret Manager.

    Si tu código de DAG accede a los secretos durante el procesamiento (no solo desde tareas) y no se puede ajustar como se recomienda anteriormente, debes habilitar la serialización de DAG para usar el servidor web de Airflow.

  5. Habilita y configura el backend de Secret Manager

    1. Selecciona tu entorno en la página Entornos para acceder a la página Detalles del entorno.
    2. Haz clic en LA CONFIGURACIÓN DEL FLUJO DE AIRE ANULA
    3. Agrega la configuración:

      • Sección = secrets
      • Clave = backend
      • Valor = airflow.providers.google.cloud.secrets.secret_manager.CloudSecretManagerBackend

      Configuración de backend del administrador de secretos

    4. Agrega opciones de configuración opcionales:

      • Sección = secrets
      • Clave = backend_kwargs
      • Valor: La representación JSON de un objeto con los siguientes campos (source)

        • connections_prefix: especifica el prefijo del secreto que se leerá para obtener conexiones. Predeterminada: airflow-connections
        • variables_prefix: especifica el prefijo del secreto que se leerá para obtener variables. Predeterminada: airflow-variables
        • gcp_key_path: la ruta de acceso al archivo JSON de credenciales de Google Cloud (si no se proporciona, se usará la cuenta de servicio predeterminada).
        • gcp_keyfile_dict: el diccionario JSON de credenciales de Google Cloud. Exclusivo de manera mutua con gcp_key_path
        • sep: separador usado para concatenar connections_prefix y conn_id. Predeterminada: -
        • project_id: El ID del proyecto de Google Cloud para acceder a los secretos.
      • Por ejemplo: Value = {"connections_prefix":"my-connections","variables_prefix"="my-variables", "sep": "-"}

Usa Secret Manager

Cuando se recuperan variables y conexiones, Cloud Composer verifica primero el Administrador de secretos. Si no se encuentra la variable o la conexión solicitada, Cloud Composer verifica la base de datos de entorno/metastore. Nota: Por motivos de seguridad, las variables y las conexiones del administrador de secretos no son visibles en la IU del servidor web de Airflow.

Cómo leer variables

Plantillas de JINJA

Puedes usar el administrador de secretos a fin de leer variables con las plantillas JINJA para los campos del operador con plantilla (resolviendo en el momento de la ejecución).

Para la variable airflow-variables-secret_filename usa:

file_name = 'var.value.secret_filename'

Operadores personalizados y devoluciones de llamadas

También puedes usarla para leer variables en operadores personalizados o métodos de devolución de llamada de los operadores. La lectura de variables desde DAG puede afectar negativamente el rendimiento, por lo que se recomienda el uso de plantillas de JINJA si deseas usar variables en tus DAG.

Para la variable airflow-variables-myVariable usa

from airflow.models.variable import Variable
myValue = Variable.get('myVariable')

Lee conexiones

A menos que escribas un operador personalizado, rara vez necesitas acceder directamente a las conexiones. La mayoría de los enlaces reciben el nombre de conexión como su parámetro de instancia y deben recuperar las conexiones del backend del secreto automáticamente cuando se ejecutan las tareas.

Leer las conexiones directamente puede ser útil cuando escribes tu propio enlace.

Para la conexión airflow-variables-myConnection, usa:

from airflow.hooks.base_hook import BaseHook
myConnection = BaseHook.get_connection('myConnection')