Google Cloudとコンテナの継続的なセキュリティ
本文の内容は、2018年12月2日にSysdigのJorge Salamero Sanzが投稿したブログ(https://sysdig.com/blog/using-terraform-for-container-security-as-code/)を元に日本語に翻訳・再構成した内容となっております。
本チュートリアルでは、コンテナセキュリティをコードとして実装する方法を学習していきます。 おそらく、コンテナイメージを自動的に再構築するCI/CDパイプラインがあります。コンテナセキュリティをコードとして定義し、それをGitリポジトリにプッシュして変更をバージョン管理し、DockerやKubernetesなどのコンテナオーケストレーションツールでSysdig Secureを使用してポリシーを適用できるとしたらどうでしょうか。
Terraformは、コードを使用してインフラストラクチャをデプロイおよび更新するための素晴らしいツールです。AWS、Google Cloud、Azure、IBMなどのクラウドプロバイダーでのクラスターデプロイメントを自動化するためにも使用されています。 良いニュースは、TerraformとSysdig Secureを使用して、コンテナーセキュリティをコードとして構成できるようになりました。
Sysdig Secure Terraformプロバイダーのインストールは本当に簡単です。 システムにインストールする必要があるいくつかの前提条件は、Terraform(>こちらの方法を参照)とプロバイダーコードをコンパイルするGo(> 1.9)です(最も簡単なのは、aptやyumなどのパッケージマネージャーを使用してGoランタイムをインストールすることです)。
そして:
これで準備完了です!
Terraformは、リソース定義(この場合はセキュリティポリシー)を含む記述ファイルを使用します。プロバイダーはこれらの定義を解析し、必要なアクションをリモートインフラストラクチャ(Sysdig Secure)で実行して、記述されている構成が実際にデプロイされているものと一致するようにします。
これらのファイルでは、Terraform形式(.tf)またはJSON(.tf.json)を使用できます。 Terraformに完全に慣れていない場合は、構文ドキュメントを参照することをお勧めします。
コンテナのセキュリティポリシー設定のために、手を動かして基本的なTerraform設定ファイルを作成しましょう。
まず最初に、Sysdig Secureプロバイダーを使用することと、次のすべての構成がこのモジュールによって処理されることをTerraformに伝える必要があります。
provider "sysdig" { }
これでTerraformはプロバイダーを使用して、ファイル内のすべてのリソース定義を処理します。TerraformがSysdig Secureバックエンドに対して必要なすべてのアクションを実行できるようにするには、Sysdig Secure APIトークンが必要です。
provider "sysdig" { sysdig_secure_api_token = "<your_token>"
}
ファイルに保存したくない場合、Terraformは、対話形式で実行するときに入力するように求めます。
次に、いくつかのリソースを作成します。 プロバイダーは現在、作成と更新をサポートしています。
Falcoは、コンテナ、マイクロサービス、クラウドネイティブアプリケーション用に構築された行動アクティビティ監視ツールです。 Sysdigによって開始されたオープンソースプロジェクトですが、現在はCNCF財団の傘下でホストされています。 商用製品のSysdig SecureはFalcoの基盤の上に構築されており、Falcoフィルタリングルールを活用して高度なSysdig Secureポリシーを作成できます。
Falcoでは、ルールを異なるファイルにグループ化できます。実際に、Nginx、HAproxy、Traefik、MongoDB、PostgreSQL、Redis、Elasticsearchなどのさまざまなサービス/アプリケーション、またはapi-serverやkubeletなどのさまざまなKubernetesコンポーネント用のデフォルトのセキュリティプロファイルまたはルールセットを作成しました。Falco extrasリポジトリで見つけることができます。これらのファイルにルールを含めるには、各ファイルのコンテンツを含むリソースをインスタンス化するだけです。
resource "sysdig_secure_user_rules_file" "rules-traefik" { content = "${file("${path.module}/rules-traefik.yaml")}"
}
別のリソース名を使用する限り、複数のファイルからルールをインスタンス化できます。YAMLファイルのパスは、Terraform定義ファイルと同じフォルダーに相対的であることに注意してください。
通常、SIEMのさまざまなソースからセキュリティイベントを集約するか、モニタリングおよびコンプライアンスの目的でそれらをログに記録します。これは、Sysdig Secureの通知チャネルを通じて実現されます。
新しい通知チャネルを定義するには、目的の名前とオプションで新しいリソースを作成します。 オプションは、実際にSecureのGUI内で設定された使用可能なものと一致します。
resource "sysdig_secure_notification_channel" "sample-email" { name = "Example Channel - Email" enabled = true type = "EMAIL" recipients = "root@example.com" notify_when_ok = false notify_when_resolved = false
}
SlackやPagerDutyなどのOAuth認証を必要とする通知チャネルを定義する必要がある場合は、UIを使用して作成され、ブラウザーを使用して構成された既存のチャネルからリソース定義を自動的に生成するために構築したこの小さなツールをご覧ください。
Sysdig Secureでは、UIを使用してシンプルで非常に効果的なセキュリティポリシーを作成できます。これらはビヘイビアパターンを定義し、条件が満たされると、セキュリティイベントがトリガーされます。これらのイベントに対応するために、Sysdigはコンテナの隔離や強制終了などの複数のアクションを実行できますが、フォレンジックおよび事後分析を実行するためのすべてのシステムアクティビティでSysdigキャプチャを作成することもできます。
繰り返しますが、ここでのオプションは、プロセス、コンテナイメージ、ネットワークアクティビティ、ファイルアクティビティ、またはシステムコールの名前、説明、重大度、スコープ、ホワイトリストおよびブラックリストなど、Sysdig Secure UIで利用できるものと一致します。 Falco言語で作成されたルールも参照できます。
ここでは、可能なすべてのオプションを含むコンテナセキュリティポリシー定義例を見ることができます。
resource "sysdig_secure_policy" "sample2" { name = "Other example of Policy" description = "this is other example of policy" severity = 4 enabled = true container_scope = true host_scope = true processes = { default = "accept" whitelist = ["mysql", "apache"] blacklist = ["ssh"] } containers = { default = "none" whitelist = ["cassandra"] blacklist = ["mongo"] } network = { inbound = "accept" outbound = "deny" listening_ports { default = "none" tcp { whitelist = [80, 443] blacklist = [8080, 5000] } udp { whitelist = [53, 4000] blacklist = [3400, 543] } } } filesystem = { read = { whitelist = ["/home"] blacklist = ["/etc"] } readwrite = { whitelist = ["/home"] blacklist = ["/tmp"] } other_paths = "none" } syscalls = { default = "accept" whitelist = ["accept", "close"] blacklist = ["bind", "bpf"] } notification_channels = ["${sysdig_secure_notification_channel.sample-victorops.id}"] falco_rule_name_regex = "Unexpected spawned process Traefik"
}
コンテナセキュリティをコードとして作成する場合、複数のルールを特定の優先順位で評価する必要があります。これは、リソースIDによって参照される順序付きリストルールを定義する別のリソースです。
resource "sysdig_secure_policies_priority" "priority" { policies = [ "${sysdig_secure_policy.sample2.id}", "${sysdig_secure_policy.sample.id}"]
}
実稼働環境のコンテナ内で誰かが対話型シェルを実行した場合に警告するセキュリティポリシーを作成することは、間違いなく良い考えです。これは、コンテナ内でリバースシェルを実行する外部攻撃者か、運用環境内でプレイすることを決定した組織内の誰かである可能性があります。
このセキュリティイベントに応答して、アラートを起動し、システムコールキャプチャをトリガーして、シェルの生成後に何が発生したかを分析します。
ここで一連のファイルを作成し、すべてを同じディレクトリ内に配置します。
Sysdig Secure Terraformプロバイダーを使用していることを示すdemo_provider.tf:
provider "sysdig" {}
通知チャネルの定義を含むdemo_notification_channels.tf:
resource "sysdig_secure_notification_channel" "elastic-search" { name = "ElasticSearch" enabled = false type = "WEBHOOK" url = "http://ec2-44-444-44-444.compute-1.amazonaws.com:9200/sysdigsecure/event" notify_when_ok = true notify_when_resolved = true
}
ポリシールールの評価順序を定義するdemo_policies_priority.tf
今回は1つだけです。
resource "sysdig_secure_policies_priority" "priority" { policies = [ "${sysdig_secure_policy.terminal-shell-in-container.id}"]
}
demo_policies.tfには、ポリシールール定義が含まれています。
resource "sysdig_secure_policy" "terminal-shell-in-container" { name = "Terminal shell in container" description = "A shell was spawned by a program in a container with an attached terminal." severity = 1 enabled = true filter = "not kubernetes.namespace.name in ('ping', 'default')" container_scope = true host_scope = false actions { capture { seconds_before_event = 10 seconds_after_event = 20 } } notification_channels = ["${sysdig_secure_notification_channel.webhook.id}", "${sysdig_secure_notification_channel.elastic-search.id}"] falco_rule_name_regex = "Terminal shell in container"
}
独自のFalco言語ルールをアップロードする必要がある場合、次の内容を含むdemo_user_rules.tfファイルがあります。
resource "sysdig_secure_user_rules_file" "rules" { content = "${file("${path.module}/rules.yaml")}"
}
これで、変更を適用するには、このディレクトリ内からterraform applyを実行するだけで完了です! これらすべてのファイルをGitに保存してから、Jenkinsまたはお気に入りのCIサーバーに適用してもらうことができます。
Sysdig Secure Terraformプロバイダーでコードとしてコンテナセキュリティを実装することの最も重要な利点の1つは、バージョン管理された再現可能なセキュリティポリシーを持つことです。さらに、これは、アプリケーションのデプロイに使用するのと同じパイプライン内にデプロイできます。
Terraformを使用してルールと通知チャネルを作成するのは非常に簡単で、ツールキット内ですでにTerraformを使用している場合、これはセキュリティの処理方法に大きな影響を与える小さなステップになります。
あなたがそれを役に立つと思うことを望みます、あなたのフィードバックを聞きたいです、そして、もし、あなたがSysdig Secureをご利用されていなかったら、今すぐ、ご利用ください!