top of page

Śledź nasze wpisy w social media

  • Instagram
  • Facebook
  • Twitter
  • LinkedIn
  • YouTube
  • Zdjęcie autoraPiotr Kośka

Najlepsze praktyki w zakresie bezpieczeństwa Terraform

Terraform jest de facto narzędziem, niezależnym od dostawcy zasobów, a Twoja organizacja może pracować ze wszystkimi jednocześnie. Niekwestionowanym aspektem jest bezpieczeństwo Terraform, ponieważ każdy błąd w konfiguracji może mieć wpływ na całą infrastrukturę.



W tym artykule chcę wyjaśnić korzyści płynące z korzystania z Terraform i przedstawić wskazówki dotyczące korzystania z Terraform w bezpieczny sposób, odwołując się do niektórych najlepszych praktyk w zakresie bezpieczeństwa.


  • Audyt konfiguracji Terraform pod kątem luk w zabezpieczeniach i wdrażanie kontroli bezpieczeństwa.

  • Zarządzanie poświadczeniami dostępu w zabezpieczeniach Terraform.

  • Najlepsze praktyki bezpieczeństwa w korzystaniu z modułów Terraform.

  • DIY moduły Terraform.

Co to jest Terraform?


Terraform to narzędzie typu open source jako narzędzie do tworzenia kodu, które umożliwia bezpieczne i przewidywalne tworzenie, zmienianie i niszczenie infrastruktury (IaC). Pisałem o tym już we wcześniejszym artykule.


Aby zobaczyć prosty przykład, spójrzmy na kod - przykład z oficjalnej strony, który wdraża kontener nginx.

Zainicjować projekt za pomocą terraform init, udostępniając kontener serwera nginx za pomocą terraform apply i zniszczyć serwer sieciowy nginx za pomocą terraform destroy.


Terraform komunikując się z chmurą publiczną AWS, Azure, GCP czy DigitalOcean polega na kluczach dostępu i tajnych kluczach do uwierzytelniania od dostawców chmury. W tym przykładzie uwierzytelnianie nie było wymagane, ale większość dostawców wymaga poświadczeń w taki czy inny sposób. Przechowywanie poświadczeń w sposób niezabezpieczony może prowadzić do powstania luk w zabezpieczeniach, takich jak nieautoryzowany dostęp i naruszenia bezpieczeństwa danych. Jednym z miejsc, na które należy zwrócić uwagę, jest przechowywanie poświadczeń w plikach stanu Terraform.





Pliki stanu Terraform to pliki, których Terraform używa do śledzenia zasobów utworzonych w określonej infrastrukturze. Plik stanu jest zwykle przechowywane lokalnie na komputerze, na którym działa Terraform, chociaż można je również przechowywać zdalnie w zapleczu (backend), takim jak Terraform Cloud lub S3 (zalecany zdalny backend jak współpracujesz z zespołem lub dla zachowania dobrych praktyk).


Plik stanu zawiera migawkę infrastruktury w określonym momencie, w tym wszystkie zasoby utworzone lub zmodyfikowane przez Terraform. Obejmuje to szczegóły, takie jak identyfikatory zasobów, ich bieżący stan i wszelkie inne metadane, których Terraform potrzebuje do zarządzania zasobami.


Jeśli chcesz dowiedzieć się więcej o Terraform, zapoznaj się z moim kursem Terraform Podstawy. Zapraszam (wystarczy kliknąć w obrazek)




Audyt plików manifestu Terraform


Terraform używa pliku stanu do określania bieżącego stanu infrastruktury i planowania zmian w tej infrastrukturze. Kiedy wprowadzasz zmiany w konfiguracji Terraform i stosujesz te zmiany, Terraform porównuje nową konfigurację z istniejącym plikiem stanu i określa, jakie zmiany należy wprowadzić w infrastrukturze, aby dostosować ją do nowej konfiguracji.

Korzyści ze skanowania plików manifestu Terraform są znaczące, jeśli chodzi o wykrywanie i łagodzenie potencjalnych zagrożeń bezpieczeństwa w infrastrukturze chmurowej. Jeśli możesz zrobić tylko jedną rzecz, upewnij się, że dokładnie przeskanowałeś pliki Terraform. Ponieważ plik stanu jest ważny dla działania Terraform, ważne jest, aby obchodzić się z nim ostrożnie. Zawsze powinieneś wykonać kopię zapasową pliku stanu i upewnić się, że jest bezpiecznie przechowywany, zwłaszcza jeśli używasz zdalnego zaplecza. Należy również uważać, aby nie modyfikować pliku stanu ręcznie, ponieważ może to spowodować niespójności między plikiem stanu a rzeczywistą infrastrukturą.


W przypadku "SCARLETEEL" - skanowanie manifestów Terraform mogło pomóc w wykryciu ujawnionych kluczy dostępu i sekretów w zasobnikach S3. Dzięki wczesnemu wykryciu incydentów można było zapobiec lub przynajmniej go powstrzymać, zanim atakujący miał szansę uzyskać dostęp do drugiego konta AWS – jak przedstawiono na poniższym diagramie.



Identyfikacja informacji wrażliwych

Skanowanie plików Terraform może pomóc zidentyfikować wszelkie poufne informacje , takie jak klucze dostępu, sekrety, hasła lub tokeny, które mogą zostać przypadkowo ujawnione w plikach stanu. Jak widać w incydencie SCARLETEEL, osoby atakujące mogą wykorzystać te informacje do uzyskania nieautoryzowanego dostępu do infrastruktury chmury i przemieszczania się między organizacjami.


Błędne konfiguracje sieci

Tak jak konfigurujemy dostęp do naszej chmury, konfigurując VPC lub AWS Security Groups, też musimy wziąć pod uwagę poprawną konfigurację plików Terraform, aby maksymalnie zmniejszyć powierzchnię ataku ograniczając dostęp tam gdzie jest to możliwe do zaufanych adresów IP,, a porty nie potrzebne nie otwieramy.


Widoczność zmian w pliku stanu

Pliki manifestu Terraform zawierają historię zmian wprowadzonych w Twojej infrastrukturze, w tym informacje o utworzeniu, zaktualizowaniu lub zniszczeniu zasobów. Skanowanie plików stanu może pomóc w śledzeniu zmian, identyfikowaniu anomalii i szybkim reagowaniu na wszelkie incydenty związane z bezpieczeństwem.





Zgodność i zarządzanie

Skanowanie plików `.tf` może pomóc upewnić się, że infrastruktura chmury jest zgodna z wymaganiami prawnymi i zarządczymi, takimi jak PCI DSS , HIPAA lub SOC 2 . Wykrywając potencjalne zagrożenia bezpieczeństwa, możesz podejmować działania naprawcze i zapobiegać naruszeniom zgodności.


Wykrywanie luk w automatyzacji

Skanowanie plików Terraform można zautomatyzować, co pozwala wykrywać i ograniczać zagrożenia bezpieczeństwa w czasie rzeczywistym. Możesz zintegrować skanowanie z potokiem DevOps, co pozwala wykryć luki w zabezpieczeniach na wczesnym etapie cyklu programowania i uniemożliwić im dotarcie do środowiska produkcyjnego.


Ogólnie rzecz biorąc, skanowanie plików definicji Terraform jest podstawową praktyką bezpieczeństwa dla każdej organizacji używającej Terraform do zarządzania infrastrukturą chmurową. Może pomóc w identyfikacji i ograniczeniu potencjalnych zagrożeń dla bezpieczeństwa, zapewniając bezpieczeństwo i zgodność środowiska chmurowego.


Narzędzia do skanowania Terraform

Narzędzia do skanowania Terraform mogą pomóc w znalezieniu błędnych konfiguracji, problemów z bezpieczeństwem i luk w kodzie Terraform. Te narzędzia mają na celu pomóc użytkownikom w identyfikowaniu i rozwiązywaniu problemów przed ich wdrożeniem w środowiskach produkcyjnych. Oto kilka popularnych narzędzi do skanowania Terraform:


  • TerrascanTerrascan to narzędzie do analizy statycznej typu open source, które skanuje kod Terraform pod kątem problemów z bezpieczeństwem. Zapewnia użytkownikom funkcje polityki jako kodu i obsługuje wielu dostawców usług w chmurze.

  • CheckovCheckov to narzędzie typu open source, które skanuje kod Terraform pod kątem problemów z bezpieczeństwem i naruszeń najlepszych praktyk. Posiada obszerną bibliotekę wbudowanych zasad i jest wysoce konfigurowalny.

  • KICSKeeping Infrastructure as Code Secure (KICS) to narzędzie typu open source, które skanuje kod Terraform pod kątem problemów z bezpieczeństwem, naruszeń zgodności i błędnych konfiguracji infrastruktury. Obsługuje wielu dostawców chmury i jest wysoce konfigurowalny.

Na potrzeby tego bloga omówimy, w jaki sposób Terrascan jest używany do skanowania problemów związanych z bezpieczeństwem w Terraform. Zachęcam też do przetestowania innych narzędzi z wymienionej listy.


Oczywiście jak chcesz zobaczyc je w akcji zapraszam do kursu dostępnego na stronie Szkolenia Cloud


Terrascan wykorzystuje statyczną analizę kodu do skanowania kodu Terraform i konfiguracji pod kątem problemów z bezpieczeństwem i luk w zabezpieczeniach. Terrascan może być używany jako samodzielne narzędzie lub zintegrowany z potokiem CI/CD w celu automatycznego skanowania kodu Terraform w ramach procesu kompilacji. Teraz pokaże, w jaki sposób Terrascan jest używany do wyszukiwania luk w zabezpieczeniach.


Przykład z Terrascan


Zeskanuj swój kod Terraform za pomocą Terrascan. Po zainicjowaniu pliku konfiguracyjnego Terrascan możesz przeskanować kod Terraform pod kątem problemów z bezpieczeństwem za pomocą polecenia terrascan scan.

Przejrzyj wyniki skanowania Terrascan. Po zakończeniu skanowania Terrascan powinien wyświetlić listę wszelkich problemów z bezpieczeństwem wykrytych w kodzie Terraform. Każdy problem będzie zawierał opis problemu, lokalizację w kodzie Terraform, w której wykryto problem, oraz ocenę istotności. Oto przykład wyniku skanowania Terrascan:

W tym przykładzie Terrascan wykrył poważny problem bezpieczeństwa w pliku main.tf kodu Terraform. Problem jest związany z zakodowanymi na stałe sekretami w konfiguracjach Terraform, co może stanowić poważne zagrożenie bezpieczeństwa.

Korzystanie z narzędzi do skanowania Terraform może pomóc poprawić bezpieczeństwo, identyfikując potencjalne problemy i luki w zabezpieczeniach, zanim zostaną one wdrożone w środowiskach produkcyjnych. Może to pomóc w zapobieganiu naruszeniom bezpieczeństwa i zapewnieniu, że infrastruktura jest skonfigurowana w bezpieczny i zgodny sposób. Ponadto narzędzia te mogą pomóc w egzekwowaniu zasad bezpieczeństwa i najlepszych praktyk w organizacjach oraz zmniejszać ryzyko błędu ludzkiego. Poniżej przykład uruchomienia wymienionych wyżej narzędzi na tym samym kodzie:


Narzedzie tflint
Narzedzie tflint

Narzedzie tfsec
Narzedzie tfsec

Narzędzie terrascan
Narzędzie terrascan

Narzedzie checkov
Narzedzie checkov

Jak można zauważyć różne narzędzia zwracają różne wyniki, więc czasami warto stosować więcej niż jedno narządzie w szczególności kiedy mamy różne chmury, lub dobrać takie które działa najlepiej z naszą chmurą.


Zarządzanie poświadczeniami dostępu w Terraform Security


Terraform umożliwia łatwą konfigurację zasobów w chmurze, ale wymaga uwierzytelnienia u dostawców usług w chmurze. Sposób zarządzania tymi poświadczeniami ma kluczowe znaczenie dla bezpieczeństwa Twojej infrastruktury. Jedną z najlepszych praktyk jest używanie bezpiecznego systemu zarządzania poświadczeniami do przechowywania poświadczeń.


Istotne jest, aby unikać przechowywania poświadczeń w postaci zwykłego tekstu ani zapisywania ich na stałe w kodzie Terraform.





Nie przechowuj sekretów w stanie Terraform


Pliki stanu Terraform nie powinny zawierać żadnych tajemnic, takich jak hasła czy klucze API . Zamiast tego użyj zmiennych wejściowych Terraform lub zewnętrznych źródeł danych, aby przekazać poufne informacje do modułu. Pomoże to zapewnić, że twoje sekrety nie zostaną ujawnione w pliku stanu. Na przykład tutaj jest plik stanu Terraform, który nie zawiera żadnych tajemnic:


Plik definiuje pojedynczą instancję AWS EC2 i używa typu zasobu aws_instance do jej utworzenia. Blok dostawcy określa region AWS, który ma być używany, a blok wyjściowy definiuje zmienną wyjściową , która wyświetla publiczny adres IP instancji.

Gdyby wymagana była jakakolwiek poufna informacja, taka jak klucz dostępu AWS lub klucz tajny, byłaby przekazywana do modułu za pomocą zmiennych wejściowych lub zewnętrznych źródeł danych, zamiast być przechowywana w pliku stanu.


Nie przechowuj tajemnic w postaci zwykłego tekstu


Nigdy nie przechowuj tajemnic w postaci zwykłego tekstu w swoich manifestach Terraform .


Jak wspomnieliśmy wcześniej, możesz użyć zmiennych środowiskowych lub zmiennych wejściowych, aby przekazać sekrety do modułu Terraform. Oto na przykład skrypt, który używa zmiennych środowiskowych do przekazywania tajemnic do Terraform:


Zamiast przechowywać db_password w postaci zwykłego tekstu w manifeście Terraform, możemy przekazać je jako zmienną środowiskową, gdy uruchamiamy polecenie Terraform:


Po przekazaniu zmiennej środowiskowej możemy po prostu uruchomić skrypt Terraform - terraform apply


Zmienna db_password zostanie wypełniona wartością zmiennej środowiskowej TF_VAR_db_password , która jest przekazywana do zasobu aws_db_instance. Hasło nie będzie przechowywane w postaci zwykłego tekstu w manifeście Terraform, dzięki czemu będzie bezpieczniejsze. Alternatywnie moglibyśmy użyć zmiennych wejściowych do przekazania sekretów do modułu Terraform. Oto przykład wykorzystania zmiennych wejściowych do przekazywania sekretów do modułu Terraform:


Następnie możemy przekazać zmienną db_password do modułu Terraform, gdy uruchamiamy polecenie terraform apply. terraform apply -var "db_password=supersecret"


Takie podejście pozwala nam przekazywać sekrety do modułu Terraform bez przechowywania ich w postaci zwykłego tekstu w manifeście Terraform.


Lepszym podejściem jest użycie bezpiecznego systemu zarządzania danymi uwierzytelniającymi, takiego jak HashiCorp Vault lub AWS Secrets Manager . Narzędzia te oferują bezpieczny sposób przechowywania poufnych informacji i zarządzania nimi, zapewniając kontrolę dostępu, szyfrowanie i dzienniki audytu. Najlepszym miejscem do rozpoczęcia jest utworzenie Hashicorp Vault Secrets Engine .


Powyższy kod tworzy montowanie silnika sekretów KV i ogólny klucz tajny, który przechowuje poświadczenia AWS.


Zastąp var.aws_access_key i var.aws_secret_key odpowiednimi zmiennymi środowiskowymi lub użyj innej metody bezpiecznego przekazania tych wartości do Terraform. Po skonfigurowaniu mechanizmu sekretów możemy bezpiecznie pobrać dane uwierzytelniające AWS z Hashicorp Vault za pomocą poniższych zasad:


Powyższy kod pobiera poświadczenia AWS z HashiCorp Vault i ustawia je jako konfigurację dostawcy dla dostawcy „ aws ” skonfigurowanego w pierwszym skrypcie. Teraz możesz używać Terraform do konfigurowania zasobów AWS bez kodowania na stałe lub przechowywania poświadczeń AWS w postaci zwykłego tekstu. To jest tylko przykładowy skrypt. Powinieneś go zmodyfikować w oparciu o swoje specyficzne wymagania i używany system zarządzania poświadczeniami. Ponadto należy skonfigurować kontrolę dostępu i dzienniki inspekcji dla systemu zarządzania poświadczeniami, aby zapewnić ochronę i monitorowanie tajemnic.


Często wymieniaj poświadczenia


Po wdrożeniu bezpiecznego systemu zarządzania danymi uwierzytelniającymi kluczowa jest częsta rotacja kluczy .


Rotacja kluczy oznacza okresowe generowanie nowych kluczy dostępu i unieważnianie starych. Ta praktyka gwarantuje, że jeśli jeden z twoich kluczy zostanie naruszony, nie będzie ważny.


Możesz ponownie użyć narzędzi takich jak Hashicorp Vault lub AWS Secrets Manager, aby zautomatyzować proces rotacji kluczy. Zautomatyzowanie tego procesu może pomóc uniknąć błędów ludzkich, które są jedną z głównych przyczyn naruszeń bezpieczeństwa. Ponieważ pracowaliśmy już z Hashicorp Vault, utworzymy następujący przykład zasad Vault , który powinien zapewnić częstą rotację naszych kluczy Terraform w celu utrzymania bezpieczeństwa systemu.


Ta polityka zawiera trzy oświadczenia, które zapewniają minimalne wymagane uprawnienia do zarządzania kluczami Terraform:


  1. Pierwsza instrukcja umożliwia użytkownikom odczytywanie, tworzenie, aktualizowanie, usuwanie i wyświetlanie wpisów tajnych w ścieżce secret/data/terraform/* . Ta ścieżka powinna zawierać klucze używane przez Terraform do uzyskiwania dostępu do innych zasobów. Parametr max_versions ogranicza liczbę wersji klucza, które mogą być przechowywane, podczas gdy parametr force zapewnia wygenerowanie nowego klucza, nawet jeśli maksymalna liczba wersji została już osiągnięta.

  2. Druga instrukcja umożliwia użytkownikom odnawianie dzierżawy tajemnic. Jest to ważne dla zapewnienia częstej rotacji klawiszy.

  3. Trzecia instrukcja umożliwia użytkownikom odwołanie dzierżawy tajemnic. Jest to przydatne, jeśli klucz jest zagrożony i musi zostać natychmiast odwołany.

to tylko przykładowe zasady; należy go zmodyfikować w oparciu o określone wymagania i zasoby, którymi zarządzasz w Terraform. Ponadto należy skonfigurować Vault do automatycznej rotacji kluczy na podstawie zasad bezpieczeństwa organizacji.


Zasady dostępu do najniższych uprawnień


Wreszcie, podczas konfigurowania infrastruktury Terraform kluczowe znaczenie ma wdrożenie zasady najmniejszych uprawnień .





Zasada najmniejszych uprawnień oznacza, że ​​należy przyznać minimalny poziom dostępu wymagany do prawidłowego działania określonego zasobu. Takie podejście minimalizuje potencjalne szkody, które osoba atakująca może wyrządzić, jeśli uzyska dostęp do Twojej infrastruktury.


Dzięki Terraform możesz wdrożyć zasady dostępu z najniższymi uprawnieniami, definiując odpowiednie role, zasady i uprawnienia IAM, redukując błędne konfiguracje IAM . Możesz także użyć modułów Terraform, które zostały zaprojektowane z myślą o najlepszych praktykach w zakresie bezpieczeństwa. Na przykład poniższa zasada zapewnia dostęp z najniższymi uprawnieniami do zasobów Terraform dla określonego użytkownika lub grupy.

Powyższa polityka zawiera trzy stwierdzenia, które zapewniają minimalne niezbędne uprawnienia do zarządzania zasobami Terraform:


  1. Pierwsza instrukcja umożliwia określonemu użytkownikowi lub grupie wykonanie działań terraform:plan , terraform:apply i terraform:destroy na zasobach w określonym obszarze roboczym Terraform. Musisz zastąpić <twój-terraform-workspace> nazwami zasobów Amazon (ARN) swojego obszaru roboczego Terraform.

  2. Druga instrukcja umożliwia określonemu użytkownikowi lub grupie wykonanie akcji terraform:state-push i terraform:state-pull na określonym zasobniku stanu Terraform. Ponownie musisz zastąpić <your-terraform-state-bucket> ARN swojego zasobnika stanu Terraform.

  3. Trzecia instrukcja umożliwia określonemu użytkownikowi lub grupie wykonanie akcji terraform:state-list na wszystkich zasobach w określonym obszarze roboczym Terraform. Jak zawsze, pamiętaj, aby zastąpić <twój-terraform-workspace> ARN swojego obszaru roboczego Terraform. to tylko przykładowe zasady; powinieneś zmodyfikować ARN, aby pasowały do ​​​​konkretnego środowiska i przypadku użycia. Ponadto powinieneś przejrzeć i dostosować zasady w oparciu o swoje specyficzne wymagania i zasoby, którymi zarządzasz w Terraform.


Korzystanie z modułów Terraform


Moduły Terraform to skuteczny sposób organizowania i ponownego wykorzystywania kodu infrastruktury. Jednak, podobnie jak w przypadku każdego kodu, moduły mogą stanowić zagrożenie dla bezpieczeństwa łańcucha dostaw, jeśli nie są właściwie używane. W tej sekcji omówimy bezpieczeństwo Terraform z niektórymi najlepszymi praktykami korzystania z modułów Terraform w celu zapewnienia bezpiecznej infrastruktury jako kodu.


Nie ufaj im ślepo; dokładnie sprawdź tworzoną infrastrukturę, grupy bezpieczeństwa itp. i zawsze najpierw „planuj”.


Moduły Terraform mogą zaoszczędzić wiele czasu i wysiłku, ale nie należy im ślepo ufać. Zawsze przeglądaj kod i plan przed zastosowaniem jakichkolwiek zmian w infrastrukturze. Obejmuje to skanowanie Terraform w poszukiwaniu błędnej konfiguracji lub luk w zabezpieczeniach oraz przeglądanie grup zabezpieczeń i innych tworzonych zasobów, aby upewnić się, że spełniają one Twoje wymagania dotyczące bezpieczeństwa.


Użyj polecenia „ plan ” programu Terraform, aby przejrzeć zmiany przed ich zastosowaniem.


Polecenie „ plan” służy do generowania planu wykonania, który pokazuje, co zrobi Terraform po zastosowaniu Twojej konfiguracji. Dzięki temu możesz przejrzeć zmiany i upewnić się, że spełniają one Twoje oczekiwania, zanim faktycznie je zastosujesz. Najprostszym poleceniem do wygenerowania planu jest:


terraform plan

Więcej o samym terraform znajdziesz w kursie dostępnym na Szkolenia Cloud


Terraform przeanalizuje Twoje pliki konfiguracyjne i wygeneruje plan, co zrobi, gdy zastosujesz zmiany. Dane wyjściowe będą wyglądać mniej więcej tak:


W każdym przypadku przejrzyj dane wyjściowe, aby upewnić się, że zmiany są zgodne z oczekiwaniami. W tym przykładzie Terraform utworzy nową grupę zabezpieczeń i nową instancję EC2 oraz zniszczy istniejącą instancję EC2. Jeśli jesteś zadowolony z planu, możesz zastosować zmiany za pomocą polecenia Apply:


terraform apply


Przeglądając plan przed zastosowaniem zmian, możesz wykryć wszelkie nieoczekiwane zmiany lub błędy i uniknąć potencjalnych problemów z infrastrukturą. Jak wspomnieliśmy na początku tej sekcji, nie ufaj ślepo infrastrukturze. Plany zapewniają, że możemy zastosować dokładne specyfikacje bezpieczeństwa.


Aktualizuj moduły


Moduły powinny być na bieżąco aktualizowane o najnowsze poprawki bezpieczeństwa i najlepsze praktyki.


Zawsze sprawdzaj dostępność aktualizacji i stosuj je w razie potrzeby. Pomoże to zapewnić, że Twoja infrastruktura jest bezpieczna i aktualna zgodnie z najnowszymi standardami bezpieczeństwa. Chociaż w Terraform nie ma wbudowanych poleceń służących do aktualizowania modułów o najnowsze poprawki zabezpieczeń i najlepsze praktyki Terraform, istnieją jednak narzędzia innych firm, które mogą pomóc w zarządzaniu modułami i kontroli wersji.


Jednym z takich narzędzi jest własny oficjalny rejestr modułów Terraform, który jest wyselekcjonowanym zbiorem gotowych modułów dla typowych potrzeb infrastrukturalnych. Moduły w rejestrze są utrzymywane przez społeczność Terraform i są regularnie aktualizowane, aby zapewnić aktualność z najnowszymi poprawkami bezpieczeństwa i najlepszymi praktykami.


Aby użyć modułu z rejestru, możesz dołączyć jego źródłowy adres URL do pliku konfiguracyjnego Terraform. Na przykład:


Aby zaktualizować moduł do najnowszej wersji dostępnej w rejestrze, możesz użyć polecenia terraform get z flagą -update :


terraform get -update

Powyższe polecenie „terraform get -update” zaktualizuje wszystkie moduły w konfiguracji Terraform do najnowszych wersji dostępnych w rejestrze. Oprócz rejestru modułów dostępne są również narzędzia innych firm, takie jak Terraform Cloud i Atlantis , które zapewniają bardziej zaawansowane funkcje zarządzania modułami i kontroli wersji, takie jak:


  • Automatyczne aktualizacje

  • Blokowanie wersji

  • Narzędzia współpracy

Narzędzia te mogą pomóc w aktualizowaniu modułów i zapewnieniu, że infrastruktura jest bezpieczna i zgodna z najnowszymi standardami bezpieczeństwa.


Nie przechowuj pliku stanu lokalnie; zapisz go w postaci zaszyfrowanej w innym miejscu, które można później pobrać


Pliki stanu Terraform zawierają poufne informacje o Twojej infrastrukturze, takie jak identyfikatory zasobów i klucze tajne. Nie przechowuj ich lokalnie ani publicznie w systemach kontroli wersji. Zamiast tego zapisz je w bezpiecznym miejscu, które można później wyciągnąć w razie potrzeby. Należy również zaszyfrować plik stanu, aby zabezpieczyć go przed nieautoryzowanym dostępem. Na przykład stworzyliśmy poniższy skrypt Terraform, który wykorzystuje zdalne przechowywanie stanu w zasobniku S3, aby uniknąć przechowywania tych plików stanu lokalnie lub w systemie kontroli wersji:

W tym przykładzie blok terraform na początku pliku określa, że ​​plik stanu powinien być przechowywany w zasobniku S3 o nazwie my-terraform-state-bucket z kluczem my-terraform-state.tfstate .


  • Parametr region określa region AWS, w którym znajduje się zasobnik S3.

  • Parametr dynamodb_table określa nazwę tabeli DynamoDB używanej do blokowania.

  • Parametr encrypt mówi Terraformowi, aby zaszyfrował plik stanu przed zapisaniem go w S3.

  • Blok zasobów aws_instance określa zasoby infrastruktury do utworzenia, ale nie zawiera żadnych poufnych informacji.

Gdy uruchomisz terraform apply , Terraform utworzy zasoby i zapisze plik stanu w zasobniku S3.


Po uruchomieniu kolejnych poleceń terraform Terraform użyje pliku stanu zdalnego w zasobniku S3 zamiast pliku lokalnego.


Przechowując plik stanu w bezpiecznej lokalizacji, takiej jak zasobnik S3, możesz mieć pewność, że nie będzie on przechowywany lokalnie ani w systemach kontroli wersji. Szyfrując plik stanu, możesz chronić go przed nieautoryzowanym dostępem.


Nie modyfikuj stanu Terraform ręcznie


Ręczne modyfikacje pliku stanu Terraform mogą powodować problemy i wprowadzać zagrożenia bezpieczeństwa.


Zawsze używaj poleceń Terraform do zarządzania plikiem stanu. Jeśli musisz wprowadzić zmiany w pliku stanu, użyj polecenia import Terraform, aby zaimportować zasoby do stanu. Zapewni to, że plik stanu pozostanie spójny z rzeczywistą infrastrukturą.


Załóżmy, że masz instancję EC2 działającą na AWS i chcesz zacząć nią zarządzać przez Terraform. Najpierw musisz utworzyć nowy plik konfiguracyjny Terraform opisujący istniejący zasób. Oto prosty przykład:

Następnie możesz uruchomić polecenie terraform import, a następnie typ zasobu, unikalny identyfikator zasobu i nazwę zasobu w pliku konfiguracyjnym Terraform.


terraform import aws_instance.example i-0123456789abcdefg


W powyższym przykładzie i-0123456789abcdefg to unikalny identyfikator instancji EC2 w AWS, a aws_instance.example to nazwa zasobu w pliku konfiguracyjnym Terraform. Po uruchomieniu polecenia terraform import Terraform utworzy teraz nowy plik stanu i zaimportuje do niego istniejące zasoby. Następnie użylibyśmy normalnych poleceń Terraform, takich jak terraform plan i terraform apply , aby zarządzać zasobami w przyszłości.


Jeśli chcesz dowiedzieć się więcej o bezpieczeństwie EC2, nie zapomnij sprawdzić Zabezpieczanie SSH na EC2 i Jak zabezpieczyć Amazon EC2 w dokumentacji AWS.


Tworzenie modułów Terraform


Moduły Terraform zapewniają sposób organizowania i ponownego wykorzystywania kodu infrastruktury. Podczas tworzenia modułów Terraform ważne jest, aby postępować zgodnie z najlepszymi praktykami bezpieczeństwa Terraform, aby zapewnić bezpieczną infrastrukturę jako kod. W tej sekcji omówimy kilka najlepszych praktyk tworzenia modułów Terraform.


Użyj git do przechowywania manifestów Terraform


Przechowuj manifesty Terraform w systemach kontroli wersji, takich jak Git. Ułatwia to śledzenie zmian, cofanie zmian i współpracę z innymi osobami. Zawsze używaj kontroli wersji dla swoich modułów Terraform, aby mieć pewność, że zmiany są śledzone i możliwe do audytu.





Zainicjujmy Git w naszym bieżącym katalogu, aby zrozumieć, jak przechowywać manifesty Terraform:


git init

Musisz utworzyć nowy plik konfiguracyjny Terraform, taki jak main.tf, i dodać do niego trochę zasobów. Następnie możesz dodać plik do Git i zatwierdzić zmiany:


git add main.tfgit commit -m "Initial commit"

Wprowadź zmiany w pliku konfiguracyjnym Terraform, dodaj je i zatwierdź w Git:


git add main.tfgit commit -m "Added new resource"

Jeśli chcesz wrócić do poprzedniej wersji pliku konfiguracyjnego Terraform, możesz użyć Git, aby sprawdzić poprzednie zatwierdzenie:


git checkout HEAD~1 main.tf

To polecenie sprawdzi wersję pliku main.tf z poprzedniego zatwierdzenia. Możesz także używać Git do współpracy z innymi osobami nad projektem Terraform. Na przykład możesz przekazać swoje zmiany do zdalnego repozytorium Git, które inni mogą klonować i nad którym mogą pracować:


git remote add origin <remote-repository-url>git push -u origin master

Korzystając z Gita, możesz:


Śledź zmiany w swoich manifestach Terraform , na przykład kto zmienił określony zasób lub kiedy ostatnio coś zostało zmodyfikowane.

Cofnij zmiany w przypadku awarii możesz wrócić do poprzedniej znanej działającej wersji.

Łatwiej współpracuj z innymi za pomocą pull requestów w celu omówienia zmian.


Podpisywanie Terraforma


Podpisywanie Terraform byłoby fajną funkcją, która pozwala użytkownikom podpisywać swoje manifesty Terraform za pomocą klucza prywatnego.


To znacznie poprawiłoby bezpieczeństwo Terraform, ponieważ mogłoby pomóc użytkownikom upewnić się, że ich manifesty Terraform nie zostały naruszone. Niestety Terraform nie ma wbudowanej funkcji podpisywania manifestów Terraform kluczem prywatnym. Możesz jednak użyć zewnętrznych narzędzi, takich jak GPG lub narzędzie do podpisywania wtyczek Hashicorp , aby podpisać manifesty Terraform i zweryfikować ich integralność. Oto na przykład skrypt, który może podpisywać manifesty Terraform za pomocą GPG i weryfikować ich integralność:

Jak zawsze, będziesz musiał wykonać powyższy skrypt i podpisać manifest Terraform za pomocą GPG przy użyciu klucza prywatnego, zweryfikować integralność podpisanego manifestu i wyodrębnić podpisany manifest do dalszego wykorzystania.


Podpisując swoje manifesty Terraform za pomocą GPG i weryfikując ich integralność, możesz upewnić się, że Twoje manifesty Terraform nie zostały naruszone i że są takie same, jak w momencie ich pierwotnego podpisania. Pomaga to poprawić bezpieczeństwo kodu infrastruktury i zmniejszyć ryzyko nieautoryzowanych zmian.


Zautomatyzuj cały proces


Zautomatyzuj cały proces tworzenia, testowania i wdrażania modułów Terraform. Użyj narzędzi takich jak GitLab CI/CD lub Jenkins, aby zautomatyzować ten proces, ułatwiając zarządzanie kodem infrastruktury i zapewniając jej bezpieczeństwo.


Na przykład w dużej firmie świadczącej usługi finansowe zespół ds. infrastruktury dysponował wieloma modułami Terraform, które służyły do ​​zarządzania infrastrukturą chmurową. Napotkali jednak wyzwania związane z ręcznym zarządzaniem i wdrażaniem tych modułów, co prowadziło do błędów i niespójności.


Aby temu zaradzić, zespół zdecydował się na wdrożenie GitLab CI/CD w celu zautomatyzowania procesu tworzenia, testowania i wdrażania modułów Terraform. Oto przykład struktury potoku GitLab CI/CD:

W tym przykładzie potok składa się z trzech etapów: kompilacja, testowanie i wdrażanie.


Na etapie kompilacji kod Terraform jest kompilowany i pakowany, a następnie generowany jest plan. Na etapie testów przeprowadzane są zautomatyzowane testy kodu Terraform, w tym walidacja kodu, poprawne formatowanie i zastosowanie planu w środowisku testowym.

Wreszcie, na etapie wdrażania, kod Terraform jest stosowany w środowisku docelowym, zapewniając, że infrastruktura jest skonfigurowana zgodnie z kodem. Z punktu widzenia bezpieczeństwa, automatyzując proces tworzenia, testowania i wdrażania modułów Terraform za pomocą GitLab CI/CD, możesz poprawić bezpieczeństwo kodu swojej infrastruktury i zmniejszyć ryzyko nieautoryzowanych zmian.


Nie nadużywaj danych wyjściowych


Nie nadużywaj zmiennych wyjściowych do przechowywania poufnych informacji, takich jak Sekrety.


Użyj narzędzia do zarządzania sekretami, takiego jak Vault lub AWS Secrets Manager, aby przechowywać poufne informacje. W poniższym skrypcie użyjemy Hashicorp Vault do przechowywania i pobierania sekretów do wykorzystania w Terraform:

W takim przypadku możesz użyć zasobu vault_generic_secret do przechowywania swoich kluczy tajnych w Vault, a następnie pobrać te klucze tajne za pomocą źródła danych data.vault_generic_secret i użyć ich w naszym kodzie Terraform.


Używając narzędzia do zarządzania tajemnicami, takiego jak Hashicorp Vault lub AWS Secrets Manager do przechowywania poufnych informacji, można łatwo uniknąć konieczności przechowywania tajemnic w zmiennych wyjściowych lub innych częściach naszego kodu Terraform, zmniejszając w ten sposób ryzyko nieautoryzowanego dostępu lub ujawnienia tych wrażliwe dane uwierzytelniające/tajne.

Zamierzamy użyć metody zapobiegania-zniszczenia, aby zapobiec przypadkowemu usunięciu zasobu „nigel_instance” . Ustawienie parametru Prevent_destroy na true spowoduję, że Terraform zapobiegnie usunięciu zasobu za pomocą polecenia terraform destroy lub internetowego interfejsu użytkownika Terraform. Stosując zapobieganie zniszczeniu, podkreślamy krytyczność tego środowiska laboratoryjnego/przejściowego, ale także zapewniamy, że nawet jeśli nie jest to środowisko produkcyjne, powinno pozostać stabilne i spójne. Dlatego zmniejszamy ryzyko przypadkowego usunięcia przez współpracownika, które w przeciwnym razie doprowadziłoby do potencjalnego przestoju.


Podczas korzystania z Terraform do tworzenia infrastruktury kluczowe jest zapewnienie bezpieczeństwa infrastruktury.


Wniosek


Terraform to potężne narzędzie, które udostępnia infrastrukturę jako kod, ale podczas korzystania z niego kluczowe znaczenie ma nadanie priorytetu bezpieczeństwu.


Postępując zgodnie z najlepszymi praktykami bezpieczeństwa Terraform, które przedstawiliśmy w tym przewodniku, możesz zminimalizować ryzyko naruszenia bezpieczeństwa i zapewnić bezpieczeństwo swojej infrastruktury. Podsumowując:


Skanuj pliki Terraform, aby wykryć błędne konfiguracje lub luki w zabezpieczeniach.

Korzystaj z bezpiecznego systemu zarządzania danymi uwierzytelniającymi i nigdy nie przechowuj tajemnic w plikach Terraform.

Implementuj zasady dostępu z najmniejszymi uprawnieniami.

Zastosuj te same praktyki bezpieczeństwa do dostawców usług w chmurze.

Niezależnie od tego, czy jesteś inżynierem DevOps, analitykiem zabezpieczeń czy architektem chmury, te wytyczne ułatwiają zarządzanie infrastrukturą chmurową i zabezpieczanie jej.


Ostatnie posty

Zobacz wszystkie

Śledź nasze wpisy w social media

  • Instagram
  • Facebook
  • Twitter
  • LinkedIn
  • YouTube

Poznaj terraform jedno z najepszych narzedzi do zarządzania infrastrukturą w kodzie (IaC) - w kursie tym przeprowadzam Cię przez proces instalacji i konfiguracji tego narzędzia.

bottom of page