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があります:
terraformファイルを妥協できる場合、誰かがterraform plan
またはterraform apply
を実行したときにRCEを実行するためのさまざまな方法があります。
Terraform planは、Terraformで最も使用されるコマンドであり、Terraformを使用する開発者やソリューションは常に呼び出します。したがって、RCEを取得する最も簡単な方法は、任意のコマンドをterraform plan
で実行するようにterraform設定ファイルを汚染することです。
外部プロバイダーを使用する
Terraformは、Terraformと外部プログラムとのインターフェースを提供するexternal
プロバイダーを提供しています。external
データソースを使用して、plan
中に任意のコードを実行できます。
terraform設定ファイルに次のようなものを注入すると、terraform plan
を実行したときにリバースシェルが実行されます:
カスタムプロバイダーの使用
攻撃者は、Terraform Registryにカスタムプロバイダーを送信し、その後、機能ブランチのTerraformコードに追加することができます(こちらの例から)。
プロバイダーは init
でダウンロードされ、plan
が実行されると悪意のあるコードが実行されます。
例は https://github.com/rung/terraform-provider-cmdexec で見つけることができます。
外部参照を使用する
前述の2つのオプションは便利ですが、あまりステルス性がありません(2つ目はよりステルス性がありますが、1つ目よりも複雑です)。この攻撃をよりステルスな方法で実行することもできます。以下の提案に従ってください:
terraformファイルにrev shellを直接追加する代わりに、rev shellを含む外部リソースをロードすることができます:
You can find the rev shell code in 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
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)