Zrozumienie kont usługowych
Kontekst
Konto usługowe to specjalny typ konta Google przeznaczony do reprezentowania użytkownika niebędącego człowiekiem, który musi się uwierzytelnić i uzyskać autoryzację dostępu do danych w interfejsach API Google.
Typowo konta usługowe są używane w takich scenariuszach, jak:
- Uruchamianie obciążeń na maszynach wirtualnych (VM).
- Uruchamianie obciążeń na stacjach roboczych w siedzibie firmy lub centrach danych, które korzystają z interfejsów API Google.
- Uruchamianie obciążeń, które nie są związane z cyklem życia ludzkiego użytkownika.
Twoja aplikacja przyjmuje tożsamość konta usługi w celu wywołania interfejsów API Google, dzięki czemu użytkownicy nie są bezpośrednio zaangażowani.
Zarządzanie kontami usług
Gdy zdecydujesz, że potrzebujesz konta usługi, możesz zadać sobie następujące pytania, aby zrozumieć, w jaki sposób zamierzasz korzystać z konta usługi:
- Do jakich zasobów może mieć dostęp konto usługi?
- Jakich uprawnień potrzebuje konto usługi?
- Gdzie kod, który przyjmuje tożsamość konta usługi, będzie się przechwytywał – w chmurze Google czy w siedzibie firmy?
Użyj następującego schematu blokowego, aby uzyskać odpowiedzi na powyższe pytania:
Zauważ, że konta usługi można traktować zarówno jako źródło, jak i tożsamość.
Myśląc o koncie usługi jako o tożsamości, można przyznać rolę do konta usługi, umożliwiając mu dostęp do zasobu (takiego jak projekt).
Myśląc o koncie usługi jako o zasobie, można przyznać role innym użytkownikom w celu uzyskania dostępu do tego konta usługi lub zarządzania nim.
Udzielanie dostępu do kont usług
Udzielanie dostępu do konta usługi w celu uzyskania dostępu do zasobu jest podobne do udzielania dostępu do dowolnej innej tożsamości. Na przykład, jeśli masz aplikację uruchomioną na silniku Compute Engine i chcesz, aby aplikacja miała dostęp tylko do tworzenia obiektów w magazynie Cloud Storage. Można utworzyć konto usługi dla tej aplikacji i przyznać jej rolę twórcy obiektów w pamięci masowej.Poniższy diagram ilustruje ten przykład:
Dowiedz się więcejNadawanie ról wszystkim typom członków, w tym kontom usługi.
Śledzenie kont usług
Z czasem, w miarę tworzenia coraz większej liczby kont usług, można stracić orientację, które konto usług jest używane w jakim celu.
Nazwa wyświetlana konta usług to dobry sposób na przechwytywanie dodatkowych informacji o koncie usług, takich jak cel konta usług lub osoba kontaktowa dla konta. W przypadku nowych kont usługowych można wypełnić nazwę wyświetlaną podczas tworzenia konta usługowego. W przypadku istniejących kont usługowych należy użyć metody serviceAccounts.update()
do modyfikacji nazwy wyświetlanej.
Identyfikacja nieużywanych kont usługowych
Nieużywane konta usługowe stwarzają niepotrzebne zagrożenie bezpieczeństwa, dlatego zalecamy wyłączenie nieużywanych kont usługowych, a następnie usunięcie kont usługowych, gdy użytkownik jest pewien, że już ich nie potrzebuje. Do identyfikacji nieużywanych kont usługowych można użyć następujących metod:
- Wgląd w konta usługowe informuje, które konta usługowe w projekcie nie uwierzytelniły się w ciągu ostatnich 90 dni.
- Metryki użytkowania kont usługowych umożliwiają sprawdzenie, kiedy konto usługowe było ostatnio używane.
Usuwanie i tworzenie kont usług
Możliwe jest usunięcie konta usługi, a następnie utworzenie nowego konta usługi o tej samej nazwie.
Gdy usuwasz konto usługi, jego powiązania ról nie są natychmiast usuwane. Zamiast tego wiązania ról wymieniają konto usługi z prefiksemdeleted:
. Przykład można znaleźć w temacie Zasady z usuniętymi członkami.
Jeśli utworzysz nowe konto usługi o tej samej nazwie co niedawno usunięte konto usługi, stare powiązania mogą nadal istnieć, ale nie będą miały zastosowania do nowego konta usługi, mimo że oba konta mają ten sam adres e-mail. Takie zachowanie występuje, ponieważ konta usługowe otrzymują unikalny identyfikator w ramach Zarządzania Tożsamością i Dostępem (IAM) podczas tworzenia. Wewnętrznie wszystkie przypisania ról są przyznawane przy użyciu tych identyfikatorów, a nie adresu e-mail konta usługowego. Dlatego wszelkie przypisania ról, które istniały dla usuniętego konta usługi, nie mają zastosowania do konta usługi informacyjnej, które używa tego samego adresu e-mail.
Podobnie, jeśli dołączysz konto usługi do zasobu, a następnie usuniesz konto usługi i utworzysz nowe konto usługi o tej samej nazwie, nowe konto usługi nie zostanie dołączone do zasobu.
Aby zapobiec temu nieoczekiwanemu zachowaniu, rozważ użycie nowej, unikatowej nazwy dla każdego konta usługi. Ponadto, jeśli przypadkowo usuniesz konto usługi, możesz spróbować cofnąć usunięcie konta usługi zamiast tworzyć nowe konto usługi.
Jeśli nie możesz cofnąć usunięcia oryginalnego konta usługi, a musisz utworzyć nowe konto usługi o tej samej nazwie i tych samych rolach, musisz nadać te role nowemu kontu usługi. Aby uzyskać szczegółowe informacje, zobaczPolityki z usuniętymi członkami.
Jeśli potrzebujesz również, aby nowe konto usługi było dołączone do tych samych zasobów co oryginalne konto usługi, wykonaj jedną z następujących czynności:
- W przypadku instancji Compute Engine możesz zmienić konto usługi dołączone do instancji, aby zastąpić oryginalne konto usługi nowym kontem usługi.
- W przypadku wszystkich innych zasobów musisz usunąć istniejący zasób, a następnie utworzyć nowy zasób tego samego typu i dołączyć nowe konto usługi.
Uprawnienia dla kont usług
Ta sekcja opisuje typowe scenariusze uprawnień przyznawanych kontom usług lub kontom użytkowników, które mają uprawnienia do podszywania się pod konta usług:
- Udzielanie minimalnych uprawnień kontom usług
- Uprawnienia kont usług dla typowych scenariuszy
Udzielanie minimalnych uprawnień kontom usług
Tak jak w przypadku wszystkich typów członków, powinieneś udzielić kontu usługi tylko minimalnego zestawu uprawnień wymaganych do osiągnięcia jego celu. Learn aboutgranting roles to all types of members,including service accounts.
When granting permissions to users to access a service account, keep in mindthat the user can access all the resources for which the service account haspermissions. Dlatego ważne jest, aby starannie skonfigurować uprawnienia kont usługowych, czyli ściśle określić, kto z zespołu może działać jako konto usługowe (lub podszywać się pod nie). Zachowaj szczególną ostrożność, pozwalając usersto podszywać się pod wysoko uprzywilejowane konta usług, takie jak konta usługCompute Engine i App Enginedefault.
Users with IAM roles to updatethe App Engine and Compute Engine instances (such asApp Engine Deployeror Compute Instance Admin) can effectively run code as the service accounts used to run these instances, and indirectly gain accessto all the resources for which the service accounts has access. Podobnie, dostęp SSH do instancji Compute Engine może również zapewnić możliwość wykonywania kodu jako ta instancja.
Uprawnienia kont usług dla wspólnych scenariuszy
Konta usług mogą być używane w wielu różnych scenariuszach, a każdy z nich wymaga pewnych uprawnień. W tej sekcji opisano typowe scenariusze i wymagane uprawnienia.
Dołączanie kont usług do zasobów
Jeśli chcesz rozpocząć długo trwające zadanie, które uwierzytelnia się jako konto usługi, musisz dołączyć konto usługi do zasobu, który będzie uruchamiał zadanie.
Uprawnienia:
- Uprawnienia do tworzenia zasobu
iam.serviceAccounts.actAs
Aby znaleźć role, które zawierają te uprawnienia, przeszukaj listę ról pod kątem uprawnień.
Istnieje kilka różnych zasobów Google Cloud, które mogą uruchamiać zadania długotrwałe jako konta usług. Niektóre przykłady tych zasobów obejmują:
- Compute Engine VMs
- App Engine apps
- Cloud Functions
Podczas tworzenia tych zasobów masz możliwość dołączenia konta usługi. To konto usługi działa jako tożsamość zasobu.
Aby utworzyć zasób i dołączyć konto usługi, potrzebujesz uprawnień do utworzenia tego zasobu i uprawnienia do podszywania się pod konto usługi, które zostanie dołączone do zasobu. Uprawnienie do podszywania się pod konto usługi jest zapewniane przez dowolną rolę, która zawiera uprawnienie iam.serviceAccounts.actAs
.
Po utworzeniu zasobu i dołączeniu do niego konta usługi można rozpocząć długo trwające zadanie na zasobie. Zadanie działa jako konto usługi, które jest dołączone do zasobu, i używa tego konta usługi do autoryzowania żądań do interfejsów API chmury Google.
Aby dowiedzieć się więcej o dołączaniu kont usług do zasobów, zobaczDołączanie konta usługi do zasobu.
Bezpośrednie podszywanie się pod konto usługi
Uprawnienia:
iam.serviceAccounts.getAccessToken
iam.serviceAccounts.signBlob
iam.serviceAccounts.signJwt
iam.serviceAccounts.implicitDelegation
Role:
-
roles/iam.serviceAccountTokenCreator
(Service Account Token Creator)
Po przyznaniu wymaganych uprawnień, użytkownik (lub usługa) może bezpośrednioimpersonalizować (lub stwierdzić) tożsamość konta usługi w kilku typowych scenariuszach.
Po pierwsze, użytkownik może uzyskać krótkoterminowe poświadczenia dla konta usługi używając uprawnieniaiam.serviceAccounts.getAccessToken
i wywołując metodęgenerateAccessToken()
. Używając poświadczeń krótkoterminowych, użytkownik może wydawać polecenia doGoogle Cloud i może uzyskać dostęp do wszystkich zasobów, do których konto usługi ma dostęp. Na przykład, ten przepływ umożliwia użytkownikowi użycie flagigcloud --impersonate-service-account
do podszywania się pod konto usługi bez konieczności użycia pobranego zewnętrznego klucza konta usługi.
Po drugie, użytkownik może uzyskać artefakty podpisane zarządzanym przez Google kluczem prywatnym konta usługi, używając uprawnienia iam.serviceAccounts.signBlob
i wywołując metodęsignBlob()
lubsignJwt()
. Klucz prywatny zarządzany przez Google jest zawsze przechowywany w depozycie i nigdy nie jest bezpośrednio ujawniany. signBlob()
pozwala na podpisywanie dowolnych ładunków (takich jak adresy URL podpisane przezCloud Storage), podczas gdy signJwt()
pozwala tylko na podpisywanie dobrze sformowanych JWT.
Wreszcie, użytkownik może podszywać się (lub twierdzić) pod konto usługi bez kiedykolwiek pobierania danych uwierzytelniających dla konta usługi. Jest to zaawansowany przypadek użycia i jest obsługiwany tylko dla dostępu programistycznego przy użyciu metodygenerateAccessToken()
. W scenariuszach z co najmniej 3 kontami usługowymi, mianowicie A, B i C: konto usługowe A może uzyskać token dostępu dla konta usługowego C, jeśli konto usługowe A ma przyznane uprawnienieiam.serviceAccounts.implicitDelegation
na B, a B ma przyznane uprawnienie iam.serviceAccounts.getAccessToken
na C.
Generowanie tokenów ID OpenID Connect (OIDC)
Pozwolenia:
iam.serviceAccounts.getOpenIdToken
Role:
-
roles/iam.serviceAccountTokenCreator
(Service Account Token Creator)
Użytkownik (lub usługa) może wygenerować token JWT zgodny z OpenID Connect (OIDC) podpisany przez dostawcę Google OIDC Provider (accounts.google.com), który reprezentujeidentyczność konta usługi przy użyciu iam.serviceAccounts.getOpenIdToken
permission.
Te tokeny nie są bezpośrednio akceptowane przez większość interfejsów API Google bez organizacji wdrażającej dodatkową federację tożsamości w celu przyznania dostępu doGoogle. Istnieje kilka wyjątków – na przykład Identity-Aware Proxy, który umożliwia oparty na OIDC dostęp do aplikacji uruchamianych przez użytkownika.
Generowanie zewnętrznych kluczy prywatnych
Uprawnienia:
iam.serviceAccountKeys.create
Role:
-
roles/editor
(Editor) -
roles/iam.serviceAccountAdmin
(Service Account Admin)
Użytkownik lub usługa może wygenerować zewnętrzny materiał klucza prywatnego (RSA), który można wykorzystać do uwierzytelnienia się bezpośrednio w Google jako konto usługi. Ten materiał klucza może być następnie używany z bibliotekami Application Default Credentials (ADC) lub z poleceniemgcloud auth activate-service-account
. Każda osoba, która uzyska dostęp do tego materiału klucza, będzie miała pełny dostęp do wszystkich zasobów, do których ma dostęp konto usługi. Takie materiały z kluczami prywatnymi powinny być traktowane z najwyższą troską i powinny być uważane za mniej bezpieczne, im dłużej istnieją. Dlatego rotacja materiału klucza prywatnego jest krytyczna dla utrzymania silnego bezpieczeństwa.
Zarządzanie kluczami kont usług
Istnieją dwa typy kluczy kont usług:
-
Klucze zarządzane przez Google Cloud. Te klucze są używane przez usługi Google Cloudservices, takie jak App Engine i Compute Engine. Nie można ich pobierać, są automatycznie rotowane i używane do podpisywania przez maksymalnie dwa tygodnie. Proces rotacji jest probabilistyczny; użycie nowego klucza będzie stopniowo wzrastać i spadać w czasie jego życia. Zalecamy buforowanie zestawu kluczy publicznych dla konta usługi przez co najwyżej 24 godziny, aby zapewnić stały dostęp do aktualnego zestawu kluczy.
-
Klucze zarządzane przez użytkownika. Te klucze są tworzone, pobierane i zarządzane przez użytkowników. Po usunięciu ich z konta usługi nie można używać ich do uwierzytelniania.
W przypadku kluczy zarządzanych przez użytkownika należy upewnić się, że istnieją procesy umożliwiające spełnienie wymagań w zakresie zarządzania kluczami, takich jak:
- Przechowywanie kluczy
- Dystrybucja kluczy
- Odwołanie kluczy
- Rotacja kluczy
- Ochrona kluczy przed nieautoryzowanymi użytkownikami
- Odzyskiwanie kluczy
Każdy, kto ma dostęp do ważnego klucza prywatnego dla konta usługi, będzie mógł uzyskać dostęp do zasobów za pośrednictwem tego konta usługi. Zauważ, że cykl życia klucza dostępu do konta usługi (i w ten sposób, dane, do których dostęp ma konto usługi) jest niezależny od cyklu życia użytkownika, który pobrał klucz.
Zawsze zniechęcaj programistów do sprawdzania kluczy w kodzie źródłowym lub pozostawiania ich w katalogu Downloads na ich stacji roboczej.
Aby zwiększyć bezpieczeństwo kluczy, postępuj zgodnie z poniższymi wskazówkami:
-
Użyj interfejsu API konta usługi IAM do automatycznej rotacji kluczy konta usługi. Możesz obrócić klucz poprzez utworzenie nowego klucza, przełączenie aplikacji do korzystania z nowego klucza i usunięcie starego klucza. Użyj metod
serviceAccount.keys.create()
iserviceAccount.keys.delete()
razem, aby zautomatyzować rotację. Klucze zarządzane przez Google Cloud są rotowane mniej więcej raz w tygodniu.- Użyj metody
serviceAccount.keys.list()
do audytowania kont usługowych i kluczy.
- Użyj metody
Używanie kont usługowych z Compute Engine
Instancje Compute Engine muszą działać jako konta usługowe, aby mieć dostęp do innych zasobów Google Cloud. Aby upewnić się, że instancje Compute Engine są bezpieczniejsze, należy rozważyć następujące kwestie:
-
Można tworzyć maszyny wirtualne w tym samym projekcie z różnymi kontami usług. Aby zmienić konto usługi dla maszyny wirtualnej po jej utworzeniu, użyj metody
instances.setServiceAccount
. -
Możesz nadać role IAM kontom usług, aby określić, do czego mogą mieć dostęp. W wielu przypadkach nie będziesz już musiał polegać na zakresach. Daje to przewagę możliwości modyfikowania uprawnień konta usługi maszyny wirtualnej bez ponownego tworzenia instancji.
-
Ponieważ instancje zależą od swoich kont usług, aby mieć dostęp do zasobówGoogle Cloud, unikaj usuwania kont usług, gdy są one nadal używane przez działające instancje. Jeśli usuniesz konta usług, instancje mogą zacząć nie wykonywać swoich operacji.
Najlepsze praktyki
-
Zdefiniuj, kto może działać jako konta usług. Użytkownicy, którzy są użytkownikami kontaService dla konta usługi, mogą pośrednio uzyskać dostęp do wszystkich zasobów, do których konto usługi ma dostęp. Dlatego należy zachować ostrożność podczas przyznawania użytkownikowi roli użytkownika konta usługi.
-
Przyznaj kontu usługi tylko minimalny zestaw uprawnień wymaganych do osiągnięcia celu. Dowiedz się o przyznawaniu ról wszystkim typom członków, w tym kontom usług.
-
Utwórz konta usług dla każdej usługi z uprawnieniami wymaganymi tylko dla tej usługi.
-
Użyj nazwy wyświetlanej konta usługi, aby śledzić konta usług. Podczas tworzenia konta usługi należy uzupełnić jego nazwę wyświetlaną o cel konta usługi.
-
Zdefiniuj konwencję nazewnictwa dla kont usług.
-
Wdrożenie procesów automatyzujących rotację kluczy kont usług zarządzanych przez użytkowników.
-
Wykorzystanie interfejsu API kont usługIAM w celu wdrożenia rotacji kluczy.
-
Audyt kont usług i kluczy za pomocą metody
serviceAccount.keys.list()
lub stronyLogs Viewer w konsoli. -
Nie usuwaj kont usług, które są używane przez działające instancje naApp Engine lub Compute Engine, chyba że chcesz, aby te aplikacje straciły dostęp do konta usługi.
Wypróbuj sam
Jeśli jesteś nowym użytkownikiem usługi Google Cloud, utwórz konto, aby sprawdzić, jak nasze produkty sprawdzają się w rzeczywistych scenariuszach. Nowi klienci otrzymują również 300 USD bezpłatnych kredytów na uruchamianie, testowanie i wdrażanie obciążeń roboczych.
Zacznij za darmo