Organisation: Example Corp(サンプル株式会社)
Prepared for: [TO FILL: IT / Information Security Department]
Security contact: security@example.com
Generated: 2026-08-16T15:03:20.847173+00:00 (Aigis v1.2.0)
Claude Code is Anthropic's command-line coding agent. It reads and edits
files, runs shell commands, fetches web content, and can call external
tools (including Model Context Protocol servers) on a developer's machine
to complete software-engineering tasks autonomously. Because it executes
real actions on a real workstation, an uncontrolled deployment is a
meaningful operational and security risk.
Aigis is a zero-dependency, open-source guardrail layer that sits between
the agent and the actions it wants to take. It provides three things an
IT/security department can rely on:
1. Deterministic pre-execution guardrails. A Claude Code *PreToolUse*
hook intercepts every tool call. Aigis scans the request, evaluates it
against your organisation's policy, and returns allow / review / deny
before the action runs. Decisions are rule-based and reproducible —
not a probabilistic model judging itself.
2. Tamper-evident audit logs. Every decision is recorded to an
append-only JSONL log. A signed variant (HMAC-SHA256 + hash chain)
makes after-the-fact deletion or modification detectable.
3. An organisation-owned policy. The policy is a human-readable file in
your repository, reviewed and version-controlled like any other code.
Aigis runs entirely locally and adds no new runtime dependencies. It does
not send your prompts or code anywhere; it governs what the agent is
allowed to do on your machine.
NIST AI RMF, OWASP LLM Top 10, and the METI/MIC AI Business Operator
Guidelines v1.2, plus an explicit "what Aigis does NOT cover" boundary.
language and as literal YAML.
tamper-evidence design, and the command to verify integrity.
triage, escalate, and report false positives.
rules — 10 deny, 5 review, 1 allow.
Default decision when no rule matches: allow.
Read this before approving. The rule set is a deny-list: it enumerates
known-dangerous operations (recursive deletion, raw disk writes, credential and
SSH-key access, piping a download into a shell) and lets everything else
proceed — an agent that cannot run ls is not usable. So the default above is
**fail-open by design, not by oversight: an operation nobody wrote a rule for
will run.** If your review requires the opposite posture — deny unless
explicitly permitted — set default_decision: deny in aigis-policy.yaml and
add allow rules for the operations your team actually needs. That is a real
piece of work, and it is the honest price of a fail-closed configuration.
The policy name above comes from the policy file itself. If it was produced by
aigis profile build, the capability combination behind it decides the rules —
and the rules, not the name, are what section 3 sets out in full. Judge the
configuration by those.
This table maps each control Aigis implements to the major security and AI-governance frameworks. ISO/IEC 27001 item numbers are listed as "supports evidence for" — Aigis is a control implementation, not a certification body, and does not guarantee compliance.
Two things to know before reading the table. First, the IDs in the *AI Business Operator GL* column (GL-*, SEC-*, APPI-*) are defined by Aigis, derived from the guideline text — they are not official clause numbers, so asking which guideline clause GL-POISON-01 refers to has no answer outside this repository. The requirement text behind each ID lives in aigis/compliance.py. Second, every mapping here is self-assessed: no third party has reviewed it, and the list contains no partial or uncovered entries — so read it as a statement of what we implement, not as a measured coverage figure.
| Aigis control | What it does | ISO/IEC 27001:2022 Annex A | NIST AI RMF | OWASP LLM Top 10 | AI Business Operator GL v1.2 |
|---|---|---|---|---|---|
| Input scanning (prompt-injection / jailbreak / PII) | Deterministic regex + similarity detection on every prompt before it reaches the model. | A.8.16 (Monitoring activities), A.5.7 (Threat intelligence) | MEASURE 2.7, MANAGE 2.1 | LLM01 Prompt Injection, LLM02 Sensitive Information Disclosure | GL-POISON-01, SEC-PI-01 |
| Output scanning (data leak / secret / PII) | Scans model output for leaked secrets, PII, and system-prompt disclosure before it is returned. | A.8.12 (Data leakage prevention), A.5.34 (Privacy and PII) | MEASURE 2.7, MANAGE 4.1 | LLM02 Sensitive Information Disclosure, LLM05 Improper Output Handling | APPI-PII-01, GL-DATA-01 |
| Tool-call policy enforcement | Deterministic allow/deny/review decision on every tool call (shell, file, network) before execution. | A.8.18 (Use of privileged utility programs) | GOVERN 1.1, MANAGE 2.1 | LLM06 Excessive Agency | GL-HUMAN-03 (最小権限), SEC-PRIV-01 |
| MCP tool-definition scanning | Detects tool-poisoning and rug-pull changes in Model Context Protocol server definitions. | A.5.21 (ICT supply chain security), A.5.19 (Information security in supplier relationships) | MAP 4.1, MANAGE 3.1 | LLM03 Supply Chain, LLM01 Prompt Injection | GL-SEC-03 (攻撃対象面の管理) |
| Memory / file-write filter | Blocks writes to protected paths (.env, credentials, SSH keys) and filters persisted agent memory. | A.8.3 (Information access restriction), A.8.12 (Data leakage prevention) | MANAGE 2.1, GOVERN 1.4 | LLM06 Excessive Agency, LLM02 Sensitive Information Disclosure | GL-HUMAN-03 (最小権限), GL-DATA-02 |
| Tamper-evident audit log (HMAC + hash chain) | Append-only log; each entry HMAC-SHA256 signed and hash-chained so deletion/modification is detectable. | A.8.15 (Logging), A.8.16 (Monitoring activities), A.5.28 (Collection of evidence) | MEASURE 2.8, MANAGE 4.1 | LLM06 Excessive Agency (logging & monitoring) | GL-AUDIT-01 (追跡可能性), GL-RISK-02 (インシデントDB) |
| SIEM forwarding (ECS / HTTP) | Optional non-blocking forwarder mirrors events to a SIEM in Elastic Common Schema; PII redaction runs first. | A.8.16 (Monitoring activities), A.5.25 (Assessment of security events) | MEASURE 2.8, MANAGE 4.1 | LLM06 Excessive Agency | GL-HUMAN-04 (継続的モニタリング) |
| Weekly security report | Automated weekly report of scans, blocks, OWASP coverage, and week-over-week trend for review meetings. | A.5.36 (Compliance review), A.8.16 (Monitoring activities) | MEASURE 4.1, GOVERN 4.1 | — (cross-cutting; not an OWASP risk category) | GL-TRANS-01 (ドキュメント化), GL-RISK-02 |
For an honest scope boundary, the following areas are out of scope for Aigis and must be handled by other controls (your existing security tooling and operational processes).
Policy currently in force: Aigis Default Policy (v1.0). Default decision when no rule matches: allow.
| # | Rule ID | Action | Target | Decision | Reason | |
|---|---|---|---|---|---|---|
| 1 | dangerous_commands |
shell:exec |
rm -rf * |
deny | Recursive forced deletion is blocked | |
| 2 | dangerous_format |
shell:exec |
*mkfs* |
deny | Filesystem format commands are blocked | |
| 3 | dangerous_dd |
shell:exec |
*dd if=* |
deny | Raw disk operations are blocked | |
| 4 | sudo_commands |
shell:exec |
sudo * |
review | Privilege escalation requires review | |
| 5 | env_file_protection |
file:write |
.env* |
deny | Environment files are protected from modification | |
| 6 | secrets_dir_protection |
file:* |
*secrets* |
review | Access to secrets directories requires review | |
| 7 | ssh_key_protection |
file:* |
*.ssh/* |
deny | SSH key access is blocked | |
| 8 | credentials_protection |
file:write |
*credentials* |
deny | Credential files are protected | |
| 9 | pipe_to_shell |
shell:exec |
`* | bash*` | deny | Piping remote content to shell is blocked |
| 10 | pipe_to_sh |
shell:exec |
`* | sh*` | deny | Piping remote content to shell is blocked |
| 11 | git_force_push |
shell:exec |
*--force* |
deny | Force push is blocked | |
| 12 | git_push_review |
shell:exec |
git push* |
review | Git push requires review | |
| 13 | agent_spawn_review |
agent:spawn |
* |
review | Spawning sub-agents requires review | |
| 14 | llm_prompt_scan |
llm:prompt |
* |
allow | LLM prompts are scanned by Aigis's detection engine | |
| 15 | risk_threshold_critical |
* |
* |
deny | Critical-risk content detected by Aigis scan engine | |
| 16 | risk_threshold_medium |
* |
* |
review | Suspicious content detected by Aigis scan engine |
The following is the verbatim policy file under version control.
# Aigis Policy: Aigis Default Policy
# Generated by Aigis v0.3.0
name: "Aigis Default Policy"
version: "1.0"
default_decision: allow
rules:
- id: dangerous_commands
action: "shell:exec"
target: "rm -rf *"
decision: deny
reason: "Recursive forced deletion is blocked"
- id: dangerous_format
action: "shell:exec"
target: "*mkfs*"
decision: deny
reason: "Filesystem format commands are blocked"
- id: dangerous_dd
action: "shell:exec"
target: "*dd if=*"
decision: deny
reason: "Raw disk operations are blocked"
- id: sudo_commands
action: "shell:exec"
target: "sudo *"
decision: review
reason: "Privilege escalation requires review"
- id: env_file_protection
action: "file:write"
target: ".env*"
decision: deny
reason: "Environment files are protected from modification"
- id: secrets_dir_protection
action: "file:*"
target: "*secrets*"
decision: review
reason: "Access to secrets directories requires review"
- id: ssh_key_protection
action: "file:*"
target: "*.ssh/*"
decision: deny
reason: "SSH key access is blocked"
- id: credentials_protection
action: "file:write"
target: "*credentials*"
decision: deny
reason: "Credential files are protected"
- id: pipe_to_shell
action: "shell:exec"
target: "*| bash*"
decision: deny
reason: "Piping remote content to shell is blocked"
- id: pipe_to_sh
action: "shell:exec"
target: "*| sh*"
decision: deny
reason: "Piping remote content to shell is blocked"
- id: git_force_push
action: "shell:exec"
target: "*--force*"
decision: deny
reason: "Force push is blocked"
- id: git_push_review
action: "shell:exec"
target: "git push*"
decision: review
reason: "Git push requires review"
- id: agent_spawn_review
action: "agent:spawn"
target: "*"
decision: review
reason: "Spawning sub-agents requires review"
- id: llm_prompt_scan
action: "llm:prompt"
target: "*"
decision: allow
reason: "LLM prompts are scanned by Aigis's detection engine"
- id: risk_threshold_critical
action: "*"
target: "*"
decision: deny
reason: "Critical-risk content detected by Aigis scan engine"
conditions:
risk_above: 80
- id: risk_threshold_medium
action: "*"
target: "*"
decision: review
reason: "Suspicious content detected by Aigis scan engine"
conditions:
risk_above: 40
Aigis keeps audit logs in three tiers (all append-only JSONL, one event per line):
.aigis\logs (per-project, developer-visible)~/.aigis/global/ (cross-project, for audit / CISO)~/.aigis/alerts/ (deny / review events, permanent)Current state: local logs are not yet created,
with 0 events in the last 7 days and 0 in 30 days.
Each event is recorded as an aigis.activity.ActivityEvent with these fields:
actiontargetagent_typeuser_idsession_idevent_typecwdproject_namedetailsrisk_scorerisk_levelmatched_rulesremediation_hintsowasp_refspolicy_decisionpolicy_rule_idtimestampevent_idautonomy_leveldelegation_chainestimated_costmemory_scopesuggested_fixfix_applied(compressed or deleted).
~/.aigis/alerts/) are kept permanently and never deleted.aigis maintenanceThe signed audit log (aigis.audit.SignedAuditLog) does two things per entry:
1. HMAC-SHA256 signature — every field of the entry is canonicalised to
JSON and signed with a secret key. The signature depends on the entry's
content, so changing a single byte fails signature verification.
2. Hash chain — each entry stores the SHA-256 hash of the previous entry
(prev_hash), so deleting, reordering, or inserting entries is detectable.
Integrity is checked with four tests: signature, chain, sequence, and
timestamp ordering.
Verify command:
aigis audit verify
Use --log PATH to point at a specific log file and --json for a
machine-readable result. Use aigis audit status for a quick health check.
Current state: signed audit log is
enabled.
The HMAC key is resolved in this order (see aigis/audit/signed_log.py):
1. An explicit secret_key supplied by the caller.
2. An existing key file at .aigis/audit_key.
3. Otherwise a fresh key is generated (secrets.token_hex(32)) and written there.
What this means for a reviewer. In the default configuration the signing key
sits on the same machine as the agent and the logs, owned by the same user. The
signature therefore detects tampering by anything *other than* the log's own
author — a later process, another user, file corruption. It does not detect
the author editing an entry and re-signing it, because they hold the key.
If your threat model includes the developer whose activity is being recorded —
which is usually the reason an audit trail exists at all — combine the signed log
with at least one of the following:
or Datadog land outside the developer's reach. This is the strongest option
available today, and it requires no change to Aigis.
secret_key from a secret manager the developercannot read, so local forgery is not possible.
~/.aigis/alerts/ to storage the developer cannot write to.One platform note: the key file is set to 0600 on POSIX, but Windows does not
enforce POSIX permissions — set NTFS ACLs explicitly there.
Events can optionally be forwarded to an external SIEM (Elastic Common Schema,
over HTTP). Forwarding is non-blocking and never delays an agent tool call. A
PII redactor can run before any event leaves the process. See
docs/forwarders.md. Current state: not detected (forwarders are configured in code; see docs/forwarders.md).
A Claude Code *PreToolUse* hook runs on every tool call. When Aigis denies
a request, the hook exits with code 2 and Claude Code aborts that tool
execution. The reason (the matched policy rule ID, and the risk score where
relevant) is printed to standard error and simultaneously written to the
audit log.
The hook is fail-closed: if it cannot reach a decision — unparseable
input, Aigis not installed, an exception during scanning — it blocks on the
safe side.
| Severity | Guideline | Response |
|---|---|---|
| Critical | Risk score ≥ 80, or a denied destructive op (rm -rf, etc.) |
Immediate block. Review the record; escalate if needed |
| High | Risk score 50–79 | Block or review. A responder examines it |
| Medium | Risk score 40–49, review decision | Human approval via the review queue |
| Low | Risk score < 40 | Allowed; logged only |
1. List recent alerts: aigis logs --alerts
2. Inspect the event details (action, target, matched rule, risk score).
3. Verify audit-log integrity: aigis audit verify
4. If a legitimate action was blocked, follow "Reporting false positives" below.
5. If this looks like an attack, report it using the escalation template.
Subject: [Aigis] {severity} — detected {rule_id}
When: {ISO-8601 timestamp}
Project / host: {project name / hostname}
User: {user_id}
Action: {action} Target: {target}
Risk score: {score} Decision: {decision}
Matched rule: {rule_id}
Audit-log verification: {result of `aigis audit verify`}
First responder: [TO FILL: first responder name]
Escalate to: security@example.com
1. Capture the exact blocked input/action (aigis logs --alerts --json).
2. Reproduce by re-scanning the input: aigis scan "<input>"
3. If it is genuinely legitimate, adjust the policy (see below).
4. Record the adjustment in the commit message for the review trail.
aigis policy showaigis-policy.yaml to add or adjust rules.aigis policy check[TO FILL: approver / role].
We recommend introducing Aigis in three phases to limit risk while validating
it in real use. Each phase ends with a review gate that decides whether to
proceed to the next.
Scope: [TO FILL: pilot team / project]
aigis init --agent claude-codeaigis doctoraigis logs --alerts and the weekly reportReview gate 1: Is the false-positive rate acceptable? Were there any
serious block events? Approver: [TO FILL: phase-1 approver]
docs/forwarders.md)Review gate 2: Is audit-log integrity verifiable (aigis audit verify)?
Is the operational load reasonable? Approver:
[TO FILL: phase-2 approver]
Review gate 3: Is the governance process sustainable?
Approver: [TO FILL: phase-3 approver]
_Regenerate this pack whenever the policy changes (it can run in CI), so the
documents you submit to IT always reflect the live posture._
組織: Example Corp(サンプル株式会社)
提出先: 【要記入: 情報システム部門】
セキュリティ窓口: security@example.com
生成日時: 2026-08-16T15:03:20.847173+00:00(Aigis v1.2.0)
Claude CodeはAnthropic社が提供するコマンドライン型のコーディングエージェントです。
ファイルの読み書き、シェルコマンドの実行、Webコンテンツの取得を行い、外部ツール
(Model Context Protocolサーバーを含む)を呼び出して、ソフトウェア開発タスクを
自律的に遂行します。開発者の実機上で実際の操作を実行するため、統制のない導入は
運用・セキュリティ上の重大なリスクとなり得ます。
Aigisは、エージェントと、それが実行しようとする操作との間に位置する、ゼロ依存の
オープンソース・ガードレール層です。情報システム部門が拠り所とできる、次の3点を
提供します。
1. 決定論的な実行前ガードレール。 Claude Codeの *PreToolUse* フックが、すべての
ツール呼び出しを捕捉します。Aigisはリクエストを検査し、貴社のポリシーに照らして
評価し、操作が実行される前に「許可/レビュー/拒否」を返します。判定はルール
ベースで再現可能であり、モデルが自分自身を確率的に判定するものではありません。
2. 改ざん検知が可能な監査ログ。 すべての判定は追記専用のJSONLログに記録されます。
署名付き版(HMAC-SHA256+ハッシュチェーン)により、事後の削除・改ざんを検知できます。
3. 組織が保有するポリシー。 ポリシーはリポジトリ内の可読なファイルであり、他の
コードと同様にレビューおよびバージョン管理が可能です。
Aigisは完全にローカルで動作し、新たな実行時依存関係を追加しません。プロンプトや
コードを外部に送信することはなく、エージェントが貴社の端末上で行える操作を統制します。
NIST AI RMF、OWASP LLM Top 10、および経済産業省・総務省「AI事業者ガイドライン
v1.2」へマッピングしたもの。あわせて「Aigisが対象としない範囲」を明示します。
検証コマンドを記載します。
レーション、誤検知の報告方法を記載します。
— 拒否10件、レビュー5件、許可1件。
どのルールにも一致しない場合の既定判定: allow。
承認判断の前にお読みください。 本ルールセットは拒否リスト方式です。既知の
危険な操作(再帰的削除、ローディスク書き込み、認証情報やSSH鍵へのアクセス、
ダウンロード内容のシェルへのパイプ等)を列挙して止め、それ以外は通します。ls すら
実行できないエージェントは実用に耐えないためです。したがって上記の既定判定は
**設計上の fail-open であり、見落としではありません。つまり、誰もルールを書いていない
操作は実行されます。** 「明示的に許可されたもの以外は拒否する」姿勢が貴社の審査要件で
ある場合は、aigis-policy.yaml で default_decision: deny を設定し、業務に必要な
操作を許可ルールとして列挙する必要があります。これは相応の作業量を伴いますが、
fail-closed 構成の正直な対価です。
上記のポリシー名はポリシーファイル自体に由来します。aigis profile build で
生成した場合、その背後にある capability の組み合わせがルールを決定しており、
実際のルールは第3章に全文が掲載されています。名前ではなく、そのルールで
構成をご判断ください。
本表は、Aigisが実装する各コントロールを、主要なセキュリティ・AIガバナンスフレームワークへ対応付けたものです。ISO/IEC 27001の項番は「証跡を補強するもの(supports evidence for)」として記載しており、Aigisが認証や準拠を保証するものではありません。
表を読む前に知っておいていただきたい点が2つあります。 1つ目は、「AI事業者GL v1.2」列のID(GL-* / SEC-* / APPI-*)はAigisが独自に定義したもので、ガイドライン本文から要件を抽出して番号を振ったものです。ガイドラインの公式項番ではないため、GL-POISON-01 がガイドラインのどの条項に当たるかという問いには、本リポジトリの外では答えがありません。各IDの要件文は aigis/compliance.py に記載しています。2つ目は、本表の対応付けはすべて自己評価であり、第三者のレビューを受けていないことです。部分対応・未対応の項目が1件も存在しないため、測定されたカバレッジ率ではなく、「何を実装しているかの表明」として読んでください。
| Aigisコントロール | 概要 | ISO/IEC 27001:2022 附属書A | NIST AI RMF | OWASP LLM Top 10 | AI事業者GL v1.2 |
|---|---|---|---|---|---|
| 入力スキャン(プロンプトインジェクション・ジェイルブレイク・個人情報) | モデルに到達する前に、すべてのプロンプトを正規表現と類似度検知で決定論的に検査します。 | A.8.16 (Monitoring activities), A.5.7 (Threat intelligence) | MEASURE 2.7, MANAGE 2.1 | LLM01 Prompt Injection, LLM02 Sensitive Information Disclosure | GL-POISON-01, SEC-PI-01 |
| 出力スキャン(情報漏洩・秘密情報・個人情報) | モデルの出力を返す前に、秘密情報・個人情報・システムプロンプトの漏洩がないか検査します。 | A.8.12 (Data leakage prevention), A.5.34 (Privacy and PII) | MEASURE 2.7, MANAGE 4.1 | LLM02 Sensitive Information Disclosure, LLM05 Improper Output Handling | APPI-PII-01, GL-DATA-01 |
| ツール呼び出しポリシー強制 | すべてのツール呼び出し(シェル・ファイル・ネットワーク)を実行前に許可/拒否/レビュー判定します。 | A.8.18 (Use of privileged utility programs) | GOVERN 1.1, MANAGE 2.1 | LLM06 Excessive Agency | GL-HUMAN-03 (最小権限), SEC-PRIV-01 |
| MCPツール定義スキャン | Model Context Protocolサーバー定義に含まれるツールポイズニングや定義改ざん(ラグプル)を検出します。 | A.5.21 (ICT supply chain security), A.5.19 (Information security in supplier relationships) | MAP 4.1, MANAGE 3.1 | LLM03 Supply Chain, LLM01 Prompt Injection | GL-SEC-03 (攻撃対象面の管理) |
| メモリ・ファイル書き込みフィルター | 保護対象パス(.env、認証情報、SSH鍵)への書き込みをブロックし、永続化されるエージェントメモリを検査します。 | A.8.3 (Information access restriction), A.8.12 (Data leakage prevention) | MANAGE 2.1, GOVERN 1.4 | LLM06 Excessive Agency, LLM02 Sensitive Information Disclosure | GL-HUMAN-03 (最小権限), GL-DATA-02 |
| 改ざん検知監査ログ(HMAC+ハッシュチェーン) | 追記専用ログ。各エントリをHMAC-SHA256で署名しハッシュチェーンで連結するため、削除・改ざんを検知できます。 | A.8.15 (Logging), A.8.16 (Monitoring activities), A.5.28 (Collection of evidence) | MEASURE 2.8, MANAGE 4.1 | LLM06 Excessive Agency (logging & monitoring) | GL-AUDIT-01 (追跡可能性), GL-RISK-02 (インシデントDB) |
| SIEM転送(ECS/HTTP) | 任意の非ブロッキング転送機能が、イベントをElastic Common Schema形式でSIEMへ複製します。送信前に個人情報の墨消しを実施します。 | A.8.16 (Monitoring activities), A.5.25 (Assessment of security events) | MEASURE 2.8, MANAGE 4.1 | LLM06 Excessive Agency | GL-HUMAN-04 (継続的モニタリング) |
| 週次セキュリティレポート | スキャン数・ブロック数・OWASPカバレッジ・前週比トレンドを集計した週次レポートを自動生成します。 | A.5.36 (Compliance review), A.8.16 (Monitoring activities) | MEASURE 4.1, GOVERN 4.1 | — (cross-cutting; not an OWASP risk category) | GL-TRANS-01 (ドキュメント化), GL-RISK-02 |
正直な範囲設定のため、Aigisが対象としない領域を明示します。これらは別の管理策(既存のセキュリティ製品・運用体制)で対応する必要があります。
現在適用中のポリシー: Aigis Default Policy(v1.0)。どのルールにも一致しない場合の既定判定は allow です。
| # | ルールID | アクション | 対象 | 判定 | 理由 | |
|---|---|---|---|---|---|---|
| 1 | dangerous_commands |
shell:exec |
rm -rf * |
deny | Recursive forced deletion is blocked | |
| 2 | dangerous_format |
shell:exec |
*mkfs* |
deny | Filesystem format commands are blocked | |
| 3 | dangerous_dd |
shell:exec |
*dd if=* |
deny | Raw disk operations are blocked | |
| 4 | sudo_commands |
shell:exec |
sudo * |
review | Privilege escalation requires review | |
| 5 | env_file_protection |
file:write |
.env* |
deny | Environment files are protected from modification | |
| 6 | secrets_dir_protection |
file:* |
*secrets* |
review | Access to secrets directories requires review | |
| 7 | ssh_key_protection |
file:* |
*.ssh/* |
deny | SSH key access is blocked | |
| 8 | credentials_protection |
file:write |
*credentials* |
deny | Credential files are protected | |
| 9 | pipe_to_shell |
shell:exec |
`* | bash*` | deny | Piping remote content to shell is blocked |
| 10 | pipe_to_sh |
shell:exec |
`* | sh*` | deny | Piping remote content to shell is blocked |
| 11 | git_force_push |
shell:exec |
*--force* |
deny | Force push is blocked | |
| 12 | git_push_review |
shell:exec |
git push* |
review | Git push requires review | |
| 13 | agent_spawn_review |
agent:spawn |
* |
review | Spawning sub-agents requires review | |
| 14 | llm_prompt_scan |
llm:prompt |
* |
allow | LLM prompts are scanned by Aigis's detection engine | |
| 15 | risk_threshold_critical |
* |
* |
deny | Critical-risk content detected by Aigis scan engine | |
| 16 | risk_threshold_medium |
* |
* |
review | Suspicious content detected by Aigis scan engine |
以下は、リポジトリで管理されている実際のポリシーファイルの全文です。
# Aigis Policy: Aigis Default Policy
# Generated by Aigis v0.3.0
name: "Aigis Default Policy"
version: "1.0"
default_decision: allow
rules:
- id: dangerous_commands
action: "shell:exec"
target: "rm -rf *"
decision: deny
reason: "Recursive forced deletion is blocked"
- id: dangerous_format
action: "shell:exec"
target: "*mkfs*"
decision: deny
reason: "Filesystem format commands are blocked"
- id: dangerous_dd
action: "shell:exec"
target: "*dd if=*"
decision: deny
reason: "Raw disk operations are blocked"
- id: sudo_commands
action: "shell:exec"
target: "sudo *"
decision: review
reason: "Privilege escalation requires review"
- id: env_file_protection
action: "file:write"
target: ".env*"
decision: deny
reason: "Environment files are protected from modification"
- id: secrets_dir_protection
action: "file:*"
target: "*secrets*"
decision: review
reason: "Access to secrets directories requires review"
- id: ssh_key_protection
action: "file:*"
target: "*.ssh/*"
decision: deny
reason: "SSH key access is blocked"
- id: credentials_protection
action: "file:write"
target: "*credentials*"
decision: deny
reason: "Credential files are protected"
- id: pipe_to_shell
action: "shell:exec"
target: "*| bash*"
decision: deny
reason: "Piping remote content to shell is blocked"
- id: pipe_to_sh
action: "shell:exec"
target: "*| sh*"
decision: deny
reason: "Piping remote content to shell is blocked"
- id: git_force_push
action: "shell:exec"
target: "*--force*"
decision: deny
reason: "Force push is blocked"
- id: git_push_review
action: "shell:exec"
target: "git push*"
decision: review
reason: "Git push requires review"
- id: agent_spawn_review
action: "agent:spawn"
target: "*"
decision: review
reason: "Spawning sub-agents requires review"
- id: llm_prompt_scan
action: "llm:prompt"
target: "*"
decision: allow
reason: "LLM prompts are scanned by Aigis's detection engine"
- id: risk_threshold_critical
action: "*"
target: "*"
decision: deny
reason: "Critical-risk content detected by Aigis scan engine"
conditions:
risk_above: 80
- id: risk_threshold_medium
action: "*"
target: "*"
decision: review
reason: "Suspicious content detected by Aigis scan engine"
conditions:
risk_above: 40
Aigisは監査ログを3階層で保持します(いずれも追記専用のJSONL形式、1行1イベント)。
.aigis\logs(プロジェクト単位、開発者が確認可能)~/.aigis/global/(全プロジェクト横断、監査・CISO向け)~/.aigis/alerts/(拒否・レビューイベントを恒久保存)現状: ローカルログは未生成、
直近7日間で0件、30日間で0件を記録しています。
各イベントは aigis.activity.ActivityEvent として記録され、以下のフィールドを持ちます。
actiontargetagent_typeuser_idsession_idevent_typecwdproject_namedetailsrisk_scorerisk_levelmatched_rulesremediation_hintsowasp_refspolicy_decisionpolicy_rule_idtimestampevent_idautonomy_leveldelegation_chainestimated_costmemory_scopesuggested_fixfix_applied~/.aigis/alerts/)は恒久保存され、削除されません。aigis maintenance署名付き監査ログ(aigis.audit.SignedAuditLog)は、各エントリに対して次を行います。
1. HMAC-SHA256署名 — 各エントリの全フィールドを正準JSON化し、秘密鍵で署名します。
署名はそのエントリの内容に依存するため、1バイトでも改変すれば署名検証に失敗します。
2. ハッシュチェーン — 各エントリは直前エントリのSHA-256ハッシュ(prev_hash)を保持
します。これにより、エントリの削除・並べ替え・挿入が検知可能になります。
整合性は次の4チェックで検証されます: 署名・チェーン・連番・タイムスタンプ順序。
検証コマンド:
aigis audit verify
--log PATH でログファイルを指定でき、--json で機械可読な結果を出力します。
状態確認には aigis audit status を使用します。
現状: 署名付き監査ログは有効です。
HMAC鍵は次の順序で解決されます(aigis/audit/signed_log.py)。
1. 呼び出し側が明示的に渡した secret_key
2. 既存の鍵ファイル .aigis/audit_key
3. いずれも無ければ新規生成(secrets.token_hex(32))して同ファイルに保存
審査する側が知っておくべきこと。 既定構成では、署名鍵はエージェントとログと
同じマシン上に、同じユーザー権限で置かれます。したがって署名が検知できるのは
「ログを書いた本人以外」による改変です — 後続プロセス、別ユーザー、ファイル破損。
本人がエントリを書き換えて再署名した場合は検知できません。 鍵を本人が持って
いるからです。
記録対象である開発者本人を脅威モデルに含める場合 — 監査ログを置く理由は通常
そこにあります — 署名ログを次のいずれかと組み合わせてください。
開発者の手が届かない場所に残ります。現時点で最も強い選択肢で、Aigis側の変更は
不要です。
secret_key を渡せば、ローカルでの偽造ができなくなります。
~/.aigis/alerts/ の外部エクスポート。 開発者が書き込めない保管先へ定期的に出す。プラットフォーム注記: 鍵ファイルはPOSIXでは 0600 を設定しますが、Windowsは
POSIX権限を強制しません。Windows環境ではNTFS ACLを明示的に設定してください。
イベントは任意で外部SIEMへ転送できます(Elastic Common Schema形式、HTTP)。転送は
非ブロッキングで、エージェントのツール呼び出しを遅延させません。送信前に個人情報の
墨消し(Redactor)を実行できます。詳細は docs/forwarders.md を参照してください。
現状: not detected (forwarders are configured in code; see docs/forwarders.md)。
Claude Codeの *PreToolUse* フックがツール呼び出しごとに動作します。Aigisがリクエストを
拒否(deny)した場合、フックは終了コード 2 を返し、Claude Codeはそのツール実行を
中止します。理由(一致したポリシールールID、必要に応じてリスクスコア)が標準エラー出力に
表示され、同時に監査ログへ記録されます。
フックはフェイルクローズ(fail-closed)設計です。入力の解析失敗、Aigis未導入、スキャン
時の例外など、判定できない事象が発生した場合は、安全側に倒してブロックします。
| 重大度 | 目安 | 対応 |
|---|---|---|
| Critical | リスクスコア ≥ 80、または破壊的操作(rm -rf 等)の拒否 |
即時ブロック。記録を確認し、必要に応じてエスカレーション |
| High | リスクスコア 50–79 | ブロックまたはレビュー。担当者が確認 |
| Medium | リスクスコア 40–49、レビュー判定 | レビューキューで人間が承認 |
| Low | リスクスコア < 40 | 許可。ログのみ記録 |
1. 直近のアラートを確認します: aigis logs --alerts
2. 該当イベントの詳細(アクション・対象・一致ルール・リスクスコア)を確認します。
3. 監査ログの整合性を検証します: aigis audit verify
4. 正当な操作が誤ってブロックされた場合は、下記「誤検知の報告」に従います。
5. 攻撃の可能性がある場合は、下記エスカレーションテンプレートで報告します。
件名: [Aigis] {重大度} — {ルールID} を検知
発生日時: {ISO-8601タイムスタンプ}
プロジェクト / 端末: {プロジェクト名 / ホスト名}
利用者: {ユーザーID}
アクション: {action} 対象: {target}
リスクスコア: {score} 判定: {decision}
一致ルール: {rule_id}
監査ログ検証結果: {aigis audit verify の結果}
一次対応: 【要記入: 一次対応者名】
エスカレーション先: security@example.com
1. ブロックされた具体的な入力/操作を記録します(aigis logs --alerts --json)。
2. 当該入力を再スキャンして再現します: aigis scan "<入力>"
3. 正当な操作であると確認できた場合は、ポリシーを調整します(下記参照)。
4. 調整内容は、レビュー記録のためコミットメッセージに残します。
aigis policy showaigis-policy.yaml を編集してルールを追加・調整します。aigis policy checkAigisの導入は、リスクを抑えつつ実運用での妥当性を確認するため、3段階で進めることを
推奨します。各フェーズの終わりにレビューゲートを設け、次フェーズへの移行可否を判断します。
対象: 【要記入: パイロットチーム・プロジェクト】
aigis init --agent claude-code でフックを導入するaigis doctor で導入状態を確認するaigis logs --alerts と週次レポートで状況を確認するレビューゲート1: 誤検知率は許容範囲か。重大なブロック事象はなかったか。
承認者: 【要記入: フェーズ1承認者】
docs/forwarders.md)レビューゲート2: 監査ログの整合性は検証可能か(aigis audit verify)。
運用負荷は妥当か。承認者: 【要記入: フェーズ2承認者】
レビューゲート3: ガバナンス体制は継続的に運用可能か。
承認者: 【要記入: フェーズ3承認者】
_本パックはポリシー変更時に再生成することを推奨します(CIに組み込み可能)。
最新の稼働状況を反映した文書を、常に情報システム部門へ提出できます。_