Conecta cuentas de servicio a recursos

Para algunos recursos de 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 recurso necesita acceder a otros servicios y recursos de Google Cloud, usa su cuenta de servicio conectada 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 API de Google Cloud, esas aplicaciones automáticamente se autentican como la cuenta de servicio conectada.

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

Antes de comenzar

Conecta una cuenta de servicio a un recurso

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.

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 Permisos y busca la sección Principales con acceso a esta cuenta de servicio.

    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 del proyecto de Google Cloud Los ID de proyecto son strings 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 del proyecto de Google Cloud Los ID de proyecto son strings 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 al recurso nuevo

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.

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 Functions Función de Cloud Functions
Cloud Life Sciences Canalizaciones
Cloud Run Servicios
Cloud Scheduler Trabajos
Cloud Source Repositories
Compute Engine
Dataflow Trabajos
Datalab Instancias
Dataproc Clústeres
Eventarc Activadores
Google Kubernetes Engine
Notebooks Instancias de notebook
Pub/Sub Suscripciones
Vertex AI
Workflows Workflows

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.

Conecta una cuenta de servicio a un recurso en otro proyecto

De forma predeterminada, no puedes crear una cuenta de servicio en un proyecto y conectarla a un recurso en otro proyecto. Si deseas conservar todas tus cuentas de servicio en un proyecto, debes actualizar la política de la organización para ese proyecto.

Habilita cuentas de servicio para conectarlas entre proyectos

Para permitir que los usuarios conecten cuentas de servicio de un proyecto a los recursos de otro proyecto, verifica las siguientes restricciones booleanas en la política de la organización para el proyecto en el que se encuentran tus cuentas de servicio:

  • 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. La restricción se aplica de forma predeterminada.

    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 la política de la organización del proyecto para aplicar la restricción booleana iam.disableCrossProjectServiceAccountUsage.
  • No actualices la política 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 característica, 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 Cloud que dependa de una cuenta de servicio en otro proyecto.

¿Qué sigue?