Mostrar y obtener claves de cuentas de servicio

En esta página se explica cómo enumerar y obtener claves de cuentas de servicio mediante la consola, la CLI de Google Cloud, la API Identity and Access Management o una de las bibliotecas de cliente de Google Cloud.Trusted Cloud

Antes de empezar

Roles obligatorios

Para obtener los permisos que necesitas para enumerar y obtener claves de cuentas de servicio, pide a tu administrador que te asigne el rol de gestión de identidades y accesos Ver cuentas de servicio (roles/iam.serviceAccountViewer) en el proyecto o en la cuenta de servicio cuyas claves quieras gestionar. Para obtener más información sobre cómo conceder roles, consulta el artículo Gestionar el acceso a proyectos, carpetas y organizaciones.

También puedes conseguir los permisos necesarios a través de roles personalizados u otros roles predefinidos.

Para obtener más información, consulta Roles de cuentas de servicio.

Los roles básicos de gestión de identidades y accesos también contienen permisos para gestionar claves de cuentas de servicio. No debes conceder roles básicos en un entorno de producción, pero sí puedes hacerlo en un entorno de desarrollo o de pruebas.

Mostrar claves de cuentas de servicio

Puedes consultar las claves de una cuenta de servicio mediante laTrusted Cloud consola, la CLI de gcloud, el método serviceAccount.keys.list() o una de las bibliotecas de cliente.

El método serviceAccount.keys.list() se suele usar para auditar cuentas de servicio y claves, o para crear herramientas personalizadas para gestionar cuentas de servicio.

Para saber a qué proyecto pertenece tu clave, puedes descargarla como archivo JSON y consultar ese archivo.

Es posible que veas claves que no has creado. Son claves creadas por Google y usadas por la API Service Account Credentials. Para obtener más información, consulta el artículo sobre Google Cloud-powered key pares.

Consola

  1. En la Trusted Cloud consola, ve a la página Cuentas de servicio.
  2. Selecciona un proyecto.
  3. En la página Cuentas de servicio, haz clic en la dirección de correo de la cuenta de servicio cuyas claves quieras consultar.
  4. Haz clic en Teclas. La consola muestra una lista de claves de la cuenta de servicio. Trusted Cloud

gcloud

Ejecuta el comando gcloud iam service-accounts keys list para mostrar las claves de la cuenta de servicio.

Sustituye los siguientes valores:

  • SA_NAME: nombre de la cuenta de servicio de la que se van a mostrar las claves.
  • PROJECT_ID: tu ID de proyecto Trusted Cloud .
gcloud iam service-accounts keys list \
    --iam-account=SA_NAME@PROJECT_ID.

Resultado:

KEY_ID CREATED_AT EXPIRES_AT INHABILITADO DISABLE_REASON EXTENDED_STATUS
8e6e3936d7024646f8ceb39792006c07f4a9760c 2021-01-01T21:01:42Z 9999-12-31T23:59:59Z      
937c98f870f5c8db970af527aa3c12fd88b1c20a 2021-01-01T20:55:40Z 9999-12-31T23:59:59Z Verdadero INICIADO POR EL USUARIO  
937c98f870f5c8db970af527aa3c12fd88b1c20a 2021-01-01T20:55:40Z 9999-12-31T23:59:59Z Verdadero EXPOSED ['key':'SERVICE_ACCOUNT_KEY_EXTENDED_STATUS_KEY_EXPOSED' 'value':'{exposure URL}']

C++

Para saber cómo instalar y usar la biblioteca de cliente de IAM, consulta Bibliotecas de cliente de IAM. Para obtener más información, consulta la documentación de referencia de la API C++ de gestión de identidades y accesos.

Para autenticarte en IAM, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta la sección Antes de empezar.

namespace iam = ::google::cloud::iam_admin_v1;
[](std::string const& service_account_name,
   std::vector<std::string> const& key_type_labels) {
  iam::IAMClient client(iam::MakeIAMConnection());
  std::vector<google::iam::admin::v1::ListServiceAccountKeysRequest::KeyType>
      key_types;
  for (auto const& type : key_type_labels) {
    if (type == "USER_MANAGED") {
      key_types.push_back(google::iam::admin::v1::
                              ListServiceAccountKeysRequest::USER_MANAGED);
    } else if (type == "SYSTEM_MANAGED") {
      key_types.push_back(google::iam::admin::v1::
                              ListServiceAccountKeysRequest::SYSTEM_MANAGED);
    }
  }
  auto response =
      client.ListServiceAccountKeys(service_account_name, key_types);
  if (!response) throw std::move(response).status();
  std::cout << "ServiceAccountKeys successfully retrieved: "
            << response->DebugString() << "\n";
}

C#

Para saber cómo instalar y usar la biblioteca de cliente de IAM, consulta Bibliotecas de cliente de IAM. Para obtener más información, consulta la documentación de referencia de la API C# de gestión de identidades y accesos.

Para autenticarte en IAM, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta la sección Antes de empezar.


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

Para saber cómo instalar y usar la biblioteca de cliente de IAM, consulta Bibliotecas de cliente de IAM. Para obtener más información, consulta la documentación de referencia de la API Go de gestión de identidades y accesos.

Para autenticarte en IAM, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta la sección Antes de empezar.

import (
	"context"
	"fmt"
	"io"

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

// listKey lists a service account's keys.
func listKeys(w io.Writer, serviceAccountEmail string) ([]*iam.ServiceAccountKey, error) {
	ctx := context.Background()
	service, err := iam.NewService(ctx)
	if err != nil {
		return nil, fmt.Errorf("iam.NewService: %w", 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: %w", err)
	}
	for _, key := range response.Keys {
		fmt.Fprintf(w, "Listing key: %v", key.Name)
	}
	return response.Keys, nil
}

Java

Para saber cómo instalar y usar la biblioteca de cliente de IAM, consulta Bibliotecas de cliente de IAM. Para obtener más información, consulta la documentación de referencia de la API Java de gestión de identidades y accesos.

Para autenticarte en IAM, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta la sección Antes de empezar.

import com.google.cloud.iam.admin.v1.IAMClient;
import com.google.iam.admin.v1.ListServiceAccountKeysRequest;
import com.google.iam.admin.v1.ServiceAccountKey;
import java.io.IOException;
import java.util.List;

public class ListServiceAccountKeys {

  public static void main(String[] args) throws IOException {
    // TODO(Developer): Replace the below variables before running.
    String projectId = "your-project-id";
    String serviceAccountName = "your-service-account-name";

    List<ServiceAccountKey> keys = listKeys(projectId, serviceAccountName);
    keys.forEach(key -> System.out.println("Key: " + key.getName()));
  }

  // Lists all keys for a service account.
  public static List<ServiceAccountKey> listKeys(String projectId, String accountName)
          throws IOException {
    // Initialize client that will be used to send requests.
    // This client only needs to be created once, and can be reused for multiple requests.
    String email = String.format("%s@%s.iam.gserviceaccount.com", accountName, projectId);
    try (IAMClient iamClient = IAMClient.create()) {
      ListServiceAccountKeysRequest req = ListServiceAccountKeysRequest.newBuilder()
              .setName(String.format("projects/%s/serviceAccounts/%s", projectId, email))
              .build();

      return iamClient.listServiceAccountKeys(req).getKeysList();
    }
  }
}

Python

Para saber cómo instalar y usar la biblioteca de cliente de IAM, consulta Bibliotecas de cliente de IAM. Para obtener más información, consulta la documentación de referencia de la API Python de gestión de identidades y accesos.

Para autenticarte en IAM, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta la sección Antes de empezar.

from typing import List

from google.cloud import iam_admin_v1
from google.cloud.iam_admin_v1 import types


def list_keys(project_id: str, account: str) -> List[iam_admin_v1.ServiceAccountKey]:
    """Creates a key for a service account.

    project_id: ID or number of the Google Cloud project you want to use.
    account: ID or email which is unique identifier of the service account.
    """

    iam_admin_client = iam_admin_v1.IAMClient()
    request = types.ListServiceAccountKeysRequest()
    request.name = f"projects/{project_id}/serviceAccounts/{account}"

    response = iam_admin_client.list_service_account_keys(request=request)
    return response.keys

REST

El método projects.serviceAccounts.keys.list muestra todas las claves de cuenta de servicio de una cuenta de servicio.

Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

  • PROJECT_ID: tu ID de proyecto. Trusted Cloud Los IDs de proyecto son cadenas alfanuméricas, como my-project.
  • SA_NAME: el nombre de la cuenta de servicio cuyas claves quieres enumerar.
  • KEY_TYPES: opcional. Lista de tipos de claves separadas por comas que quiere incluir en la respuesta. El tipo de clave indica si una clave la gestiona el usuario (USER_MANAGED) o el sistema (SYSTEM_MANAGED). Si se deja en blanco, se devuelven todas las claves.

Método HTTP y URL:

GET https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/SA_NAME@PROJECT_ID./keys?keyTypes=KEY_TYPES

Para enviar tu solicitud, despliega una de estas opciones:

Deberías recibir una respuesta JSON similar a la siguiente:

{
  "keys": [
    {
      "name": "projects/my-project/serviceAccounts/my-service-account@my-project./keys/90c48f61c65cd56224a12ab18e6ee9ca9c3aee7c",
      "validAfterTime": "2020-03-04T17:39:47Z",
      "validBeforeTime": "9999-12-31T23:59:59Z",
      "keyAlgorithm": "KEY_ALG_RSA_2048",
      "keyOrigin": "GOOGLE_PROVIDED",
      "keyType": "USER_MANAGED"
    },
    {
      "name": "projects/my-project/serviceAccounts/my-service-account@my-project./keys/e5e3800831ac1adc8a5849da7d827b4724b1fce8",
      "validAfterTime": "2020-03-31T23:50:09Z",
      "validBeforeTime": "9999-12-31T23:59:59Z",
      "keyAlgorithm": "KEY_ALG_RSA_2048",
      "keyOrigin": "GOOGLE_PROVIDED",
      "keyType": "USER_MANAGED"
    },
    {
      "name": "projects/my-project/serviceAccounts/my-service-account@my-project./keys/b97699f042b8eee6a846f4f96259fbcd13e2682e",
      "validAfterTime": "2020-05-17T18:58:13Z",
      "validBeforeTime": "9999-12-31T23:59:59Z",
      "keyAlgorithm": "KEY_ALG_RSA_2048",
      "keyOrigin": "GOOGLE_PROVIDED",
      "keyType": "USER_MANAGED",
      "disabled": true
      "disable_reason": "SERVICE_ACCOUNT_KEY_DISABLE_REASON_EXPOSED"
      "extended_status": "SERVICE_ACCOUNT_KEY_EXTENDED_STATUS_KEY_EXPOSED"
      "extended_status_message": "exposed at: https://www.github.com/SomePublicRepo"
    }
  ]
}

Obtener una clave para la cuenta de servicio

Puedes usar la CLI de gcloud o la API REST para obtener los datos de la clave pública de una clave de cuenta de servicio. Además, puedes usar la consola de Trusted Cloud , la CLI de gcloud o la API REST para obtener metadatos de la clave, como el algoritmo que usa y si la gestionas tú o Google.

Es posible que algunas aplicaciones o herramientas necesiten acceder a los datos de la clave pública o a los metadatos de una clave de cuenta de servicio para realizar tareas como auditorías e interoperabilidad con sistemas externos. Por ejemplo, Terraform podría tener que verificar que el estado de una clave de cuenta de servicio en Trusted Cloud by S3NS coincide con lo que se define en el archivo de configuración de Terraform.

Consola

Para obtener los datos de la clave pública de una clave de cuenta de servicio, haz lo siguiente:

Usa la CLI de gcloud o la API REST. Estos datos no están disponibles en la consolaTrusted Cloud .

Para obtener los metadatos de una clave de cuenta de servicio, haz lo siguiente:

  1. En la Trusted Cloud consola, ve a la página Cuentas de servicio.
  2. Selecciona un proyecto.
  3. En la página Cuentas de servicio, haz clic en la dirección de correo de la cuenta de servicio cuyas claves quieras consultar.
  4. Haz clic en Teclas. La consola Trusted Cloud muestra una lista de claves de la cuenta de servicio, incluidos los metadatos de cada clave.

gcloud

Para obtener los datos de la clave pública de una clave de cuenta de servicio, haz lo siguiente:

Ejecuta el comando gcloud beta iam service-accounts keys get-public-key:

gcloud beta iam service-accounts keys get-public-key KEY_ID \
    --iam-account=SA_NAME@PROJECT_ID. \
    --output-file=FILENAME

Proporciona los siguientes valores:

  • KEY_ID: el ID de la clave pública que quieres obtener. Para encontrar el ID de la clave, consulta todas las claves de la cuenta de servicio, identifica la clave que quieras obtener y copia su ID.
  • SA_NAME: Nombre de la cuenta de servicio cuya clave pública quieres obtener.
  • PROJECT_ID: tu ID de proyecto Trusted Cloud .
  • FILENAME: el archivo en el que se guardarán los datos de la clave pública.

De forma predeterminada, los datos de la clave pública se guardan en formato PEM X.509. Para obtener la clave pública sin formato, ejecuta el comando con la marca adicional --type=raw.

Por ejemplo, el siguiente comando obtiene los datos de la clave pública c97cc34494c07c9b483701f28368f20145b9ef97, que pertenece a la cuenta de servicio my-service-account@my-project., y, a continuación, guarda los datos de la clave pública en el archivo public_key.pem:

gcloud beta iam service-accounts keys get-public-key \
    c97cc34494c07c9b483701f28368f20145b9ef97 \
    --iam-account=my-service-account@my-project. \
    --output-file=public_key.pem

Para obtener los metadatos de una clave de cuenta de servicio, haz lo siguiente:

Ejecuta el comando gcloud iam service-accounts keys list:

gcloud iam service-accounts keys list --iam-account=SA_NAME \
    --filter="name~KEY_ID" --format=json

Proporciona los siguientes valores:

  • SA_NAME: nombre de la cuenta de servicio de la que quieres obtener los metadatos de la clave.
  • KEY_ID: ID de la clave de la que quieres obtener metadatos.

Por ejemplo, el siguiente comando obtiene metadatos de la clave c97cc34494c07c9b483701f28368f20145b9ef97, que pertenece a la cuenta de servicio my-service-account@my-project.:

gcloud iam service-accounts keys list \
    --iam-account=my-service-account@my-project. \
    --filter="name~c97cc34494c07c9b483701f28368f20145b9ef97" --format=json

REST

El método projects.serviceAccounts.keys.get devuelve información sobre una clave pública de una cuenta de servicio.

Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

  • PROJECT_ID: tu ID de proyecto. Trusted Cloud Los IDs de proyecto son cadenas alfanuméricas, como my-project.
  • SA_NAME: nombre de la cuenta de servicio cuya clave pública quieres obtener.
  • KEY_ID: el ID de la clave pública que quieres obtener. Para encontrar el ID de la clave, consulta todas las claves de la cuenta de servicio, identifica la clave que quieras obtener y, a continuación, copia su ID del final del campo name. El ID de la clave es todo lo que hay después de keys/.
  • KEY_TYPE: formato en el que se devolverá la clave pública. Usa TYPE_X509_PEM_FILE para el formato PEM X.509 o TYPE_RAW_PUBLIC_KEY para la clave pública sin formato. Si omite este parámetro de consulta, el método devuelve metadatos de la clave, pero no devuelve los datos de la clave pública.

Método HTTP y URL:

GET https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/SA_NAME@PROJECT_ID./keys/KEY_ID?publicKeyType=KEY_TYPE

Para enviar tu solicitud, despliega una de estas opciones:

Deberías recibir una respuesta JSON similar a la siguiente:

{
  "name": "projects/my-project/serviceAccounts/my-service-account@my-project./keys/f4a83933ac07cf52bb74e0e66d99662a09f51a36",
  "validAfterTime": "2021-12-10T17:32:06Z",
  "validBeforeTime": "9999-12-31T23:59:59Z",
  "publicKeyData": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUMvRENDQWVTZ0F3SUJBZ0lJT2lCdm9hR09nV0F3RFFZSktvWklodmNOQVFFRkJRQXdJREVlTUJ3R0ExVUUKQXhNVk1UQXhNVGsxTlRFMk5UWXlPRGszTmpFek1qQXpNQ0FYRFRJeE1USXhNREUzTXpJd05sb1lEems1T1RreApNak14TWpNMU9UVTVXakFnTVI0d0hBWURWUVFERXhVeE1ERXhPVFUxTVRZMU5qSTRPVGMyTVRNeU1ETXdnZ0VpCk1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQzdzeDBFcXVUMGNwSXhlczl1SW0yRy9DS3EKdnc4YTl2a2JkaWZZbDZHSDh1ZUxEWDhGNHVUeEVQMkNzU3JLTHZtOFo2My9IVUxnWjBtQXByb0JlM08vaVR1ZwpmYVZ0NVNtakhvWm9YQ1lpbjR0MS93SkpvdDhrRFdPeDZhOEdieUdqZ215ak8yYk1XdEtaQ2dqeGZ3cUV0MmN3CklnajA5VzJKYTlHTWRsdVA0VGVubTRKSkJoaFpFbTJ1bVAwYVZZdkRnUWF5d0RCYnJuNG8yY0EzSWplRDZGM1gKK0VHRDNKU0s4VW02Sk5sM21adGp6VWNZSHBrYkF0U1A2ZDI5d1RmZkdIRFY0THJRWlM3bG15d3hsb3p5WnpaawpCOFpHckMzSkF1MVNVRTdQOTN6bWtFb1B6MlRUNWhaYXZMWFQ5TGM2SExiRklRVHFnVEJVWHlNMkpIcGZBZ01CCkFBR2pPREEyTUF3R0ExVWRFd0VCL3dRQ01BQXdEZ1lEVlIwUEFRSC9CQVFEQWdlQU1CWUdBMVVkSlFFQi93UU0KTUFvR0NDc0dBUVVGQndNQ01BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQkhPNXlpUDY3NkE4UEN2RjdRSzdFMApYZVljbzdsSStFZkowaGJrWVlmdUtnSENPcXcvd3FBbCtOSithanljT2FPWDFPMlRZN3ZOc05pR2t3eWc2QXdqCklhL1NHVjd3NkxpS2JldFRuSVp4UlhRY25lcnVvZEwycUR5eWphMDJJSXJVTmVKY1o0MVJBNXRTL3NkcTFGNm4KM0NjSXFoZTI1OTA4TUNna3cwaFB1K0VLbFF6R1B5T3pVRHBLdXg0cnRBaHJTYTBUVW1wbEMxdTJnUk1YRkF6aApWUjU0V2dNa2tabURyalBNeWdBS3JmNkd0bHo2VHRTYTVLb1BWdGpsWExUQkxaSnlhdk4zc1F2dFlBK1NFQWpWCnA1N1ZabFBYZmR0dWN4ekJaOC9zS25SOHNyYU5hVWFjamg1NEE1Nm1URTE3b0IyUWkrTHBJUTYvNnVqVnNXaUYKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=",
  "keyAlgorithm": "KEY_ALG_RSA_2048",
  "keyOrigin": "GOOGLE_PROVIDED",
  "keyType": "USER_MANAGED"
}

Siguientes pasos