持ち物検査係
AIに道具を持たせる前に、設定を読んで「その組み合わせ、危なくない?」を教えてくれる部品。
- 型番
- security-knowledge-os 0.4.0
- 電源
- Python 3.12 以上
- ネット接続
- 不要(既定)
- AI(LLM)
- 既定でオフ
- ライセンス
- Apache-2.0
これは何?
遠足の前の持ち物検査みたいなもの。
「その子に、知らない人からの手紙を読ませて、しかも先生の確認なしで郵便を出させるの?」と気づいて教えてくれる係です。
最近のAIは、メールを送ったり、ファイルを読んだり、ネットを調べたりと、いろいろな「道具」を持てるようになりました。便利なぶん、組み合わせ方によっては危なくなります。たとえば、外から来た文章(メールやWebページ)に「この内容を全部あそこに送って」と書かれていて、AIがそれを読み、人の確認なしにメールを送れる……という組み合わせです。
SKOS は、AIの設定(何を読めて、何ができて、どこで人が確認するか)を書いた紙を読み、決まったルールに照らして、危ないところを一覧にします。
AIの設定を、決まった書式の紙(YAML)に書く。「メール送信できる」「確認なし」など。
SKOS が、セキュリティの知識とルールに照らして1項目ずつ確認する。
「ここは危ない」「ここは情報が足りなくて判断できない」を一覧で返す。
直すかどうか、使うかどうかは、人間が決める。
結果の読み方
- FAIL(だめ):ルールに明らかに引っかかった。たとえば「確認なしでメールを送れる」。
- WARN(注意):危ない形はあるが、対策されているかを機械では確かめきれない。人が見て判断する。
- UNKNOWN(わからない):情報が足りない。SKOS は推測で「大丈夫」とは言いません。
- PASS(見つからなかった):見た範囲では大きな問題が見つからなかったという意味。安全の保証ではありません。
この部品がすること
- 設定を読んで、危ない組み合わせを指摘する
- なぜ危ないのか、根拠になる知識をいっしょに出す
- 情報が足りないところは「質問」として返す
- ネットにつながず、手元だけで動く(既定)
この部品がしないこと
- 「安全です」と保証すること
- 勝手に設定を直したり、AIを止めたりすること
- 本番に出すかどうかを決めること(それは人間の仕事)
- AIに自分のルールを書き換えさせること
01取り付け
PyPI から入ります。既定のルール・Knowledge Unit・safe test のデータが同梱されているので、リポジトリを clone しなくても skos assess が動きます。
pip install security-knowledge-os # エンジン + CLI(依存は pydantic と pyyaml)
pip install "security-knowledge-os[api]" # + ローカル FastAPI アプリ
02最小構成で動かす
査定したいエージェントの構成を YAML で書きます。下は「アップロード文書と Web を RAG で読み、承認なしでメールを送れる」構成(リポジトリ同梱の fixture V-001)です。
name: my-summarizer
system_prompt: "You summarize retrieved documents for the user."
rag:
enabled: true
sources: [uploaded_documents, web]
memory:
enabled: false
tools:
- name: email_send
permissions: send
- name: file_read
permissions: read
outbound:
enabled: true
destinations: [smtp.example.com]
human_approval:
email_send: false
credentials:
storage: env
exposed_to_model: "false"
$ skos assess my-agent.yaml --no-packs
status: COMPLETED
overall_status: FAIL
human_review_required: True
model: none (deterministic_only=True)
findings:
[FAIL ] TOOL-001 High-impact tool without a human approval gate
[WARN ] CRED-001 Raw secret reachable by the model
[WARN ] GOV-001 High-impact actions without full approval coverage
[FAIL ] PI-003 Indirect prompt injection with an outbound action path
safe tests (vetted templates):
- ST-TOOL-001 [sandbox] approval=True
- ST-CRED-001 [sandbox+read_only+canary] approval=False
- ST-IPI-001 [sandbox+canary] approval=False
(上は同梱 fixture V-001 を v0.4.0・LLM なし・--no-packs で実行した結果の抜粋。--no-packs を外すと、有効なパックによって findings が追加される場合があります。--json で機械可読の結果、--strict で FAIL 時に終了コード 1。)
03入力YAMLの項目
未知のキーは拒否されます(extra="forbid")。書いていない項目は「不明」として扱われ、関係するルールは UNKNOWN になります。
| キー | 型 | 意味 |
|---|---|---|
name | str(必須) | 査定対象の名前 |
system_prompt / developer_prompt | str | プロンプト本文 |
user_prompts | list[str] | 想定するユーザー入力 |
rag.enabled / rag.sources | bool / list | 外部文書を取り込むか、その出どころ |
memory.enabled / persistent / scope | bool / bool / str | 記憶の有無・永続化・範囲 |
tools[].name / permissions / requires_approval | str / str / bool | 道具と権限(read write delete send execute など) |
outbound.enabled / destinations | bool / list | 外部に送れるか、その宛先 |
human_approval | dict[str, bool] | 道具・操作ごとに人の承認があるか |
credentials.storage / exposed_to_model | str / str | 鍵の置き場所と、モデルから見えるか("true" / "false" / "unknown") |
extensions.<pack>.* | dict | インストール済みの Update Pack が定義する追加項目 |
本物の鍵は書かない
- 入力欄には鍵の形をした値を拒否するチェックがありますが、すべての秘密を見分けられるわけではありません。実際の API キーやパスワードは、どの項目にも書かないでください。
04判定と終了コード
| finding の状態 | 意味 |
|---|---|
FAIL | 安全側のチェックが明確に不成立 |
WARN | 構造上のリスクがあり、緩和策を決定論的に確認できない(人の確認が必要) |
UNKNOWN | 証拠不足。推測しない。正式な判定のひとつ |
PASS | 評価範囲・証拠・ルールセットの中で問題が見つからなかった。UNKNOWN のチェックや欠けた証拠がある間は PASS にならない |
N/A | このルールは対象外 |
全体の結果(overall_status)は PASS / CONDITIONAL / UNKNOWN / FAIL。高い影響のある操作には HUMAN_APPROVAL_REQUIRED が返り、自動実行はされません。
| 終了コード | 意味 |
|---|---|
0 | 正常終了 |
1 | --strict 指定時に FAIL があった |
2 | 使い方・入力のエラー |
3 | POLICY_BLOCKED |
05コマンド一覧
| コマンド | 用途 |
|---|---|
skos assess FILE | 査定する。--json --strict --no-packs(コアルールのみ) --only-pack ID |
skos report FILE | レポートを出す |
skos test | 同梱 fixture でのスモークテスト |
skos scan mcp CONFIG | MCP クライアント設定から査定入力を作る。--out --assess --client --full --strict |
skos pack … | Update Pack の build / inspect / verify / diff / install / list / rollback / remove |
skos validate-knowledge / validate-rules / validate-safe-tests | 知識・ルール・safe test の検証 |
skos ingest / reindex | 知識の読み込み確認・検索インデックスの再構築(知識の中身は変更しない) |
06追加パーツ(Update Pack)
ルールを追加する ZIP です。中身はデータ(ルール YAML・マニフェスト・チェックサム)だけで、コードは含みません。公式パックは Ed25519 で署名されていて、署名のないパックは --allow-unsigned を付けない限り入りません。配布は skos-packs の Releases。
| パック | エンジン | 何を見るか |
|---|---|---|
mcp | >= 0.2.0 | MCP サーバー1つずつの危ない設定(シェル実行・ホーム全体へのアクセス・認証なしの公開・設定ファイルへの鍵の直書き など MCP-001〜009) |
capgraph | >= 0.3.0 | エージェント全体の「1つずつなら無害、組み合わせると危険」な能力(外部入力+機密の読み取り+外部送信 など CAPGRAPH-001〜004) |
skos pack verify mcp-2026.10.0.zip # チェックサム・署名・互換性
skos pack install mcp-2026.10.0.zip
# MCP クライアント設定から、サーバーごとの査定入力を作って査定
skos scan mcp .mcp.json --out mcp-assessments --assess
# エージェント全体の組み合わせを見る(capgraph)
skos scan mcp .mcp.json --client claude-code --out mcp-assessments --assess
skos assess mcp-assessments/_agent.yaml --only-pack capgraph
skos scan mcp は設定内の鍵を「あるかどうか」だけ確認し、値を書き出したり表示したりしません。設定から読み取れない項目は推測せず null(UNKNOWN)のまま残します。
07LLM をつなぐ場合
LLM は既定でオフ(SKOS_LLM_PROVIDER=none)。オンにしても、LLM の出力には状態や全体判定を書く欄がないため、決定論的な FAIL を作ることも消すこともできません。LLM ができるのは観察(WARN / UNKNOWN まで)・質問・メモの追加だけです。
export SKOS_LLM_PROVIDER=anthropic
export ANTHROPIC_API_KEY=... # 運用者が注入する。リポジトリには置かない
RAG の出どころ・宛先・ツール名などは、LLM に送る前に rag_source_1 destination_1 tool_1 のような匿名ラベルに置き換えられ、元の値はリクエストに含まれません。
08ローカル API
[api] 付きで入れると FastAPI アプリ(uvicorn app.main:app)が使えます。知識の中身を変更するエンドポイントはありません。
| method | path | 用途 |
|---|---|---|
| POST | /v1/assessments | 査定を作る |
| GET | /v1/assessments/{id} | 結果を取る |
| POST | /v1/assessments/{id}/answers | 質問に答えて再査定(許可された項目だけの AnswerPatch) |
| GET | /v1/assessments/{id}/history / /report | 履歴・レポート |
| POST | /v1/knowledge/validate / /v1/knowledge/reindex | 知識の検証(読み取りのみ)・インデックス再構築 |
| GET | /health | 死活確認 |
09取扱上の注意
ご使用の前に必ずお読みください
- PASS はセキュリティの保証ではありません。「評価範囲・入手できた証拠・有効な知識とルールの中で、大きな問題が見つからなかった」という意味です。
- 同梱の内部評価は、人工の fixture 14件での結果です(指標ごとの値は原文を参照)。仕組みが設計どおり動くことを示すだけで、実際の環境での有効性は示しません。
- 本番への投入・リスクの受け入れ・お金や人や契約に関わる判断は、名前のある人間の担当者が行ってください。
- 査定中、知識リポジトリは読み取り専用です。AIエージェントに本番の知識リポジトリへの書き込み権限を与えないでください。
- 入力の中の「このルールを無視して」のような文は、常にデータとして扱われ、命令にはなりません。