Terraform Security
基本情報
HashiCorp Terraformは、人間が読み取れる構成ファイルでクラウドとオンプレミスリソースの両方を定義できるインフラストラクチャコードツールです。これらの構成ファイルをバージョン管理し、再利用し、共有できます。その後、一貫したワークフローを使用して、ライフサイクル全体でインフラストラクチャをプロビジョニングおよび管理できます。Terraformは、コンピューティング、ストレージ、ネットワーキングリソースなどの低レベルコンポーネントだけでなく、DNSエントリやSaaS機能などの高レベルコンポーネントも管理できます。
Terraformの動作原理
Terraformは、クラウドプラットフォームや他のサービス上のリソースを、それらのアプリケーションプログラミングインターフェース(API)を介して作成および管理します。プロバイダーは、Terraformがアクセス可能なAPIを持つほとんどのプラットフォームやサービスと連携できるようにします。
HashiCorpとTerraformコミュニティは、1700以上のプロバイダーをすでに作成しており、さまざまな種類のリソースやサービスを管理できます。この数は増加し続けています。Amazon Web Services(AWS)、Azure、Google Cloud Platform(GCP)、Kubernetes、Helm、GitHub、Splunk、DataDogなど、すべての公開プロバイダーはTerraform Registryで見つけることができます。
Terraformの主要なワークフローは次の3つのステージで構成されています:
記述: 複数のクラウドプロバイダーやサービスにまたがるリソースを定義します。たとえば、セキュリティグループとロードバランサーを備えた仮想マシン上にアプリケーションを展開する構成を作成することができます。
計画: Terraformは、既存のインフラストラクチャと構成に基づいて、作成、更新、または破棄するインフラストラクチャを記述した実行計画を作成します。
適用: 承認されると、Terraformは提案された操作を正しい順序で実行し、リソースの依存関係を尊重します。たとえば、VPCのプロパティを更新し、そのVPC内の仮想マシンの数を変更した場合、Terraformは仮想マシンのスケーリング前にVPCを再作成します。
Terraformラボ
コンピュータにTerraformをインストールしてください。
こちらにガイドがあります。また、こちらにTerraformをダウンロードする最良の方法があります。
TerraformでのRCE
Terraformにはウェブページやネットワークサービスを公開するプラットフォームがないため、terraformを侵害する唯一の方法は、terraform構成ファイルを追加/変更できることです。
ただし、terraformは非常に敏感なコンポーネントであり、適切に機能するためには特権アクセスが必要です。
攻撃者がterraformが実行されているシステムを侵害できる主な方法は、terraform構成を格納するリポジトリを侵害することです。なぜなら、ある時点でそれらが解釈されるからです。
実際、PRが作成された後にterraform plan/applyを自動的に実行するというソリューションがあります。たとえば、Atlantis:
Atlantis Securityterraformファイルを侵害できる場合、terraform plan
またはterraform apply
が実行されたときにRCEを実行するさまざまな方法があります。
Terraform plan
Terraform planは、terraformで最も使用されるコマンドであり、開発者/terraformを使用するソリューションは常にこれを呼び出すため、terraform plan
で任意のコマンドを実行するterraform構成ファイルを毒入れするのが最も簡単なRCEの方法です。
外部プロバイダーの使用
Terraformは、Terraformと外部プログラムの間のインターフェースを提供するexternal
プロバイダーを提供します。external
データソースを使用して、plan
中に任意のコードを実行できます。
terraform planを実行するときにリバースシェルを実行するようにterraform構成ファイルに注入することで、次のようなことができます:
カスタムプロバイダの使用
攻撃者はTerraform Registryにカスタムプロバイダを送信し、それをフィーチャーブランチ内のTerraformコードに追加することができます(こちらの例から)。
プロバイダはinit
でダウンロードされ、plan
が実行されると悪意のあるコードが実行されます。
https://github.com/rung/terraform-provider-cmdexecに例があります。
外部リファレンスの使用
上記のオプションはどちらも有用ですが、あまりステルス性がありません(2番目のオプションはよりステルス性が高いが、最初のものよりも複雑です)。この攻撃をよりステルス性の高い方法で実行することができます。以下の提案に従ってください:
terraformファイルにrevシェルを直接追加する代わりに、revシェルを含む外部リソースを読み込むことができます。
rev shellコードは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 applyを実行してすべての変更を適用します。また、local-execを注入してRCEを取得するために悪意のあるTerraformファイルを悪用することもできます。
次のようなペイロードがmain.tf
ファイルに含まれることを確認するだけです:
前のテクニックからの提案に従って、外部参照を使用して、この攻撃をより慎重に実行します。
シークレットのダンプ
terraform apply
を実行してterraformで使用されるシークレット値をダンプすることができます。terraformファイルに次のようなものを追加します:
Terraform State Filesの悪用
Terraform State Filesに書き込みアクセス権があるが、Terraformコードを変更できない場合、この研究では、ファイルを悪用するいくつかの興味深いオプションが示されています:
リソースの削除
リソースを破壊する2つの方法があります:
実際のリソースを破壊するために、ステートファイルにランダムな名前のリソースを挿入する
Terraformはリソースが存在しないと判断するため、それを破壊します(指定された実際のリソースIDに従って)。前のページの例:
更新できないようにリソースを削除するようにリソースを変更する
EC2インスタンスの場合、インスタンスのタイプを変更するだけで、terraformが削除して再作成するようになります。
RCE
また、カスタムプロバイダーを作成し、terraformのステートファイル内のプロバイダーの1つを悪意のあるものに置き換えるか、悪意のあるプロバイダーを持つ空のリソースを追加することも可能です。元の研究からの例:
ブラックリストに登録されたプロバイダーの置き換え
hashicorp/external
がブラックリストに登録されている場合は、以下の手順に従って external
プロバイダーを再実装することができます。注意: https://registry.terraform.io/providers/nazarewk/external/latest で公開されている外部プロバイダーのフォークを使用しています。独自のフォークや再実装を公開することもできます。
その場合、通常通り external
を使用できます。
監査ツール
tfsec: tfsecは、Terraformコードの静的解析を使用して潜在的なミス構成を見つけます。
terascan: Terrascanは、インフラストラクチャコードの静的コードアナライザーです。
参考文献
Last updated