Falco
Falco 包括的技術概要
目次
- はじめに
- Falcoとは
- アーキテクチャ概要
- ドライバーとイベント収集
- ルールエンジン
- インストールとデプロイメント
- 設定と構成
- 出力チャネルとアラート
- プラグインシステム
- Falcosidekick によるアラート転送
- Kubernetes 環境でのセキュリティ監視
- カスタムルールの作成
- 運用とベストプラクティス
- ユースケースと適用シナリオ
- まとめ
はじめに
クラウドネイティブ環境におけるランタイムセキュリティは、コンテナ化されたワークロードの普及に伴い、その重要性が飛躍的に増大している。従来のネットワークベースのセキュリティツールだけでは、コンテナ内部の不正な挙動やホストレベルの脅威を検知することが困難である。
Falcoは、この課題に対応するために開発されたクラウドネイティブのランタイムセキュリティツールである。本記事では、Falcoのアーキテクチャ、ドライバー、ルールエンジン、デプロイメント方法、設定、プラグインシステムなど、その全体像を包括的に解説する。
Falcoとは
概要
Falcoは、ホスト、コンテナ、Kubernetes、クラウド環境全体にわたるランタイム脅威検知を提供するクラウドネイティブセキュリティツールである。Sysdigによって開発され、現在はCloud Native Computing Foundation(CNCF)のGraduated Projectとして位置づけられている。
Falcoの検知能力
Falcoは、以下のような異常な挙動を検知する:
| 検知カテゴリ | 具体例 |
|---|---|
| 権限昇格 | 予期しないsetuid/setgid呼び出し、コンテナ内でのroot取得 |
| ネームスペース変更 | コンテナエスケープの試行 |
| ファイル改ざん | /etc/passwd、/etc/shadow への不正な書き込み |
| 不正なネットワーク接続 | 予期しないアウトバウンド接続、リスニングポートの開設 |
| シェル実行 | コンテナ内でのインタラクティブシェルの起動 |
| 不審なプロセス | 想定外のプロセスの起動、暗号通貨マイナーの実行 |
動作原理
Falcoの動作は以下の3ステップで構成される:
- カーネルイベントの収集: Linux syscall をカーネルからランタイムでパース
- ルールエンジンによる評価: イベントストリームをルールエンジンで処理
- アラートの生成: 違反が検出された場合にアラートをトリガー
「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 eBPF | Legacy 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ファイルである:
- ルール(Rules): アラートを生成すべき条件の定義
- マクロ(Macros): ルールや他のマクロ内で再利用できる条件スニペット
- リスト(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 Operator | Kubernetes | 推奨 |
| Helm チャート | Kubernetes | 完全サポート |
| DEB/RPM パッケージ | Linux ホスト | ネイティブインストール |
| Docker コンテナ | コンテナ環境 | 柔軟なデプロイ |
| Tarball | Linux ホスト | ポータブル |
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/HTTPS | HTTPエンドポイントへの送信 | http_output |
| gRPC API | gRPCクライアントへの配信 | 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ルールで評価可能な新しいイベントストリーム |
| カスタムフィールド定義 | イベントから情報を抽出するフィールドの追加 |
| イベントストリーム解析 | キャプチャデータの解析 |
| 非同期イベント注入 | データストリームへのイベント注入 |
公式プラグイン
| プラグイン | イベントソース | 用途 |
|---|---|---|
| CloudTrail | aws_cloudtrail | AWS クラウドアクティビティ監視 |
| Kubernetes Audit | k8s_audit | Kubernetes 監査ログ処理 |
| Okta | okta | IDおよびアクセス管理イベント |
| GitHub | github | GitHubリポジトリアクティビティ |
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
ルール管理のベストプラクティス
- デフォルトルールを直接編集しない: カスタムルールは
falco_rules.local.yamlまたはrules.d/に配置 - 段階的な優先度設定: テスト環境では
INFORMATIONALから開始し、本番環境ではWARNING以上に設定 - 例外の適切な管理: 誤検知を
exceptionsで処理し、ルール条件を複雑にしない - タグの活用: MITRE ATT&CK フレームワークに基づくタグ付けで分類を統一
- バージョン管理: ルールファイルを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としての成熟度と、活発なコミュニティによるサポートが、本番環境での信頼性を保証する。