מחיקה וביטול מחיקה של חשבונות שירות

בדף הזה מוסבר איך מוחקים חשבונות שירות ומבטלים את המחיקה שלהם באמצעות ה-API של ניהול זהויות והרשאות גישה (IAM), מסוף Cloud de Confiance וכלי שורת הפקודה gcloud.

לפני שמתחילים

התפקידים הנדרשים

כדי לקבל את ההרשאות שנדרשות למחיקה ולביטול המחיקה של חשבונות שירות, צריך לבקש מהאדמין להקצות לכם את תפקידי ה-IAM הבאים בפרויקט:

להסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.

יכול להיות שאפשר לקבל את ההרשאות הנדרשות גם באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש.

תפקידים בסיסיים ב-IAM כוללים גם הרשאות לניהול חשבונות שירות. לא מומלץ להקצות תפקידים בסיסיים בסביבת ייצור, אבל אפשר להקצות אותם בסביבת פיתוח או בדיקה.

מחיקה של חשבון שירות

כשמוחקים חשבון שירות, לאפליקציות לא תהיה יותר גישה למשאבים שלCloud de Confiance by S3NS דרך חשבון השירות הזה. אם מוחקים את חשבון השירות שמוגדר כברירת מחדל של Compute Engine, למכונות הווירטואליות של Compute Engine שמשתמשות בחשבון השירות הזה לא תהיה יותר גישה למשאבים בפרויקט.

צריך למחוק חשבונות שירות בזהירות. לפני שמוחקים חשבון שירות, חשוב לוודא שהאפליקציות החיוניות כבר לא משתמשות בו. אם לא בטוחים אם משתמשים בחשבון שירות, Google ממליצה להשבית את חשבון השירות במקום למחוק אותו. אפשר להפעיל מחדש חשבונות שירות מושבתים אם הם עדיין נחוצים. מידע נוסף מופיע במאמר השבתה של חשבונות שירות שלא בשימוש לפני המחיקה שלהם.

אם רוצים לשחזר חשבון שירות שנמחק, אפשר לבטל את המחיקה שלו, אם עברו 30 ימים או פחות מאז שמחקתם את חשבון השירות. אחרי 30 יום, מערכת IAM מסירה את חשבון השירות באופן סופי. Cloud de Confianceאי אפשר לשחזר את חשבון השירות אחרי שהוא הוסר באופן סופי, גם אם שולחים בקשת תמיכה.

כדי להקטין עוד יותר את הסיכון למחיקת חשבון שירות נחוץ, אפשר גם להפעיל המלצות לשינוי סיכונים. ההמלצות לשינוי הסיכון יוצרות אזהרות כשמנסים למחוק חשבונות שירות שזוהו על ידי Cloud de Confiance כחשובים.

אם מוחקים חשבון שירות ואז יוצרים חשבון שירות חדש באותו שם, המערכת תתייחס לחשבון השירות החדש כזהות נפרדת. הוא לא יירש את התפקידים שהוקצו לחשבון השירות שנמחק. לעומת זאת, כשמוחקים חשבון שירות ואז מבטלים את המחיקה, הזהות של חשבון השירות לא משתנה וחשבון השירות ישמור על התפקידים שלו.

כשמוחקים חשבון שירות, קישורי התפקידים שלו לא יוסרו באופן מיידי. הם יימחקו מהמערכת באופן סופי ואוטומטי אחרי 60 יום לכל היותר. עד אז, חשבון השירות יופיע בקשרי תפקידים עם תחילית deleted: וסיומת ?uid=NUMERIC_ID. הערך NUMERIC_ID שמופיע בסיומת הוא מזהה מספרי שייחודי לחשבון השירות.

חשבונות שירות שנמחקו לא נכללים במכסה של חשבונות השירות.

המסוף

  1. נכנסים לדף Service accounts במסוף Cloud de Confiance .

    כניסה לדף Service accounts

  2. בוחרים פרויקט.

  3. בוחרים את חשבון השירות שרוצים למחוק ולוחצים על Delete .

gcloud

  1. במסוף Cloud de Confiance , מפעילים את Cloud Shell.

    הפעלת Cloud Shell

    בחלק התחתון של Cloud de Confiance המסוף יתחיל סשן של Cloud Shell ותופיע הודעה של שורת הפקודה. Cloud Shell היא סביבת מעטפת שבה ה-CLI של Google Cloud מותקן ומוגדרים ערכים לפרויקט הקיים. הסשן יופעל תוך כמה שניות.

  2. כדי למחוק את חשבון השירות, מריצים את הפקודה gcloud iam service-accounts delete.

    פקודה:

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

    פלט:

    Deleted service account SA_NAME@PROJECT_ID.s3ns.iam.gserviceaccount.com

C++

במאמר ספריות הלקוח של IAM מוסבר איך להתקין את ספריית הלקוח ולהשתמש בה ב-IAM. למידע נוסף, קראו את מאמרי העזרה של ‎IAM C++ API‎.

כדי לבצע אימות ב-IAM, צריך להגדיר את Application Default Credentials. מידע נוסף מופיע במאמר לפני שמתחילים.

לפני שמריצים דוגמאות קוד, צריך להגדיר את משתנה הסביבה GOOGLE_CLOUD_UNIVERSE_DOMAIN לערך s3nsapis.fr.

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#

במאמר ספריות הלקוח של IAM מוסבר איך להתקין את ספריית הלקוח ולהשתמש בה ב-IAM. למידע נוסף, קראו את מאמרי העזרה של ‎IAM C# API‎.

כדי לבצע אימות ב-IAM, צריך להגדיר את Application Default Credentials. מידע נוסף מופיע במאמר לפני שמתחילים.

לפני שמריצים דוגמאות קוד, צריך להגדיר את משתנה הסביבה GOOGLE_CLOUD_UNIVERSE_DOMAIN לערך s3nsapis.fr.


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

במאמר ספריות הלקוח של IAM מוסבר איך להתקין את ספריית הלקוח ולהשתמש בה ב-IAM. למידע נוסף, קראו את מאמרי העזרה של ‎IAM Go API‎.

כדי לבצע אימות ב-IAM, צריך להגדיר את Application Default Credentials. מידע נוסף מופיע במאמר לפני שמתחילים.

לפני שמריצים דוגמאות קוד, צריך להגדיר את משתנה הסביבה GOOGLE_CLOUD_UNIVERSE_DOMAIN לערך s3nsapis.fr.

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

במאמר ספריות הלקוח של IAM מוסבר איך להתקין את ספריית הלקוח ולהשתמש בה ב-IAM. למידע נוסף, קראו את מאמרי העזרה של ‎IAM Java API‎.

כדי לבצע אימות ב-IAM, צריך להגדיר את Application Default Credentials. מידע נוסף מופיע במאמר לפני שמתחילים.

לפני שמריצים דוגמאות קוד, צריך להגדיר את משתנה הסביבה GOOGLE_CLOUD_UNIVERSE_DOMAIN לערך s3nsapis.fr.

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

במאמר ספריות הלקוח של IAM מוסבר איך להתקין את ספריית הלקוח ולהשתמש בה ב-IAM. למידע נוסף, קראו את מאמרי העזרה של ‎IAM Python API‎.

כדי לבצע אימות ב-IAM, צריך להגדיר את Application Default Credentials. מידע נוסף מופיע במאמר לפני שמתחילים.

לפני שמריצים דוגמאות קוד, צריך להגדיר את משתנה הסביבה GOOGLE_CLOUD_UNIVERSE_DOMAIN לערך s3nsapis.fr.

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

השיטה serviceAccounts.delete מוחקת חשבון שירות.

לפני שמשתמשים בנתוני הבקשה, צריך להחליף את הנתונים הבאים:

  • PROJECT_ID: מזהה הפרויקט ב- Cloud de Confiance . מזהי פרויקטים הם מחרוזות אלפאנומריות, כמו my-project.
  • SA_ID: המזהה של חשבון השירות. הוא יכול להיות כתובת האימייל של חשבון השירות בתבנית SA_NAME@PROJECT_ID.s3ns.iam.gserviceaccount.com, או המזהה המספרי שייחודי לחשבון השירות.

שיטת ה-HTTP וכתובת ה-URL:

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

כדי לשלוח את הבקשה צריך להרחיב אחת מהאפשרויות הבאות:

אם הביצוע יהיה תקין, גוף התגובה יהיה ריק.

ביטול מחיקה של חשבון שירות

במקרים מסוימים, אפשר להשתמש בפקודה undelete כדי לבטל מחיקה של חשבון שירות שנמחק. בדרך כלל אפשר לבטל מחיקה של חשבון שירות שנמחק אם הוא עומד בקריטריונים הבאים:

  • חשבון השירות נמחק לפני פחות מ-30 יום.

    אחרי 30 יום, מערכת IAM מסירה את חשבון השירות באופן סופי. Cloud de Confiance אי אפשר לשחזר את חשבון השירות אחרי שהוא הוסר באופן סופי, גם אם שולחים בקשת תמיכה.

  • לא קיים חשבון שירות באותו השם של חשבון השירות שנמחק.

    לדוגמה, נניח שמחקת בטעות את חשבון השירות my-service-account@project-id.s3ns.iam.gserviceaccount.com. עדיין יש צורך בחשבון שירות בשם הזה ולכן צריך ליצור חשבון שירות חדש באותו השם, my-service-account@project-id.s3ns.iam.gserviceaccount.com.

    חשבון השירות החדש לא יורש את ההרשאות של חשבון השירות שנמחק. למעשה, הוא חשבון נפרד לגמרי מחשבון השירות שנמחק. עם זאת, אי אפשר לבטל את המחיקה של חשבון השירות המקורי כי לחשבון השירות החדש יש שם דומה.

    כדי לטפל בבעיה, מוחקים את חשבון השירות החדש ולאחר מכן מנסים לבטל את המחיקה של חשבון השירות המקורי.

אם לא מצליחים לבטל את המחיקה של חשבון השירות, אפשר ליצור חשבון שירות חדש באותו שם, לבטל את כל התפקידים מחשבון השירות שנמחק ולהקצות תפקידים דומים לחשבון השירות החדש. לקבלת פרטים נוספים, אפשר לעיין במאמר כללי מדיניות עם חשבונות משתמשים שנמחקו.

איתור מזהה מספרי של חשבון שירות שנמחק

כשמבטלים מחיקה של חשבון שירות, צריך לציין את המזהה המספרי שלו. המזהה המספרי הוא מספר בן 21 ספרות, למשל 123456789012345678901, שמזהה באופן ייחודי את חשבון השירות. לדוגמה, אם מוחקים חשבון שירות ואז יוצרים חשבון שירות חדש באותו שם, לחשבון השירות המקורי ולחשבון השירות החדש יהיו מזהים מספריים שונים.

אם יודעים שקישור במדיניות הרשאה כולל את חשבון השירות שנמחק, אפשר לקבל את מדיניות ההרשאה ואז למצוא את המזהה המספרי במדיניות הזו. המזהה המספרי מצורף לשם של חשבון השירות שנמחק. לדוגמה, במדיניות ההרשאה הזו, המזהה המספרי של חשבון השירות שנמחק הוא 123456789012345678901:

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

מזהים מספריים מצורפים רק לשמות של חשבונות משתמשים שנמחקו.

לחלופין, תוכלו לחפש ביומני הביקורת שלכם את הפעולה DeleteServiceAccount שמחקה את חשבון השירות:

  1. נכנסים לדף Logs Explorer במסוף Cloud de Confiance .

    כניסה לדף Logs Explorer

  2. בעורך השאילתות, מזינים את השאילתה הבאה ומחליפים את SERVICE_ACCOUNT_EMAIL בכתובת האימייל של חשבון השירות (לדוגמה, my-service-account@project-id.s3ns.iam.gserviceaccount.com):

    resource.type="service_account"
    resource.labels.email_id="SERVICE_ACCOUNT_EMAIL"
    "DeleteServiceAccount"
    
  3. אם חשבון השירות נמחק לפני יותר משעה, לוחצים על schedule Last 1 hour, בוחרים פרק זמן ארוך יותר מהרשימה הנפתחת, ואז לוחצים על Apply.

  4. לוחצים על Run query. ב-Logs Explorer מוצגות פעולות DeleteServiceAccount שהשפיעו על חשבונות השירות בשם שצוין.

  5. מאתרים את המזהה המספרי של חשבון השירות שנמחק באחת מהדרכים הבאות:

    • אם תוצאות החיפוש כוללות רק פעולת DeleteServiceAccount אחת, מחפשים את המזהה המספרי בשדה Unique ID שבחלונית Log fields.

    • אם בתוצאות החיפוש מוצג יותר מיומן אחד, מבצעים את הפעולות הבאות:

      1. מאתרים את הרשומה הנכונה ביומן. לשם כך, לוחצים על חץ ההרחבה שליד הרשומה ביומן. בודקים את הפרטים של הרשומה ביומן וכך יודעים אם מוצגת בה הפעולה שרוצים לבטל. חוזרי על התהליך הזה עד שמוצאים את הרשומה הנכונה ביומן.

      2. מאתרים את המזהה המספרי של חשבון השירות ברשומת היומן הנכונה. לשם כך, מרחיבים את השדה protoPayload ברשומה ביומן ואז מחפשים את השדה resourceName.

      המזהה המספרי כולל את כל מה שמופיע אחרי serviceAccounts בשדה resourceName.

ביטול מחיקה של חשבון השירות לפי המזהה המספרי

אחרי שמוצאים את המזהה המספרי של חשבון השירות שנמחק, אפשר לנסות לבטל את המחיקה של חשבון השירות.

gcloud

  1. במסוף Cloud de Confiance , מפעילים את Cloud Shell.

    הפעלת Cloud Shell

    בחלק התחתון של Cloud de Confiance המסוף יתחיל סשן של Cloud Shell ותופיע הודעה של שורת הפקודה. Cloud Shell היא סביבת מעטפת שבה ה-CLI של Google Cloud מותקן ומוגדרים ערכים לפרויקט הקיים. הסשן יופעל תוך כמה שניות.

  2. כדי לבטל את המחיקה של חשבון שירות, מריצים את הפקודה gcloud beta iam service-accounts undelete.

    פקודה:

    gcloud beta iam service-accounts undelete ACCOUNT_ID

    פלט:

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

REST

השיטה serviceAccounts.undelete משחזרת חשבון שירות שנמחק.

לפני שמשתמשים בנתוני הבקשה, צריך להחליף את הנתונים הבאים:

  • PROJECT_ID: מזהה הפרויקט ב- Cloud de Confiance . מזהי פרויקטים הם מחרוזות אלפאנומריות, כמו my-project.
  • SA_NUMERIC_ID: המזהה המספרי הייחודי של חשבון השירות.

שיטת ה-HTTP וכתובת ה-URL:

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

כדי לשלוח את הבקשה צריך להרחיב אחת מהאפשרויות הבאות:

אם אפשר לבטל את מחיקת החשבון, יישלח אליך קוד תגובה מסוג 200 OK עם פרטים לגבי חשבון השירות ששוחזר, שייראה כך:

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

המאמרים הבאים