Zarządzaj naprzemiennymi kontaktami konta AWS za pomocą Terraform
Zarządzanie rozliczeniami AWS, powiadomieniami zespołu wsparcia i serwisu oraz potencjalnymi zdarzeniami związanymi z bezpieczeństwem ma kluczowe znaczenie dla klientów, aby zapewnić bezpieczeństwo, optymalizację kosztów i monitorowanie operacyjne wdrożeń AWS.
Kontakty naprzemienne pozwalają nam kontaktować się z inną osobą w sprawie problemów z Twoim kontem we właściwym czasie, nawet jeśli jesteś niedostępny. AWS wyśle Ci powiadomienia operacyjne, takie jak dostępność usługi, do kolejnego kontaktu operacyjnego i ważne powiadomienia e-mail związane z bezpieczeństwem, zarówno do głównego właściciela konta, jak i do zastępczej osoby kontaktowej ds. bezpieczeństwa (jeśli została podana) na Twoim koncie AWS.
Terraform to oprogramowanie typu open source używane przez klientów do udostępniania i zarządzania infrastrukturą i usługami w chmurze AWS. Terraform pozwala programistom i architektom infrastruktury budować skalowalną i zarządzalną infrastrukturę jako kod.
W poprzednim artykule na blogu opisano, w jaki sposób możesz programowo zarządzać zastępczymi kontaktami na kontach członkowskich w organizacjach AWS za pomocą interfejsu wiersza poleceń AWS (CLI) w AWS CloudShell. W tym artykule autorzy przedstawią, jak możesz zautomatyzować konfigurację i zarządzanie naprzemiennymi kontaktami na wszystkich kontach członkowskich w organizacjach AWS przy użyciu modułu Terraform Infrastructure-as-code. Korzystając z tego rozwiązania, możesz otrzymywać ważne powiadomienia dotyczące zabezpieczeń, rozliczeń i operacji, zarządzając naprzemiennymi kontaktami w całej organizacji na wszystkich swoich kontach, w tym na nowych kontach, które udostępniasz w swojej organizacji.
Warunki wstępne
Aby wykonać czynności opisane w tym artykule, wykonaj następujące kroki:
1. Pobierz i skonfiguruj Terraform.Możesz zobaczyć te instrukcje, aby rozpocząć korzystanie z Terraform w AWS.
2. Upewnij się, że Twoje środowisko Terraform może przejąć administracyjną rolę uprawnień do wdrażania zasobów opisanych w tym poście na kontach zarządzania i delegowanych administratorów.Zapoznaj się z następną sekcją, aby uzyskać listę zasobów utworzonych przez Terraform.Zapoznaj się z dokumentacją Terraform, jak używać AssumeRole do udostępniania zasobów AWS na różnych kontach.
Oto przykładowe zasady Terraform AssumeRole umożliwiające dostęp do konta AWS:
provider "aws" {
region = “us-east-1”
assume_role {
role_arn = "”
}
}
3. Na swoim koncie zarządzania włącz usługę zarządzania kontem AWS dla swojej organizacji, aby móc centralnie zarządzać kolejnymi kontaktami.Zrób to za pomocą interfejsu AWS CLI lub CloudShell.
aws organizations enable-aws-service-access --service-principal account.amazonaws.com
4. Zarejestruj delegowanego administratora, aby użytkownicy nie potrzebowali dostępu do konta zarządzania do zarządzania naprzemiennymi kontaktami.Upewnij się, że w poniższym fragmencie kodu zastąpiłeś identyfikatorem konta delegowanego administratora.
aws organizations register-delegated-administrator --account-id --service-principal account.amazonaws.com
Wystarczy wykonać kroki 3 i 4 tylko raz przez cały cykl trwania konta AWS. Możesz użyć AWS CLI lub zasobu Terraform.
Omówienie rozwiązania
Rozwiązanie wykorzystuje bezserwerową i sterowaną zdarzeniami architekturę składającą się z ról Amazon EventBridge, AWS Lambda, AWS Identity and Access Management, dostawcy AWS Terraform i AWS Organizations.
Poniższe kroki opisują przepływ pracy rozwiązania omówionego w tym artykule:
- Na wyznaczonym koncie administratora moduł Terraform implementuje niestandardową magistralę zdarzeń Amazon EventBridge, regułę EventBridge, role IAM i funkcję AWS Lambda, aby programowo skonfigurować alternatywny kontakt.
- Na koncie zarządzania moduł Terraform implementuje rolę IAM i regułę EventBridge dołączoną do domyślnej szyny zdarzeń. Reguła składa się z wyzwalacza zdarzenia dla wielu kont, który wywołuje funkcję Lambda na delegowanym koncie, gdy nowe konto jest dodawane do organizacji AWS.
- Po dodaniu nowego konta do AWS Organizations domyślna magistrala zdarzeń na koncie Management odbiera zdarzenie CreateAccountResult API w AWS CloudTrail, aby potwierdzić zdarzenie utworzenia konta. Następnie kieruje zdarzenie do lokalnej reguły EventBridge i przekazuje zdarzenie do niestandardowej magistrali zdarzeń na delegowanym koncie administratora przy użyciu magistrali zdarzeń dla wielu kont.
- Niestandardowa magistrala zdarzeń kieruje zdarzenie do reguły EventBridge, która wyzwala funkcję Lambda na delegowanym koncie administratora.
- Funkcja pobiera listę rachunków członkowskich i konfiguruje alternatywny kontakt na każdym rachunku.
Uwaga: naprzemienne kontakty dla konta zarządzania można modyfikować tylko przy użyciu kontekstu autonomicznego, a nie kontekstu organizacji. Funkcja Lambda nie konfiguruje alternatywnego kontaktu na koncie zarządzającym.
Poniższy diagram architektury ilustruje rozwiązanie omówione w tym artykule:
Domyślnie ten moduł terraform tworzy pakiet wdrożeniowy i używa go do tworzenia lub aktualizowania funkcji lub warstwy Lambda na delegowanym koncie administratora.
Kod źródłowy tego bloga można pobrać z tego repozytorium GitHub.
Przegląd
W tej sekcji autorzy wyróżnili metodę wdrażania przykładowych alternatywnych kontaktów AWS dotyczących zabezpieczeń, rozliczeń i operacji przy użyciu pliku definicji zmiennej Terraform (.tfvars). Metodę wdrażania można dostosować, korzystając z alternatywnych metod, takich jak potoki CI/CD, dostosowania dla AWS Control Tower itp., zgodnie z potrzebami organizacji. Repozytorium GitHub składa się z modułu root - skryptu Terraform main.tf, który implementuje dwa moduły podrzędne dedykowane_konto i konto_zarządzania odpowiednio w delegowanych kontach administratora i kontach zarządzania.
Etapy wdrożenia
1. Sprawdź, czy profil AWS CLI jest skonfigurowany w terminalu, a środowisko Terraform może przejąć rolę administracyjną na koncie delegowanym i koncie zarządzania.
2. Sklonuj alternatywne repozytorium kontaktów:
git clone https://github.com/aws-samples/aws-account-alternate-contact-with-terraform
3. Przejdź do pobranego katalogu:
$ cd aws-account-alternate-contact-with-terraform
4. Otwórz plik provider.tf i zaktualizuj go przy użyciu konfiguracji dostawcy Terraform. Możesz zdefiniować swoje profile AWS CLI lub wprowadzić swoje ARN role IAM przyjmij rolę dla kont zarządzania i kont delegowanych. Zobacz konfigurację dostawcy Terraform, aby uzyskać informacje na temat używania dostawców do interakcji z systemami zdalnymi.
provider "aws" {
region = var.region
alias = "delegated_account"
assume_role {
role_arn = "arn:aws:iam:::role/"
}
}
provider "aws" {
region = var.region
alias = "mgmt_account"
assume_role {
role_arn = "arn:aws:iam:::role/"
}
}
5. Teraz utworzysz plik o nazwie terraform.tfvars, aby zdefiniować argumenty zmiennych:
$ touch terraform.tfvars
6. Otwórz plik terraform.tfvars w edytorze tekstu i wklej następujący plik konfiguracyjny Terraform.Zmodyfikuj plik za pomocą parametrów zmiennych i zapisz plik.
region = "us-east-1"
management_account_id = ""
security_alternate_contact = CONTACT_TYPE=SECURITY; EMAIL_ADDRESS=john@example.com; CONTACT_NAME=John Bob; PHONE_NUMBER=1234567890; CONTACT_TITLE=Risk Manager
billing_alternate_contact = CONTACT_TYPE=BILLING; EMAIL_ADDRESS=alice@example.com; CONTACT_NAME=Alice Doe; PHONE_NUMBER=1234567890; CONTACT_TITLE=Finance Manager
operations_alternate_contact = CONTACT_TYPE=OPERATIONS; EMAIL_ADDRESS=bob@example.com; CONTACT_NAME=Bob Smith; PHONE_NUMBER=1234567890; CONTACT_TITLE=Operations Manager
invoke_lambda = true
tags = {
Project = "AWS-Alternate-Contact"
Environment = "Dev"
}
Wymagane są następujące zmienne:
- region: Domowy region AWS Twojego konta zarządzania AWS Organizations.
- management_account_id: Identyfikator Twojego konta AWS Organizations Management.
- security_alternate_contact: alternatywne dane kontaktowe dotyczące zabezpieczeń.Uwaga: prawidłowa wartość CONTACT_TYPE to SECURITY.
- billing_alternate_contact: alternatywne dane kontaktowe do rozliczeń.Uwaga: prawidłowa wartość CONTACT_TYPE to BILLING.
- operation_alternate_contact: alternatywne dane kontaktowe operacji.Uwaga: prawidłowa wartość CONTACT_TYPE to OPERACJE.
- invoke_lambda: Kontroluje czy ma zostać wywołana funkcja Lambda (prawda czy fałsz).
- tags: Mapa tagów do przypisania do zasobu.
Uwaga: Moduł główny musi być wdrożony w tym samym regionie na kontach zarządzania i wyznaczonych kont administratorów, ponieważ EventBridge jest regionalną usługą AWS. Jest to automatycznie obsługiwane przez skrypt i należy podać tylko jeden argument dla zmiennej regionu. Możesz sprawić, by moduł Terraform wywoływał funkcję Lambda, ustawiając zmienną invoke_lambda jako true przed uruchomieniem terraform apply.
Moduł wykorzystuje niektóre domyślne parametry, takie jak nazwa magistrali zdarzeń, grupa logów CloudWatch i nazwa funkcji Lambda, aby uprościć implementację opisaną w tym poście. Te parametry domyślne można modyfikować, modyfikując plik variable.tf w katalogach modułów podrzędnych.
7. Zmodyfikuj plik main.tf za pomocą edytora tekstu i zaktualizuj parametr zmiennej źródłowej.Jeśli wdrażasz skrypt Terraform z folderu lokalnego, źródłem powinien być katalog lokalny.
Na przykład:
module "delegated_admin_account" {
source = "./modules/delegated_account"
module "management_account" {
source = "./modules/management_account"
Argument źródłowy w bloku modułu informuje Terraform, gdzie znaleźć kod źródłowy żądanego modułu podrzędnego. Typowe źródła to rejestr Terraform, ścieżki lokalne, zasobniki Amazon Simple Storage Service (S3) i wiele innych. Aby uzyskać dodatkowe informacje, zapoznaj się z dokumentacją dotyczącą źródeł modułów Terraform.
8. Po dodaniu skryptu z konfiguracją zmiennej możesz zainicjować katalog.Inicjalizacja katalogu konfiguracyjnego pobiera i instaluje dostawcę AWS, który jest zdefiniowany w konfiguracji:
$ terraform init
Powinieneś zobaczyć komunikat „Terraform został pomyślnie zainicjowany!” oraz wersję zainstalowanego dostawcy.
9. Powinieneś sformatować i zweryfikować swoją konfigurację.Polecenie terraform fmt automatycznie aktualizuje konfiguracje w bieżącym katalogu w celu zapewnienia czytelności i spójności.Możesz również upewnić się, że konfiguracja jest poprawna składniowo i spójna, używając polecenia terraform validate:
$ terraform fmt
$ terraform validate
Powinieneś teraz zobaczyć komunikat o powodzeniu, który potwierdza, że konfiguracja szablonu jest prawidłowa.
Success! The configuration is valid.
10. Teraz zastosujesz konfigurację do utworzenia infrastruktury:
$ terraform apply
Przed zastosowaniem jakichkolwiek zmian w konfiguracji Terraform drukuje plan wykonania, aby opisać działania, które Terraform podejmie w celu zaktualizowania infrastruktury.
Po wyświetleniu musisz wpisać „tak”, aby potwierdzić, że plan może zostać uruchomiony.
Plan: 13 to add, 0 to change, 0 to destroy.
Changes to Outputs:
+ delegated_account_event_bus = (known after apply)
+ delegated_account_event_rule = (known after apply)
+ delegated_account_lambda_function = (known after apply)
+ management_account_event_bus_role = (known after apply)
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes
Po pomyślnym wdrożeniu zobaczysz dane wyjściowe Terraform podobne do następujących komunikatów:
Apply complete! Resources: 13 added, 0 changed, 0 destroyed.
Outputs:
delegated_account_event_bus = "arn:aws:events:us-east-1::event-bus/aws-alternate-contact"
delegated_account_event_rule = "arn:aws:events:us-east-1::rule/aws-alternate-contact/aws-alternate-contact-rule"
delegated_account_lambda_function = "arn:aws:lambda:us-east-1::function:aws-alternate-contact"
management_account_event_bus_role = "arn:aws:iam:::role/aws-eventbridge-alternate-contact-role"
Gratulacje! Wdrożyłeś alternatywny kontakt bezpieczeństwa przy użyciu Terraform.
Monitoruj naprzemienną konfigurację kontaktu bezpieczeństwa
Aby potwierdzić, że alternatywny kontakt bezpieczeństwa został wdrożony, możesz wykonać następujące kroki:
- Zaloguj się na dowolne ze swoich kont członkowskich w swoich organizacjach AWS i przejdź do zarządzania kontem/konsoli rozliczeniowej.
- Powinieneś teraz zobaczyć, że alternatywne zabezpieczenia zostały pomyślnie skonfigurowane:
Sprzątanie
Aby uniknąć ponoszenia przyszłych opłat i cofnąć wdrożenie, uruchom następujące polecenie terraform:
$ terraform destroy
Uruchomienie „terraform destroy” całkowicie usunie cały kod, a przyszłe konta nie otrzymają kolejnych informacji kontaktowych. Przed zniszczeniem wszystkich zarządzanych zasobów terraform drukuje plan wykonania, aby opisać działania, które Terraform podejmie w celu zaktualizowania infrastruktury. Po wyświetleniu monitu wpisz „tak”, aby potwierdzić, że plan może zostać uruchomiony:
Do you really want to destroy all resources?
Terraform will destroy all your managed infrastructure, as shown above.
There is no undo. Only 'yes' will be accepted to confirm.
Enter a value: yes
Po usunięciu zasobów zobaczysz dane wyjściowe Terraform podobne do następującego komunikatu:
Destroy complete! Resources: 13 destroyed.
Wnioski
W tym artykule przedstawiono, jak zaimplementować naprzemienne kontakty konta AWS na dużą skalę przy użyciu Terraform. Używając infrastruktury jako kodu, możesz programowo ustawić kolejne kontakty na wszystkich swoich kontach, w tym na nowych kontach, które tworzysz lub dodajesz do swojej organizacji. Przykład użyty w tym poście przedstawia konfigurację naprzemiennych kontaktów w zakresie zabezpieczeń, rozliczeń i operacji. Należy upewnić się, że podstawowe i kolejne dane kontaktowe konta w organizacji są skonfigurowane dla właścicieli obciążenia i wszelkich dodatkowych zespołów, które muszą otrzymywać powiadomienia o rozliczeniach, operacjach i zabezpieczeniach.
Aby dowiedzieć się więcej o alternatywnych kontaktach konta AWS, zapoznaj się z dokumentacją AWS.
źródło: AWS