セキュリティの三銃士: SELinux、OPA、Falco

詳細に入る前に、私たちのセキュリティチームを紹介しましょう:

  • SELinux: 長年の経験を持つ厳格なセキュリティガード。
  • OPA: 新しいポリシー執行者。
  • Falco: 鋭い目を持つランタイムセキュリティモニター。

これらが揃えば、どんなハッカーも二の足を踏むことでしょう。

舞台設定: Kubernetesのプレイグラウンド

まずはシンプルなKubernetesデプロイメントから始めましょう:


apiVersion: apps/v1
kind: Deployment
metadata:
  name: super-secure-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: super-secure-app
  template:
    metadata:
      labels:
        app: super-secure-app
    spec:
      containers:
      - name: super-secure-app
        image: supersecure/app:v1
        ports:
        - containerPort: 8080

一見無害に見えますが、適切なセキュリティ対策がなければ、これは紙の鍵のように脆弱です。

ステップ1: SELinuxプロファイルの作成

まずは、ポッド用のSELinuxプロファイルを作成します。しかし、ゼロから書くのではなく、ランタイムトレースから生成します。まるでSELinuxが自分の自伝を書いているようなものです!

ランタイムトレースからSELinuxポリシーを生成する

audit2allowを使って、auditdログからポリシーを生成します。手順は以下の通りです:

  1. SELinuxを許可モードでアプリケーションを実行する
  2. auditdログを収集する
  3. ログをaudit2allowに渡す

# auditdログを収集
ausearch -m AVC -ts recent > avc.log

# ポリシーを生成
audit2allow -i avc.log -M mysecurepolicy

# ポリシーを適用
semodule -i mysecurepolicy.pp

これで、アプリケーションに合わせたカスタムSELinuxポリシーが完成しました。まるでオーダーメイドのスーツのようです。

ステップ2: OPAの登場 – ポリシー執行の達人

SELinuxプロファイルができたら、次はOpen Policy Agent (OPA)の出番です。OPAは、ポッドが常に正しいSELinuxプロファイルで動作するようにします。

OPAポリシーの作成

SELinuxプロファイルを強制するOPAポリシーを作成しましょう:


package kubernetes.admission

import data.kubernetes.namespaces

deny[msg] {
  input.request.kind.kind == "Pod"
  input.request.operation == "CREATE"
  container := input.request.object.spec.containers[_]
  not container.securityContext.seLinuxOptions
  msg := sprintf("Container %v must have SELinux options set", [container.name])
}

deny[msg] {
  input.request.kind.kind == "Pod"
  input.request.operation == "CREATE"
  container := input.request.object.spec.containers[_]
  container.securityContext.seLinuxOptions
  container.securityContext.seLinuxOptions.type != "mysecurepolicy"
  msg := sprintf("Container %v must use the 'mysecurepolicy' SELinux profile", [container.name])
}

このポリシーは、クラブの入口でIDを確認するバウンサーのようなものです。リストに載っていない(正しいSELinuxプロファイルを使用していない)場合は入れません!

KubernetesへのOPAのデプロイ

次に、OPAをアドミッションコントローラーとしてデプロイします:


apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
metadata:
  name: opa-validating-webhook
webhooks:
  - name: validating-webhook.openpolicyagent.org
    rules:
      - operations: ["CREATE", "UPDATE"]
        apiGroups: [""]
        apiVersions: ["v1"]
        resources: ["pods"]
    clientConfig:
      service:
        namespace: opa
        name: opa
      caBundle: ${CA_BUNDLE}
    admissionReviewVersions: ["v1beta1"]
    sideEffects: None
    timeoutSeconds: 5

これで、OPAはポッドの作成や更新を厳しくチェックし、SELinuxポリシーが守られていることを確認します。まるでKubernetesのナイトクラブの入口でIDを確認するセキュリティガードのようです。

ステップ3: Falco – ランタイムセキュリティの番犬

SELinuxとOPAは素晴らしいですが、ランタイムセキュリティはどうでしょう?ここで登場するのがFalcoです。問題の兆候を見逃さない、常に警戒している番犬です。

カスタムFalcoルールの作成

ポッドを監視するためのカスタムFalcoルールを作成しましょう:


- rule: Unauthorized SELinux Profile Change
  desc: Detect attempts to change SELinux profile at runtime
  condition: >
    evt.type = setattr and
    (evt.arg.name contains "selinux" or evt.arg.name_version contains "selinux") and
    not proc.name in (allowed_selinux_changers)
  output: "SELinux profile change attempt detected (user=%user.name command=%proc.cmdline)"
  priority: WARNING
  tags: [process, selinux]

- macro: allowed_selinux_changers
  condition: (proc.name in ("semanage", "setsebool", "load_policy"))

これらのルールは、ポッドのためのセキュリティカメラのようなものです。常に監視し、警報を鳴らす準備ができています。

すべてをまとめる

すべてのピースが揃ったので、それらがどのように連携するか見てみましょう:

  1. SELinuxプロファイルがポッドの基本的なセキュリティを提供します。
  2. OPAがすべてのポッドが正しいSELinuxプロファイルで作成されることを保証します。
  3. Falcoがランタイム環境を監視し、怪しい活動を検出します。

これは、3層のセキュリティケーキのようなもので、それぞれの層が美味しい...いや、安全です!

PCI-DSSコンプライアンスの仕上げ

このセットアップで、PCI-DSSコンプライアンスの達成に向けて大きく前進しています。以下は、私たちのセキュリティ対策がいくつかの主要なPCI-DSS要件にどのように対応しているかです:

  • 要件2: ベンダー提供のデフォルトを使用しない - カスタムSELinuxプロファイルにより、デフォルト設定に依存しません。
  • 要件6: 安全なシステムの開発と維持 - OPAがクラスター全体でセキュリティポリシーを強制します。
  • 要件10: ネットワークリソースとカード保持者データへのすべてのアクセスを追跡し監視する - Falcoが怪しい活動を継続的に監視し、警告を発します。

結論: スケールに応じたセキュリティ、しかし理性を失わずに

Kubernetesポッドのセキュリティをスケールで実装することは、髪を引っ張るような経験である必要はありません。SELinux、OPA、Falcoを活用することで、堅牢でスケーラブルなセキュリティソリューションを構築しました。これにより、最も厳しいセキュリティ監査員でも笑顔になるでしょう。

Kubernetesセキュリティの世界では、壁を作ることではなく、変化する脅威の状況に対応できる賢く適応可能な防御を作ることが重要です。さあ、ポッドを安全にし、コンプライアンスの力があなたと共にありますように!

"曖昧さに直面したときは、推測の誘惑に抵抗せよ。" - The Zen of Python

この引用は、Pythonだけでなくセキュリティにも当てはまります。セキュリティのニーズを推測せず、SELinux、OPA、Falcoのようなツールを使って、クラスターで何が起こっているのかを正確に把握しましょう。

考えるための材料

これらのセキュリティ対策を実装する際に、次のことを考慮してください:

  • アプリケーションが進化するにつれて、SELinuxポリシーの更新をどのように扱いますか?
  • Falcoアラートの誤検知を管理するための戦略は何ですか?
  • SELinux以外のポリシー執行のためにOPAをどのように活用できますか?

セキュリティは旅であり、目的地ではありません。学び続け、適応し続け、ポッドが常に安全であるようにしましょう!