deploying-osquery-for-endpoint-monitoring について
osqueryを端末群に導入・運用するためのセキュリティチーム向けガイドです。SQLによる脅威ハンティング、定期クエリ、ログ設定、FleetDMでの一元管理を扱います。
主な機能
- 01複数OSへのosquery導入
- 02SQLによる端末状態の照会
- 03定期クエリとログの設定
- 04FleetDMによるフリート管理
- 05クエリ負荷とイベントテーブルの確認
活用シーン
- 01異なるOSの端末群へosqueryを展開
- 02ファイルレスプロセスや不審なポートの調査
- 03ソフトウェア、サービス、ポートの適合性確認
- 04結果ログを一元分析の仕組みに送信
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill deploying-osquery-for-endpoint-monitoringインストール後、Claude Code で/deploying-osquery-for-endpoint-monitoringを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
LICENSEassets/template.mdreferences/api-reference.mdstandards.mdworkflows.mdscripts/agent.pyprocess.py詳細
エンドポイント監視のための Osquery のデプロイ
使用する場面
次のような場合にこのスキルを使用します。
- Windows、macOS、Linux のエンドポイント全体に osquery をデプロイして、フリート全体の可視性を確保する
- osquery の SQL インターフェースを使用して、脅威ハンティング用クエリを作成する
- エンドポイントのコンプライアンス(インストール済みソフトウェア、開放ポート、実行中のサービス)を監視する
- osquery データを SIEM または Kolide/Fleet と統合し、一元管理する
リアルタイムのアラートには使用しないでください(osquery は定期実行またはオンデマンドであり、リアルタイムには EDR を使用してください)。
前提条件
- 対象 OS 用の Osquery パッケージ(https://osquery.io/downloads)
- エンタープライズデプロイ用のフリート管理サーバー(Kolide Fleet または FleetDM)
- エージェントとサーバー間の安全な通信に使用する TLS 証明書
- osquery の結果ログ用のログ集約パイプライン(Filebeat、Fluentd)
ワークフロー
ステップ 1:Osquery をインストールする
# Ubuntu/Debian
export OSQUERY_KEY=1484120AC4E9F8A1A577AEEE97A80C63C9D8B80B
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys $OSQUERY_KEY
add-apt-repository 'deb [arch=amd64] https://pkg.osquery.io/deb deb main'
apt-get update && apt-get install osquery -y
# Windows (MSI)
# Download from https://osquery.io/downloads/official
msiexec /i osquery-5.12.1.msi /quiet
# macOS
brew install osquery
ステップ 2:Osquery を設定する
// /etc/osquery/osquery.conf (Linux/macOS) or C:\ProgramData\osquery\osquery.conf
{
"options": {
"config_plugin": "filesystem",
"logger_plugin": "filesystem",
"logger_path": "/var/log/osquery",
"disable_logging": "false",
"schedule_splay_percent": "10",
"events_expiry": "3600",
"verbose": "false",
"worker_threads": "2",
"enable_monitor": "true",
"disable_events": "false",
"disable_audit": "false",
"audit_allow_config": "true",
"host_identifier": "hostname",
"enable_syslog": "true"
},
"schedule": {
"process_monitor": {
"query": "SELECT pid, name, path, cmdline, uid, parent FROM processes WHERE on_disk = 0;",
"interval": 300,
"description": "Detect processes running without on-disk binary (fileless)"
},
"listening_ports": {
"query": "SELECT DISTINCT p.name, p.path, lp.port, lp.protocol, lp.address FROM listening_ports lp JOIN processes p ON lp.pid = p.pid WHERE lp.port != 0;",
"interval": 600,
"description": "Monitor listening network ports"
},
"persistence_check": {
"query": "SELECT name, path, source FROM startup_items;",
"interval": 3600,
"description": "Monitor persistence mechanisms"
},
"installed_packages": {
"query": "SELECT name, version, source FROM deb_packages;",
"interval": 86400,
"description": "Daily software inventory"
},
"users_and_groups": {
"query": "SELECT u.username, u.uid, u.gid, u.shell, u.directory FROM users u WHERE u.uid >= 1000;",
"interval": 3600
},
"crontab_monitor": {
"query": "SELECT * FROM crontab;",
"interval": 3600,
"description": "Monitor scheduled tasks"
},
"suid_binaries": {
"query": "SELECT path, username, permissions FROM suid_bin;",
"interval": 86400,
"description": "Detect SUID binaries"
}
},
"packs": {
"incident-response": "/usr/share/osquery/packs/incident-response.conf",
"ossec-rootkit": "/usr/share/osquery/packs/ossec-rootkit.conf",
"vuln-management": "/usr/share/osquery/packs/vuln-management.conf"
}
}
ステップ 3:脅威ハンティング用クエリ
-- Detect processes with no on-disk binary (potential fileless malware)
SELECT pid, name, path, cmdline FROM processes WHERE on_disk = 0;
-- Find listening ports not associated with known services
SELECT lp.port, lp.protocol, p.name, p.path
FROM listening_ports lp JOIN processes p ON lp.pid = p.pid
WHERE lp.port NOT IN (22, 80, 443, 3306, 5432);
-- Detect unauthorized SSH keys
SELECT * FROM authorized_keys WHERE NOT key LIKE '%admin-team%';
-- Find recently modified system binaries
SELECT path, mtime, size FROM file
WHERE path LIKE '/usr/bin/%' AND mtime > (strftime('%s', 'now') - 86400);
-- Detect processes connecting to external IPs
SELECT DISTINCT p.name, p.path, pn.remote_address, pn.remote_port
FROM process_open_sockets pn JOIN processes p ON pn.pid = p.pid
WHERE pn.remote_address NOT LIKE '10.%'
AND pn.remote_address NOT LIKE '172.16.%'
AND pn.remote_address NOT LIKE '192.168.%'
AND pn.remote_address != '127.0.0.1'
AND pn.remote_address != '0.0.0.0';
-- Windows: Detect unsigned running executables
SELECT p.name, p.path, a.result AS signature_status
FROM processes p JOIN authenticode a ON p.path = a.path
WHERE a.result != 'trusted';
ステップ 4:一元管理のために FleetDM をデプロイする
# FleetDM provides centralized osquery management
# Deploy FleetDM server, configure agents to report to it
# Agents use TLS enrollment and config from Fleet
# Agent configuration for Fleet:
# --tls_hostname=fleet.corp.com
# --tls_server_certs=/etc/osquery/fleet.pem
# --enroll_secret_path=/etc/osquery/enroll_secret
主な概念
| 用語 | 定義 |
|---|---|
| Osquery | OS の状態をクエリ可能な SQL テーブルとして公開する、オープンソースのエンドポイントエージェント |
| スケジュール | 定義された間隔で実行され、結果を記録する定期クエリ |
| パック | 特定のユースケース(IR、コンプライアンス)向けにまとめられた、関連クエリのコレクション |
| FleetDM | オープンソースの osquery フリート管理プラットフォーム |
| 差分結果 | Osquery はクエリ実行間の変更のみをログに記録し、データ量を削減します |
ツールとシステム
- Osquery: https://osquery.io/ - エンドポイント可視化エージェント
- FleetDM: https://fleetdm.com/ - フリートの一元管理
- Kolide: Slack と統合されたクラウドベースの osquery 管理
- osquery-go: osquery 拡張機能用の Go クライアントライブラリ
よくある落とし穴
- クエリのパフォーマンス:大規模なテーブルスキャンを伴う複雑なクエリは、エンドポイントのパフォーマンスに影響します。WHERE 句を使用し、
EXPLAINでクエリのコストをテストしてください。 - スケジュール間隔が短すぎる:負荷の高いクエリを 60 秒ごとに実行すると、CPU 使用率が急上昇します。ほとんどのクエリでは 300~3600 秒の間隔を使用してください。
- 差分モードを使用していない:差分ログを使用しない場合、osquery は各間隔で全結果をログに記録します。差分モードでは変更のみが記録されます。
- イベントテーブルがない:一部の osquery テーブルではイベントフレームワークを有効にする必要があります(process_events、socket_events)。
--disable_events=falseで有効にしてください。
コメント
Markdown 対応