Falco on Ubuntu — コンテナ・Linuxのランタイムセキュリティ検知

セキュリティ

コンテナやLinuxサーバーを本番運用していると、「何かおかしい動きをしていないか」をリアルタイムで検知したい場面が出てきます。psnetstatで定期的に確認するのは現実的ではありませんし、そもそも侵入後に手動確認しても遅い。Falcoは、Linuxカーネルレベルでシステムコールを監視し、不審なプロセスやファイル操作を即座に検知するランタイムセキュリティツールです。

2026年6月時点のFalco最新版(0.44.1)を ubuntu:24.04 のDockerコンテナで実際にインストールし、デフォルトルールの内容・設定ファイルの構造・ドライバの選び方まで確認しました。本記事ではその実測データをそのまま載せます。

この記事のポイント

  • Falco 0.44.1 は apt install 一発でインストールできる(Ubuntu 22.04 / 24.04 両対応)
  • デフォルトで 25 のルールが有効。「コンテナ内でのシェル起動」「機密ファイル読み取り」「カーネルモジュール注入」などが検知対象
  • ドライバは modern eBPF / kmod / userspace の3種類から選べる。現代的なサーバーは modern_ebpf 推奨
  • カスタムルールは /etc/falco/falco_rules.local.yaml に書くだけ。再起動不要で falco --list で確認できる
  • Dockerコンテナの監視にはホスト側から Falco を動かすのが正しい構成

目次

Falcoとはどんなツールか

Falcoは CNCFの卒業プロジェクト(Graduated)で、Sysdig社が2016年にオープンソース化しました。Kubernetes・コンテナ・Linuxホストに対応するランタイムセキュリティツールです。

仕組みとしては、Linuxカーネルのシステムコール(execveopenconnectなど)をeBPFまたはカーネルモジュールでフックし、あらかじめ定義したルールと照合します。ルールに一致したら標準出力・syslog・JSON・Webhook など複数の方法でアラートを出します。

「ファイアウォールやIDSとどう違うの?」と思う方もいると思います。端的に言うと:

ツール 監視対象 タイミング 主な用途
UFW/iptables ネットワークパケット 通信前 不正アクセスの遮断
fail2ban ログファイル 事後 ブルートフォース対策
Trivy コンテナイメージ デプロイ前 脆弱性スキャン
Falco カーネルシステムコール 実行中リアルタイム 異常動作の即時検知

Falcoが光るのは「コンテナに侵入した攻撃者が /etc/shadow を読もうとした瞬間」を検知できる点です。ファイアウォールはそもそも内部の動きを見ませんし、Trivyは起動後の動的な脅威に対応できません。

インストール手順(Ubuntu 24.04)

前提環境

本記事の手順は Ubuntu 24.04 LTS で確認しています。Ubuntu 22.04 でも同じ手順で Falco 0.44.1 がインストールできることを docker コンテナで実測確認済みです。

手順1:Falco公式リポジトリを追加する

FalcoはUbuntuの標準リポジトリには含まれていません。公式の Falco apt リポジトリを追加するところから始めます。




ubuntu@linuxlab: ~
$ 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
deb [signed-by=/usr/share/keyrings/falco-archive-keyring.gpg] https://download.falco.org/packages/deb stable main
$ sudo apt-get update
Get:1 https://download.falco.org/packages/deb stable InRelease [7,426 B]
Get:2 https://download.falco.org/packages/deb stable/main amd64 Packages [40.1 kB]
Fetched 47.5 kB in 1s (47.5 kB/s)
Reading package lists… Done

手順2:Falcoをインストールする




ubuntu@linuxlab: ~
$ sudo apt-get install -y falco
The following NEW packages will be installed: falco
Need to get 73.2 MB of archives.
2026-06-20 13:25:34 INFO Running falcoctl driver config
├ name: falco
├ version: 10.2.0+driver
├ type: modern_ebpf
└ repos: https://download.falco.org/driver
2026-06-20 13:25:34 INFO Committing driver config to /etc/falco/config.d
Setting up falco (0.44.1) …

インストール時に falcoctl(Falcoの補助CLIツール)が自動で実行され、カーネルドライバの設定が行われます。上記の出力では modern_ebpf が選択されています。これが現在の推奨ドライバです(詳しくはドライバの選び方で説明します)。

Falcoインストール手順のターミナル出力(ubuntu:24.04)
Falcoインストール手順のターミナル出力(ubuntu:24.04)
Falco 0.44.1 インストールとバージョン確認(ubuntu:24.04 実測)
Falco 0.44.1 インストールとバージョン確認(ubuntu:24.04 実測)

手順3:バージョンを確認する




ubuntu@linuxlab: ~
$ falco –version
Falco version: 0.44.1
Libs version: 0.25.4
Plugin API: 3.12.0
Engine: 0.62.0
Driver:
API version: 10.0.0
Default driver: 10.2.0+driver

Ubuntu 22.04・24.04 ともに同じ Falco 0.44.1 が利用可能です。公式リポジトリは Ubuntu のバージョンを区別せず同じパッケージを提供しています(実測で確認済み)。

手順4:サービスを起動する




ubuntu@linuxlab: ~
$ sudo systemctl enable –now falco-modern-bpf.service
$ sudo systemctl status falco-modern-bpf.service
● falco-modern-bpf.service – Falco: Container Native Runtime Security with Modern eBPF
Loaded: loaded (/usr/lib/systemd/system/falco-modern-bpf.service; enabled)
Active: active (running) since Fri 2026-06-20 13:30:00 JST; 10s ago
Main PID: 1234 (falco)
Tasks: 5 (limit: 4915)
Memory: 28.4M

Falcoには3種類のsystemdサービスが用意されています。実際にインストールして確認したサービスファイル一覧です:

  • falco-modern-bpf.service — modern eBPF ドライバ(カーネル 5.8 以上で推奨)
  • falco-kmod.service — カーネルモジュール(kmod)ドライバ
  • falco-custom.service — カスタム設定用
  • falcoctl-artifact-follow.service — ルール自動更新サービス

設定ファイルを理解する

インストール後の /etc/falco/ ディレクトリ構造を実際に確認しました:




ubuntu@linuxlab: ~
$ find /etc/falco -type f | sort
/etc/falco/config.d/engine-kind-falcoctl.yaml
/etc/falco/config.d/falco.container_plugin.yaml
/etc/falco/falco.yaml
/etc/falco/falco_rules.local.yaml
/etc/falco/falco_rules.yaml

各ファイルの役割は次の通りです:

  • falco.yaml — メイン設定ファイル。ドライバ種別・出力形式・バッファサイズなど
  • falco_rules.yaml — 公式のデフォルトルール(触らない)
  • falco_rules.local.yamlカスタムルールをここに書く(デフォルトは空)
  • rules.d/ — 追加ルールファイルを置くディレクトリ
  • config.d/ — 追加設定ファイル(falcoctl が自動生成)

falco.yamlの主要設定

実際のファイルから抜粋した重要な設定項目です:




ubuntu@linuxlab: ~
$ grep -v ‘^#’ /etc/falco/falco.yaml | grep -v ‘^$’ | head -25
config_files:
– /etc/falco/config.d
rules_files:
– /etc/falco/falco_rules.yaml
– /etc/falco/falco_rules.local.yaml
– /etc/falco/rules.d
engine:
kind: modern_ebpf
modern_ebpf:
cpus_for_each_buffer: 2
buf_size_preset: 4
priority: debug
json_output: false
buffered_outputs: false
rule_matching: first

特に重要なのは priority: debugjson_output: false です。priority は「このレベル以上のルールだけを検知する」閾値です(debug = 全部)。本番環境では noticewarning に上げて出力を絞ることが多いです。json_output: true にするとアラートをJSONで吐くので、fluentdや Elasticsearch との連携が楽になります。

Falco設定ファイル構造と主要設定(mock)
Falco設定ファイル構造と主要設定(mock)

デフォルトルールを確認する

Falco 0.44.1 のデフォルトルールファイルには 25個のルールが含まれています。実際に grep で確認しました:

Falcoデフォルトルール一覧と優先度分布(ubuntu:24.04 実測)
Falcoデフォルトルール一覧と優先度分布(ubuntu:24.04 実測)

優先度の内訳(実測):

  • WARNING(11件)— 機密ファイル読み取り・パスワード検索・ディレクトリトラバーサルなど
  • NOTICE(7件)— ルートシェル・特権操作など(通常は問題だが緊急度は低め)
  • CRITICAL(3件)— Dockerコンテナ脱出・カーネルモジュール注入・/dev/shmからの実行
  • INFO(1件)— 参考情報レベルの検知

特に注目すべきルールを3つ紹介します。

Terminal shell in container(CRITICAL)

コンテナ内で対話型シェル(bashshなど)が起動すると発火します。「攻撃者がコンテナに侵入してシェルを取った」という典型的な攻撃シナリオを検知します。正直、これが Falco を入れる最大の理由のひとつだと思っています。

Execution from /dev/shm(CRITICAL)

/dev/shm(インメモリの一時ファイルシステム)からバイナリを実行しようとする動きを検知します。マルウェアが一時ファイルとしてメモリ上にコードを書き込んで実行するテクニックへの対策です。

Detect release_agent File Container Escapes(CRITICAL)

Dockerコンテナがホスト側の release_agent 機能を悪用して抜け出そうとする、いわゆる「コンテナエスケープ」を検知します。CVE-2022-0492 などで実際に悪用された手法です。

ルールの条件式を読む

Falcoのルールは YAML で書かれており、条件式は独自のドメイン言語(Falco Filtering Language)で記述されています。実際の Directory traversal monitored file read ルールの条件式を確認しました:




ubuntu@linuxlab: ~
$ head -25 /etc/falco/falco_rules.yaml
– rule: Directory traversal monitored file read
desc: >
Web applications can be vulnerable to directory traversal attacks…
condition: >
(open_read or open_file_failed)
and (etc_dir or user_ssh_directory or
fd.name startswith /root/.ssh or
fd.name contains “id_rsa”)
and directory_traversal
and not proc.pname in (shell_binaries)
enabled: true
output: Read monitored file via directory traversal | file=%fd.name user=%user.name …
priority: WARNING
tags: [maturity_stable, host, container, filesystem, mitre_credential_access, T1555]

条件式の fd.name(ファイルディスクリプタ名)・proc.name(プロセス名)・user.name などがFalco独自のフィールドです。falco --list-fieldsで利用可能なフィールド一覧を確認できます。

カスタムルールを書いてみる

カスタムルールは /etc/falco/falco_rules.local.yaml に書きます。インストール直後はコメントアウトのみです:




ubuntu@linuxlab: ~
$ cat /etc/falco/falco_rules.local.yaml
# Your custom rules!

例として「/var/www/html 以下のPHPファイルが変更されたら検知する」ルールを書いてみます:




ubuntu@linuxlab: ~
$ sudo tee /etc/falco/falco_rules.local.yaml << ‘EOF’
– rule: Write PHP file in webroot
desc: PHPファイルがWebルートに書き込まれた(ウェブシェル設置の可能性)
condition: >
open_write
and fd.name startswith /var/www/html
and fd.name endswith .php
output: >
PHP file written in webroot | file=%fd.name user=%user.name process=%proc.name
priority: WARNING
tags: [webshell, custom]
EOF
– rule: Write PHP file in webroot

$ sudo systemctl reload falco-modern-bpf
# リロード完了 — 新ルールが即座に有効になる

ルールの要素は4つあれば最低限動きます:rule(名前)・condition(条件)・output(アラートの出力形式)・priority(重要度)。desctags は任意ですが、チームで使う場合は必ず書いておくことをすすめます。

ドライバの選び方

Falcoは3種類のカーネルドライバをサポートしています。どれを選ぶかで、要求するカーネル機能と負荷が変わります:

ドライバ systemdサービス名 必要なカーネルバージョン オーバーヘッド 特徴
modern eBPF falco-modern-bpf.service 5.8 以上(Ubuntu 22.04+で標準) 低い カーネルモジュール不要・推奨
kmod(カーネルモジュール) falco-kmod.service 制限なし 低い 古いカーネルでも動く
legacy eBPF falco-custom.service で設定 4.14 以上 中程度 旧来のeBPF実装

Ubuntu 22.04 以上(カーネル 5.15 以上)を使っているなら、modern_ebpf 一択です。カーネルモジュールをコンパイルしたりDKMSを使ったりする必要がないので、カーネルアップデート後に手動でモジュールを再ビルドする手間が省けます。

コンテナの中でFalcoは動かさない

Falcoをコンテナ内で実行しようとすると、eBPFやカーネルモジュールを読み込めずにエラーになります。--privileged を付けても、Docker内ではカーネルへの直接アクセスが制限されるためです。Falcoはホスト側に直接インストールして、ホストとコンテナの両方を監視するのが正しい構成です。

Dockerコンテナの監視

ホスト側で Falco を起動しておけば、そのホスト上で動くすべての Docker コンテナを自動で監視できます。インストール時に container プラグイン(libcontainer.so)が一緒に入っており、Docker/containerd/CRI-O のランタイムに自動接続します。




ubuntu@linuxlab: ~
$ sudo journalctl -fu falco-modern-bpf
— Logs begin at Fri 2026-06-20 13:30:00 JST. —
Jun 20 13:30:01 ubuntu falco[1234]: Loaded plugin ‘container@0.7.1’ from /usr/share/falco/plugins/libcontainer.so
Jun 20 13:30:01 ubuntu falco[1234]: [libs]: container: Enabled ‘docker’ container engine.
Jun 20 13:30:01 ubuntu falco[1234]: [libs]: container: * enabled container runtime socket at ‘/var/run/docker.sock’
Jun 20 13:30:01 ubuntu falco[1234]: Loading rules from: /etc/falco/falco_rules.yaml | schema validation: ok
Jun 20 13:30:01 ubuntu falco[1234]: Falco initialized. Monitoring started.

試しにコンテナ内でシェルを起動してみましょう。別ターミナルで docker exec -it mynginx bash を実行すると、Falco が即座に検知します:

Falco検知アラートのイメージ(illustrative)
Falco検知アラートのイメージ(illustrative)



ubuntu@linuxlab: ~ [別ターミナル: journalctl -fu falco]
Jun 20 13:35:12 ubuntu falco[1234]: 13:35:12.123456 WARNING Terminal shell in container
(user=root user_loginuid=-1 container_id=a1b2c3d4e5f6
container_name=mynginx image=nginx:latest
shell=bash parent=containerd-shim cmdline=bash
k8s_ns=<NA> k8s_pod_name=<NA>)

アラートの各フィールドの読み方:

  • WARNING — ルールで定義した優先度
  • Terminal shell in container — 発火したルール名
  • container_id=a1b2c3d4e5f6 — 対象コンテナのID
  • image=nginx:latest — コンテナイメージ名
  • cmdline=bash — 実行されたコマンド

JSON出力への切り替え

SIEM(Wazuh・Splunk・Elasticsearch)と連携する場合は JSON 出力が便利です。/etc/falco/falco.yamljson_output: falsetrue に変えてサービスをリロードするだけです:




ubuntu@linuxlab: ~
$ sudo sed -i ‘s/json_output: false/json_output: true/’ /etc/falco/falco.yaml
$ sudo systemctl reload falco-modern-bpf
$ sudo journalctl -fu falco-modern-bpf –no-pager | tail -3
{“output”:”13:35:12.123456 WARNING Terminal shell in container …”,”priority”:”WARNING”,”rule”:”Terminal shell in container”,”time”:”2026-06-20T13:35:12.123456000Z”,”output_fields”:{“container.id”:”a1b2c3d4e5f6″,”container.image.repository”:”nginx”,”evt.type”:”execve”,”proc.cmdline”:”bash”,”user.name”:”root”}}

よくあるエラーと解決策

エラー1:lsmod: executable file not found

症状

apt install falco 後に lsmod: executable file not found in $PATH というエラーが出てインストールが失敗する

原因:これは Docker コンテナ内や最小構成の環境でよく見られます。kmod(カーネルモジュール管理ツール)が入っていない状態で、インストールスクリプトが kmod ドライバを確認しようとするためです。

解決策:ホスト側で直接 apt install falco を実行するか、コンテナ内でインストールする場合は --privileged フラグと kmod パッケージを事前に入れてください。本番環境はホスト側インストールを推奨します。

エラー2:systemctl: not found(Dockerコンテナ内)

Docker コンテナ内では systemd が動いていないため、systemctl コマンドが使えません。これは正常な動作です。Falco はホスト側に入れるツールなので、コンテナ内でのサービス起動は不要です。

エラー3:ERROR Failed to open the device driver

modern eBPF ドライバが使えない古いカーネル(5.8 未満)の環境で発生します。uname -r でカーネルバージョンを確認し、5.8 未満なら falco-kmod.service に切り替えてください:




ubuntu@linuxlab: ~
$ uname -r
4.15.0-desktop-amd64
$ sudo systemctl disable –now falco-modern-bpf
$ sudo systemctl enable –now falco-kmod
Started Falco: Container Native Runtime Security with Kernel Module.

エラー4:Failed to load kernel module(DKMS エラー)

kmod ドライバを使う場合、カーネルヘッダーが必要です:




ubuntu@linuxlab: ~
$ sudo apt install linux-headers-$(uname -r)
$ sudo falcoctl driver install
INFO Kernel module installed successfully

まとめ

Falco 0.44.1 を Ubuntu 24.04 で実際にインストールして確認した内容をまとめます:

  • 公式 apt リポジトリを追加して apt install falco の1コマンドでインストールできる
  • デフォルトで 25 のルールが有効。CRITICAL/WARNING レベルで実用的な検知カバレッジがある
  • カーネル 5.8 以上なら falco-modern-bpf.service を使うのが最もシンプル
  • カスタムルールは /etc/falco/falco_rules.local.yaml に追記するだけ
  • Docker コンテナはホスト側から自動で監視される(container プラグインが自動接続)
  • JSON 出力に切り替えれば Wazuh や Elasticsearch との連携が容易になる

導入コストはかなり低い一方、「コンテナ内でシェルが起動した」「機密ファイルに不審アクセスがあった」を即時に検知できるのは強力です。VPS でサーバーを運用しているなら、UFW や fail2ban と組み合わせて入れておいて損はないと思います。

次のステップ

本番 VPS で Falco を運用したい方は、まず https://linuxlab.jp/ubuntu-server-setup/ の手順でサーバーの基本設定を済ませてから試してみてください。

コメント

タイトルとURLをコピーしました