
動作を変更する前に、リポジトリの目的、コンポーネント、スコープの概要については OVERVIEW.md を参照してください。
MCP サーバーとして公開される修復オーケストレーターです。MCP クライアント(Claude Desktop、Claude Code など)を接続し、自然言語のリクエストを送信します。例えば:
ホスト a.b.c にログインし、インストール済みパッケージを確認し、CVE を見つけて、修正を提案してください - 可能であれば Ansible で、そしてそれがどのコンプライアンス管理項目にマッピングされるか教えてください。
prescryb はプリミティブ(SSH インベントリ、CVE マッチング、ライブアドバイザリ検索、コンプライアンストピックのマッピング、Ansible プレイブックのレンダリング)を提供します。接続されたモデルが推論を行います: どの検出結果が重要か、どの CVE を掘り下げるか、どのプレイブックを生成するか。prescryb はターゲットホストに対して何も適用しません - すべてのツールはターゲットに対して読み取り専用であるか、純粋なテキスト/データ生成です。
| ツール | 機能 |
|---|---|
inventory_host(host, user="", port=22, hostname="", identity_file="", trust_unknown_host=False) | SSH で接続し、ディストリビューションを検出し、インストール済みパッケージをバージョン付きで一覧表示します。 |
check_cves(system, packages) | パッケージのバージョンを OSV.dev に対してバッチマッチングします。エコシステムを考慮したバージョン比較を使用します(名前のみのマッチングではありません)。各マッチには EPSS 悪用確率スコアが付加されます。 |
fetch_advisory(cve_id) | 1 つの CVE の現在の NVD レコード - 説明、CVSS、CWE、参照 - をライブで取得します(トレーニングデータからではありません)。 |
fetch_epss(cve_ids) | check_cves でまだカバーされていない CVE ID(例: fetch_advisory や Web 検索から得たもの)の EPSS 悪用確率スコアをバッチ取得します。 |
map_compliance(area) | 自由記述のトピック("ssh"、"sudo"、"kernel modules" など)を CIS/DISA STIG のトピック領域にマッピングし、konstruktoid.hardening GitHub リポジトリに存在する場合は対応するロールもマッピングします - さらにその領域が対処する MITRE ATT&CK のテクニックと緩和策も示します。 |
lookup_cce(target, keyword, cce_id) | プラットフォーム(例: "rhel8")の NIST CCE(Common Configuration Enumeration)エントリを検索します。データは konstruktoid/cce-web のコミュニティ JSON 変換に由来します。 |
list_cce_targets() | lookup_cce がクエリ可能なすべてのプラットフォームを一覧表示します。 |
list_local_docs() | ローカルの gitignore 対象である LOCAL_DOCS_DIR 配下で見つかったドキュメント(Markdown/テキスト/PDF)を一覧表示します。 |
search_local_docs(query, top_k=5) | それらのローカルドキュメントに対する RAG スタイルのセマンティック検索で、完全にマシン上で埋め込みを行います。 |
generate_playbook(system, cve_matches, compliance_areas, hosts_alias) | 提案のみの Ansible プレイブックをレンダリングします: CVE 修正はパッケージアップグレードタスクになり、コンプライアンス領域は roles: 参照になります。 |
典型的なフロー: inventory_host、次に返されたパッケージに対して check_cves、次に必要に応じて興味深い CVE に対して fetch_advisory、次に気づいた安全でない設定領域に対して map_compliance(および lookup_cce)、次に必要に応じて関連する内部ランブック/ポリシーのコンテキストを search_local_docs で検索、最後にレビューするものを生成するために generate_playbook を実行します。
flowchart TD
U["Operator: natural-language request"] --> M["Connected model\n(Claude Desktop / Claude Code)"]
M --> A["inventory_host\nSSH in, list packages"]
A --> B["check_cves\nOSV.dev match + EPSS score"]
B --> C{"Interesting\nCVE?"}
C -->|yes| D["fetch_advisory\nNVD detail for one CVE"]
C -->|no| E
D --> E["map_compliance / lookup_cce\nCIS/DISA STIG + ATT&CK mapping"]
E --> F["search_local_docs\ninternal runbooks (optional)"]
F --> G["generate_playbook\nsuggest-only Ansible playbook"]
G --> H["Model reasons over the results\nand presents findings + playbook"]
H --> R["Operator reviews\n(ansible-playbook --check --diff)\nand applies manually"]
style R fill:#f9f,stroke:#333,stroke-width:1px
prescryb のツールボックスは inventory_host、check_cves、
fetch_advisory、map_compliance/lookup_cce、search_local_docs、
generate_playbook のみです。それぞれは読み取り専用の検索、または純粋な
テキスト/データ生成呼び出しです。オペレーターと接続されたモデルは prescryb
の一部ではなく、このチェーン内のいかなるものも inventory_host の
読み取り専用 SSH セッション以外ではターゲットホストに触れません。生成された
プレイブックの適用は、オペレーターが prescryb の外部で行う意図的かつ
独立したステップです。
uv sync
Claude Code:
claude mcp add prescryb -- uv --directory /path/to/prescryb run prescryb
Claude Desktop (claude_desktop_config.json):
{
"mcpServers": {
"prescryb": {
"command": "uv",
"args": ["--directory", "/path/to/prescryb", "run", "prescryb"]
}
}
}
inventory_host はパスワード引数を一切受け付けません。MCP ツール呼び出しの引数はクライアントによってログに記録される可能性があり、接続されたモデルからも見えるため、認証情報をそれらに流してはなりません。認証は、自分で ssh host を実行する場合とまったく同じように動作します:
~/.ssh/config から解決されます。inventory_host の hostname/identity_file 引数は、解決されたアドレス/鍵パスを直接上書きします。これは ~/.ssh/config に追加したくないホスト向けです(パスのみが渡され、鍵の内容が渡されることはありません)。trust_unknown_host=True を渡さない限り拒否されます。代わりに一度手動で ssh host を実行して鍵を固定することを推奨します。qemu/vm.sh は、cloud-init シードと 127.0.0.1 上の SSH ポートフォワード(2201、2202、2203)を備えたクラウドイメージ(almalinux10、trixie、resolute)を QEMU 上で起動します。必要なものは qemu-system-x86_64、qemu-img、cloud-localds(cloud-image-utils)、curl、ssh です。/dev/kvm が書き込み可能な場合は KVM が使用されます。イメージはチェックサム検証され、qemu/.state/ にキャッシュされます。
qemu/vm.sh up trixie
qemu/vm.sh ssh trixie true # retry until the guest answers
claude 'inventory 127.0.0.1 port 2202 user prescryb with identity file
qemu/.state/id_ed25519 (trust_unknown_host is fine, it is a throwaway VM),
check any vulnerabilities and suggest a fix, include compliance mapping if
possible, write the playbook suggestion to /tmp/ and print the file location'
qemu/vm.sh destroy trixie
ssh 経由で既に到達可能なホスト(~/.ssh/config、エージェントキー、またはデフォルトの identity ファイルで解決される)については、ホスト名を直接指定します。ポートや identity ファイルの設定は不要です:
インベントリ prod-web-01、インストール済みパッケージを確認し、CVE を見つけ、修正を提案して - 可能なら Ansible で、そしてそれがどのコンプライアンス管理項目にマッピングされるか教えて。
ホストがまだ ~/.ssh/config にない場合は、Host ブロックを追加するか、単発の接続のために user/port/hostname/identity_file を直接 inventory_host に渡してください - 以下の molecule の例と同じです。
molecule converge -s default
そのシナリオの molecule.yml のプラットフォームエントリから ssh_port/ssh_user を見つけ(例:almalinux10 プラットフォームの場合は ssh_port: 22201、ssh_user: almalinux)、molecule login が接続に使用する秘密鍵を特定します。~/.ssh/config に Host ブロックを追加するか、ファイルを完全に省略して、使い捨ての一時的な接続のためにそれらを直接 inventory_host に渡します:
インベントリ 127.0.0.1、ポート 22201、ユーザー almalinux、identity_file /path/to/molecule's/generated/key、インストール済みパッケージを確認し、CVE を検出し、 修正案を提示してください - 可能であれば Ansible で、そしてそれがどのコンプライアンス コントロールにマッピングされるかを教えてください。
終了したら molecule destroy -s default を実行してください。prescryb はそれを代行せず、読み取り以外の形でインスタンスに触れることもありません。
map_compliance はトピック領域(例:「SSH Server Configuration」)を指定し、konstruktoid/ansible-collection-hardening GitHub リポジトリ内で見つかった場合は、それを実装する Ansible ロールへのリンクも示します。
デフォルトでは konstruktoid/ansible-collection-hardening に対して GitHub API をクエリします。上書きするには:
export HARDENING_COLLECTION_REPO=owner/repo
GITHUB_TOKEN を設定して、(そうでなければ低い)未認証の GitHub API レート制限を引き上げてください。ロールがリポジトリ内に見つからない場合でも、map_compliance はトピック/フレームワーク/ロール名を返すため、何をインストールすべきかがわかります(ansible-galaxy collection install konstruktoid.hardening)。
lookup_cce は NIST Common Configuration Enumeration のエントリを検索します。これは個々の構成チェックに対する一意の識別子であり、上記のトピック領域ごとの CIS/DISA STIG マッピングとは異なります。NIST は CCE をスプレッドシートとしてのみ公開しているため、このツールは Excel を解析する代わりに、コミュニティプロジェクト konstruktoid/cce-web がホストする事前変換済みの JSON エクスポートを読み込みます。
カバレッジはトピック単位ではなくプラットフォーム単位であり、このプロジェクトの対象ディストリビューションに対しては薄いものです。利用可能なデータがあるのは RHEL ファミリー(rhel6/rhel7/rhel8 — AlmaLinux/Rocky は対応するアップストリームの RHEL 番号を使用)と SUSE(SLES12-DISA-STIG/SLES15-DISA-STIG/SLES15-PCI-DSS)のみです。Debian、Ubuntu、Alpine、Arch にはアップストリームに CCE データが一切ありません。一部の古い cce-web エクスポート(例: rhel4、rhel5、apache-httpd2.2)は、アップストリームの Excel から JSON への変換時に列ヘッダーを失っています。これらは文字化けしたフィールドを返すのではなく、未サポートとして報告されます。list_cce_targets を呼び出すと、非 Linux のもの(firefox、win2k8r2 など)を含む公開されているすべてのプラットフォームを確認できます。
ソースリポジトリを次のように上書きします:
export CCE_REPO=owner/repo