Crea y administra claves de cuentas de servicio

En esta página se explica cómo crear y administrar claves de cuenta de servicio con Google Cloud Console, la herramienta de línea de comandos de gcloud, la API de Cloud Identity and Access Management o una de las bibliotecas cliente de Google Cloud.

Requisitos previos para esta guía

Permisos necesarios

Para permitir que un usuario administre claves de cuenta de servicio, otorga la función Administrador de clave de cuenta de servicio (roles/iam.serviceAccountKeyAdmin). Las funciones básicas de Cloud IAM también contienen permisos para administrar claves de cuenta de servicio, pero recomendamos otorgar esta función a fin de evitar el acceso innecesario a otros recursos de Google Cloud.

Para obtener más información, consulta la lista de funciones de cuentas de servicio.

Crea claves de cuentas de servicio

Para usar una cuenta de servicio fuera de Google Cloud, como en otras plataformas o localmente, primero debes establecer la identidad de la cuenta de servicio. Los pares de claves públicas/privadas proporcionan una forma segura de lograr este objetivo.

Puedes crear una clave de cuenta de servicio con Cloud Console, la herramienta de gcloud, el método serviceAccounts.keys.create() o una de las bibliotecas cliente.

En los ejemplos a continuación, [SA-NAME] es el nombre de tu cuenta de servicio y [PROJECT-ID] es el ID de tu proyecto de Google Cloud. Puedes recuperar la string [SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com de la página Cuentas de servicio en Cloud Console.

Console

  1. Abre la página IAM y administración en Cloud Console.

    Abrir la página IAM y administración

  2. Selecciona tu proyecto y haz clic en Continuar.
  3. En el panel de navegación izquierdo, haz clic en Cuentas de servicio.
  4. Busca la cuenta de servicio para la que deseas crear una clave, haz clic en el botón Más more_vert en esa fila y, luego, haz clic en Crear clave.
  5. Selecciona un Tipo de clave y haz clic en Crear.

Comando de gcloud

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

Comando:

gcloud iam service-accounts keys create ~/key.json \
  --iam-account [SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com

Resultado:

created key [e44da1202f82f8f4bdd9d92bc412d1d8a837fa83] of type [json] as
[/usr/home/username/key.json] for
[SA-NAME@PROJECT-ID.iam.gserviceaccount.com]

API de REST

Solicitud:

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

Respuesta:

{
    "name":"projects/PROJECT-ID/serviceAccounts/SA-NAME@PROJECT-ID.iam.gserviceaccount.com/keys/90c48f61c65cd56224a12ab18e6ee9ca9c3aee7c",
    "privateKeyType": "TYPE_GOOGLE_CREDENTIALS_FILE",
    "privateKeyData":"MIIJqAIB . . .",
    "validBeforeTime": "2028-05-08T21:00:00Z",
    "validAfterTime": "2016-01-25T18:38:09.000Z",
    "keyAlgorithm": "KEY_ALG_RSA_2048"
}

C#

Antes de probar este ejemplo, sigue las instrucciones de configuración de C# en la Guía de inicio rápido: Cómo usar bibliotecas cliente de Cloud IAM. Si deseas obtener más información, consulta la documentación de referencia de la API de Cloud IAM para C#.


using System;
using Google.Apis.Auth.OAuth2;
using Google.Apis.Iam.v1;
using Google.Apis.Iam.v1.Data;

public partial class ServiceAccountKeys
{
    public static ServiceAccountKey CreateKey(string serviceAccountEmail)
    {
        var credential = GoogleCredential.GetApplicationDefault()
            .CreateScoped(IamService.Scope.CloudPlatform);
        var service = new IamService(new IamService.Initializer
        {
            HttpClientInitializer = credential
        });

        var key = service.Projects.ServiceAccounts.Keys.Create(
            new CreateServiceAccountKeyRequest(),
            "projects/-/serviceAccounts/" + serviceAccountEmail)
            .Execute();
        Console.WriteLine("Created key: " + key.Name);
        return key;
    }
}

Go

Antes de probar este ejemplo, sigue las instrucciones de configuración para Go en la Guía de inicio rápido: Cómo usar bibliotecas cliente de Cloud IAM. Si deseas obtener más información, consulta la documentación de referencia de la API de Cloud IAM para Go.

import (
	"context"
	"fmt"
	"io"

	"golang.org/x/oauth2/google"
	iam "google.golang.org/api/iam/v1"
)

// createKey creates a service account key.
func createKey(w io.Writer, serviceAccountEmail string) (*iam.ServiceAccountKey, error) {
	client, err := google.DefaultClient(context.Background(), iam.CloudPlatformScope)
	if err != nil {
		return nil, fmt.Errorf("google.DefaultClient: %v", err)
	}
	service, err := iam.New(client)
	if err != nil {
		return nil, fmt.Errorf("iam.New: %v", err)
	}

	resource := "projects/-/serviceAccounts/" + serviceAccountEmail
	request := &iam.CreateServiceAccountKeyRequest{}
	key, err := service.Projects.ServiceAccounts.Keys.Create(resource, request).Do()
	if err != nil {
		return nil, fmt.Errorf("Projects.ServiceAccounts.Keys.Create: %v", err)
	}
	fmt.Fprintf(w, "Created key: %v", key.Name)
	return key, nil
}

Java

Antes de probar este ejemplo, sigue las instrucciones de configuración para Java que se encuentran en la Guía de inicio rápido: Cómo usar bibliotecas cliente de Cloud IAM. Si deseas obtener más información, consulta la documentación de referencia de la API de Cloud IAM para Java.

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.iam.v1.Iam;
import com.google.api.services.iam.v1.IamScopes;
import com.google.api.services.iam.v1.model.CreateServiceAccountKeyRequest;
import com.google.api.services.iam.v1.model.ServiceAccountKey;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Collections;

public class CreateServiceAccountKey {

  // Creates a key for a service account.
  public static void createKey(String projectId) {
    // String projectId = "my-project-id";

    Iam service = null;
    try {
      service = initService();
    } catch (IOException | GeneralSecurityException e) {
      System.out.println("Unable to initialize service: \n" + e.toString());
      return;
    }

    try {
      ServiceAccountKey key =
          service
              .projects()
              .serviceAccounts()
              .keys()
              .create(
                  "projects/-/serviceAccounts/your-service-account-name@"
                      + projectId
                      + ".iam.gserviceaccount.com",
                  new CreateServiceAccountKeyRequest())
              .execute();

      System.out.println("Created key: " + key.getName());
    } catch (IOException e) {
      System.out.println("Unable to create service account key: \n" + e.toString());
    }
  }

  private static Iam initService() throws GeneralSecurityException, IOException {
    // Use the Application Default Credentials strategy for authentication. For more info, see:
    // https://cloud.google.com/docs/authentication/production#finding_credentials_automatically
    GoogleCredential credential =
        GoogleCredential.getApplicationDefault()
            .createScoped(Collections.singleton(IamScopes.CLOUD_PLATFORM));
    // Initialize the IAM service, which can be used to send requests to the IAM API.
    Iam service =
        new Iam.Builder(
                GoogleNetHttpTransport.newTrustedTransport(),
                JacksonFactory.getDefaultInstance(),
                credential)
            .setApplicationName("service-account-keys")
            .build();
    return service;
  }
}

Python

Antes de probar este ejemplo, sigue las instrucciones de configuración para Python en la Guía de inicio rápido: Cómo usar bibliotecas cliente de Cloud IAM. Si deseas 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_key(service_account_email):
    """Creates a key for 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)

    key = service.projects().serviceAccounts().keys().create(
        name='projects/-/serviceAccounts/' + service_account_email, body={}
        ).execute()

    print('Created key: ' + key['name'])

Ten en cuenta que el valor privateKeyData que se muestra es una representación de string codificada en Base64 del valor TYPE_GOOGLE_CREDENTIALS_FILE (claves o credenciales JSON o P12).

Cuando creas una clave, se genera y descarga a tu máquina un nuevo par de clave pública o privada. Este sirve como copia única de la clave privada. Tú eres el responsable del almacenar de forma segura la clave privada. Anota su ubicación y asegúrate de que tu aplicación pueda acceder a ella, ya que necesita la clave para hacer llamadas a la API autenticadas.

Puede tardar hasta 60 segundos antes de poder usar una clave creada nueva para autenticación. Si experimentas errores de autenticación de inmediato después de crear una clave nueva, asegúrate de que pasen 60 segundos antes de volver a intentar.

El formato de la clave puede diferir según cómo se genera. Las claves creadas con Cloud Console o la herramienta de línea de comandos de gcloud se ven de la siguiente manera:

{
"type": "service_account",
"project_id": "[PROJECT-ID]",
"private_key_id": "[KEY-ID]",
"private_key": "-----BEGIN PRIVATE KEY-----\n[PRIVATE-KEY]\n-----END PRIVATE KEY-----\n",
"client_email": "[SERVICE-ACCOUNT-EMAIL]",
"client_id": "[CLIENT-ID]",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://accounts.google.com/o/oauth2/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/[SERVICE-ACCOUNT-EMAIL]"
}

A su vez, las claves generadas con la API de REST o con bibliotecas cliente se ven de la siguiente forma:

{
"name": "projects/[PROJECT-ID]/serviceAccounts/[SERVICE-ACCOUNT-EMAIL]/keys/[KEY-ID]",
"privateKeyType": "TYPE_GOOGLE_CREDENTIALS_FILE",
"privateKeyData": "[PRIVATE-KEY]",
"validAfterTime": "[DATE]",
"validBeforeTime": "[DATE]",
"keyAlgorithm": "KEY_ALG_RSA_2048"
}

Nuevamente, ten en cuenta que el valor privateKeyData que se muestra es una representación de string codificada en Base64 del valor TYPE_GOOGLE_CREDENTIALS_FILE (claves o credenciales JSON o P12).

Debido a que los formatos entre cada método son diferentes, es más fácil generar una clave con el mismo método que piensas usar cuando hagas llamadas a la API en el futuro. Por ejemplo, si usas gcloud, también puedes generar tu clave con gcloud. Si deseas usar una clave en un método que se generó con un método diferente (como usar una clave generada con REST para gcloud), deberás editar la clave a fin de que coincida con el formato adecuado.

Google garantiza que todos los usuarios podrán acceder a las claves públicas de todas las cuentas de servicios, a fin de verificar las firmas que se crearon con la clave privada. La clave pública es de acceso público en las URL a continuación:

  • Certificado x.509: https://www.googleapis.com/service_accounts/v1/metadata/x509/[SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com
  • Clave web de JSON (JWK): https://www.googleapis.com/service_accounts/v1/jwk/[SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com
  • Extremo sin procesar: https://www.googleapis.com/service_accounts/v1/metadata/raw/[SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com

Genera una lista de las claves de cuentas de servicio

Puedes generar una lista de las claves de una cuenta de servicio con Cloud Console, la herramienta de gcloud, el método serviceAccount.keys.list() o una de las bibliotecas cliente.

El método serviceAccount.keys.list() se usa comúnmente a fin de auditar claves y cuentas de servicio, o de compilar herramientas personalizadas para administrar cuentas de servicio.

Si quieres descubrir a qué proyecto pertenece tu clave, puedes descargar la clave como un archivo JSON y mirar ese archivo.

Puede que haya claves que no creaste; estas son las claves administradas en Google Cloud que se usan en los servicios de Google Cloud, como App Engine y Compute Engine. Para obtener más información sobre la diferencia entre las claves administradas por el usuario y con Google Cloud, consulta la sección Comprender las cuentas de servicio .

Console

  1. Abre la página IAM y administración en Cloud Console.

    Abrir la página IAM y administración

  2. Selecciona tu proyecto y haz clic en Continuar.
  3. En el panel de navegación izquierdo, haz clic en Cuentas de servicio. Todas las cuentas de servicio y sus claves correspondientes están en la lista.

Comando de gcloud

Ejecuta el comando gcloud iamservice-accounts keys list para generar una lista de las claves de cuentas de servicio.

Comando:

gcloud iam service-accounts keys list \
    --iam-account [SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com

Resultado:

KEY_ID CREATED_AT EXPIRES_AT
8e6e3936d7024646f8ceb39792006c07f4a9760c 2016-01-26T21:01:42.000Z 2026-01-23T21:01:42.000Z
937c98f870f5c8db970af527aa3c12fd88b1c20a 2016-01-26T20:55:40.000Z 2026-01-23T20:55:40.000Z

API de REST

Llama al comando serviceAccount.keys.list() para obtener una lista de las claves de una cuenta de servicio.

Solicitud:

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

Respuesta:

{
  "keys": [
    {
        "name": "projects/PROJECT-ID/serviceAccounts/SA-NAME@PROJECT-ID.iam.gserviceaccount.com/keys/90c48f61c65cd56224a12ab18e6ee9ca9c3aee7c",
        "validAfterTime": "2016-01-25T18:38:09.000Z",
        "validBeforeTime": "2026-01-22T18:38:09.000Z",
        "keyAlgorithm": "KEY_ALG_RSA_2048"
    },
    {
        "name": "projects/PROJECT-ID/serviceAccounts/SA-NAME@PROJECT-ID.iam.gserviceaccount.com/keys/e5e3800831ac1adc8a5849da7d827b4724b1fce8",
        "validAfterTime": "2016-01-25T13:43:27.000Z",
        "validBeforeTime": "2016-01-26T13:43:27.000Z",
        "keyAlgorithm": "KEY_ALG_RSA_2048"
    },
    {
        "name": "projects/PROJECT-ID/serviceAccounts/SA-NAME@PROJECT-ID.iam.gserviceaccount.com/keys/b97699f042b8eee6a846f4f96259fbcd13e2682e",
        "validAfterTime": "2016-01-26T13:28:27.000Z",
        "validBeforeTime": "2016-01-27T13:28:27.000Z",
        "keyAlgorithm": "KEY_ALG_RSA_2048"
    }
  ]
}

C#

Antes de probar este ejemplo, sigue las instrucciones de configuración de C# en la Guía de inicio rápido: Cómo usar bibliotecas cliente de Cloud IAM. Si deseas obtener más información, consulta la documentación de referencia de la API de Cloud IAM para C#.


using System;
using System.Collections.Generic;
using Google.Apis.Auth.OAuth2;
using Google.Apis.Iam.v1;
using Google.Apis.Iam.v1.Data;

public partial class ServiceAccountKeys
{
    public static IList<ServiceAccountKey> ListKeys(string serviceAccountEmail)
    {
        var credential = GoogleCredential.GetApplicationDefault()
            .CreateScoped(IamService.Scope.CloudPlatform);
        var service = new IamService(new IamService.Initializer
        {
            HttpClientInitializer = credential
        });

        var response = service.Projects.ServiceAccounts.Keys
            .List($"projects/-/serviceAccounts/{serviceAccountEmail}")
            .Execute();
        foreach (ServiceAccountKey key in response.Keys)
        {
            Console.WriteLine("Key: " + key.Name);
        }
        return response.Keys;
    }
}

Go

Antes de probar este ejemplo, sigue las instrucciones de configuración para Go en la Guía de inicio rápido: Cómo usar bibliotecas cliente de Cloud IAM. Si deseas obtener más información, consulta la documentación de referencia de la API de Cloud IAM para Go.

import (
	"context"
	"fmt"
	"io"

	"golang.org/x/oauth2/google"
	iam "google.golang.org/api/iam/v1"
)

// listKey lists a service account's keys.
func listKeys(w io.Writer, serviceAccountEmail string) ([]*iam.ServiceAccountKey, error) {
	client, err := google.DefaultClient(context.Background(), iam.CloudPlatformScope)
	if err != nil {
		return nil, fmt.Errorf("google.DefaultClient: %v", err)
	}
	service, err := iam.New(client)
	if err != nil {
		return nil, fmt.Errorf("iam.New: %v", err)
	}

	resource := "projects/-/serviceAccounts/" + serviceAccountEmail
	response, err := service.Projects.ServiceAccounts.Keys.List(resource).Do()
	if err != nil {
		return nil, fmt.Errorf("Projects.ServiceAccounts.Keys.List: %v", err)
	}
	for _, key := range response.Keys {
		fmt.Fprintf(w, "Listing key: %v", key.Name)
	}
	return response.Keys, nil
}

Java

Antes de probar este ejemplo, sigue las instrucciones de configuración para Java que se encuentran en la Guía de inicio rápido: Cómo usar bibliotecas cliente de Cloud IAM. Si deseas obtener más información, consulta la documentación de referencia de la API de Cloud IAM para Java.

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.iam.v1.Iam;
import com.google.api.services.iam.v1.IamScopes;
import com.google.api.services.iam.v1.model.ServiceAccountKey;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Collections;
import java.util.List;

public class ListServiceAccountKeys {

  // Lists all keys for a service account.
  public static void listKeys(String projectId) {
    // String projectId = "my-project-id";

    Iam service = null;
    try {
      service = initService();
    } catch (IOException | GeneralSecurityException e) {
      System.out.println("Unable to initialize service: \n" + e.toString());
      return;
    }

    try {
      List<ServiceAccountKey> keys =
          service
              .projects()
              .serviceAccounts()
              .keys()
              .list(
                  "projects/-/serviceAccounts/"
                      + "your-service-account-name@"
                      + projectId
                      + ".iam.gserviceaccount.com")
              .execute()
              .getKeys();

      for (ServiceAccountKey key : keys) {
        System.out.println("Key: " + key.getName());
      }
    } catch (IOException e) {
      System.out.println("Unable to list service account keys: \n" + e.toString());
    }
  }

  private static Iam initService() throws GeneralSecurityException, IOException {
    // Use the Application Default Credentials strategy for authentication. For more info, see:
    // https://cloud.google.com/docs/authentication/production#finding_credentials_automatically
    GoogleCredential credential =
        GoogleCredential.getApplicationDefault()
            .createScoped(Collections.singleton(IamScopes.CLOUD_PLATFORM));
    // Initialize the IAM service, which can be used to send requests to the IAM API.
    Iam service =
        new Iam.Builder(
                GoogleNetHttpTransport.newTrustedTransport(),
                JacksonFactory.getDefaultInstance(),
                credential)
            .setApplicationName("service-account-keys")
            .build();
    return service;
  }
}

Python

Antes de probar este ejemplo, sigue las instrucciones de configuración para Python en la Guía de inicio rápido: Cómo usar bibliotecas cliente de Cloud IAM. Si deseas 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_keys(service_account_email):
    """Lists all keys for 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)

    keys = service.projects().serviceAccounts().keys().list(
        name='projects/-/serviceAccounts/' + service_account_email).execute()

    for key in keys['keys']:
        print('Key: ' + key['name'])

Obtén una clave de cuenta de servicio

Solo puedes obtener los datos de una clave privada para una clave de cuenta de servicio cuando esta se crea por primera vez.

Puedes obtener información básica sobre una clave, como su ID, algoritmo y datos de clave pública, con el método de la API de REST projects.serviceAccounts.keys.get(). No se admite el uso de Cloud Console o la herramienta de línea de comandos de gcloud.

Sube claves públicas para cuentas de servicio

Puedes subir una parte de clave pública de un par de claves administradas por el usuario para firmar claves de cuenta de servicio. Los datos de clave pública se asocian permanentemente con la cuenta de servicio y se usarán para todas las operaciones de firma subsiguientes cuando se creen claves de cuenta de servicio. Si deseas inhabilitar la capacidad de subir claves para tu proyecto, consulta la sección sobre cómo restringir la subida de claves de cuentas de servicio.

Si decides usar un par de claves administradas por el usuario en lugar de un par de claves administradas por Google, asegúrate de mantenerlo y rotarlo con frecuencia.

Antes de subir tu clave pública, asegúrate de que esté en el formato RSA_X509_PEM. Si aún no tienes un certificado, puedes generar un certificado X.509 autofirmado en el formato adecuado con herramientas como openssl. Para generar un certificado válido con la herramienta openssl, utiliza el siguiente comando:

openssl req -x509 -nodes -newkey rsa:2048 -keyout /output/path/to/private/key \
    -out /output/path/to/public/key -subj "/CN=unused"

Ten en cuenta que, de forma predeterminada, los certificados X.509 creados con openssl vencen después de 30 días. Sin embargo, puedes extender o acortar el plazo de vencimiento con la marca -n.

Comando de gcloud

Ejecuta el comando gcloud alpha iam service-accounts keys upload para subir una clave pública con el fin de firmar claves de cuenta de servicio.

Comando:

gcloud alpha iam service-accounts keys upload /path/to/public/key \
    --iam-account [SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com

El siguiente resultado contiene un identificador único para la clave subida:

Name: projects/PROJECT-ID/serviceAccounts/SA-NAME@PROJECT-ID.iam.gserviceaccount.com/keys/c7b74879da78e4cdcbe7e1bf5e129375c0bfa8d0

Para determinar si el resultado del comando fue correcto, ejecuta el siguiente comando gcloud iam service-accounts keys list:

gcloud iam service-accounts keys list \
    --iam-account [SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com

El siguiente resultado contendrá el mismo identificador único que se mostró después de crear la clave:

KEY_ID CREATED_AT EXPIRES_AT
c7b74879da78e4cdcbe7e1bf5e129375c0bfa8d0 2019-06-26T21:01:42.000Z 2029-06-23T21:01:42.000Z

API de REST

Llama al comando serviceAccount.keys.upload() a fin de subir una clave pública para una cuenta de servicio.

Solicitud:

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

Cuerpo de la solicitud:

{
  "publicKeyData": "LS0tLS1CRUdJTiBDRVJUSUZJQ...jlsCjVjMXUzVlVqS3AtLS0tXG4="
}

El cuerpo de la solicitud debe contener los datos de clave pública en el formato RSA_X509_PEM.

Respuesta:

{
  "name": "projects/[PROJECT-ID]/serviceAccounts/[SERVICE-ACCOUNT-EMAIL]/keys/c7b74879da78e4cdcbe7e1bf5e129375c0bfa8d0",
  "keyAlgorithm": "KEY_ALG_RSA_2048",
  "keyOrigin": "USER_PROVIDED",
}

Borra claves de cuentas de servicios

Puedes borrar una clave de cuenta de servicio con Cloud Console, la herramienta de gcloud, el método serviceAccount.keys.delete() o una de las bibliotecas cliente.

Si borras una clave, tu aplicación ya no podrá acceder a los recursos de Cloud Platform con esta. Por seguridad, se recomienda que rotes las claves de las cuentas de servicio con regularidad. Para rotar una clave, debes crear una clave nueva, hacer que las aplicaciones usen la clave nueva y, luego, borrar la vieja. Usa los métodos serviceAccount.keys.create() y serviceAccount.keys.delete() juntos para automatizar la rotación.

Console

  1. Abre la página IAM y administración en Cloud Console.

    Abrir la página IAM y administración

  2. Selecciona tu proyecto y haz clic en Continuar.
  3. En el panel de navegación izquierdo, haz clic en Cuentas de servicio. Todas las cuentas de servicio y sus claves correspondientes están en la lista.
  4. Haz clic en el correo electrónico de la cuenta de servicio deseada para ver sus claves.
  5. En la lista de claves, haz clic en Borrar delete para cada clave que desees quitar.

Comando de gcloud

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

Comando:

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

Resultado:

Deleted key [8e6e3936d7024646f8ceb39792006c07f4a9760c] for
service account [SA-NAME@PROJECT-ID.iam.gserviceaccount.com]

API de REST

Solicitud:

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

C#

Antes de probar este ejemplo, sigue las instrucciones de configuración de C# en la Guía de inicio rápido: Cómo usar bibliotecas cliente de Cloud IAM. Si deseas obtener más información, consulta la documentación de referencia de la API de Cloud IAM para C#.


using System;
using Google.Apis.Auth.OAuth2;
using Google.Apis.Iam.v1;
using Google.Apis.Iam.v1.Data;

public partial class ServiceAccountKeys
{
    public static void DeleteKey(string fullKeyName)
    {
        var credential = GoogleCredential.GetApplicationDefault()
            .CreateScoped(IamService.Scope.CloudPlatform);
        var service = new IamService(new IamService.Initializer
        {
            HttpClientInitializer = credential
        });

        service.Projects.ServiceAccounts.Keys.Delete(fullKeyName).Execute();
        Console.WriteLine("Deleted key: " + fullKeyName);
    }
}

Go

Antes de probar este ejemplo, sigue las instrucciones de configuración para Go en la Guía de inicio rápido: Cómo usar bibliotecas cliente de Cloud IAM. Si deseas obtener más información, consulta la documentación de referencia de la API de Cloud IAM para Go.

import (
	"context"
	"fmt"
	"io"

	"golang.org/x/oauth2/google"
	iam "google.golang.org/api/iam/v1"
)

// deleteKey deletes a service account key.
func deleteKey(w io.Writer, fullKeyName string) error {
	client, err := google.DefaultClient(context.Background(), iam.CloudPlatformScope)
	if err != nil {
		return fmt.Errorf("google.DefaultClient: %v", err)
	}
	service, err := iam.New(client)
	if err != nil {
		return fmt.Errorf("iam.New: %v", err)
	}

	_, err = service.Projects.ServiceAccounts.Keys.Delete(fullKeyName).Do()
	if err != nil {
		return fmt.Errorf("Projects.ServiceAccounts.Keys.Delete: %v", err)
	}
	fmt.Fprintf(w, "Deleted key: %v", fullKeyName)
	return nil
}

Java

Antes de probar este ejemplo, sigue las instrucciones de configuración para Java que se encuentran en la Guía de inicio rápido: Cómo usar bibliotecas cliente de Cloud IAM. Si deseas obtener más información, consulta la documentación de referencia de la API de Cloud IAM para Java.

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.iam.v1.Iam;
import com.google.api.services.iam.v1.IamScopes;
import com.google.api.services.iam.v1.model.ServiceAccountKey;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Collections;
import java.util.List;

public class DeleteServiceAccountKey {

  // Deletes a service account key.
  public static void deleteKey(String projectId) {
    // String projectId = "my-project-id";

    Iam service = null;
    try {
      service = initService();
    } catch (IOException | GeneralSecurityException e) {
      System.out.println("Unable to initialize service: \n" + e.toString());
      return;
    }

    try {
      // First, get the name of the key using List() or Get()
      List<ServiceAccountKey> keys =
          service
              .projects()
              .serviceAccounts()
              .keys()
              .list(
                  "projects/-/serviceAccounts/"
                      + "your-service-account-name@"
                      + projectId
                      + ".iam.gserviceaccount.com")
              .execute()
              .getKeys();
      String keyToDelete = keys.get(0).getName();

      // Then you can delete the key
      service.projects().serviceAccounts().keys().delete(keyToDelete).execute();

      System.out.println("Deleted key: " + keyToDelete);
    } catch (IOException e) {
      System.out.println("Unable to delete service account key: \n" + e.toString());
    }
  }

  private static Iam initService() throws GeneralSecurityException, IOException {
    // Use the Application Default Credentials strategy for authentication. For more info, see:
    // https://cloud.google.com/docs/authentication/production#finding_credentials_automatically
    GoogleCredential credential =
        GoogleCredential.getApplicationDefault()
            .createScoped(Collections.singleton(IamScopes.CLOUD_PLATFORM));
    // Initialize the IAM service, which can be used to send requests to the IAM API.
    Iam service =
        new Iam.Builder(
                GoogleNetHttpTransport.newTrustedTransport(),
                JacksonFactory.getDefaultInstance(),
                credential)
            .setApplicationName("service-account-keys")
            .build();
    return service;
  }
}

Python

Antes de probar este ejemplo, sigue las instrucciones de configuración para Python en la Guía de inicio rápido: Cómo usar bibliotecas cliente de Cloud IAM. Si deseas 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_key(full_key_name):
    """Deletes a service account key."""

    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().keys().delete(
        name=full_key_name).execute()

    print('Deleted key: ' + full_key_name)