Zarządzaj naprzemiennymi kontaktami konta AWS za pomocą Terraform

9 lutego 2022

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:

  1. 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.
  2. 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.
  3. 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.
  4. Niestandardowa magistrala zdarzeń kieruje zdarzenie do reguły EventBridge, która wyzwala funkcję Lambda na delegowanym koncie administratora.
  5. 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:

Zarządzaj naprzemiennymi kontaktami konta AWS za pomocą Terraform

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:

  1. Zaloguj się na dowolne ze swoich kont członkowskich w swoich organizacjach AWS i przejdź do zarządzania kontem/konsoli rozliczeniowej.
  2. Powinieneś teraz zobaczyć, że alternatywne zabezpieczenia zostały pomyślnie skonfigurowane:

Zarządzaj naprzemiennymi kontaktami konta AWS za pomocą Terraform

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

 

Case Studies
Referencje

Firma Hostersi pozwoliła nam osadzić ogólne zagadnienia programu Well Architected Framework w kontekście naszej firmy. Oszczędziło nam to wiele czasu i pozwoliło znaleźć lepiej dopasowane rozwiązania do specyfiki naszego biznesu. WAF był świetnym katalizatorem do wprowadzenie szeregu zmian w obszarze niezawodności, szybkości i bezpieczeństwa edrone. 

Piotr Stachowicz
CTO
W skrócie o nas
Specjalizujemy się w dostarczaniu rozwiązań IT w obszarach projektowania infrastruktury serwerowej, wdrażania chmury obliczeniowej, opieki administracyjnej i bezpieczeństwa danych.