Show HN: Argus - エージェント型攻撃から保護するオープンソースセキュリティプラットフォーム
Show HN: Argus- open source security platform to protect against agentic attacks (github.com)
要約
Argusは、AIエージェントが証拠を分析するものの、実際のシステムには一切変更を加えないセルフホスト型のマルチテナントセキュリティオペレーションプラットフォームです。クラウド、ID、コード、エンドポイント、ネットワーク、Kubernetesアセットを収集し、検出エンジンがイベントを評価、テストハーネスがセキュリティツールを実行、そしてガバナンスされたエージェントが読み取り専用ツールで調査・分析を行います。変更は、承認プロセスを経るアクションブローカーのみが許可されます。
全文翻訳
[画像: Test](https://github.com/thomasunise/argus/actions/workflows/test.yml) [画像: License: MIT](https://github.com/thomasunise/argus/blob/main/LICENSE)
Argusは、AIエージェントが証拠を分析するものの、実際のシステムには一切変更を加えないセルフホスト型のマルチテナントセキュリティオペレーションプラットフォームです。コレクターはクラウド、ID、コード、エンドポイント、ネットワーク、Kubernetesアセットを証拠グラフに収集します。検出エンジンはイベントをスウォーム、ID、クラウド、コード、カナリアシグナルについて評価します。スコープが制限されたテストハーネスは、承認されたセキュリティツールを実行します。ガバナンスされたエージェントは、読み取り専用ツールでトリアージ、調査、ハンティングを行います。そして、独立したアクションブローカー(型指定されたアクション、ポリシー、承認、ドライラン、ロールバック、キルスイッチ)のみが、あらゆる変更を許可される唯一のコンポーネントです。
[画像: Argus overview](https://github.com/thomasunise/argus/blob/main/docs/screenshots/overview-light.png)
このREADMEは、リポジトリに現在含まれているものについて説明します。docs/ARCHITECTURE.mdは設計について、docs/ROADMAP.mdは実装済みと計画中の項目について説明しています。
プロジェクトステータス
Argusはオープンソースの基盤であり、フォークして拡張されることを意図しています。プラットフォームコア(テナンシー、認証、RBAC、監査チェーン、キュー、ポリシー、承認)は、CIでSQLiteおよびPostgreSQL上でエンドツーエンドでテストされています。コレクターと検出ルールをあなたの環境に合わせて調整し、アクションを有効にする前に、監視専用モード(docs/GO-LIVE.md)で開始してください。これは認定製品ではありません。Argusが証拠として何を提供できるか、またはできないかについては、docs/COMPLIANCE.mdを参照してください。
アーキテクチャ
ブラウザ / SDK / センサー
|
v HTTPS (Caddy, ALB, Front Door またはあなたのインフラ)
+-------------------------------------------------------------+
| API (FastAPI) 認証: セッション / OIDC+PKCE / TOTP / APIキー |
| RBAC (viewer < analyst < operator < admin < owner), CSRF, |
| プリンシパルごとのレート制限、リクエストID、セキュリティヘッダー |
+------+------------------+------------------+----------------+
|
PostgreSQL Redisキュー 監査チェーン
(全テーブルに (リース、リトライ、 (テナントごとにハッシュリンク、
tenant_id) python -m HMAC、JSONL / S3オブジェクト
app.worker) ロック / Azure不変)
|
+------+------------------+------------------+------------------+----------------------------------+
| WorkerプロセスはAPIと同じハンドラーを実行します:
| collectors.run detections.run / baselines
| graph.recompute testing.run agents.run
+------------------------------------------------------------+
|
v エージェントは propose_action のみを呼び出す -> ActionRequest(pending)
アクションブローカー (独立したポリシー、承認、ドライラン、ロールバック、キルスイッチ)
信頼境界(各1文で、詳細はdocs/THREAT-MODEL.mdに記載):
- エージェントは何も実行できません。唯一の書き込み可能なツールは、保留中のリクエストを作成します。
- エージェントが読み取るすべてのものは、信頼されていないデータとしてラップされ、プロンプトにその旨が記載されます。
- アクティブなテストは、記録された承認とスコープ内でのみ実行され、実行時に再確認されます。
- すべてのドメインテーブルには
tenant_idが含まれており、クエリはスコープ付きヘルパーを経由し、テストでアサートされます。 - 監査チェーンはハッシュリンクされ、HMAC署名(本番環境では必須)され、オプションでWORM(Write Once, Read Many)シンクにミラーリングされます。
このチェックアウトに含まれるもの
| エリア | ステータス | 場所 |
|---|---|---|
| アプリケーションファクトリ、設定、DB、RBAC、認証(ローカル、OIDC、TOTP、APIキー)、CSRF、レート制限 | 実装済み、テスト済み | app/core/, app/api/auth.py, app/api/deps.py |
| 監査チェーン(JSONL / S3オブジェクトロック / Azure不変ブロブシンク付き) | 実装済み | app/core/audit.py |
| ジョブキュー(インメモリおよびRedis、リース、リトライ、キャンセル、リパー)とスタンドアロンワーカー | 実装済み | app/core/queue.py, app/worker.py |
| Prometheusメトリクス、JSONロギング、オプションのOpenTelemetryトレーシング | 実装済み | app/core/telemetry.py |
| 証拠グラフ:ノード、エッジ、攻撃パス、露出スコアリング | 実装済み | app/graph/, app/api/graph.py |
| 検出:12ルール(スウォームx4、IDx2、クラウド、k8s、コード、カナリア、異常、エージェント型)、ベースライン、カナリア | 実装済み | app/detections/, app/api/detections.py, app/api/canaries.py |
| コレクター:AWS、Azure、GCP、Kubernetes、GitHub、Okta、Entra、osquery、netflow | フィクスチャ付きで実装済み;クラウドSDKはオプション | app/collectors/, app/api/collectors.py |
| テストハーネス:スコープポリシー、レート制限、Webベースライン、trivy、nuclei、zap、prowler、caldera、semgrep、gitleaks用アダプター | 実装済み;ツールは別途インストールが必要 | app/testing/, app/api/tests.py, app/api/scans.py |
| エージェントランタイム、プロバイダー(Anthropic、OpenAI、Ollama、なし)、読み取り専用ツール、7つのスペシャリスト、評価スイート | 実装済み | app/agents/, app/api/agents.py, app/api/evals.py |
| アクションブローカー:25種類のアクション(AWS、Azure、GCP、Kubernetes、GitHub、Okta、Entra、Cloudflare、Argus内部)、ポリシー、承認、ドライラン、実行、ロールバック、キルスイッチ | 実装済み | app/actions/, app/api/actions.py |
インテグレーション:POST /api/v1/ingest/{source}の背後にある13のインバウンドパーサー、6つのアウトバウンドチャネル(Webhook、Slack、Jira、ServiceNow、PagerDuty、メール)と配信・リトライ、Wazuhインデクサープル | 実装済み | app/integrations/, app/api/ingest.py, app/api/integrations.py |
| 管理、アセット、検出結果、イベント、調査、承認、監査、レポートルーター | 実装済み | app/api/ |
Alembicマイグレーション(初期リビジョン)とscripts/migrate.py | 実装済み | alembic/, docs/MIGRATIONS.md |
| コンテナ、Compose、Helm、Terraform(AWS、Azure)、CI、オブザーバビリティ、ドキュメント | 実装済み | Dockerfile, compose*.yaml, infra/, .github/, docs/ |
ルーターは自動的に検出されます。完全なv1サーフェスはdocs/API.mdにあります。
クイックスタート(開発、SQLite、Dockerなし)
要件:Python 3.11または3.12。
python -m venv .venv && . .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txt -r requirements-dev.txt
cp .env.example .env
python scripts/generate_secrets.py --write # REPLACE_ 値3つ、および空の場合はAUDIT_SIGNING_KEYとDATA_ENCRYPTION_KEYを埋めます
uvicorn app.main:app --host 127.0.0.1 --port 8080
http://127.0.0.1:8080を開き、.envからADMIN_EMAIL / ADMIN_PASSWORDでサインインします。REDIS_URLが空の場合、ジョブはAPIプロセス内で実行されます(WORKERS_INPROCESS=true)。DB_AUTO_CREATE=true(デフォルト)の場合、テーブルは起動時に作成されます。Alembic管理スキーマの場合はfalseに設定し、python scripts/migrate.pyを実行します(docs/MIGRATIONS.mdを参照)。
独立したテナント内の合成デモデータ(ネットワークに一切触れません):
python scripts/seed_demo.py
これはdemoテナントのログインを出力し、DEMOラベル付きのアセット、承認、cloud.public_exposure_changeおよびswarm.machine_speed_sequenceをトリガーするイベント、検出結果、カナリア、エージェント実行レコードを作成します。APP_ENV=productionでは実行を拒否します。
テスト:
python -m pytest -q
パイロット(Docker Compose:API、ワーカー、PostgreSQL、Redis)
cp .env.example .env && python scripts/generate_secrets.py --write
docker compose up --build -d
docker compose logs -f api
compose.yamlはAPIを127.0.0.1:8080にのみバインドし、APIとワーカーを1つのイメージから読み取り専用のルートファイルシステム、ケーパビリティなし、Dockerソケットなしで実行し、./targetsを読み取り専用でマウントし、API起動時にスキーマを適用します(RUN_MIGRATIONS=true)。オブザーバビリティ(OpenTelemetryコレクター、Prometheus(/metricsをスクレイピング)、Grafana(infra/grafana/argus.jsonのダッシュボード付き))を追加するには--profile observabilityを使用します。
単一ホストのTLS終端:
# .env: APP_ENV=production COOKIE_SECURE=true BASE_URL=https://host ARGUS_DOMAIN=host ACME_EMAIL=ops@example.com
docker compose -f compose.yaml -f compose.prod.yaml up -d
本番環境
Kubernetes:infra/helm/argus(API + ワーカーデプロイメント、HPA、PDB、デフォルト拒否NetworkPolicy、TLS付きインバウンド、オプションのServiceMonitor)。AWS:infra/terraform(ECS Fargate、RDS、ElastiCache、S3オブジェクトロック監査バケット、Secrets Manager、ALB + WAF)。Azure:infra/terraform-azure(Container Apps、Flexible Postgres、Azure Cache、不変ブロブコンテナ、Key Vault、Front Door + WAF)。
本番環境チェックリストはdocs/DEPLOYMENT.mdにあります。短縮版(起動時のassert_safe_config()によって一部強制されます):
APP_ENV=productionは、PostgreSQL、REDIS_URL、COOKIE_SECURE=true、https://のBASE_URL、DATA_ENCRYPTION_KEY(S)、AUDIT_SIGNING_KEY(S)、外部監査シンク、およびOIDCまたはTOTP_REQUIRED=trueなしでは起動を拒否します。- 専用ワーカー(
WORKERS_INPROCESS=false、python -m app.worker)。 - オブジェクトロック監査シンク(S3オブジェクトロックまたはAzure不変ブロブ)を使用します(JSONLのみではありません)。
/metricsはエッジでブロックされ、ワーカーのEgressフィルタリング、シークレットはシークレットマネージャーに格納されます。- イメージはダイジェストでピン留めされ、cosign(
.github/workflows/release.yml)で検証されます。
ロール
ロールは累積的です(app/core/rbac.py):
| ロール | 追加される権限 |
|---|---|
| viewer | テナント内のすべてを読み取る |
| analyst | 検出結果と検出ルールを編集する、エージェントと評価を実行する、カナリアを管理する、承認を記録する |
| operator | アセットを管理・承認する、テスト、スキャン、コレクターを実行する、アクションをリクエスト、承認、実行、ロールバックする、検出を実行する |
| admin | ユーザー、APIキー、設定、コレクターとインテグレーションの設定、アクションキルスイッチ、テストスコープ |
| owner | テナント設定、重要なアクションの承認 |
APIキーはロールとオプションのスコープ(例:ingest)を持ち、これによってさらに制限されます。systemプリンシパルはキューハンドラー内でのみ使用されます。
エージェント、テスト、アクションのガバナンス方法
エージェント(app/agents/runtime.py)。スペシャリストは、システムプロンプト、ツール名のリスト、出力スキーマ、および予算(AGENT_MAX_STEPS、AGENT_MAX_TOKENS、AGENT_MAX_SECONDS、AGENT_COST_CEILING_USD、組み込みのClaude価格表外のモデルにはAGENT_MODEL_PRICES)を持つAgentSpecです。ツールはArgusデータへの読み取り専用ビューであり、唯一のproposeツールはブローカーを通じて保留中のActionRequestを作成します。すべてのツール結果は赤字で表示され、切り詰められ、<untrusted_data source=...>としてラップされます。ガードレールプロンプトは、証拠内の指示がインジェクションの兆候であることをモデルに伝えます。各モデルとツールステップは、入力ハッシュ、トークン、レイテンシとともに永続化されます(agent_steps)。AI_PROVIDER=noneの場合、スペシャリストは決定論的なフォールバックを実行します。プロンプトインジェクションと精度評価スイートはapp/agents/evals/suites/にあります。
テスト(app/testing/)。TestScopeは、アセット、許可されるティア(パッシブ、アクティブ、侵入的)、環境、UTCウィンドウ、レート制限、および同時実行制限(max_concurrencyを超えた実行はキューで待機)をリストします。実行は、アセットが現在のAssetAuthorizationを持ち、そのフラグがティアを許可し、スコープがそれを許可し、ウィンドウが開いており、ターゲットがポリシー検証に合格した場合にのみ許可されます。scope.check()はリクエスト時に実行され、ワーカー内で再度実行されます。侵入的ティアは、ステージングおよびラボ環境に限定されます。外部ツールは、固定されたargv、タイムアウト、制限された出力、および最小限の環境を持つrun_tool()を通じて実行されます。
アクション(app/actions/)。型指定されたアクションは、リスク、可逆性、およびパラメータスキーマを宣言し、dry_run、execute、rollbackを実装します。リクエスト(オペレーターまたはエージェントのpropose_actionから)は、ポリシー(app/actions/policy.py:キルスイッチ、テナントactions_enabled、拒否リスト、メンテナンスウィンドウ、低リスクで可逆的なアクションのみの自動承認(ACTIONS_AUTO_APPROVE_LOWの場合))、承認(承認者はリクエスターと異なる。高リスクは2名必要(ACTIONS_REQUIRE_TWO_FOR_HIGHの場合)。クリティカルはさらにactions:approve_criticalを持つプリンシパルが必要)、ブラスト半径を持つドライラン、保存されたロールバックペイロードを持つactions.executeキューのジョブとしての実行、および各遷移での監査エントリを経由します。ACTIONS_KILL_SWITCH=true(グローバル、環境)またはPOST /api/v1/actions/kill-switch(テナントごと、actions_enabled=falseを設定)は、すべてのアクションリクエストと実行を拒否します。
ドキュメント
| ドキュメント | 内容 |
|---|---|
docs/ARCHITECTURE.md | 設計:パッケージ、インターフェース、データモデル、APIテーブル |
docs/API.md | ステータス付きv1ルート概要 |
docs/DEPLOYMENT.md | 開発、Compose、Kubernetes、AWS、Azure;本番環境チェックリスト |
docs/GO-LIVE.md | 監視専用モードでの段階的な本番環境ロールアウト |
docs/SECURITY.md | 実装されたセキュリティモデル、報告 |
docs/THREAT-MODEL.md | STRIDE(信頼境界ごと)、プロンプトインジェクション、SSRF、テナンシー、認証情報、ブローカーの悪用、サプライチェーン |
docs/RUNBOOKS.md | インシデント手順 |
docs/COMPLIANCE.md | SOC 2 / NIST 800-171 / ISO 27001コントロールマッピング(認定ではなく、証拠サポート) |
docs/ROADMAP.md | 実装済み対次期計画 |
CONTRIBUTING.md | 貢献ガイド |
セキュリティ
脆弱性は、公開されたイシューではなく、GitHubのプライベート脆弱性報告(Securityタブ)を通じてプライベートに報告してください。詳細はdocs/SECURITY.mdにあります。
ライセンス
このリポジトリはMITライセンスです。サードパーティツール(nuclei、ZAP、Prowler、CALDERA、Semgrep、Gitleaks、Trivy)、クラウドSDK、モデルプロバイダーは、それぞれのライセンスと規約に従います。