kevward という防御系CLIツールを作ってOSS公開しました(AGPL-3.0)。
Ubuntu/Debianサーバに入れて実行すると、パッチ状況・CISA KEV(実際に悪用中のCVE)との突合・攻撃元IPを、依存ほぼゼロで1枚の自己完結HTMLにまとめます。
pipx install kevward で入ります。
GitHub: https://github.com/ForexRobotics/kevward
PyPI: https://pypi.org/project/kevward/
pipx install kevward
sudo kevward report --trends -o report.html
##なぜ作ったか
生成AIの登場で、攻撃コードやフィッシングが以前より少ない手間で量産されるようになり、サーバへの攻撃は体感でも明らかに増えています。そんな中、サーバ運用で毎朝気になるのは、だいたい次の3つです。
このサーバ、何が脆弱/古いのか?
誰に攻撃されているのか?
世の中で今まさに悪用されている脆弱性のうち、自分に効くものはあるか?
これに答えるツールは単機能では色々あります(スキャナ、fail2ban、SIEM…)。でも「スキャンだけ」「IPブロックだけ」「全部入りで重い(Wazuh等)」のどれかに寄りがちで、小さなサーバで"まず現状把握したい"フェーズにちょうどいいものが意外と無い。
そこで、1ホストに1本入れるだけで上の3つに答える軽量ツールを作りました。SIEMを立てるほどじゃない中小サーバや、"とりあえず自分のサーバの健康診断がしたい"人向けです。
私は以前、トレンドマイクロでウイルスバスターの開発責任者をしていました。kevwardはそれとは比べ物にならないくらい小さな、自分のサーバの痒いところに手が届く週末プロジェクトです。
##何ができるか?
① パッチ状況(posture)
apt管理のパッケージ(base system / nginx / Apache / PHP / MySQL / MariaDB / PostgreSQL / Redis / OpenSSH / ufw)の保留中のセキュリティ更新・マイナー更新を検出。加えて Composer/Laravel・Node.js/npm・WordPress は**依存アドバイザリの監査(レポート専用)**を行います。
kevward check # 何も変更せず現状だけ表示
② CISA KEV 突合 ← ここが肝
CISA KEV カタログは「実際に悪用が観測されているCVE」の公式リストです。理論上のCVEの洪水ではなく「今まさに攻撃に使われているやつ」。
kevwardはこれをホストに実際に入っているソフトだけと突き合わせます。
kevward trends
CISA KEV catalog: 1760 CVEs (fresh)
matched to detected software (laravel, linux, nginx, openssh, php, ubuntu): 44
note: name-level match — confirm version applicability per CVE.
CVE-2026-109618 php group/php (added 2026-10-26)
CVE-2024-4577 php group/php (added 2024-06-12) [ransomware]
...
正直な限界: 突合は「製品名レベル」で、バージョン単位の該当までは見ていません。「該当の可能性」として出すので、最終的には各CVEをバージョンで確認する前提です。ここは将来 Ubuntu USN / OVAL と連携してバージョン単位に絞りたいところ。
(余談:この"製品名レベル"の突合、最初は脆弱性の説明文まで検索対象にしていて、Zimbraの「...PHP Remote File Inclusion」みたいな説明文中の"PHP"に誤反応していました。vendor/productだけに絞って解決。実データで回すとこういうのがすぐ見つかって面白い)
③ 攻撃元IPの可視化
fail2banのban履歴と、sshdの認証失敗ログを集計して、攻撃元IPを棒グラフでレポートに出します。実サーバで回すと「185.x.x.x がダントツ(sshd失敗305回)」みたいなのが一目で分かります。
プラグイン構造:1ファイルでサービス追加
対応サービスを増やすのは1ファイル置くだけ(自動discovery、中央のリストを編集しない設計)。
# kevward/plugins/redis.py
from ._apt import AptServicePlugin
from ..plugin import register
@register
class RedisPlugin(AptServicePlugin):
name = "redis"
packages = ["redis-server", "redis-tools"]
kev_terms = ["redis"]
これだけで、セキュリティ更新検出・マイナー更新検出・安全なapply・KEV突合が全部つきます。
領域 対応サービス
基盤 apt(ホスト全体の更新・再起動検出)
Webサーバ nginx, Apache
DB MySQL, MariaDB, PostgreSQL, Redis
ランタイム PHP, Node.js
アプリ Composer/Laravel, WordPress(レポート専用)
アクセス OpenSSH(sshd), ufw
安全設計
セキュリティツール自身が事故を起こしたら本末転倒なので、デフォルトを徹底的に安全側に倒しています。
デフォルト読み取り専用:check / report / trends は一切変更しない
applyは明示:--yes なしはドライラン。セキュリティ更新のみ、マイナー更新は--minor
再起動は二重ゲート:allow_reboot=true かつ --reboot の両方が揃って初めて実行
リスクの高いものはレポート専用:Composer/Laravel・Node・WordPressは監査のみで自動更新しない(依存のbumpはアプリ所有者の判断)
防御専用:リモートホストには一切触れない。hack-back機能は無いし、PRでも受け付けない
定期実行
systemdのタイマーを同梱。毎朝レポートを自動生成できます。
sudo systemctl enable --now kevward-report.timer
##技術的なところ
Python 3.10+(Ubuntu 22.04以降)。依存は3.10のときのtomliだけ、3.11+なら標準ライブラリtomllibで依存ゼロ。
レポートは外部アセットなしの単一HTML(light/dark対応)。scpで持ち出してもそのまま開ける。
エージェント不要・管理サーバ不要。1台のサーバだけで完結。
CI(ruff + スモークテスト)、Trusted Publishing(OIDC)でタグpush→PyPI自動公開。
##位置づけ
CrowdSecやWazuhの競合ではなく補完です。あれらを入れるほどじゃない規模や、"まず現状を知りたい"段階に刺さります。将来はCrowdSec CTIとの突合や、収集イベントの時系列集約(SQLite/ClickHouse)も考えています。
##おわりに
フィードバック歓迎です。特に KEV突合の精度(name-levelをどうバージョン単位に寄せるか) と、次に対応すべきサービスについて意見をもらえると嬉しいです。
GitHub: https://github.com/ForexRobotics/kevward
PyPI: https://pypi.org/project/kevward/
License: AGPL-3.0
