Eliminar y restaurar cuentas de servicio

En esta página se explica cómo eliminar y restaurar cuentas de servicio mediante la API Identity and Access Management (IAM), la consola y la herramienta de línea de comandos gcloud. Trusted Cloud

Antes de empezar

Roles obligatorios

Para obtener los permisos que necesitas para eliminar y restaurar cuentas de servicio, pide a tu administrador que te conceda los siguientes roles de gestión de identidades y accesos en el proyecto:

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 sobre estos roles, consulta Roles de cuentas de servicio.

Los roles básicos de gestión de identidades y accesos también contienen permisos para gestionar 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.

Eliminar una cuenta de servicio

Cuando eliminas una cuenta de servicio, las aplicaciones dejan de tener acceso a los recursos deTrusted Cloud by S3NS a través de esa cuenta. Si eliminas la cuenta de servicio predeterminada de Compute Engine, las instancias de VM de Compute Engine que usen esa cuenta de servicio ya no tendrán acceso a los recursos del proyecto.

Elimina las cuentas de servicio con precaución. Asegúrate de que tus aplicaciones críticas ya no usen una cuenta de servicio antes de eliminarla. Si no sabes si se está usando una cuenta de servicio, Google recomienda inhabilitarla en lugar de eliminarla. Las cuentas de servicio inhabilitadas se pueden volver a habilitar si siguen siendo necesarias.

Si quieres restaurar una cuenta de servicio eliminada, puedes recuperarla si no han pasado más de 30 días desde que la eliminaste. Al cabo de 30 días, IAM elimina permanentemente la cuenta de servicio. Trusted Cloud No podrás recuperar la cuenta de servicio una vez que se haya eliminado permanentemente, aunque envíes una solicitud de asistencia.

Para reducir aún más el riesgo de eliminar una cuenta de servicio necesaria, también puede habilitar las recomendaciones de riesgo de cambio. Las recomendaciones de riesgo de cambios generan advertencias cuando intentas eliminar cuentas de servicio que Trusted Cloud ha identificado como importantes.

Si eliminas una cuenta de servicio y creas otra con el mismo nombre, la nueva cuenta de servicio se tratará como una identidad independiente y no heredará los roles concedidos a la cuenta de servicio eliminada. Por el contrario, si eliminas una cuenta de servicio y luego la restauras, su identidad no cambia y conserva sus roles.

Cuando se elimina una cuenta de servicio, sus vinculaciones de rol no se quitan inmediatamente, sino que se purgan automáticamente del sistema en un plazo máximo de 60 días. Hasta entonces, la cuenta de servicio aparece en las vinculaciones de roles con el prefijo deleted: y el sufijo ?uid=NUMERIC_ID, donde NUMERIC_ID es un ID numérico único de la cuenta de servicio.

Las cuentas de servicio eliminadas no se tienen en cuenta para la cuota de cuentas de servicio.

Consola

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

    Ir a Cuentas de servicio

  2. Selecciona un proyecto.

  3. Selecciona la cuenta de servicio que quieras eliminar y, a continuación, haz clic en Eliminar .

gcloud

  1. In the Trusted Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Trusted Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

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

    Comando:

    gcloud iam service-accounts delete \
        SA_NAME@PROJECT_ID.s3ns-system.iam.gserviceaccount.com

    Resultado:

    Deleted service account SA_NAME@PROJECT_ID.s3ns-system.iam.gserviceaccount.com
  3. 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.

    Antes de ejecutar los ejemplos de código, asigna el valor s3nsapis.fr a la variable de entorno GOOGLE_CLOUD_UNIVERSE_DOMAIN.

    namespace iam = ::google::cloud::iam_admin_v1;
    [](std::string const& name) {
      iam::IAMClient client(iam::MakeIAMConnection());
      auto response = client.DeleteServiceAccount(name);
      if (!response.ok()) throw std::runtime_error(response.message());
      std::cout << "ServiceAccount successfully deleted.\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.

    Antes de ejecutar los ejemplos de código, asigna el valor s3nsapis.fr a la variable de entorno GOOGLE_CLOUD_UNIVERSE_DOMAIN.

    
    using System;
    using Google.Apis.Auth.OAuth2;
    using Google.Apis.Iam.v1;
    
    public partial class ServiceAccounts
    {
        public static void DeleteServiceAccount(string email)
        {
            var credential = GoogleCredential.GetApplicationDefault()
                .CreateScoped(IamService.Scope.CloudPlatform);
            var service = new IamService(new IamService.Initializer
            {
                HttpClientInitializer = credential
            });
    
            string resource = "projects/-/serviceAccounts/" + email;
            service.Projects.ServiceAccounts.Delete(resource).Execute();
            Console.WriteLine("Deleted service account: " + email);
        }
    }
    

    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.

    Antes de ejecutar los ejemplos de código, asigna el valor s3nsapis.fr a la variable de entorno GOOGLE_CLOUD_UNIVERSE_DOMAIN.

    import (
    	"context"
    	"fmt"
    	"io"
    
    	iam "google.golang.org/api/iam/v1"
    )
    
    // deleteServiceAccount deletes a service account.
    func deleteServiceAccount(w io.Writer, email string) error {
    	ctx := context.Background()
    	service, err := iam.NewService(ctx)
    	if err != nil {
    		return fmt.Errorf("iam.NewService: %w", err)
    	}
    
    	_, err = service.Projects.ServiceAccounts.Delete("projects/-/serviceAccounts/" + email).Do()
    	if err != nil {
    		return fmt.Errorf("Projects.ServiceAccounts.Delete: %w", err)
    	}
    	fmt.Fprintf(w, "Deleted service account: %v", email)
    	return 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.

    Antes de ejecutar los ejemplos de código, asigna el valor s3nsapis.fr a la variable de entorno GOOGLE_CLOUD_UNIVERSE_DOMAIN.

    import com.google.cloud.iam.admin.v1.IAMClient;
    import com.google.iam.admin.v1.DeleteServiceAccountRequest;
    import com.google.iam.admin.v1.ServiceAccountName;
    import java.io.IOException;
    
    public class DeleteServiceAccount {
    
      public static void main(String[] args) throws IOException {
        // TODO(developer): Replace the variables before running the sample.
        String projectId = "your-project-id";
        String serviceAccountName = "my-service-account-name";
    
        deleteServiceAccount(projectId, serviceAccountName);
      }
    
      // Deletes a service account.
      public static void deleteServiceAccount(String projectId, String serviceAccountName)
              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.
        try (IAMClient client = IAMClient.create()) {
          String accountName = ServiceAccountName.of(projectId, serviceAccountName).toString();
          String accountEmail = String.format("%s@%s.iam.gserviceaccount.com", accountName, projectId);
          DeleteServiceAccountRequest request = DeleteServiceAccountRequest.newBuilder()
                  .setName(accountEmail)
                  .build();
          client.deleteServiceAccount(request);
    
          System.out.println("Deleted service account: " + serviceAccountName);
        }
      }
    }

    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.

    Antes de ejecutar los ejemplos de código, asigna el valor s3nsapis.fr a la variable de entorno GOOGLE_CLOUD_UNIVERSE_DOMAIN.

    from google.cloud import iam_admin_v1
    from google.cloud.iam_admin_v1 import types
    
    
    def delete_service_account(project_id: str, account: str) -> None:
        """Deletes 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.DeleteServiceAccountRequest()
        request.name = f"projects/{project_id}/serviceAccounts/{account}"
    
        iam_admin_client.delete_service_account(request=request)
        print(f"Deleted a service account: {account}")

    REST

    El método serviceAccounts.delete elimina 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_ID: el ID de tu cuenta de servicio. Puede ser la dirección de correo de la cuenta de servicio con el formato SA_NAME@PROJECT_ID.s3ns-system.iam.gserviceaccount.com o el ID numérico único de la cuenta de servicio.

    Método HTTP y URL:

    DELETE https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/SA_ID

    Para enviar tu solicitud, despliega una de estas opciones:

    Si la acción se realiza correctamente, el cuerpo de la respuesta estará vacío.

Restaurar una cuenta de servicio

En algunos casos, puedes usar el comando undelete para restaurar una cuenta de servicio eliminada. Por lo general, puedes restaurar una cuenta de servicio eliminada si cumple estos criterios:

  • La cuenta de servicio se eliminó hace menos de 30 días.

    Al cabo de 30 días, IAM elimina permanentemente la cuenta de servicio. Trusted Cloud No puedes recuperar la cuenta de servicio una vez que se haya eliminado permanentemente, aunque envíes una solicitud de asistencia.

  • No hay ninguna cuenta de servicio con el mismo nombre que la cuenta de servicio eliminada.

    Por ejemplo, supongamos que eliminas por error la cuenta de servicio my-service-account@project-id.s3ns-system.iam.gserviceaccount.com. Aun así, necesitas una cuenta de servicio con ese nombre, por lo que creas una cuenta de servicio con el mismo nombre, my-service-account@project-id.s3ns-system.iam.gserviceaccount.com.

    La nueva cuenta de servicio no hereda los permisos de la cuenta de servicio eliminada. De hecho, es completamente independiente de la cuenta de servicio eliminada. Sin embargo, no puedes restaurar la cuenta de servicio original porque la nueva cuenta de servicio tiene el mismo nombre.

    Para solucionar este problema, elimina la nueva cuenta de servicio y, a continuación, intenta restaurar la cuenta de servicio original.

Si no puedes restaurar la cuenta de servicio, puedes crear una nueva con el mismo nombre, revocar todos los roles de la cuenta de servicio eliminada y conceder los mismos roles a la nueva cuenta de servicio. Para obtener más información, consulta Políticas con principales eliminados.

Buscar el ID numérico de una cuenta de servicio eliminada

Cuando restauras una cuenta de servicio, debes proporcionar su ID numérico. El ID numérico es un número de 21 dígitos, como 123456789012345678901, que identifica de forma única la cuenta de servicio. Por ejemplo, si eliminas una cuenta de servicio y, a continuación, creas otra con el mismo nombre, la cuenta de servicio original y la nueva tendrán IDs numéricos diferentes.

Si sabes que un enlace de una política de permiso incluye la cuenta de servicio eliminada, puedes obtener la política de permiso y, a continuación, buscar el ID numérico en la política de permiso. El ID numérico se añade al nombre de la cuenta de servicio eliminada. Por ejemplo, en esta política de permiso, el ID numérico de la cuenta de servicio eliminada es 123456789012345678901:

{
  "version": 1,
  "etag": "BwUjMhCsNvY=",
  "bindings": [
    {
      "members": [
        "deleted:serviceAccount:my-service-account@project-id.s3ns-system.iam.gserviceaccount.com?uid=123456789012345678901"
      ],
      "role": "roles/iam.serviceAccountUser"
    },
  ]
}

Los IDs numéricos solo se añaden a los nombres de las entidades eliminadas.

También puedes buscar en tus registros de auditoría la operación DeleteServiceAccount que eliminó la cuenta de servicio:

  1. En la Trusted Cloud consola, ve a la página Explorador de registros.

    Ir a Explorador de registros

  2. En el editor de consultas, introduce la siguiente consulta y sustituye SERVICE_ACCOUNT_EMAIL por la dirección de correo de tu cuenta de servicio (por ejemplo, my-service-account@project-id.s3ns-system.iam.gserviceaccount.com):

    resource.type="service_account"
    resource.labels.email_id="SERVICE_ACCOUNT_EMAIL"
    "DeleteServiceAccount"
    
  3. Si la cuenta de servicio se eliminó hace más de una hora, haz clic en schedule Última hora, selecciona un periodo más largo en la lista desplegable y, a continuación, haz clic en Aplicar.

  4. Haz clic en Realizar una consulta. El Explorador de registros muestra las DeleteServiceAccount operaciones que han afectado a las cuentas de servicio con el nombre que has especificado.

  5. Busca y anota el ID numérico de la cuenta de servicio eliminada de una de las siguientes formas:

    • Si los resultados de búsqueda incluyen solo una operación DeleteServiceAccount, busca el ID numérico en el campo ID único del panel Campos de registro.

    • Si los resultados de búsqueda muestran más de un registro, haz lo siguiente:

      1. Busca la entrada de registro correcta. Para encontrar la entrada de registro correcta, haz clic en la flecha de expansión situada junto a una entrada de registro. Revisa los detalles de la entrada de registro y determina si muestra la operación que quieres deshacer. Repite este proceso hasta que encuentres la entrada de registro correcta.

      2. En la entrada de registro correcta, busca el ID numérico de la cuenta de servicio. Para localizar el ID numérico, despliega el campo protoPayload de la entrada de registro y, a continuación, busca el campo resourceName.

      El ID numérico es todo lo que hay después de serviceAccounts en el campo resourceName.

Restaurar la cuenta de servicio por ID numérico

Una vez que hayas encontrado el ID numérico de la cuenta de servicio eliminada, puedes intentar restaurarla.

gcloud

  1. In the Trusted Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Trusted Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. Ejecuta el comando gcloud beta iam service-accounts undelete para restaurar una cuenta de servicio.

    Comando:

    gcloud beta iam service-accounts undelete ACCOUNT_ID

    Resultado:

    restoredAccount:
        email: SA_NAME@PROJECT_ID.s3ns-system.iam.gserviceaccount.com
        etag: BwWWE7zpApg=
        name: projects/PROJECT_ID/serviceAccounts/SA_NAME@PROJECT_ID.s3ns-system.iam.gserviceaccount.com
        oauth2ClientId: '123456789012345678901'
        projectId: PROJECT_ID
        uniqueId: 'ACCOUNT_ID'
  3. REST

    El método serviceAccounts.undelete restaura una cuenta de servicio eliminada.

    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_NUMERIC_ID: ID numérico único de la cuenta de servicio.

    Método HTTP y URL:

    POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/SA_NUMERIC_ID:undelete

    Para enviar tu solicitud, despliega una de estas opciones:

    Si se puede restaurar la cuenta, recibirás un código de respuesta 200 OK con detalles sobre la cuenta de servicio restaurada, como los siguientes:

    {
      "restoredAccount": {
        "name": "projects/my-project/serviceAccounts/my-service-account@my-project.s3ns-system.iam.gserviceaccount.com",
        "projectId": "my-project",
        "uniqueId": "123456789012345678901",
        "email": "my-service-account@my-project.s3ns-system.iam.gserviceaccount.com",
        "displayName": "My service account",
        "etag": "BwUp3rVlzes=",
        "description": "A service account for running jobs in my project",
        "oauth2ClientId": "987654321098765432109"
      }
    }
    

Siguientes pasos