Sysdigでコンテナセキュリティをコードとして管理するためにTerraformを使用する

Image

このブログ記事では、Sysdig Terraformプロバイダーを使用して、インフラストラクチャのセキュリティ設定を管理・自動化する方法を学びます。Terraformプロバイダーとは本質的に、さまざまなAPIとやり取りし、HCL言語を用いてコードとして定義したインフラや設定を作成するために必要なロジックをすべて含む、Terraform向けのプラグインです。

このプロバイダーを使うことで、次のことが可能になります:

  • 設定をバージョン管理する: Sysdigの設定をGitリポジトリに保存して管理します。これにより、チームで変更を共同作業でき、更新内容のレビューや改訂履歴の追跡が可能になります。必要に応じて、以前のバージョンへ簡単にロールバックすることもできます。
  • 環境間の一貫性を確保する: Terraformを使用して、開発・ステージング・本番環境に設定を複製し、一貫性を確保してドリフトを防ぎます。複数環境を管理する場合でも、環境固有の変数を動的に渡すことで単一のproviderブロックを再利用でき、全体の設定を簡素化できます。
  • 反復作業を自動化する: アラート、ポリシー、その他の設定の作成を自動化して時間を節約します。
  • 統合されたワークフロー: 単一のツールでSysdig SecureとSysdig Monitorのリソースを両方管理します。たとえば、同じTerraform設定内でSysdig Secureのランタイムポリシーを作成し、Sysdig Monitorの監視アラートを設定できます。これにより複雑さが減り、ワークフロー効率が向上します。

Sysdig Terraformプロバイダーのインストール

開始するには、Terraform 0.13以上がインストールされていることを確認してください。Terraformが初めての場合は、次の内容でmain.tfファイルを作成し、terraform init.を使用してプロジェクトを初期化します。‍

terraform {
  required_providers {
    sysdig = {
      source = "sysdiglabs/sysdig"      version = ">=1.46.0"    }
  }
}

これにより環境がセットアップされ、Terraform Registryで提供されているプロバイダーがダウンロードされます。

Sysdigプロバイダーの設定

Sysdigプロバイダーは、Sysdig SecureとSysdig Monitorの両方に対するリソースおよびデータソースをサポートします。Sysdig Secureはランタイムセキュリティ、コンプライアンス、脆弱性管理に重点を置き、Sysdig Monitorは高度な監視、アラート、ダッシュボードで全メトリクスを分析する機能を提供します。

各サービスにはそれぞれ固有のAPIトークンエンドポイントが必要で、ユーザーは用途に応じて的を絞った設定で個別のユースケースに対応できます。

Secureの認証

provider "sysdig" {
  sysdig_secure_url      = "https://secure.sysdigv5.wpenginepowered.com"  sysdig_secure_api_token = "<your_secure_api_token>"}

Monitorの認証

provider "sysdig" {
  sysdig_monitor_url     = "https://app.sysdigcloud.com"  sysdig_monitor_api_token = "<your_monitor_api_token>"}

SecureとMonitorの統合認証

単一のproviderブロック内でSecureとMonitorの設定を組み合わせることもできます。このアプローチにより、SecureとMonitorの設定を一箇所で定義でき、管理が簡素化されます。また、extra_headersブロックを通じて追加のHTTPヘッダーを含められるため、プロキシのある環境もサポートします。

provider "sysdig" {
  sysdig_secure_url       = "https://secure.sysdigv5.wpenginepowered.com"  sysdig_secure_api_token = "<your_secure_api_token>"
  sysdig_monitor_url      = "https://app.sysdigcloud.com"  sysdig_monitor_api_token = "<your_monitor_api_token>"
  extra_headers = {
"Proxy-Authorization" = "Basic xxxxxxxxxxxxxxxx"  }
}

サポートされるリソースとデータソース

Sysdig Terraformプロバイダーは、Sysdig Platform、Sysdig Secure、Sysdig Monitor向けにさまざまなリソースとデータソースをサポートしています。以下は概要です:

Sysdig Platform(MonitorとSecureの両方)

  • ユーザーおよびアクセス管理: ユーザー、ロール、サービスアカウントを管理します(例: sysdig_usersysdig_custom_role)。
  • IPフィルタリング: プラットフォームへのアクセスに対するIP制限を設定します(例: sysdig_ip_filter)。

Sysdig Secure

  • ポリシー: ランタイムおよび脆弱性ポリシーを作成します(例: sysdig_secure_policy)。
  • コンプライアンス制御: ポスチャー制御を定義します(例: sysdig_secure_posture_control)。
  • ルール: Falco構文を使用してランタイムルールを実装します(例: sysdig_secure_rule)。
  • 通知チャネル: メール、Slack、その他の連携向けのアラートを設定します(例: sysdig_secure_notification_channel_slack)。
  • マクロとリスト: 複数のFalcoルール間でロジックを再利用します(例: sysdig_secure_macrosysdig_secure_list)。

Sysdig Monitor

  • アラート: メトリクス、PromQLクエリ、または異常行動から検出されたアノマリーによってトリガーされるアラートを作成します(例: sysdig_monitor_alert_metric)。
  • ダッシュボードとチーム: コードでダッシュボードとユーザーチームを管理し、表示設定をコードとして構成します(例: sysdig_monitor_dashboard)。
  • 通知チャネル: PagerDuty、webhook、メールなど、アラートの連携を設定します(例: sysdig_monitor_notification_channel_email)。

高度なユースケース

設定複製の自動化

組織では、開発、ステージング、本番など複数の環境を使用することがよくあります。Sysdig Terraformプロバイダーは、これらの環境間で設定を効率的に複製し、テストするのに役立ちます。たとえば:

  • カスタムFalcoルール: 本番に昇格する前にステージングでランタイム検知ルールをテストして検証し、障害やノイズを減らします。
  • コンプライアンスポリシー: Terraformを使用してRegoベースのポリシーを段階的に展開し、環境をまたいで改善・検証します。

Terraformはproviderブロックとstateファイルを使用して、各環境が一貫した設定でプロビジョニングされるようにし、ドリフトを回避します。宣言的モデルにより、望ましい最終状態を定義でき、Terraformがその状態に一致させるための下層の手順を処理します。これにより手作業のミスが減り、プロセスの効率が向上します。さらに、必要な状態はコードとして定義されるため、Gitのようなバージョン管理システムに保存して過去の変更を追跡し、新しい変更をレビューし、必要に応じてロールバックできます。

デバッグ

設定のトラブルシューティングやTerraform実行のデバッグのために、環境変数TF_LOG=DEBUGを設定して詳細ログを有効化できます。これによりAPI呼び出しやその他の詳細が表示され、問題の特定に役立ちます。

チュートリアル: ポリシーをコードとしてゼロから作成

それでは、Terraformとプロバイダーで環境を設定したい人の立場になってみましょう。まず、プロバイダー設定を含むmain.tfファイルの作成から始めます。

terraform {
  required_providers {
    sysdig = {
      source = "sysdiglabs/sysdig"      version = ">=1.46.0"    }
  }
}
provider "sysdig" {
  sysdig_secure_url      = "https://secure.sysdigv5.wpenginepowered.com"  sysdig_secure_api_token = "<your_secure_api_token>"}

terraform initを実行すると、次のメッセージが表示されます:

Initializing the backend...

Initializing provider plugins...
- Finding sysdiglabs/sysdig versions matching "1.46.0"...

- Installing sysdiglabs/sysdig v1.46.0...

- Installed sysdiglabs/sysdig v1.46.0 (signed by a HashiCorp partner, key ID 0A2458C5D4F39147)

Partner and community providers are signed by their developers.
If you'd like to know more about provider signing, you can read about it here:
https://www.terraform.io/docs/cli/plugins/signing.html
Terraform has created a lock file .terraform.lock.hcl to record the provider
selections it made above. Include this file in your version control repository
so that Terraform can guarantee to make the same selections by default when
you run "terraform init" in the future.
Terraform has been successfully initialized!

ポリシー

組織内のコンテナでターミナルシェルが実行されることを検知したいとします。このイベントは通常セキュリティリスクであり、本番コンテナでシェルが生成されることは、不正アクセス、設定ミス、またはコンテナ環境を悪用しようとする試みを示している可能性があります。

まずはポリシーの作成から始められます:

resource "sysdig_secure_custom_policy""terminal_shell_in_container" {
  depends_on = [sysdig_secure_rule_falco.terminal_shell_in_container]
  name = "Terminal shell in container"  description = "Detected a terminal shell being open within a container"  severity = 4  enabled = true
  actions {
    capture {
      name = "terminal-shell.scap"      seconds_before_event = 5      seconds_after_event = 10    }
  }
}

ポリシー全体を定義しましたが、ポリシーはルールの束に追加の振る舞いを付与したものにすぎません。この例では、イベント前後のすべてのsyscallをキャプチャしています。これ単体では何も検知しないため、ルール(または複数のルール)を与える必要があります。

ルール

Falcoルール構文に従い、TerraformでSysdig Secureにカスタムルールを作成できます。Falcoはシステムコールデータを活用して、不審なアクティビティを高精度に検知します。このケースでは、コンテナ内でターミナルシェルが開かれることを検知するカスタムルールを作成します。現時点で構文を理解する必要はありません。Sysdigはすでに1400以上のルールを提供しているため、デフォルトのものを参照して独自のルールを作成できます。

resource "sysdig_secure_rule_falco""terminal_shell_in_container" {
  name        = "Terminal shell in container"// ID  description = "A shell was used as the entrypoint/exec point into a container with an attached terminal."  tags        = ["container", "shell"]

  condition = "(evt.type in (execve, execveat) and evt.dir=<) and (container.id != host) and (proc.name in (ash, bash, csh, ksh, sh, tcsh, zsh, dash))"  output    = "A shell was spawned in a container with an attached terminal (user=%user.name %container.info shell=%proc.name parent=%proc.pname cmdline=%proc.cmdline terminal=%proc.tty container_id=%container.id image=%container.image.repository)"  priority  = "notice"  source    = "syscall"}

ご覧のとおり、ルールのconditionは複数のFalcoフィールドイベントを指定しており、望むほど読みやすくない場合があります。さらに、変更が必要になるたびに、そのロジックを再解釈しなければなりません。また、検知対象のシェルがルール内にハードコードされている点も、改善の余地があります。

ここでFalcoの listsmacrosという概念が役立ちます。

結論

Sysdig Terraformプロバイダーは、セキュリティ設定の管理と自動化を簡素化し、環境間での一貫性とコンプライアンスを確保します。詳細な例、高度な設定、サポートされるリソースとデータソースの完全な一覧については、 Sysdig Terraform Providerのドキュメントをご覧ください。

翻訳元: https://www.sysdig.com/blog/using-terraform-for-container-security-as-code

ソース: sysdig.com