Cómo crear y administrar cuentas de servicio

En esta página se explica cómo crear y administrar cuentas de servicio con la API de Cloud Identity and Access Management, Google Cloud Platform Console y la herramienta de línea de comandos de gcloud.

Cuando creas un nuevo proyecto de Cloud, Google Cloud Platform (GCP) crea automáticamente una cuenta de servicio de Compute Engine y una cuenta de servicio de App Engine bajo ese proyecto. Puedes crear hasta 98 cuentas de servicio adicionales para tu proyecto a fin de controlar el acceso a tus recursos.

Antes de comenzar

Permisos necesarios

Para permitir que un usuario administre cuentas de servicio, otorga una de las siguientes funciones:

  • Usuario de cuenta de servicio (roles/iam.serviceAccountUser): otorga permisos para obtener, listar o suplantar una cuenta de servicio.
  • Administrador de cuenta de servicio (roles/iam.serviceAccountAdmin): incluye los permisos de usuario de cuenta de servicio y también otorga permisos para crear, actualizar, borrar, y obtener o configurar la política de Cloud IAM en una cuenta de servicio.

Las funciones básicas de Cloud IAM también contienen permisos para administrar cuentas de servicio. Sin embargo, recomendamos otorgar una de las funciones predefinidas anteriores para evitar el acceso innecesario a otros recursos de GCP.

Consulta el tema Funciones de la cuenta de servicio para obtener más información sobre las funciones relacionadas con las cuentas de servicio.

Cómo crear una cuenta de servicio

Crear una cuenta de servicio es similar a agregar un miembro a tu proyecto, pero la cuenta de servicio pertenece a tus aplicaciones en lugar de a un usuario final individual.

En los ejemplos a continuación, [SA-NAME] es el nombre de la cuenta de servicio. Este es un identificador único; aparecerá en la dirección de correo electrónico de la cuenta de servicio y lo usarás para actualizar la cuenta de servicio con otras API. No se puede cambiar una vez creado. [SA-DISPLAY-NAME] es un nombre descriptivo para la cuenta de servicio. [PROJECT-ID] es el ID de tu proyecto de Google Cloud Platform.

Para crear una cuenta de servicio, como mínimo se debe otorgar al usuario la función de administrador de cuenta de servicio (roles/iam.serviceAccountAdmin) o la función básica de editor (roles/editor).

Console

  1. Abre la página Cuentas de servicio en GCP Console.

    Abrir la página Cuentas de servicio.

  2. Haz clic en Seleccionar un proyecto.

  3. Selecciona el proyecto y haz clic en Abrir.

  4. Haz clic en Crear cuenta de servicio.

  5. Ingresa un nombre de cuenta de servicio, selecciona una función que desees otorgar a la cuenta de servicio y, luego, haz clic en Guardar.

COMANDO DE GCLOUD

Ejecuta el comando de gcloud iam service-accounts create para crear una cuenta de servicio.

Comando:

gcloud iam service-accounts create [SA-NAME]
    --display-name "[SA-DISPLAY-NAME]"

El resultado es la cuenta de servicio:

Created service account [SA-NAME].

API de REST

Llama a serviceAccounts.create() para crear una cuenta de servicio.

POST https://iam.googleapis.com/v1/projects/[PROJECT-ID]/serviceAccounts

El cuerpo de la solicitud debe contener las propiedades de la cuenta de servicio.

{
    "accountId": "[SA-NAME]",
    "serviceAccount": {
        "displayName": "[SA-DISPLAY-NAME]",
    }
}

Respuesta:

{
    "name": "projects/PROJECT-ID/serviceAccounts/SA-NAME@PROJECT-ID.iam.gserviceaccount.com",
    "projectId": "PROJECT-ID",
    "uniqueId": "113948692397867021414",
    "email": "SA-NAME@PROJECT-ID.iam.gserviceaccount.com",
    "displayName": "SA-DISPLAY-NAME",
    "etag": "BwUp3rVlzes=",
    "oauth2ClientId": "117249000288840666939"
}

C#

Antes de probar esta muestra, sigue las instrucciones de configuración para C# que se encuentran en la Guía de inicio rápido de Cloud IAM con bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud IAM para C#.

public static ServiceAccount CreateServiceAccount(string projectId,
    string name, string displayName)
{
    var request = new CreateServiceAccountRequest
    {
        AccountId = name,
        ServiceAccount = new ServiceAccount
        {
            DisplayName = displayName
        }
    };

    ServiceAccount serviceAccount = s_iam.Projects.ServiceAccounts
        .Create(request, "projects/" + projectId).Execute();

    Console.WriteLine("Created service account: " + serviceAccount.Email);
    return serviceAccount;
}

Java

Antes de probar esta muestra, sigue las instrucciones de configuración para Java que se encuentran en la Guía de inicio rápido de Cloud IAM con bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud IAM para Java.

public ServiceAccount createServiceAccount(String projectId, String name, String displayName)
    throws IOException {

  ServiceAccount serviceAccount = new ServiceAccount();
  serviceAccount.setDisplayName(displayName);
  CreateServiceAccountRequest request = new CreateServiceAccountRequest();
  request.setAccountId(name);
  request.setServiceAccount(serviceAccount);

  serviceAccount =
      service.projects().serviceAccounts().create("projects/" + projectId, request).execute();

  System.out.println("Created service account: " + serviceAccount.getEmail());
  return serviceAccount;
}

Python

Antes de probar esta muestra, sigue las instrucciones de configuración para Python que se encuentran en la Guía de inicio rápido de Cloud IAM con bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud IAM para Python.

import os

from google.oauth2 import service_account
import googleapiclient.discovery

def create_service_account(project_id, name, display_name):
    """Creates a service account."""

    credentials = service_account.Credentials.from_service_account_file(
        filename=os.environ['GOOGLE_APPLICATION_CREDENTIALS'],
        scopes=['https://www.googleapis.com/auth/cloud-platform'])

    service = googleapiclient.discovery.build(
        'iam', 'v1', credentials=credentials)

    my_service_account = service.projects().serviceAccounts().create(
        name='projects/' + project_id,
        body={
            'accountId': name,
            'serviceAccount': {
                'displayName': display_name
            }
        }).execute()

    print('Created service account: ' + my_service_account['email'])
    return my_service_account

Después de crear una cuenta de servicio, otorga una o más funciones a la cuenta de servicio para que pueda actuar en tu nombre.

Cómo listar cuentas de servicio

Cuando se listan cuentas de servicio, puedes especificar parámetros para limitar el número de cuentas de servicio para incluir en la respuesta. Luego, puedes usar ListServiceAccountsResponse.next_page_token en una solicitud posterior para listar las cuentas de servicio restantes.

Utiliza este método para auditar cuentas y claves de servicio o para crear herramientas personalizadas para administrar cuentas de servicio.

Para listar cuentas de servicio, como mínimo se debe otorgar al usuario la función de usuario de cuenta de servicio (roles/iam.serviceAccountUser) o la función básica de lector (roles/viewer).

Console

  1. Abre la página Cuentas de servicio en GCP Console.

    Abrir la página Cuentas de servicio.

  2. Haz clic en Seleccionar un proyecto.

  3. Selecciona el proyecto y haz clic en Abrir. Todas las cuentas de servicio se listan en la página Cuentas de servicio.

COMANDO DE GCLOUD

Ejecuta el comando gcloud iam service-accounts list para listar todas las cuentas de servicio en un proyecto.

Comando:

gcloud iam service-accounts list

El resultado es la lista de todas las cuentas de servicio en el proyecto:

NAME                    EMAIL
SA-DISPLAY-NAME-1       SA-NAME-1@PROJECT-ID.iam.gserviceaccount.com
SA-DISPLAY-NAME-2       SA-NAME-2@PROJECT-ID.iam.gserviceaccount.com

API de REST

Llama al método serviceAccounts.list().

Solicitud:

GET https://iam.googleapis.com/v1/projects/[PROJECT-ID]/serviceAccounts

Respuesta:

{
    "accounts": [
    {
        "name": "projects/PROJECT-ID/serviceAccounts/SA-NAME-1@PROJECT-ID.iam.gserviceaccount.com",
        "projectId": "PROJECT-ID",
        "uniqueId": "108979773878059201436",
        "email": "SA-NAME-1@PROJECT-ID.iam.gserviceaccount.com",
        "displayName": "SA-DISPLAY-NAME-1",
        "etag": "BwUpTsLVUkQ=",
        "oauth2ClientId": "102240834887833340852"
    },
    {
        "name": "projects/PROJECT-ID/serviceAccounts/SA-NAME-2@PROJECT-ID.iam.gserviceaccount.com",
        "projectId": "PROJECT-ID",
        "uniqueId": "108979773878059201436",
        "email": "SA-NAME-2@PROJECT-ID.iam.gserviceaccount.com",
        "displayName": "SA-DISPLAY-NAME-2",
        "etag": "BwUpTsLVUkQ=",
        "oauth2ClientId": "102240834887833340852"
    }]
}

C#

Antes de probar esta muestra, sigue las instrucciones de configuración para C# que se encuentran en la Guía de inicio rápido de Cloud IAM con bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud IAM para C#.

public static IList<ServiceAccount> ListServiceAccounts(string projectId)
{
    ListServiceAccountsResponse response = s_iam.Projects.ServiceAccounts
        .List("projects/" + projectId).Execute();
    IList<ServiceAccount> serviceAccounts = response.Accounts;

    foreach (ServiceAccount account in serviceAccounts)
    {
        Console.WriteLine("Name: " + account.Name);
        Console.WriteLine("Display Name: " + account.DisplayName);
        Console.WriteLine("Email: " + account.Email);
        Console.WriteLine();
    }
    return serviceAccounts;
}

Java

Antes de probar esta muestra, sigue las instrucciones de configuración para Java que se encuentran en la Guía de inicio rápido de Cloud IAM con bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud IAM para Java.

public List<ServiceAccount> listServiceAccounts(String projectId) throws IOException {

  ListServiceAccountsResponse response =
      service.projects().serviceAccounts().list("projects/" + projectId).execute();
  List<ServiceAccount> serviceAccounts = response.getAccounts();

  for (ServiceAccount account : serviceAccounts) {
    System.out.println("Name: " + account.getName());
    System.out.println("Display Name: " + account.getDisplayName());
    System.out.println("Email: " + account.getEmail());
    System.out.println();
  }
  return serviceAccounts;
}

Python

Antes de probar esta muestra, sigue las instrucciones de configuración para Python que se encuentran en la Guía de inicio rápido de Cloud IAM con bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud IAM para Python.

import os

from google.oauth2 import service_account
import googleapiclient.discovery

def list_service_accounts(project_id):
    """Lists all service accounts for the current project."""

    credentials = service_account.Credentials.from_service_account_file(
        filename=os.environ['GOOGLE_APPLICATION_CREDENTIALS'],
        scopes=['https://www.googleapis.com/auth/cloud-platform'])

    service = googleapiclient.discovery.build(
        'iam', 'v1', credentials=credentials)

    service_accounts = service.projects().serviceAccounts().list(
        name='projects/' + project_id).execute()

    for account in service_accounts['accounts']:
        print('Name: ' + account['name'])
        print('Email: ' + account['email'])
        print(' ')
    return service_accounts

Cómo renombrar una cuenta de servicio

El nombre para mostrar de una cuenta de servicio se usa comúnmente para capturar información adicional sobre la cuenta de servicio, como el propósito de la cuenta de servicio o una persona de contacto para la cuenta.

Para renombrar una cuenta de servicio, como mínimo se debe otorgar al usuario la función de administrador de cuenta de servicio (roles/iam.serviceAccountAdmin) o la función básica de editor (roles/editor).

Console

  1. Abre la página Cuentas de servicio en GCP Console.

    Abrir la página Cuentas de servicio.

  2. Haz clic en Seleccionar un proyecto.
  3. Selecciona el proyecto y haz clic en Abrir.
  4. Busca la cuenta de servicio que deseas renombrar, haz clic en el botón Más more_vert en esa fila y, luego, haz clic en Editar.
  5. Ingresa el nuevo nombre y haz clic en Guardar.

COMANDO DE GCLOUD

Ejecuta el comando gcloud iam service-accounts update para actualizar una cuenta de servicio.

Comando:

gcloud iam service-accounts update
    [SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com
    --display-name "[UPDATED-DISPLAY-NAME]"

El resultado es la cuenta de servicio renombrada:

displayName: Updated display name
email: SA-NAME@PROJECT-ID.iam.gserviceaccount.com
etag: BwUqQpHDCw8=
name: projects/PROJECT-ID/serviceAccounts/SA-NAME@PROJECT-ID.iam.gserviceaccount.com
oauth2ClientId: '112984177383228986143'
projectId: PROJECT-ID
uniqueId: '112984177383228986143'

API de REST

Usa el método serviceAccounts.update().

Solicitud:

PUT https://iam.googleapis.com/v1/projects/[PROJECT-ID]/serviceAccounts/[SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com

El cuerpo de la solicitud debe contener el nuevo nombre para mostrar, el ID del proyecto, el ID único de la cuenta de servicio y el correo electrónico de la cuenta de servicio.

{
    "displayName":"[UPDATED-DISPLAY-NAME]",
    "etag":"BwUpVKjgNtE=",
    "projectId":"[PROJECT-ID]",
    "uniqueId":"107522985251862639552",
    "email":"[SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com",
}

Respuesta:

{
    "name": "projects/PROJECT-ID/serviceAccounts/SA-NAME@PROJECT-ID.iam.gserviceaccount.com",
    "projectId": "PROJECT-ID",
    "uniqueId": "107522985251862639552",
    "email": "SA-NAME@PROJECT-ID.iam.gserviceaccount.com",
    "displayName": "Updated display name",
    "etag": "BwUqLK4bL9U=",
    "oauth2ClientId": "105236325228757713905"
}

C#

Antes de probar esta muestra, sigue las instrucciones de configuración para C# que se encuentran en la Guía de inicio rápido de Cloud IAM con bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud IAM para C#.

public static ServiceAccount RenameServiceAccount(string email,
    string newDisplayName)
{
    // First, get a ServiceAccount using List() or Get()
    string resource = "projects/-/serviceAccounts/" + email;
    ServiceAccount serviceAccount = s_iam.Projects.ServiceAccounts
        .Get(resource).Execute();

    // Then you can update the display name
    serviceAccount.DisplayName = newDisplayName;
    serviceAccount = s_iam.Projects.ServiceAccounts.Update(
        serviceAccount, resource).Execute();

    Console.WriteLine($"Updated display name for {serviceAccount.Email} " +
        "to: " + serviceAccount.DisplayName);
    return serviceAccount;
}

Java

Antes de probar esta muestra, sigue las instrucciones de configuración para Java que se encuentran en la Guía de inicio rápido de Cloud IAM con bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud IAM para Java.

public ServiceAccount renameServiceAccount(String email, String newDisplayName)
    throws IOException {

  // First, get a service account using List() or Get()
  ServiceAccount serviceAccount =
      service.projects().serviceAccounts().get("projects/-/serviceAccounts/" + email).execute();

  // Then you can update the display name
  serviceAccount.setDisplayName(newDisplayName);
  service.projects().serviceAccounts().update(serviceAccount.getName(), serviceAccount).execute();

  System.out.println(
      "Updated display name for " + serviceAccount.getName() + " to: " + newDisplayName);
  return serviceAccount;
}

Python

Antes de probar esta muestra, sigue las instrucciones de configuración para Python que se encuentran en la Guía de inicio rápido de Cloud IAM con bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud IAM para Python.

import os

from google.oauth2 import service_account
import googleapiclient.discovery

def rename_service_account(email, new_display_name):
    """Changes a service account's display name."""

    # First, get a service account using List() or Get()
    credentials = service_account.Credentials.from_service_account_file(
        filename=os.environ['GOOGLE_APPLICATION_CREDENTIALS'],
        scopes=['https://www.googleapis.com/auth/cloud-platform'])

    service = googleapiclient.discovery.build(
        'iam', 'v1', credentials=credentials)

    resource = 'projects/-/serviceAccounts/' + email

    my_service_account = service.projects().serviceAccounts().get(
        name=resource).execute()

    # Then you can update the display name
    my_service_account['displayName'] = new_display_name
    my_service_account = service.projects().serviceAccounts().update(
        name=resource, body=my_service_account).execute()

    print('Updated display name for {} to: {}'.format(
        my_service_account['email'], my_service_account['displayName']))
    return my_service_account

Cómo borrar una cuenta de servicio

Cuando borras una cuenta de servicio, las aplicaciones ya no tendrán acceso a los recursos de Google Cloud Platform a través de esa cuenta de servicio. Si borras las cuentas de servicio predeterminadas de App Engine y de Compute Engine, las instancias ya no tendrán acceso a los recursos del proyecto.

Borra con precaución; asegúrate de que tus aplicaciones críticas ya no utilicen una cuenta de servicio antes de borrarla. Además, las vinculaciones de funciones para una cuenta de servicio borrada no se quitan de inmediato; se borran automáticamente del sistema después de un máximo de 60 días.

Para borrar una cuenta de servicio, como mínimo se debe otorgar al usuario la función de administrador de cuenta de servicio (roles/iam.serviceAccountAdmin) o la función básica de editor (roles/editor).

Console

  1. Abre la página Cuentas de servicio en GCP Console.

    Abrir la página Cuentas de servicio.

  2. Haz clic en Seleccionar un proyecto.

  3. Selecciona el proyecto y haz clic en Abrir.

  4. Selecciona las cuentas de servicio que desees borrar y, luego, haz clic en Borrar delete.

COMANDO DE GCLOUD

Ejecuta el comando gcloud iam service-accounts delete para borrar una cuenta de servicio.

Comando:

gcloud iam service-accounts delete
  [SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com

Salida:

Deleted service account SA-NAME@PROJECT-ID.iam.gserviceaccount.com

API de REST

Usa el método serviceAccounts.delete().

DELETE https://iam.googleapis.com/v1/projects/[PROJECT-ID]/serviceAccounts/[SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com

C#

Antes de probar esta muestra, sigue las instrucciones de configuración para C# que se encuentran en la Guía de inicio rápido de Cloud IAM con bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud IAM para C#.

public static void DeleteServiceAccount(string email)
{
    string resource = "projects/-/serviceAccounts/" + email;
    s_iam.Projects.ServiceAccounts.Delete(resource).Execute();

    Console.WriteLine("Deleted service account: " + email);
}

Java

Antes de probar esta muestra, sigue las instrucciones de configuración para Java que se encuentran en la Guía de inicio rápido de Cloud IAM con bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud IAM para Java.

public void deleteServiceAccount(String email) throws IOException {

  service.projects().serviceAccounts().delete("projects/-/serviceAccounts/" + email).execute();

  System.out.println("Deleted service account: " + email);
}

Python

Antes de probar esta muestra, sigue las instrucciones de configuración para Python que se encuentran en la Guía de inicio rápido de Cloud IAM con bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud IAM para Python.

import os

from google.oauth2 import service_account
import googleapiclient.discovery

def delete_service_account(email):
    """Deletes a service account."""

    credentials = service_account.Credentials.from_service_account_file(
        filename=os.environ['GOOGLE_APPLICATION_CREDENTIALS'],
        scopes=['https://www.googleapis.com/auth/cloud-platform'])

    service = googleapiclient.discovery.build(
        'iam', 'v1', credentials=credentials)

    service.projects().serviceAccounts().delete(
        name='projects/-/serviceAccounts/' + email).execute()

    print('Deleted service account: ' + email)

Después de borrar una cuenta de servicio, no crees una nueva cuenta de servicio con el mismo nombre. Esto puede dar como resultado un comportamiento inesperado. Para obtener más información, consulta Cómo borrar y volver a crear cuentas de servicio.

Próximos pasos

¿Te sirvió esta página? Envíanos tu opinión:

Enviar comentarios sobre…

Documentación de Cloud Identity and Access Management