Falco

Falco 包括的技術概要

目次

  1. はじめに
  2. Falcoとは
  3. アーキテクチャ概要
  4. ドライバーとイベント収集
  5. ルールエンジン
  6. インストールとデプロイメント
  7. 設定と構成
  8. 出力チャネルとアラート
  9. プラグインシステム
  10. Falcosidekick によるアラート転送
  11. Kubernetes 環境でのセキュリティ監視
  12. カスタムルールの作成
  13. 運用とベストプラクティス
  14. ユースケースと適用シナリオ
  15. まとめ

はじめに

クラウドネイティブ環境におけるランタイムセキュリティは、コンテナ化されたワークロードの普及に伴い、その重要性が飛躍的に増大している。従来のネットワークベースのセキュリティツールだけでは、コンテナ内部の不正な挙動やホストレベルの脅威を検知することが困難である。

Falcoは、この課題に対応するために開発されたクラウドネイティブのランタイムセキュリティツールである。本記事では、Falcoのアーキテクチャ、ドライバー、ルールエンジン、デプロイメント方法、設定、プラグインシステムなど、その全体像を包括的に解説する。


Falcoとは

概要

Falcoは、ホスト、コンテナ、Kubernetes、クラウド環境全体にわたるランタイム脅威検知を提供するクラウドネイティブセキュリティツールである。Sysdigによって開発され、現在はCloud Native Computing Foundation(CNCF)のGraduated Projectとして位置づけられている。

Falcoの検知能力

Falcoは、以下のような異常な挙動を検知する:

検知カテゴリ具体例
権限昇格予期しないsetuid/setgid呼び出し、コンテナ内でのroot取得
ネームスペース変更コンテナエスケープの試行
ファイル改ざん/etc/passwd/etc/shadow への不正な書き込み
不正なネットワーク接続予期しないアウトバウンド接続、リスニングポートの開設
シェル実行コンテナ内でのインタラクティブシェルの起動
不審なプロセス想定外のプロセスの起動、暗号通貨マイナーの実行

動作原理

Falcoの動作は以下の3ステップで構成される:

  1. カーネルイベントの収集: Linux syscall をカーネルからランタイムでパース
  2. ルールエンジンによる評価: イベントストリームをルールエンジンで処理
  3. アラートの生成: 違反が検出された場合にアラートをトリガー

「Falcoの監視能力はsyscallに限定されない」— プラグインを通じて多様なデータソースの取り込みが可能。


アーキテクチャ概要

全体アーキテクチャ

┌──────────────────────────────────────────────────────────────────────┐
│                          Falco Architecture                          │
│                                                                      │
│  ┌────────────────────────────────────────────────────────────────┐  │
│  │                     Event Sources                              │  │
│  │                                                                │  │
│  │  ┌──────────────┐  ┌──────────────┐  ┌──────────────────────┐ │  │
│  │  │ Kernel Events│  │   Plugins    │  │     gVisor Events    │ │  │
│  │  │  (syscalls)  │  │ (CloudTrail, │  │                      │ │  │
│  │  │              │  │  K8s Audit,  │  │                      │ │  │
│  │  │              │  │  Okta, etc.) │  │                      │ │  │
│  │  └──────┬───────┘  └──────┬───────┘  └──────────┬───────────┘ │  │
│  └─────────┼─────────────────┼──────────────────────┼────────────┘  │
│            │                 │                      │                │
│            ▼                 ▼                      ▼                │
│  ┌────────────────────────────────────────────────────────────────┐  │
│  │                    Driver Layer                                │  │
│  │  ┌──────────────┐  ┌──────────────┐  ┌──────────────────────┐ │  │
│  │  │ Modern eBPF  │  │ Legacy eBPF  │  │   Kernel Module      │ │  │
│  │  │  (Default)   │  │ (Deprecated) │  │                      │ │  │
│  │  └──────────────┘  └──────────────┘  └──────────────────────┘ │  │
│  └────────────────────────────┬───────────────────────────────────┘  │
│                               │                                      │
│                               ▼                                      │
│  ┌────────────────────────────────────────────────────────────────┐  │
│  │                   Falco Engine (Userspace)                     │  │
│  │                                                                │  │
│  │  ┌──────────────┐  ┌──────────────┐  ┌──────────────────────┐ │  │
│  │  │  Rules Engine│  │  Filtering   │  │   Alert Generation   │ │  │
│  │  │              │  │  Expression  │  │                      │ │  │
│  │  │              │  │  Evaluation  │  │                      │ │  │
│  │  └──────────────┘  └──────────────┘  └──────────┬───────────┘ │  │
│  └─────────────────────────────────────────────────┼─────────────┘  │
│                                                     │                │
│                                                     ▼                │
│  ┌────────────────────────────────────────────────────────────────┐  │
│  │                   Output Channels                              │  │
│  │                                                                │  │
│  │  stdout │ File │ Syslog │ Program │ HTTP │ gRPC               │  │
│  │                         │                                      │  │
│  │                    Falcosidekick → 50+ integrations            │  │
│  └────────────────────────────────────────────────────────────────┘  │
└──────────────────────────────────────────────────────────────────────┘

主要コンポーネント

コンポーネント役割
ユーザースペースプログラムCLIツール。ルールエンジン、イベント処理、アラート生成を実行
ドライバーカーネルイベントストリームの提供(Modern eBPF、Legacy eBPF、カーネルモジュール)
設定ファイルランタイム動作、ルール、アラートアクションの定義
プラグイン新しいイベントソースとフィールドエクストラクターによる機能拡張
falcoctlルールとプラグインの管理用管理ツール

ドライバーとイベント収集

ドライバータイプの比較

Falcoは3種類のカーネルイベント収集ドライバーをサポートする:

特性Modern eBPFLegacy eBPFカーネルモジュール
デフォルトはいいいえいいえ
最小カーネル (x86_64)≥5.8≥4.14≥3.10
最小カーネル (aarch64)≥5.8≥4.17≥3.10
特権要件削減(4つのcapability)削減フルroot権限
ステータス推奨非推奨(v0.43.0~)アクティブ
CO-RE対応はいいいえN/A
BPFリングバッファはいいいえN/A

Modern eBPF プローブ(推奨)

Modern eBPFプローブは、Falcoのデフォルトかつ推奨ドライバーである。CO-RE(Compile Once Run Everywhere)パラダイムを実装し、互換性のあるシステムでは別途ダウンロードやビルドが不要。

必要なカーネル機能:

  • BPFリングバッファサポート
  • BTF(Binary Type Format)エクスポージャー

必要なLinux Capabilities:

CAP_SYS_BPF         # BPFプログラムのロード
CAP_SYS_PERFMON     # パフォーマンスモニタリング
CAP_SYS_RESOURCE    # setrlimitによるメモリロッキング管理
CAP_SYS_PTRACE      # /proc/<pid>/environ へのアクセス

設定例:

# falco.yaml での Modern eBPF 設定
engine:
  kind: modern_ebpf
  ebpf:
    buf_size_preset: 4    # バッファサイズプリセット(0-9)
    drop_failed_exit: false

カーネルモジュール

従来型のドライバーで、最も広いカーネルバージョンの互換性を持つ。

# カーネルモジュールのインストール
falcoctl driver install

# または Docker イメージ経由
docker run --rm -v /usr/src:/usr/src \
  -v /lib/modules:/lib/modules \
  falcosecurity/falco-driver-loader

制約: フル特権が必要であり、Linux Capabilitiesでの実行は不可。

Legacy eBPF プローブ(非推奨)

# falco.yaml での Legacy eBPF 設定(非推奨)
engine:
  kind: ebpf
  ebpf:
    probe: /path/to/falco_probe.o

注意: Legacy eBPFプローブはFalco v0.43.0で非推奨化され、将来のリリースで削除される予定。


ルールエンジン

ルールファイルの構造

Falcoのルールファイルは、主に3種類の要素を含むYAMLファイルである:

  1. ルール(Rules): アラートを生成すべき条件の定義
  2. マクロ(Macros): ルールや他のマクロ内で再利用できる条件スニペット
  3. リスト(Lists): ルール、マクロ、他のリストに含めることができるアイテムのコレクション

ルールの基本構造

- rule: Terminal Shell in Container
  desc: >
    コンテナ内でインタラクティブシェルが検出された
  condition: >
    spawned_process and
    container and
    shell_procs and
    proc.tty != 0 and
    container_entrypoint
  output: >
    コンテナ内でシェルが実行されました
    (user=%user.name container_id=%container.id
     container_name=%container.name
     shell=%proc.name parent=%proc.pname
     cmdline=%proc.cmdline terminal=%proc.tty
     container_image=%container.image.repository)
  priority: WARNING
  tags: [container, shell, mitre_execution]

ルールフィールドの解説:

フィールド必須説明
ruleはいルールの一意な名前
descはいルールの説明
conditionはいアラートをトリガーするフィルタリング式
outputはいアラートに含まれる出力文字列
priorityはい重要度(EMERGENCY〜DEBUG)
sourceいいえイベントソース(syscall、k8s_audit など)
tagsいいえタグのリスト
enabledいいえルールの有効/無効(デフォルト: true)
exceptionsいいえルールの例外条件

優先度レベル

優先度説明使用例
EMERGENCYシステムが使用不能カーネルの侵害
ALERT即座の対応が必要ルートキット検知
CRITICAL致命的な状況重要なサービスの侵害
ERRORエラー状態不正なファイル変更
WARNING警告状態コンテナ内シェル
NOTICE通常だが重要な状態設定変更
INFORMATIONAL情報提供ログイン成功
DEBUGデバッグ情報詳細なトレース

マクロの定義と使用

# マクロの定義
- macro: container
  condition: container.id != host

- macro: shell_procs
  condition: proc.name in (bash, sh, zsh, csh, ksh, dash, fish)

- macro: spawned_process
  condition: >
    evt.type = execve and
    evt.dir = < and
    proc.pid != 0

- macro: container_entrypoint
  condition: not proc.pname exists or proc.pname in (runc:[2:INIT], runc:[1:CHILD])

# ルール内での使用
- rule: Shell in Container
  condition: spawned_process and container and shell_procs
  output: "Shell spawned in container (user=%user.name container=%container.name)"
  priority: WARNING

リストの定義と使用

# リストの定義
- list: sensitive_file_names
  items:
  - /etc/shadow
  - /etc/passwd
  - /etc/sudoers
  - /etc/pam.conf
  - /etc/security

- list: sensitive_mount_paths
  items:
  - /proc
  - /sys
  - /dev

# リストのルール内での使用
- rule: Write to Sensitive File
  desc: 機密ファイルへの書き込みが検出された
  condition: >
    open_write and
    fd.name in (sensitive_file_names) and
    not proc.name in (apt, dpkg, yum, rpm, passwd)
  output: >
    機密ファイルへの書き込み
    (user=%user.name file=%fd.name process=%proc.name command=%proc.cmdline)
  priority: ERROR
  tags: [filesystem, mitre_persistence]

ルールの例外(Exceptions)

- rule: Write Below Etc
  desc: /etc/ 配下のファイルへの書き込みを検知
  condition: >
    open_write and
    fd.name startswith /etc/
  output: >
    /etc/ 配下のファイルが変更されました
    (user=%user.name file=%fd.name process=%proc.name)
  priority: ERROR
  exceptions:
  - name: known_package_managers
    fields: [proc.name]
    comps: [in]
    values:
    - [apt, dpkg, yum, rpm, dnf, pip, pip3]
  - name: trusted_users
    fields: [user.name, proc.name]
    comps: [=, =]
    values:
    - [root, systemd-resolve]
    - [root, NetworkManager]

ルールの上書きとカスタマイズ

# 既存ルールの無効化
- rule: Terminal Shell in Container
  enabled: false

# 既存ルールの条件追加(append)
- rule: Terminal Shell in Container
  append: true
  condition: and not container.image.repository = "my-debug-image"

# 既存マクロの拡張
- macro: user_known_write_etc_conditions
  append: true
  condition: or proc.name = my-config-tool

# 既存リストの拡張
- list: allowed_executables
  append: true
  items:
  - my-custom-tool
  - another-tool

インストールとデプロイメント

デプロイメントオプション

方法推奨環境備考
Falco OperatorKubernetes推奨
Helm チャートKubernetes完全サポート
DEB/RPM パッケージLinux ホストネイティブインストール
Docker コンテナコンテナ環境柔軟なデプロイ
TarballLinux ホストポータブル

Kubernetes へのデプロイ(Helm)

# 1. Falco Helm リポジトリの追加
helm repo add falcosecurity https://falcosecurity.github.io/charts
helm repo update

# 2. Falco のインストール
helm install falco falcosecurity/falco \
  --namespace falco \
  --create-namespace \
  --set tty=true

# 3. デプロイの確認
kubectl get pods -n falco
kubectl logs -l app.kubernetes.io/name=falco -n falco

デフォルトでは、FalcoはDaemonSetとしてクラスターの全ノードにデプロイされ、Linuxカーネルからのイベント消費用に事前設定される。

Helm チャートの詳細設定

# values.yaml の例
falco:
  # ドライバー設定
  driver:
    kind: modern_ebpf
  
  # ルール設定
  rules_file:
  - /etc/falco/falco_rules.yaml
  - /etc/falco/falco_rules.local.yaml
  - /etc/falco/rules.d
  
  # 出力設定
  json_output: true
  json_include_output_property: true
  
  # HTTPサーバー設定
  http_output:
    enabled: true
    url: http://falcosidekick:2801
  
  # 優先度フィルター
  priority: WARNING
  
  # メトリクス
  metrics:
    enabled: true
    interval: 60m
    output_rule: true
    
# Falcosidekick 連携
falcosidekick:
  enabled: true
  webui:
    enabled: true
    replicaCount: 1

# リソース設定
resources:
  requests:
    cpu: 100m
    memory: 512Mi
  limits:
    cpu: 1000m
    memory: 1024Mi

# トレランス設定(全ノードでの実行用)
tolerations:
- effect: NoSchedule
  operator: Exists

Helm チャートのアップグレード

# バージョン指定でのアップグレード
helm upgrade falco falcosecurity/falco \
  --namespace falco \
  --version 4.8.1 \
  --reuse-values

# アンインストール
helm uninstall falco -n falco

Linux パッケージインストール

# Debian/Ubuntu
curl -fsSL https://falco.org/repo/falcosecurity-packages.asc | \
  sudo gpg --dearmor -o /usr/share/keyrings/falco-archive-keyring.gpg

echo "deb [signed-by=/usr/share/keyrings/falco-archive-keyring.gpg] \
  https://download.falco.org/packages/deb stable main" | \
  sudo tee /etc/apt/sources.list.d/falcosecurity.list

sudo apt-get update
sudo apt-get install -y falco

# RHEL/CentOS/Fedora
sudo rpm --import https://falco.org/repo/falcosecurity-packages.asc
sudo curl -fsSL -o /etc/yum.repos.d/falcosecurity.repo \
  https://falco.org/repo/falcosecurity-rpm.repo
sudo yum install -y falco

Docker でのデプロイ

# Modern eBPF ドライバーでの実行
docker run --rm -i -t \
  --privileged \
  -v /var/run/docker.sock:/host/var/run/docker.sock \
  -v /proc:/host/proc:ro \
  -v /etc:/host/etc:ro \
  falcosecurity/falco:latest

# カスタムルール付きでの実行
docker run --rm -i -t \
  --privileged \
  -v /var/run/docker.sock:/host/var/run/docker.sock \
  -v /proc:/host/proc:ro \
  -v /etc:/host/etc:ro \
  -v /path/to/custom-rules:/etc/falco/rules.d \
  falcosecurity/falco:latest

設定と構成

falco.yaml の構造

Falcoの設定ファイルは、/etc/falco/falco.yaml に配置されるYAMLファイルである。

# /etc/falco/falco.yaml の主要設定

# ルールファイルの指定
rules_file:
- /etc/falco/falco_rules.yaml        # デフォルトルール
- /etc/falco/falco_rules.local.yaml  # カスタムルール
- /etc/falco/rules.d                  # 追加ルールディレクトリ

# エンジン設定
engine:
  kind: modern_ebpf  # modern_ebpf | ebpf | kmod
  
# 出力設定
stdout_output:
  enabled: true

file_output:
  enabled: false
  keep_alive: false
  filename: /var/log/falco/events.log

syslog_output:
  enabled: true

program_output:
  enabled: false
  keep_alive: false
  program: "jq '{text: .output}' | curl -s -X POST -H 'Content-Type: application/json' -d @- https://hooks.slack.com/services/xxx"

http_output:
  enabled: true
  url: http://falcosidekick:2801
  user_agent: "falco/0.38.2"

# JSON出力設定
json_output: true
json_include_output_property: true
json_include_tags_property: true

# 優先度フィルター
priority: WARNING

# バッファリング設定
buffered_outputs: false

# Webサーバー設定
webserver:
  enabled: true
  listen_port: 8765
  k8s_healthz_endpoint: /healthz
  ssl_enabled: false

# メトリクス設定
metrics:
  enabled: true
  interval: 60m
  output_rule: true
  resource_utilization_enabled: true
  state_counters_enabled: true
  kernel_event_counters_enabled: true
  libbpf_stats_enabled: true

コマンドラインオーバーライド

# 単一の設定オーバーライド
falco -o "json_output=true"

# ネストされた設定のオーバーライド
falco -o "engine.kind=modern_ebpf"

# 複数のオーバーライド
falco -o "json_output=true" \
      -o "priority=NOTICE" \
      -o "http_output.enabled=true" \
      -o "http_output.url=http://localhost:2801"

追加設定ファイル(v0.38.0以降)

# /etc/falco/falco.yaml
config_files:
- /etc/falco/config.d/

マージ戦略(v0.41.0以降)

戦略説明
append(デフォルト)シーケンスをマージ、スカラーを上書き
override既存のキーを置換
add-only既存のキーを保持

制約: 設定のマージはルートキーレベルでのみ動作する。


出力チャネルとアラート

サポートされる出力先

Falcoは以下の出力チャネルにアラートを送信できる:

チャネル説明設定キー
標準出力コンソールへの出力stdout_output
ファイルログファイルへの書き込みfile_output
Syslogシステムログへの送信syslog_output
プログラム外部プログラムへのパイプprogram_output
HTTP/HTTPSHTTPエンドポイントへの送信http_output
gRPC APIgRPCクライアントへの配信grpc_output(非推奨)

出力フォーマットの設定

# JSON出力(推奨)
json_output: true
json_include_output_property: true
json_include_tags_property: true

JSON出力の例:

{
  "hostname": "worker-01",
  "output": "18:42:15.123456789: Warning Shell spawned in container (user=root container_id=abc123 container_name=web-app shell=bash parent=nginx cmdline=bash terminal=34816 container_image=nginx)",
  "priority": "Warning",
  "rule": "Terminal Shell in Container",
  "source": "syscall",
  "tags": ["container", "shell", "mitre_execution"],
  "time": "2024-03-15T18:42:15.123456789Z",
  "output_fields": {
    "user.name": "root",
    "container.id": "abc123",
    "container.name": "web-app",
    "proc.name": "bash",
    "proc.pname": "nginx",
    "proc.cmdline": "bash",
    "proc.tty": 34816,
    "container.image.repository": "nginx"
  }
}

プログラム出力の例

# Slack への直接通知
program_output:
  enabled: true
  keep_alive: false
  program: >
    jq '{text: .output}' |
    curl -s -X POST
    -H 'Content-Type: application/json'
    -d @-
    https://hooks.slack.com/services/T00/B00/XXX

プラグインシステム

概要

Falcoプラグインは、文書化されたAPIに準拠した共有ライブラリで、コア機能を拡張する。

プラグインの能力

機能説明
新規イベントソースフィルタリング式とFalcoルールで評価可能な新しいイベントストリーム
カスタムフィールド定義イベントから情報を抽出するフィールドの追加
イベントストリーム解析キャプチャデータの解析
非同期イベント注入データストリームへのイベント注入

公式プラグイン

プラグインイベントソース用途
CloudTrailaws_cloudtrailAWS クラウドアクティビティ監視
Kubernetes Auditk8s_auditKubernetes 監査ログ処理
OktaoktaIDおよびアクセス管理イベント
GitHubgithubGitHubリポジトリアクティビティ

CloudTrail プラグインの設定例

# falco.yaml でのプラグイン設定
plugins:
- name: cloudtrail
  library_path: libcloudtrail.so
  init_config:
    sqsQueueUrl: https://sqs.us-east-1.amazonaws.com/123456789012/cloudtrail-events
    aws_region: us-east-1
  open_params: ""

load_plugins:
- cloudtrail

Kubernetes Audit Log プラグインの設定例

# falco.yaml での K8s Audit プラグイン設定
plugins:
- name: k8saudit
  library_path: libk8saudit.so
  init_config: ""
  open_params: "http://:9765/k8s-audit"

load_plugins:
- k8saudit

K8s Audit ルールの例

- rule: K8s Secret Access
  desc: Kubernetes Secretへのアクセスが検出された
  condition: >
    ka.verb in (get, list) and
    ka.target.resource = secrets and
    not ka.user.name in (system:serviceaccount:kube-system:default)
  output: >
    K8s Secretアクセス
    (user=%ka.user.name verb=%ka.verb
     secret=%ka.target.name
     namespace=%ka.target.namespace)
  priority: WARNING
  source: k8s_audit
  tags: [k8s, secrets, mitre_credential_access]

Falcosidekick によるアラート転送

概要

FalcosidekickはFalcoのプロキシフォワーダーであり、Falcoインスタンスとサードパーティシステムとのアラートのハブとして機能する。50以上の統合先をサポートする。

サポートされる出力カテゴリ

カテゴリ統合先
コミュニケーションSlack, Teams, Discord, Telegram, Mattermost, Google Chat
監視・オブザーバビリティDatadog, Prometheus, Dynatrace, InfluxDB, Wavefront
インシデント管理PagerDuty, Opsgenie, AlertManager, Grafana OnCall
ログシステムElasticsearch, Loki, AWS CloudWatch, SumoLogic
ストレージAWS S3, GCP Storage
サーバーレスAWS Lambda, GCP Cloud Run/Functions, OpenFaaS
メッセージキューKafka, RabbitMQ, NATS, AWS SQS/SNS/Kinesis
その他Email (SMTP), Webhooks, Redis, Falco Talon

Helm でのデプロイ

# Falco と Falcosidekick を一緒にデプロイ
helm install falco falcosecurity/falco \
  --namespace falco \
  --create-namespace \
  --set falcosidekick.enabled=true \
  --set falcosidekick.webui.enabled=true

Falcosidekick の設定例

# Falcosidekick の values.yaml

config:
  # Slack通知
  slack:
    webhookurl: "https://hooks.slack.com/services/T00/B00/XXX"
    channel: "#security-alerts"
    minimumpriority: "warning"
    messageformat: "all"
  
  # Elasticsearch連携
  elasticsearch:
    hostport: "https://elasticsearch:9200"
    index: "falco"
    type: "_doc"
    minimumpriority: "notice"
    suffix: "daily"
  
  # PagerDuty連携
  pagerduty:
    routingkey: "your-routing-key"
    minimumpriority: "critical"
  
  # AWS CloudWatch
  aws:
    cloudwatchlogs:
      loggroup: "/falco/alerts"
      logstream: ""
      minimumpriority: "warning"
      region: "us-east-1"
  
  # Prometheus Alertmanager
  alertmanager:
    hostport: "http://alertmanager:9093"
    minimumpriority: "warning"
    endpoint: "/api/v2/alerts"
  
  # カスタムフィールドの追加
  customfields:
    environment: "production"
    cluster: "main-cluster"
    team: "security-ops"

  # 優先度によるフィルタリング
  minimumpriority: "warning"

Docker でのデプロイ

docker run -d -p 2801:2801 \
  -e SLACK_WEBHOOKURL="https://hooks.slack.com/services/T00/B00/XXX" \
  -e SLACK_CHANNEL="#security-alerts" \
  -e ELASTICSEARCH_HOSTPORT="https://elasticsearch:9200" \
  -e ELASTICSEARCH_INDEX="falco" \
  falcosecurity/falcosidekick:latest

Kubernetes 環境でのセキュリティ監視

コンテナセキュリティルール

# コンテナ内での特権操作の検知
- rule: Privileged Container Started
  desc: 特権コンテナの起動が検出された
  condition: >
    container_started and
    container.privileged = true
  output: >
    特権コンテナが起動されました
    (user=%user.name container=%container.name
     image=%container.image.repository)
  priority: CRITICAL
  tags: [container, cis, mitre_privilege_escalation]

# コンテナ内でのパッケージ管理ツールの実行
- rule: Package Management in Container
  desc: コンテナ内でパッケージ管理ツールが実行された
  condition: >
    spawned_process and
    container and
    proc.name in (apt, apt-get, yum, dnf, pip, pip3, npm, gem)
  output: >
    コンテナ内でパッケージ管理ツールが実行されました
    (user=%user.name container=%container.name
     command=%proc.cmdline image=%container.image.repository)
  priority: ERROR
  tags: [container, software_mgmt, mitre_execution]

# コンテナからのネットワーク接続
- rule: Unexpected Outbound Connection from Container
  desc: コンテナから予期しないアウトバウンド接続が検出された
  condition: >
    outbound and
    container and
    not fd.sport in (80, 443, 53, 8080, 8443) and
    not proc.name in (curl, wget)
  output: >
    コンテナから予期しないアウトバウンド接続
    (user=%user.name container=%container.name
     process=%proc.name connection=%fd.name
     image=%container.image.repository)
  priority: WARNING
  tags: [container, network, mitre_command_and_control]

Kubernetes 固有のルール

# K8s ConfigMapの変更検知
- rule: K8s ConfigMap Modified
  desc: Kubernetes ConfigMapが変更された
  condition: >
    ka.verb in (create, update, patch, delete) and
    ka.target.resource = configmaps and
    ka.target.namespace != kube-system
  output: >
    ConfigMapが変更されました
    (user=%ka.user.name verb=%ka.verb
     configmap=%ka.target.name
     namespace=%ka.target.namespace)
  priority: NOTICE
  source: k8s_audit
  tags: [k8s, configmap]

# K8s ServiceAccountトークンの不正使用
- rule: Anonymous K8s Access
  desc: Kubernetes APIへの匿名アクセスが検出された
  condition: >
    ka.user.name = "system:anonymous" and
    not ka.uri startswith /healthz and
    not ka.uri startswith /readyz
  output: >
    K8s APIへの匿名アクセス
    (verb=%ka.verb uri=%ka.uri
     reason=%ka.auth.reason)
  priority: CRITICAL
  source: k8s_audit
  tags: [k8s, authentication, mitre_initial_access]

# Pod SecurityContext の違反
- rule: Pod Created with Host Network
  desc: HostNetworkが有効なPodが作成された
  condition: >
    ka.verb = create and
    ka.target.resource = pods and
    jevt.value[/requestObject/spec/hostNetwork] = "true"
  output: >
    HostNetwork付きPodが作成されました
    (user=%ka.user.name pod=%ka.target.name
     namespace=%ka.target.namespace)
  priority: WARNING
  source: k8s_audit
  tags: [k8s, network, mitre_lateral_movement]

カスタムルールの作成

ルール作成のワークフロー

1. 検知したい脅威シナリオを特定
   ↓
2. 関連するsyscallやイベントフィールドを調査
   ↓
3. マクロとリストで共通条件を抽象化
   ↓
4. ルール条件式を記述
   ↓
5. 出力フォーマットを定義
   ↓
6. テストと例外の追加
   ↓
7. 本番環境へのデプロイ

カスタムルールファイルの構成例

# /etc/falco/rules.d/custom-rules.yaml

# カスタムマクロ
- macro: my_app_container
  condition: container.image.repository startswith "my-registry.example.com/"

- macro: known_internal_networks
  condition: >
    fd.rip in ("10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16")

# カスタムリスト
- list: my_allowed_processes
  items: [nginx, node, python3, java, gunicorn]

- list: my_sensitive_paths
  items:
  - /app/config/secrets
  - /app/data/credentials
  - /app/ssl

# カスタムルール
- rule: Unauthorized Process in My App
  desc: アプリケーションコンテナで許可されていないプロセスが実行された
  condition: >
    spawned_process and
    my_app_container and
    not proc.name in (my_allowed_processes)
  output: >
    許可されていないプロセスが検出されました
    (container=%container.name process=%proc.name
     cmdline=%proc.cmdline user=%user.name
     image=%container.image.repository)
  priority: ERROR
  tags: [custom, my_app, mitre_execution]

- rule: Sensitive Config Access
  desc: アプリケーションの機密設定ファイルへのアクセスが検出された
  condition: >
    (open_read or open_write) and
    my_app_container and
    fd.name pmatch (my_sensitive_paths) and
    not proc.name in (my_allowed_processes)
  output: >
    機密設定ファイルへのアクセス
    (container=%container.name file=%fd.name
     process=%proc.name user=%user.name)
  priority: CRITICAL
  tags: [custom, my_app, sensitive_data]

- rule: Crypto Miner Detection
  desc: 暗号通貨マイニングプロセスの検知
  condition: >
    spawned_process and
    container and
    (proc.name in (xmrig, minerd, cpuminer, cgminer, bfgminer) or
     proc.cmdline contains "stratum+tcp" or
     proc.cmdline contains "stratum+ssl" or
     proc.cmdline contains "mining.pool")
  output: >
    暗号通貨マイニングが検出されました
    (container=%container.name process=%proc.name
     cmdline=%proc.cmdline user=%user.name
     image=%container.image.repository)
  priority: CRITICAL
  tags: [container, cryptomining, mitre_resource_hijacking]

運用とベストプラクティス

パフォーマンスチューニング

バッファサイズの最適化

# falco.yaml
engine:
  kind: modern_ebpf
  ebpf:
    buf_size_preset: 4  # 0(最小)〜 9(最大)
プリセットバッファサイズ推奨環境
0-2低トラフィック環境
3-4中(デフォルト)標準的な環境
5-7高トラフィック環境
8-9最大極めて高負荷な環境

ドロップイベントの監視

# ドロップアラートの設定
syscall_event_drops:
  threshold: 0.1          # ドロップ率のしきい値(10%)
  actions:
  - log                    # ログ出力
  - alert                  # アラート生成
  rate: 0.03333           # アクションの頻度制限
  max_burst: 1

高可用性構成

# Kubernetes DaemonSet での高可用性設定
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: falco
  namespace: falco
spec:
  updateStrategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1
  template:
    spec:
      tolerations:
      - effect: NoSchedule
        operator: Exists
      - effect: NoExecute
        operator: Exists
      priorityClassName: system-node-critical
      containers:
      - name: falco
        resources:
          requests:
            cpu: 100m
            memory: 512Mi
          limits:
            cpu: 1000m
            memory: 1024Mi
        livenessProbe:
          httpGet:
            path: /healthz
            port: 8765
          initialDelaySeconds: 60
          periodSeconds: 15
        readinessProbe:
          httpGet:
            path: /healthz
            port: 8765
          initialDelaySeconds: 30
          periodSeconds: 10

ルール管理のベストプラクティス

  1. デフォルトルールを直接編集しない: カスタムルールは falco_rules.local.yaml または rules.d/ に配置
  2. 段階的な優先度設定: テスト環境では INFORMATIONAL から開始し、本番環境では WARNING 以上に設定
  3. 例外の適切な管理: 誤検知を exceptions で処理し、ルール条件を複雑にしない
  4. タグの活用: MITRE ATT&CK フレームワークに基づくタグ付けで分類を統一
  5. バージョン管理: ルールファイルをGitで管理し、変更をレビュー

Falcoctl によるルール管理

# 利用可能なルールアーティファクトの一覧
falcoctl index add falcosecurity https://falcosecurity.github.io/falcoctl/index.yaml
falcoctl artifact search rules

# ルールのインストール
falcoctl artifact install falco-rules

# ルールの更新
falcoctl artifact update

トラブルシューティング

# Falcoのステータス確認
systemctl status falco

# ログの確認
journalctl -u falco -f

# ルールの検証
falco --validate /etc/falco/rules.d/custom-rules.yaml

# ドライバーの状態確認
falcoctl driver status

# ドライバーの再インストール
falcoctl driver install --type modern_ebpf

# イベントドロップの確認
falco --stats-interval 10

ユースケースと適用シナリオ

1. コンテナランタイムセキュリティ

コンテナ化されたワークロードにおける不正な挙動(シェルアクセス、ファイル改ざん、権限昇格)のリアルタイム検知。

2. Kubernetes セキュリティ監視

Kubernetes APIサーバーの監査ログ分析、RBAC違反の検知、不正なPod作成の監視。

3. コンプライアンス監視

PCI DSS、HIPAA、SOC 2などの規制要件に基づくセキュリティイベントの監視とレポーティング。

4. インシデントレスポンス

Falco Talonとの連携による自動対応(不正コンテナの強制停止、ネットワーク隔離など)。

5. クラウドセキュリティ

CloudTrailプラグインによるAWSアカウントの異常アクティビティ検知。OktaプラグインによるIAMイベントの監視。

6. 脅威ハンティング

MITRE ATT&CKフレームワークに基づいたカスタムルールによるプロアクティブな脅威検知。


まとめ

Falcoは、クラウドネイティブ環境におけるランタイムセキュリティの中核を担うツールである。その主要な特徴を以下にまとめる:

側面特徴
アーキテクチャカーネルレベルのイベント収集 + ユーザースペースのルールエンジン
ドライバーModern eBPF(推奨)、カーネルモジュール、Legacy eBPF(非推奨)
ルールエンジンYAML ベースのルール、マクロ、リスト、例外機能
検知能力syscall 監視、K8s Audit、クラウドイベント(プラグイン)
出力stdout、ファイル、Syslog、HTTP、Falcosidekick(50+統合先)
プラグインCloudTrail、K8s Audit、Okta、GitHub 等
デプロイKubernetes(Helm/Operator)、Linux パッケージ、Docker
拡張性カスタムルール、カスタムプラグイン、Falco Talon連携

Falcoの採用により、組織はカーネルレベルからクラウドサービスレベルまでの包括的なランタイムセキュリティ監視を実現し、コンテナ化されたワークロードとKubernetes環境における脅威をリアルタイムで検知・対応できるようになる。CNCFのGraduated Projectとしての成熟度と、活発なコミュニティによるサポートが、本番環境での信頼性を保証する。