Terraform Security
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
HashiCorp Terraformは、インフラストラクチャをコードとして管理するツールであり、クラウドおよびオンプレミスのリソースを人間が読みやすい設定ファイルで定義でき、これをバージョン管理、再利用、共有できます。これにより、インフラストラクチャのライフサイクル全体を通じて、一貫したワークフローを使用してすべてのインフラストラクチャをプロビジョニングおよび管理できます。Terraformは、コンピュート、ストレージ、ネットワークリソースなどの低レベルコンポーネントだけでなく、DNSエントリやSaaS機能などの高レベルコンポーネントも管理できます。
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をインストールするだけです。
ここにガイドがあり、ここにterraformをダウンロードする最良の方法があります。
Terraformは、ウェブページやネットワークサービスを公開するプラットフォームを持っていないため、terraformを妥協する唯一の方法は、terraform設定ファイルを追加/変更できることです。
しかし、terraformは非常に敏感なコンポーネントであり、適切に機能するために特権アクセスを持つ必要があります。
攻撃者がterraformが実行されているシステムを妥協する主な方法は、terraform設定を保存しているリポジトリを妥協することです。なぜなら、ある時点でそれらは解釈されるからです。
実際、PRが作成された後にterraform plan/applyを自動的に実行するソリューションが存在します。たとえば、Atlantisがあります:
Atlantis Securityterraformファイルを妥協できる場合、誰かがterraform plan
またはterraform apply
を実行したときにRCEを実行するさまざまな方法があります。
Terraform planは、Terraformで最も使用されるコマンドであり、Terraformを使用する開発者やソリューションは常に呼び出します。したがって、RCEを取得する最も簡単な方法は、任意のコマンドをterraform plan
で実行するようにterraform設定ファイルを汚染することです。
外部プロバイダーを使用する
Terraformは、Terraformと外部プログラムの間のインターフェースを提供するexternal
プロバイダーを提供しています。plan
中に任意のコードを実行するためにexternal
データソースを使用できます。
terraform設定ファイルに次のようなものを注入すると、terraform plan
を実行したときにリバースシェルが実行されます:
カスタムプロバイダーの使用
攻撃者は、Terraform Registryにカスタムプロバイダーを送信し、その後、機能ブランチのTerraformコードに追加することができます(こちらの例):
プロバイダーはinit
でダウンロードされ、plan
が実行されるときに悪意のあるコードが実行されます。
例はhttps://github.com/rung/terraform-provider-cmdexecで見つけることができます。
外部参照を使用する
前述の2つのオプションは便利ですが、あまりステルス性がありません(2つ目はよりステルス性がありますが、1つ目よりも複雑です)。この攻撃をよりステルスな方法で実行することもできます。以下の提案に従ってください:
terraformファイルにrev shellを直接追加する代わりに、rev shellを含む外部リソースをロードすることができます:
あなたは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ファイルをlocal-execを注入してRCEを取得するために悪用することもできます。
main.tf
ファイルに次のようなペイロードが含まれていることを確認するだけです:
前の技術からの提案に従って、この攻撃を外部参照を使用してよりステルス的に実行します。
terraform apply
を実行することでterraformによって使用されるシークレット値をダンプするには、terraformファイルに次のようなものを追加します:
terraformステートファイルに書き込みアクセスがあるが、terraformコードを変更できない場合、この研究はファイルを利用するための興味深いオプションを提供します。
リソースを削除する方法は2つあります:
実際のリソースを削除するために、ランダムな名前のリソースをステートファイルに挿入する
terraformはそのリソースが存在すべきではないと判断し、それを削除します(指定された実際のリソースIDに従って)。前のページの例:
更新できない方法で削除するリソースを変更する(そうすれば削除され再作成される)
EC2インスタンスの場合、インスタンスのタイプを変更するだけでterraformが削除して再作成します。
カスタムプロバイダーを作成することも可能で、terraformステートファイル内のプロバイダーの1つを悪意のあるものに置き換えるか、悪意のあるプロバイダーを持つ空のリソースを追加することができます。元の研究からの例:
hashicorp/external
がブラックリストに登録されている状況に遭遇した場合、次の手順で external
プロバイダーを再実装できます。注意: https://registry.terraform.io/providers/nazarewk/external/latest に公開された external プロバイダーのフォークを使用しています。自分自身のフォークや再実装を公開することもできます。
その後、通常通り external
を使用できます。
tfsec: tfsecは、あなたのterraformコードの静的解析を使用して、潜在的な誤設定を特定します。
terascan: Terrascanは、Infrastructure as Codeのための静的コードアナライザーです。
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)