Configurar secretos (1.ª gen.)

Puedes usar Secret Manager para almacenar de forma segura claves de API, contraseñas y otra información sensible. En esta guía se muestra cómo configurar funciones de Cloud Run para acceder a secretos almacenados en Secret Manager.

En este documento se explican las dos formas de poner un secreto a disposición de tu función:

  • Montar el secreto como volumen. De esta forma, el secreto estará disponible para la función como un archivo. Si haces referencia a un secreto como volumen, tu función accederá al valor del secreto de Secret Manager cada vez que se lea el archivo del disco. Por lo tanto, activar el secreto como volumen es una buena estrategia si quieres hacer referencia a la última versión del secreto en lugar de a una versión fijada. Este método también es adecuado si tienes previsto implementar la rotación de secretos.

  • Pasar el secreto como una variable de entorno. Los valores de las variables de entorno se resuelven en el momento de inicio de la instancia, por lo que, si utilizas este método, te recomendamos que hagas referencia a una versión fijada del secreto en lugar de a la versión más reciente.

Para obtener más información sobre cómo usar Secret Manager, consulta la descripción general de Secret Manager. Para saber cómo crear secretos y acceder a ellos, consulta Crear un secreto.

Antes de empezar

  1. Enable the Secret Manager API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

  2. Si aún no lo has hecho, crea un secreto en Secret Manager, tal como se describe en Crear un secreto.

Conceder acceso a secretos

Tu función puede acceder a secretos que se encuentren en el mismo proyecto que la función, así como a secretos que se encuentren en otro proyecto. Para acceder a un secreto, se debe conceder acceso a la cuenta de servicio de tiempo de ejecución de la función.

De forma predeterminada, Cloud Run Functions usa la cuenta de servicio predeterminada de App Engine para autenticarse con Secret Manager. Para usarla en producción, Google recomienda que configures tu función para que se autentique mediante una cuenta de servicio gestionada por el usuario a la que se le haya asignado el conjunto de roles menos permisivo necesario para llevar a cabo las tareas de esa función.

Para usar Secret Manager con funciones de Cloud Run, asigna el rol roles/secretmanager.secretAccessor a la cuenta de servicio asociada a tu función:

  1. Ve a la página Secret Manager en la Google Cloud consola:
    Ir a la página Secret Manager

  2. Haga clic en la casilla situada junto al secreto.

  3. Si aún no lo has hecho, haz clic en Mostrar panel de información para abrirlo.

  4. En el panel de información, haz clic en Añadir principal.

  5. En el campo Nuevos principales, introduce la cuenta de servicio que usa tu función para su identidad. La cuenta de servicio de la función es una de las siguientes:

  6. En el menú desplegable Selecciona un rol, elige Secret Manager y, a continuación, Permiso para acceder a los recursos de Secret Manager.

Preparar una función para acceder a secretos

Hay dos formas de poner un secreto a disposición de tu función:

  • Pasar el secreto como variable de entorno.
  • Montar el secreto como volumen.

Variables de entorno

Para usar variables de entorno y que los secretos estén disponibles para tu función, sigue estos pasos:

  1. Define una variable de entorno de tiempo de ejecución durante la implementación de la función.
  2. Haz que el secreto sea accesible para tu función en una variable de entorno.
  3. Accede a la variable de entorno programáticamente en el tiempo de ejecución.

Montar el secreto como volumen

Para montar un secreto como volumen, sigue estos pasos:

  1. Crea un archivo que contenga tu secreto.

  2. Elige un directorio que no sea del sistema y que no se esté usando, como /mnt/secrets, como ruta de montaje de tu secreto. No se podrá acceder a ningún archivo o subdirectorio que ya exista en ese directorio, excepto al secreto y sus versiones, una vez que se haya montado el secreto.

  3. Haz que el secreto sea accesible para tu función como un volumen montado.

  4. En el tiempo de ejecución, lee el contenido del archivo de forma programática para acceder al valor del secreto.

Por ejemplo, si el secreto se ha montado en /mnt/secrets/secret1, la función tiene que leer este archivo. A continuación se muestra un ejemplo de cómo puedes leer el archivo de forma síncrona con Node.js:

fs.readFileSync('/mnt/secrets/secret1')

Hacer que un secreto sea accesible para una función

Para hacer referencia a un secreto desde una función, primero debes hacer que el secreto sea accesible para la función. Puedes hacer que un secreto sea accesible para funciones nuevas o ya creadas mediante la Google Cloud consola o la interfaz de línea de comandos de Google Cloud:

Consola

Para que una función pueda acceder a un secreto, sigue estos pasos:

  1. Ve a la página de funciones de Cloud Run en la Google Cloud consola:
    Ir a la página de funciones de Cloud Run

  2. Haz clic en el nombre de la función que quieres que pueda acceder a un secreto.

  3. Haz clic en Editar.

  4. Haz clic en Tiempo de ejecución, compilación ... para desplegar las opciones de configuración avanzada.

  5. Haz clic en Seguridad y repositorio de imágenes para abrir la pestaña.

  6. Haz clic en Añadir una referencia secreta para definir un secreto para la función.

  7. Selecciona el secreto al que quieras dar acceso. Si es necesario, crea un secreto.

    • Para hacer referencia a un secreto en el mismo proyecto que tu función, sigue estos pasos:

      1. Seleccione el secreto en la lista desplegable.
    • Para hacer referencia a un secreto de otro proyecto, sigue estos pasos:

      1. Comprueba que la cuenta de servicio de tu proyecto tiene acceso al secreto.

      2. Selecciona Introducir secreto manualmente.

      3. Introduce el ID de recurso del secreto con el siguiente formato:

        projects/PROJECT_ID/secrets/SECRET_NAME

        Haz los cambios siguientes:

        • PROJECT_ID: el ID del proyecto en el que se encuentra el secreto.

        • SECRET_NAME: nombre del secreto en Secret Manager.

  8. Selecciona el método de referencia del secreto. Puedes montar el secreto como un volumen o exponerlo como una variable de entorno.

    • Para montar el secreto como volumen, haz lo siguiente:

      1. Selecciona Montados como volúmenes.

      2. En el campo Ruta de montaje, introduce la ruta de montaje de este secreto. Este es el directorio en el que se colocan todas las versiones de tu secreto.

      3. En el campo Path1, introduce el nombre del archivo que quieras montar. Este nombre se concatena con la ruta de montaje del paso anterior para formar la ruta de montaje completa donde se monta el secreto.

      4. En el menú desplegable Version1, selecciona la versión del secreto al que quieras hacer referencia.

      5. Puedes montar versiones adicionales de este secreto haciendo clic en +Añadir para definir rutas adicionales y las versiones de este secreto que se montarán en ellas.

    • Para exponer el secreto como una variable de entorno, sigue estos pasos:

      1. Seleccione Se han expuesto como variables de entorno.

      2. En el campo Name1, introduce el nombre de la variable de entorno.

      3. En el menú desplegable Version1, selecciona la versión del secreto al que quieras hacer referencia.

      4. Puedes exponer versiones adicionales de este secreto a tu función haciendo clic en + Añadir para definir variables de entorno adicionales y las versiones de este secreto que quieras almacenar en ellas.

  9. Haz clic en Listo.

  10. Haz clic en Siguiente.

  11. Haz clic en Desplegar.

El código de tu función ahora puede hacer referencia al secreto.

gcloud

Para que una función pueda acceder a un secreto, introduce uno de los siguientes comandos.

  • Para montar el secreto como un volumen, introduce el siguiente comando:

    gcloud functions deploy FUNCTION_NAME \
    --no-gen2 \
    --runtime RUNTIME \
    --set-secrets 'SECRET_FILE_PATH=SECRET:VERSION'
    

    Haz los cambios siguientes:

    • FUNCTION_NAME: el nombre de tu función.

    • RUNTIME: el tiempo de ejecución en el que se ejecutará la función.

    • SECRET_FILE_PATH: la ruta completa del secreto. Por ejemplo, /mnt/secrets/primary/latest, donde /mnt/secrets/primary/ es la ruta de montaje y latest es la ruta secreta. También puedes especificar las rutas de montaje y de secreto por separado:

      --set-secrets 'MOUNT_PATH:SECRET_PATH=SECRET:VERSION'

    • SECRET: nombre del secreto en Secret Manager.

    • VERSION: la versión del secreto que se va a usar. Por ejemplo, 1 o latest.

    La marca --set-secrets anula los secretos que ya existan. Para conservar los secretos de la función, usa la marca --update-secrets.

  • Para exponer el secreto como una variable de entorno, introduce el siguiente comando:

    gcloud functions deploy FUNCTION_NAME \
    --no-gen2 \
    --runtime RUNTIME \
    --set-secrets 'ENV_VAR_NAME=SECRET:VERSION'
    

    Haz los cambios siguientes:

    • FUNCTION_NAME: el nombre de tu función.

    • RUNTIME: el tiempo de ejecución en el que se ejecutará la función.

    • ENV_VAR_NAME: nombre de la variable de entorno.

    • SECRET: nombre del secreto en Secret Manager.

    • VERSION: la versión del secreto que se va a usar. Por ejemplo, 1 o latest.

    La marca --set-secrets anula los secretos que ya existan. Para conservar los secretos de la función, usa la marca --update-secrets.

  • Puedes hacer referencia a un secreto de otro proyecto si se ha concedido acceso al secreto a la cuenta de servicio de la función. Para hacer referencia a un secreto de otro proyecto, usa la ruta de recurso del secreto:

    gcloud functions deploy FUNCTION_NAME \
    --no-gen2 \
    --runtime RUNTIME \
    --update-secrets 'SECRET_FILE_PATH=SECRET_RESOURCE_PATH:VERSION'
    

    Haz los cambios siguientes:

    • FUNCTION_NAME: el nombre de tu función.

    • SECRET_RESOURCE_PATH: la ruta del recurso del secreto que se encuentra en otro proyecto. La ruta del recurso usa el siguiente formato:

      projects/PROJECT_ID/secrets/SECRET_NAME

      Haz los cambios siguientes:

      • PROJECT_ID: el ID del proyecto en el que se encuentra el secreto.

      • SECRET_NAME: nombre del secreto en Secret Manager.

    • RUNTIME: el tiempo de ejecución en el que se ejecutará la función.

    • SECRET_FILE_PATH: la ruta completa del secreto. Por ejemplo, /mnt/secrets/primary/latest, donde /mnt/secrets/primary/ es la ruta de montaje y latest es la ruta secreta. También puedes especificar las rutas de montaje y de secreto por separado:

      --set-secrets 'MOUNT_PATH:SECRET_PATH=SECRET:VERSION'

    • SECRET: nombre del secreto en Secret Manager.

    • VERSION: la versión del secreto que se va a usar. Por ejemplo, 1 o latest.

  • Puedes actualizar varios secretos a la vez. Separa las opciones de configuración de cada secreto con una coma. El siguiente comando actualiza un secreto montado como un volumen y otro secreto expuesto como una variable de entorno.

    Para actualizar los secretos, introduce el siguiente comando:

    gcloud functions deploy FUNCTION_NAME \
    --no-gen2 \
    --runtime RUNTIME \
    --update-secrets 'ENV_VAR_NAME=SECRET:VERSION, \
    SECRET_FILE_PATH=SECRET:VERSION'
    

    Haz los cambios siguientes:

    • FUNCTION_NAME: el nombre de tu función.

    • RUNTIME: el tiempo de ejecución en el que se ejecutará la función.

    • ENV_VAR_NAME: nombre de la variable de entorno.

    • SECRET: nombre del secreto en Secret Manager.

    • VERSION: la versión del secreto que se va a usar. Por ejemplo, 1 o latest.

    • SECRET_FILE_PATH: la ruta completa del secreto. Por ejemplo, /mnt/secrets/primary/latest, donde /mnt/secrets/primary/ es la ruta de montaje y latest es la ruta secreta. También puedes especificar las rutas de montaje y de secreto por separado:

      --set-secrets 'MOUNT_PATH:SECRET_PATH=SECRET:VERSION'

Eliminar secretos de una función

Puedes eliminar secretos de una función mediante la Google Cloud consola o la CLI de gcloud:

Consola

  1. Ve a la página de funciones de Cloud Run en la Google Cloud consola:
    Ir a la página de funciones de Cloud Run

  2. Haga clic en el nombre de la función para eliminar uno de sus secretos.

  3. Haz clic en Editar.

  4. Haz clic en Configuración de tiempo de ejecución, compilación y conexiones para ver las opciones de configuración avanzada.

  5. Haz clic en Seguridad y repositorio de imágenes para abrir la pestaña de seguridad.

  6. Mantén el puntero sobre el secreto que quieras quitar y haz clic en Eliminar.

  7. Haz clic en Siguiente.

  8. Haz clic en Desplegar.

gcloud

Puedes quitar todos los secretos de una función o especificar uno o varios secretos que quieras quitar:

  • Para eliminar todos los secretos, ejecuta el siguiente comando:

    gcloud functions deploy FUNCTION_NAME \
    --no-gen2 \
    --runtime RUNTIME \
    --clear-secrets
    

    Haz los cambios siguientes:

    • FUNCTION_NAME: el nombre de tu función.

    • RUNTIME: el tiempo de ejecución en el que se ejecutará la función.

    Se borran todos los secretos de la función.

  • Para especificar una lista de secretos que quieras eliminar, usa la marca --remove-secrets. El siguiente comando elimina un secreto montado como un volumen y otro secreto expuesto como una variable de entorno:

    gcloud functions deploy FUNCTION_NAME \
    --no-gen2 \
    --runtime RUNTIME \
    --remove-secrets='ENV_VAR_NAME,SECRET_FILE_PATH, ...'
    

    Haz los cambios siguientes:

    • FUNCTION_NAME: el nombre de tu función.

    • RUNTIME: el tiempo de ejecución en el que se ejecutará la función.

    • ENV_VAR_NAME: nombre de la variable de entorno.

    • SECRET_FILE_PATH: la ruta completa del secreto. Por ejemplo, /mnt/secrets/primary/latest, donde /mnt/secrets/primary/ es la ruta de montaje y latest es la ruta secreta. También puedes especificar las rutas de montaje y de secreto por separado:

      --set-secrets 'MOUNT_PATH:SECRET_PATH=SECRET:VERSION'

    Los secretos especificados se eliminan de la función.

Ver los secretos accesibles de una función

Puedes ver a qué secretos puede acceder tu función mediante la Google Cloud consola o la CLI de gcloud:

Consola

  1. Ve a la página de funciones de Cloud Run en la Google Cloud consola:
    Ir a la página de funciones de Cloud Run

  2. Haz clic en el nombre de la función para ver los secretos disponibles.

  3. Haz clic en Editar.

  4. Haz clic en Configuración de tiempo de ejecución, compilación y conexiones para ver las opciones de configuración avanzada.

  5. Haz clic en Seguridad para abrir la pestaña de seguridad.

En la pestaña de seguridad se muestran los secretos a los que puede acceder tu función.

gcloud

Para ver qué secretos están disponibles para tu función, usa el comando gcloud functions describe:

gcloud functions describe FUNCTION_NAME

Sustituye FUNCTION_NAME por el nombre de tu función.

Siguientes pasos