Conecta cuentas de servicio a recursos

Para algunos recursos Google Cloud , puedes especificar una cuenta de servicio administrada por el usuario que el recurso use como su identidad predeterminada. Este proceso se conoce como conectar la cuenta de servicio al recurso o asociar la cuenta de servicio al recurso. Cuando el código que se ejecuta en el recurso accede a los servicios y recursos de Google Cloud , utiliza la cuenta de servicio adjunta al recurso como su identidad. Por ejemplo, si conectas una cuenta de servicio a una instancia de Compute Engine, y las aplicaciones en la instancia usan una biblioteca cliente para llamar a las APIs de Google Cloud , esas aplicaciones utilizan automáticamente la cuenta de servicio conectada para la autenticación y la autorización.

En esta página se describe cómo configurar cuentas de servicio para que puedas conectarlas a recursos.

Antes de comenzar

  • Enable the IAM and Resource Manager APIs.

    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 APIs

  • Asegúrate de comprender cómo funcionan las cuentas de servicio en IAM.

Roles requeridos

Para obtener el permiso que necesitas para adjuntar una cuenta de servicio a un recurso, pídele a tu administrador que te otorgue el rol de IAM de Usuario de la cuenta de servicio (roles/iam.serviceAccountUser) en la cuenta de servicio. Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.

Este rol predefinido contiene el permiso iam.serviceAccounts.actAs, que se requiere para conectar una cuenta de servicio a un recurso.

También puedes obtener este permiso con roles personalizados o con otros roles predefinidos.

Configura las políticas de tu organización

Según la ubicación de la cuenta de servicio que deseas conectar al recurso, es posible que debas actualizar las políticas de la organización de tu proyecto antes de conectar la cuenta de servicio:

  • Si la cuenta de servicio está en el mismo proyecto que el recurso al que deseas adjuntarla, no es necesario que actualices las políticas de la organización de tu proyecto.

  • Si la cuenta de servicio está en un proyecto diferente del recurso al que deseas adjuntarla, debes actualizar las políticas de la organización del proyecto que contiene la cuenta de servicio. Para obtener más información, consulta Habilita cuentas de servicio para conectarlas entre proyectos en esta página.

    Este podría ser el caso si, por ejemplo, creas todas tus cuentas de servicio en un solo proyecto.

Configura la cuenta de servicio

Antes de conectar una cuenta de servicio a un recurso, debes configurar la cuenta de servicio. Este proceso difiere según si la cuenta de servicio y el recurso se encuentran en el mismo proyecto o en proyectos distintos. Después de configurar la cuenta de servicio, puedes crear el recurso y conectar la cuenta de servicio a ese recurso.

Configura un recurso en el mismo proyecto

Antes de conectar una cuenta de servicio a otro recurso en el mismo proyecto, otorga funciones a la cuenta de servicio para que pueda acceder a los recursos adecuados, tal como le otorgarías funciones a cualquier otra principal.

Configura un recurso en un proyecto diferente

En algunos casos, es posible que debas conectar una cuenta de servicio a un recurso que se encuentre en un proyecto diferente. Por ejemplo, si creas todas tus cuentas de servicio en un solo proyecto, es posible que debas conectar una de ellas a un recurso nuevo en un proyecto diferente.

Antes de conectar una cuenta de servicio a un recurso en otro proyecto, haz lo siguiente:

  1. En el proyecto en el que se encuentra la cuenta de servicio, sigue los pasos que se indican en esta página para habilitar cuentas de servicio para conectarlas entre proyectos.
  2. Identifica el proyecto en el que crearás el recurso.
  3. Identifica el tipo de recurso al que conectarás la cuenta de servicio y el servicio que posee ese tipo de recurso.

    Por ejemplo, si creas una suscripción de Pub/Sub, entonces, este es el servicio que posee el recurso.

  4. Busca la dirección de correo electrónico del agente de servicio correspondiente.

    Los distintos servicios usan diferentes agentes de servicio. Para obtener más información, consulta Agentes de servicio.

  5. Otorga la función de creador de tokens de la cuenta de servicio (roles/iam.serviceAccountTokenCreator) a los agentes de servicio:

    Console

    1. En la consola de Google Cloud , ve a la página Cuentas de servicio.

      Ir a Cuentas de servicio

    2. Selecciona el proyecto que posee la cuenta de servicio que conectarás a un recurso.

    3. Haz clic en la dirección de correo electrónico de la cuenta de servicio que conectarás a un recurso.

    4. Ve a la pestaña Principales con acceso.

    5. Haz clic en Otorgar acceso y, luego, ingresa la dirección de correo electrónico del agente de servicio.

    6. Haz clic en Seleccionar un rol, escribe Service Account Token Creator y haz clic en el rol.

    7. Haz clic en Guardar para guardar los cambios.

    8. Si necesitas otorgar la función a otro agente de servicio, repite los pasos anteriores (opcional).

    gcloud

    Usa el comando de gcloud iam service-accounts add-iam-policy-binding:

    gcloud iam service-accounts add-iam-policy-binding \
        SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \
        --member=serviceAccount:SERVICE_AGENT_EMAIL \
        --role=roles/iam.serviceAccountTokenCreator

    Reemplaza los siguientes valores:

    • SERVICE_ACCOUNT_NAME: Es el nombre de la cuenta de servicio administrada por el usuario que estás conectando a un recurso.
    • PROJECT_ID: Es el ID del proyecto en el que se encuentra la cuenta de servicio administrada por el usuario.
    • SERVICE_AGENT_EMAIL: es la dirección de correo electrónico del agente de servicio.

    El comando imprime la política de permisos actualizada para la cuenta de servicio administrada por el usuario.

    Opcional: Si necesitas otorgar el rol a otro agente de servicio, vuelve a ejecutar el comando.

    REST

    A fin de otorgar este rol, usa el patrón de lectura-modificación-escritura para actualizar la política de permisos de tu cuenta de servicio administrada por el usuario.

    En primer lugar, lee la política de permisos para la cuenta de servicio administrada por el usuario:

    Mediante el método projects.serviceAccounts.getIamPolicy, se muestra la política de permisos para la cuenta de servicio.

    Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:

    • PROJECT_ID: El ID de tu proyecto de Google Cloud . Los IDs de proyecto son cadenas alfanuméricas, como my-project.
    • USER_SA_NAME: El nombre de la cuenta de servicio administrada por el usuario que estás vinculando a un recurso.

    Método HTTP y URL:

    POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/USER_SA_NAME@PROJECT_ID.iam.gserviceaccount.com:getIamPolicy

    Cuerpo JSON de la solicitud:

    {
      "requestedPolicyVersion": 3
    }
    

    Para enviar tu solicitud, expande una de estas opciones:

    Deberías recibir una respuesta JSON similar a la que se muestra a continuación:

    {
      "version": 1,
      "etag": "BwWl3KCTUMY=",
      "bindings": [
        {
          "role": "roles/iam.serviceAccountUser",
          "members": [
            "serviceAccount:my-service-account@my-project.iam.gserviceaccount.com"
          ]
        }
      ]
    }
    

    A continuación, modifica la política para otorgar el rol Service Account Token Creator al agente de servicio.

    {
      "version": 1,
      "etag": "BwWl3KCTUMY=",
      "bindings": [
        {
          "role": "roles/iam.serviceAccountTokenCreator",
          "members": [
            "serviceAccount:SERVICE_AGENT_EMAIL"
          ]
        },
        {
          "role": "roles/iam.serviceAccountUser",
          "members": [
            "serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com"
          ]
        }
      ]
    }

    Reemplaza lo siguiente:

    • SERVICE_AGENT_EMAIL: Es la dirección de correo electrónico del agente de servicio.
    • SERVICE_ACCOUNT_NAME: Es el nombre de la cuenta de servicio administrada por el usuario.
    • PROJECT_ID: Es el ID del proyecto en el que se encuentra la cuenta de servicio administrada por el usuario.

    Por último, escribe la política de permisos actualizada:

    El método projects.serviceAccounts.setIamPolicy actualiza la política de permisos para tu cuenta de servicio.

    Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:

    • PROJECT_ID: El ID de tu proyecto de Google Cloud . Los IDs de proyecto son cadenas alfanuméricas, como my-project.
    • USER_SERVICE_ACCOUNT_NAME: Es el nombre de la cuenta de servicio administrada por el usuario que estás vinculando a un recurso.
    • SERVICE_AGENT_EMAIL: es la dirección de correo electrónico del agente de servicio que creará los tokens de acceso para la cuenta de servicio administrada por el usuario.

    Método HTTP y URL:

    POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com:setIamPolicy

    Cuerpo JSON de la solicitud:

    {
      "policy": {
        "version": 1,
        "etag": "BwWl3KCTUMY=",
        "bindings": [
          {
            "role": "roles/iam.serviceAccountTokenCreator",
            "members": [
              "serviceAccount:SERVICE_AGENT_EMAIL"
            ]
          },
          {
            "role": "roles/iam.serviceAccountUser",
            "members": [
              "serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com"
            ]
          }
        ]
      }
    }
    

    Para enviar tu solicitud, expande una de estas opciones:

    Deberías recibir una respuesta JSON similar a la que se muestra a continuación:

    {
      "version": 1,
      "etag": "BwWo331TkHE=",
      "bindings": [
        {
          "role": "roles/iam.serviceAccountTokenCreator",
          "members": [
            "serviceAccount:SERVICE_AGENT_EMAIL"
          ]
        },
        {
          "role": "roles/iam.serviceAccountUser",
          "members": [
            "serviceAccount:my-service-account@my-project.iam.gserviceaccount.com"
          ]
        }
      ]
    }
    

Conecta la cuenta de servicio a un recurso

Después de configurar la cuenta de servicio administrada por el usuario, puedes crear un recurso nuevo y conectar la cuenta de servicio a ese recurso. Asegúrate de crear el recurso nuevo en el proyecto correspondiente.

En la mayoría de los casos, debes conectar una cuenta de servicio a un recurso cuando lo creas. Después de crear el recurso, no puedes cambiar qué cuenta de servicio está conectada al recurso. Las instancias de Compute Engine son una excepción a esta regla. Puedes cambiar la cuenta de servicio conectada a una instancia según sea necesario.

Consulta las instrucciones correspondientes al tipo de recurso que quieres crear:

Conecta una cuenta de servicio cuando creas un recurso
AI Platform Prediction Versiones de modelos
AI Platform Training Trabajos
Entorno estándar de App Engine Versiones de app
Entorno flexible de App Engine Versiones de app
Cloud Composer Entornos
Cloud Run Functions Cloud Run Functions
Cloud Life Sciences Canalizaciones
Cloud Run Servicios
Cloud Scheduler Trabajos
Cloud Source Repositories
Compute Engine
Dataproc Clústeres
Google Kubernetes Engine
Notebooks Instancias de notebook
Pub/Sub Suscripciones

Después de crear el recurso y de conectar la cuenta de servicio a ese recurso, puedes otorgar funciones a la cuenta de servicio para que pueda acceder a los recursos adecuados. Este proceso equivale a otorgar una función a cualquier otra principal.

Para obtener información sobre cómo otorgar funciones, consulta Otorga, cambia y revoca el acceso a los recursos.

Habilita cuentas de servicio para conectarlas entre proyectos

Si quieres permitir que los usuarios conecten cuentas de servicio de un proyecto a los recursos de otro proyecto, debes actualizar las políticas de la organización para el proyecto que contiene las cuentas de servicio. Verifica las siguientes restricciones booleanas en las políticas de la organización de ese proyecto:

  • Asegúrate de que la restricción booleana iam.disableCrossProjectServiceAccountUsage no se aplique para el proyecto.

    Esta restricción booleana controla si puedes conectar una cuenta de servicio a un recurso en otro proyecto. Se aplica de forma predeterminada y solo se puede configurar a nivel del proyecto, no a nivel de la carpeta ni de la organización.

    Cuando no se aplica esta restricción, IAM agrega una retención de proyecto que impide que el proyecto se borre. Esta retención tiene el origen iam.googleapis.com/cross-project-service-accounts. No recomendamos que borres esta retención.

  • Recomendado: Asegúrate de que la restricción booleana iam.restrictCrossProjectServiceAccountLienRemoval se aplique al proyecto.

    Esta restricción booleana garantiza que las principales puedan quitar la retención del proyecto solo si tienen el permiso resourcemanager.projects.updateLiens a nivel de la organización. Si no se aplica esta restricción, las principales pueden quitar la retención del proyecto si tienen este permiso a nivel de proyecto.

Para aprender a ver o cambiar una restricción booleana en una política de la organización, consulta la sección Crea y administra políticas de la organización.

Inhabilita las cuentas de servicio para que no se conecten entre proyectos

Si ya habilitaste cuentas de servicio para conectarlas entre proyectos, no te recomendamos inhabilitar esta función, en especial, en entornos de producción.

Específicamente, en el proyecto en el que se encuentran tus cuentas de servicio, no debes realizar ninguno de estos cambios:

  • No actualices las políticas de la organización del proyecto para aplicar la restricción booleana iam.disableCrossProjectServiceAccountUsage.
  • No actualices las políticas de la organización del proyecto para no aplicar la restricción booleana iam.restrictCrossProjectServiceAccountLienRemoval.
  • No quites la retención de proyecto con el origen iam.googleapis.com/cross-project-service-accounts, lo que evita que borres el proyecto.
  • No borres el proyecto.

Si estás dispuesto a aceptar el riesgo de inhabilitar esta función, puedes inhabilitar las cuentas de servicio que usas entre proyectos y, luego, supervisar tu entorno de Google Cloud para ver si existen problemas a fin de reducir el riesgo. Si observas algún problema, puedes volver a habilitar las cuentas de servicio. Si no observas ningún problema, es posible que no tengas ningún recurso de Google Cloudque dependa de una cuenta de servicio en otro proyecto.

Registros de auditoría para la conexión de cuentas de servicio

Cuando un principal usa el permiso iam.serviceAccounts.actAs para conectar una cuenta de servicio a un recurso, IAM genera un registro de auditoría. Este registro de auditoría contiene la siguiente información:

  • Dirección de correo electrónico de la entidad principal que adjuntó la cuenta de servicio al recurso
  • Detalles sobre la cuenta de servicio que se adjuntó al recurso

Para obtener una lista de los recursos a los que puedes conectar cuentas de servicio, consulta Conecta la cuenta de servicio al recurso nuevo en esta página.

Para ver un ejemplo de este tipo de registro de auditoría, consulta Registros para usar el permiso iam.serviceAccounts.actAs. Para obtener más información sobre los registros de auditoría en general, consulta la descripción general de los Registros de auditoría de Cloud.

¿Qué sigue?