
任意のIP、ドメイン、またはASNに関するOSINTインテリジェンス
このプロジェクトがあなたの仕事に役立つなら、継続的なメンテナンスと新機能の開発を支援してください。
ETH寄付ウォレット
0x11282eE5726B3370c8B480e321b3B2aA13686582
QRコードをスキャンするか、上記のウォレットアドレスをコピーしてください。
15の情報源にわたる統合ホストインテリジェンス — 任意のIP、ドメイン、ASNをクエリして、セキュリティ態勢、インフラ詳細、脅威相関を即座に取得。Cloudflareの無料枠のみで動作します。
ライブURL: swiy.co/seekyou``` $ curl "https://seekyou.seekyou.workers.dev/api/lookup?q=1.1.1.1"
{ "query": { "raw": "1.1.1.1", "type": "ip", "normalised": "1.1.1.1" }, "core": { "internetdb": { "status": "ok", "data": { "ports": [80,443], "vulns": [] } }, "geo": { "status": "cached", "data": { "country": "US", "org": "AS13335 Cloudflare" } }, "bgp": { "status": "ok", "data": { "name": "CLOUDFLARENET", "rir": "ARIN" } }, ... }, "meta": { "durationMs": 312, "cacheHits": 4, "sourcesQueried": 15, "sourcesFailed": 0 } }
## スクリーンショット
<div align="center">
### ランディングページ
<img src="https://assets.kitploit.com/production/public/readmes/7467/e00ec4ba8b3e5460ae1e03360cf6540e58d92acc5522c8693445512b591fed29.png" alt="SeekYou 結果ページ" width="800" />
### 結果ページ
<img src="https://assets.kitploit.com/production/public/readmes/7467/09b165feca9927ad4cd50c3ebd28c72e09a0355d72b9ca14d795bf1d04448c92.png" alt="SeekYou ランディングページ" width="800" />
### デモ
<a href="https://www.youtube.com/watch?v=b86tAUUqd34">
<img src="https://assets.kitploit.com/production/public/readmes/7467/8762e8b464816b9a69d929514441f8c7ee9f9ee9719f95b9c5e33ac1672575f8.jpg" alt="SeekYou デモ" width="800" />
</a>
</div>
---
## 目次
- [SeekYou](#seekyou)
- [スクリーンショット](#screenshots)
- [ランディングページ](#landing-page)
- [結果ページ](#results-page)
- [デモ](#demo)
- [目次](#table-of-contents)
- [SeekYouの機能](#what-seekyou-does)
- [ユースケース](#use-cases)
- [合法的使用ポリシー](#lawful-use-policy)
- [関連ツール](#related-tools)
- [アーキテクチャ概要](#architecture-overview)
- [実行モデル](#execution-model)
- [データソース](#data-sources)
- [プロジェクト構造](#project-structure)
- [主要な設計判断](#key-design-decisions)
- [エッジファースト、Node.js不使用](#edge-first-no-nodejs)
- [階層型並列実行](#layered-parallel-execution)
- [グレースフルデグラデーション](#graceful-degradation)
- [D1 + KVストレージの分割](#split-d1--kv-storage)
- [Free プラン最適化](#free-tier-optimization)
- [Fire-and-forget D1書き込み](#fire-and-forget-d1-writes)
- [キャッシュ戦略](#caching-strategy)
- [レート制限](#rate-limiting)
- [サーキットブレーカー](#circuit-breakers)
- [キーローテーション — GrayHatWarfare](#key-rotation--grayhatwarfare)
- [D1永続化](#d1-persistence)
- [スキーマ(`schema.sql`)](#schema-schemasql)
- [スキーマの適用](#apply-schema)
- [ヘルパー関数](#helper-functions)
- [Cron Worker](#cron-worker)
- [型付き差分(`lib/diff.ts`)](#typed-diff-libdiffts)
- [Webhookペイロード](#webhook-payload)
- [開発環境のセットアップ](#development-setup)
- [前提条件](#prerequisites)
- [ローカル開発](#local-development)
- [Cloudflareリソースの作成(初回)](#create-cloudflare-resources-first-time)
- [デプロイ](#deployment)
- [ビルドとデプロイ](#build-and-deploy)
- [Wrangler設定(`wrangler.toml`)](#wrangler-configuration-wranglertoml)
- [シークレットと環境変数](#secrets-and-environment-variables)
- [必要なシークレット](#required-secrets)
- [`.env.example`(ローカル開発のみ)](#envexample-local-dev-only)
- [ライセンス](#license)
- [著者](#author)
- [謝辞](#acknowledgments)
---
## SeekYouの機能
SeekYouは**ホストインテリジェンスツール**です。IPアドレス、ドメイン名、ASNを貼り付けると、以下の統一レポートを取得できます。
| カテゴリ | 取得内容 |
|---|---|
| ネットワーク | オープンポート、CPE、BGPプレフィックス、アップストリーム、ピア、RIR |
| アイデンティティ | RDAP登録情報、連絡先、レジストラ、ネームサーバー |
| 地理情報 | 国、都市、ISP、プロキシ/ホスティング/モバイルフラグ |
| 証明書 | crt.sh履歴、SAN、発行者チェーン |
| DNS | Passive DNSレコード、Robtex逆引き/正引きDNS |
| 脅威 | URLhaus、ThreatFox、MalwareBazaar、Feodo、SSLBL |
| CVE | InternetDBが報告するCVE IDごとにNVD + CIRCLでエンリッチメント |
| 偵察 | GrayHatWarfareによる公開バケット、Wayback CDXスナップショット |
すべてのソースは並列でクエリされます。障害が発生したソースは「利用不可」バッジに切り替わり、ページが壊れることはありません。
---
## ユースケース
**セキュリティ運用** — ログから不審なIPを迅速にプロファイリングし、IOCを関連付け、公開サービスやCVEを特定し、悪意のあるドメインを追跡します。
**ネットワーク運用** — BGPルーティング、RDAP/WHOIS割り当てデータ、DNS履歴、SSL証明書の変更を検査します。
**ペネトレーションテスト** — ポート/サービス/CPEの列挙、公開バケットの発見、アーカイブページ、サブドメイン、ASNの関係性を調査します。
**脅威インテリジェンス** — C2インフラストラクチャを5つの脅威フィードに対して一度のクエリでチェックします。
**コンプライアンス&リスク** — ベンダーインフラをプロファイリングし、公開クラウドストレージを検出し、シャドーITを特定します。
---
## 合法的使用ポリシー
SeekYouは**合法的なセキュリティ研究、ネットワーク運用、脅威インテリジェンス**のために設計されています。本ツールを使用することにより、以下の条件に同意したものとみなします。
**許可される使用:**
- 自身が所有する、または監視を許可されたネットワークにおけるセキュリティ運用およびインシデント対応
- 脅威インテリジェンス研究およびIOCの関連付け
- 組織内のネットワークトラブルシューティングおよびインフラ監査
- 対象組織からの明示的な書面による許可を得たペネトレーションテスト
- サイバーセキュリティにおける学術研究および教育
- 適切な許可を得たコンプライアンス監査およびベンダーリスク評価
**禁止される使用:**
- 所有していない、またはテストする明示的な許可がないシステムへの不正アクセス、偵察、攻撃
- 個人または組織に対する嫌がらせ、ストーカー行為、プライバシー侵害
- 詐欺、不正アクセス、サイバー犯罪を含む違法行為の幇助
- 許可なくセキュリティ制御やアクセス制限を回避する行為
- CFAA(米国)、Computer Misuse Act(英国)、GDPR(EU)、または管轄区域における同等の法律を含む、適用される法律への違反
**あなたの責任:**
- 所有していないインフラに対してクエリを実行する前に、適切な許可を取得してください
- レート制限を尊重し、サービスや上流のデータソースを乱用しないでください
- 管轄区域のすべての該当法令を遵守してください
- データを責任を持って使用し、調整された開示なしに調査結果を武器化しないでください
- ホストにクエリを実行しても、そのホストにアクセスしたり悪用したりする許可は与えられないことを理解してください
**免責事項:**
本ツールの不正使用について、著者および貢献者は一切の責任を負いません。ユーザーは自身の活動が適用される法律に準拠していることを確認する単独の責任を負います。公開ソースから集約されたデータは、不完全、古い、または不正確である可能性があります。行動を起こす前に、常に信頼できる経路を通じて調査結果を確認してください。
SeekYouを通じて脆弱性を発見した場合は、責任ある開示の慣行に従い、公開開示の前に影響を受ける関係者に通知してください。
---
## 関連ツール
SeekYouはプライバシー重視のセキュリティツールキットの一部です。完全なスイートをご覧ください。
| ツール | 説明 | ライブURL |
|---|---|---|
| **TimeSeal** | 暗号学的タイムスタンプサービス — コンテンツを公開せずに、特定の時点での書類の存在を証明 | [timeseal.online](https://timeseal.online) |
| **SanctumVault** | ゼロ知識暗号化ボールト — 機密データ保存のためのクライアント側暗号化 | [sanctumvault.online](https://sanctumvault.online) |
| **GhostChat** | 一時的な暗号化メッセージング — サーバーログなしで自己破壊する会話 | [ghost-chat.pages.dev](https://ghost-chat.pages.dev) |
| **XMRProof** | Monero支払い検証 — XRMトランザクションの暗号学的証明を生成 | [xmrproof.pages.dev](https://xmrproof.pages.dev) |
| **GhostReceipt** | 匿名領収書生成 — 身元を公開せずに検証可能な取引記録を作成 | [ghostreceipt.pages.dev](https://ghostreceipt.pages.dev) |
| **SeekYou** | ホストインテリジェンスアグリゲーター — IP、ドメイン、ASNに対して15のソースを統合したOSINT | [seekyou.seekyou.workers.dev](https://seekyou.seekyou.workers.dev) |
| **HoneypotScan** | ハニーポット検出サービス — デコイシステムを特定し、セキュリティ研究における誤検知を回避 | [honeypotscan.pages.dev](https://honeypotscan.pages.dev) |
すべてのツールはCloudflareのエッジネットワーク上で動作し、プライバシーファーストの設計原則に従っています。
---
## アーキテクチャ概要```
Browser / curl
│
▼
┌─────────────────────────────────────┐
│ Cloudflare Pages │
│ Next.js App Router (SSR) │
│ │
│ app/page.tsx search form │
│ app/host/[query]/page.tsx │
│ └─ streams /api/stream?q=… │
│ app/api/recent/route.ts │
│ └─ recent searches for homepage │
│ app/targets/page.tsx │
│ └─ monitoring dashboard │
│ app/api/targets/route.ts │
│ └─ saved targets CRUD │
│ returns riskScore + lastDiff │
└──────────────┬──────────────────────┘
│
▼
┌─────────────────────────────────────┐
│ app/api/lookup/route.ts │
│ (Workers runtime via opennextjs) │
│ • input validation │
│ • per-IP rate limiting (KV) │
│ • ctx.waitUntil(recordSearch()) │
└──────────────┬──────────────────────┘
│ runLookup()
▼
┌─────────────────────────────────────┐
│ worker/lookup.ts — orchestrator │
│ 4-layer Promise.allSettled │
└──┬──────────────────────────────────┘
│
├─► Layer 1+2 (parallel, 12 sources):
│ InternetDB · IPinfo · RIPE stat · RDAP · crt.sh · HackerTarget · Robtex
│ URLhaus · ThreatFox · MalwareBazaar · Feodo · SSLBL
├─► Layer 3 (after L1): NVD CVE enrichment (only if vulns found, batched 10-at-a-time)
└─► Layer 4 (parallel): GrayHatWarfare · Wayback (domain queries only)
│
▼
┌──────────────────────┐ ┌──────────────────────┐
│ D1 │ │ KV │
│ source response cache│ │ rate limiting │
│ (TTL per source) │ │ circuit breakers │
│ searches │ │ concurrency counters │
│ saved_targets │ │ │
└──────────────────────┘ └──────────────────────┘
│
▼
┌─────────────────────────────────────┐
│ seekyou-cron (Worker) │
│ wrangler.cron.toml │
│ • hourly blocklist refresh │
│ • hourly saved-target re-query │
│ + typed diff (lib/diff.ts) │
│ + webhook on hasChanges │
└─────────────────────────────────────┘
レイヤー1とレイヤー2は同時に起動します(1つのPromise.allSettledで12のソース)。レイヤー3はレイヤー1が完了した後に開始されます — InternetDBからのCVE IDがNVDのエンリッチメントを駆動し、APIへの負荷を避けるために10件ずつバッチ処理されます。レイヤー4はレイヤー3と並行して起動しますが、ドメインクエリのみを対象とし、IP/ASNは完全にスキップします。合計実時間 ≈ max(レイヤー1+2) + max(レイヤー3+4)。
任意のクエリを?refresh=1で強制リフレッシュし、D1キャッシュをバイパスしてすべての上流からライブデータを取得します。
FeodoとSSLBLは一括ブロックリストとして取得され、cronワーカーによって1時間ごとに更新されます — クエリごとの上流呼び出しはありません。
SeekYou/ ├── app/ │ ├── page.tsx # Homepage — search form + recent searches │ ├── layout.tsx # Root layout │ ├── globals.css │ ├── about/ # About page │ ├── faq/ # FAQ page │ ├── targets/ │ │ └── page.tsx # /targets — monitoring dashboard (risk + diffs) │ ├── host/[query]/ │ │ └── page.tsx # SSR host report page (streams via /api/stream) │ ├── api/ │ │ ├── lookup/route.ts # GET /api/lookup?q=&refresh=1 │ │ ├── stream/route.ts # GET /api/stream?q= (SSE streaming) │ │ ├── recent/route.ts # GET /api/recent?limit=5 │ │ ├── batch/route.ts # POST /api/batch (multi-query) │ │ ├── targets/route.ts # GET /api/targets (+ riskScore, lastDiff) · POST │ │ ├── targets/[id]/route.ts # DELETE /api/targets/:id │ │ └── admin/reset-breaker/ # POST — manual circuit-breaker reset │ └── components/ │ ├── AnimatedTagline.tsx │ ├── Card.tsx │ ├── CopyButton.tsx │ ├── CveDrawer.tsx │ ├── DecryptedText.tsx │ ├── ExportButton.tsx # JSON export (client, zero backend) │ ├── Footer.tsx │ ├── RecentSearches.tsx # Recent queries from D1 (client) │ ├── RiskBadge.tsx # Risk score pill with breakdown tooltip │ ├── SaveButton.tsx # Save/unsave target │ ├── ScrollProgress.tsx │ ├── ShareButton.tsx │ ├── VulnsStream.tsx # Streaming CVE results │ └── ui/ # Shared UI primitives ├── worker/ │ ├── lookup.ts # 4-layer orchestrator │ ├── cron.ts # Hourly blocklist refresh + target sweep w/ typed diff │ ├── index.ts │ └── sources/ │ ├── internetdb.ts │ ├── ipapi.ts │ ├── bgpview.ts │ ├── rdap.ts │ ├── crtsh.ts │ ├── passivedns.ts │ ├── robtex.ts │ ├── abusech.ts # URLhaus + ThreatFox + MalwareBazaar │ ├── nvd.ts # NVD + CIRCL CVE enrichment │ ├── osv.ts # OSV.dev re-export (via nvd.ts) │ ├── grayhatwarfare.ts │ └── wayback.ts ├── lib/ │ ├── types.ts # All TypeScript interfaces │ ├── cache.ts # D1 cache wrapper (cacheGet/cachePut, bypass on forceRefresh) │ ├── config.ts # All magic numbers: TTLs, timeouts, limits │ ├── diff.ts # TargetDiff — typed change detection between snapshots │ ├── errors.ts # Unified error format + ErrorCode enum │ ├── hooks.ts # Shared React hooks │ ├── keyring.ts # GHW 18-key rotation │ ├── logger.ts # Structured logging │ ├── merge.ts # Result merging │ ├── normalize.ts # Threat indicator normalization │ ├── ratelimit.ts # KV-based per-IP rate limiter + circuit breakers │ ├── results.ts # SourceResult helpers │ ├── risk.ts # computeRiskScore — scored 0–100 with breakdown │ ├── searches.ts # D1 helpers: recordSearch, getRecentSearches │ ├── targets.ts # D1 helpers: saveTarget, listTargets, removeTarget │ ├── textAnimation.ts # Text animation utility │ ├── useHostStream.ts # SSE streaming hook for host results │ ├── validate.ts # Query parsing (IPv4/v6/domain/ASN) │ └── utils.ts ├── test/ │ ├── cache.test.ts │ ├── diff.test.ts # Tests for diffHostResults + summariseDiff │ ├── keyring.test.ts │ ├── logger.test.ts │ ├── merge.test.ts │ ├── normalize.test.ts │ ├── results.test.ts │ ├── risk.test.ts │ ├── validate.test.ts │ └── sources/ ├── docs/ │ ├── ROADMAP.md │ ├── Spec.md │ └── LICENSE.md ├── public/ │ └── publiceth.svg # Donation QR code ├── schema.sql # D1 schema (apply with wrangler d1 execute) ├── wrangler.toml # Pages build config (KV + D1 bindings) ├── wrangler.cron.toml # Cron worker config (separate deploy) ├── next.config.ts ├── open-next.config.ts └── vitest.config.ts
---
## 主要設計判断
### エッジファースト、Node.js不要
`@opennextjs/cloudflare` 経由の Workers ランタイム — `runtime = 'edge'` エクスポートは不要。全体を通して純粋な Web API を使用。グローバルで 50 ms 未満のコールドスタート。
### レイヤー並列実行
レイヤー1+2は同時に起動(12ソース)。レイヤー3(CVEエンリッチメント)はInternetDBが脆弱性を発見した場合のみ実行され、10件ずつバッチ処理。レイヤー4(GHW + Wayback)はレイヤー3と並行して実行されるが、IP/ASNクエリでは完全にスキップされる。合計時間 ≈ 各ウェーブ内の最も遅いソースの時間であり、全ソースの合計ではない。
### グレースフルデグラデーション
すべてのソースはサーキットブレーカー + try/catch でラップされている。失敗したソースは `{ status: 'error' }` バッジになる。ページは常にレンダリングされる。
### D1 + KV ストレージの分割
ソース応答キャッシュは **D1**(KVではない)に保存される。値は一度書き込まれ、たまに読み取られる程度で、KVの書き込みクォータコストがすぐに増加するほど大きい。**KV** はホットパスカウンター専用に予約されている:レート制限、サーキットブレーカー、実行中の同時実行数追跡。各ソースには独自のTTLがある(CVEは30日、BGP/RDAPは24時間、コアgeo/portsは1時間、abuse.chは30分)。`?refresh=1` はすべてのフェッチャーに `forceRefresh: true` をスレッドし、必要に応じてD1キャッシュをバイパスする。
### 無料枠最適化
GrayHatWarfare は18キーローテーション(1,800 req/日)。NVD はリクエストバッチングを使用(最大10同時実行)。Feodo/SSLBL は cron ワーカーによって一括リストとして取得され、KV にキャッシュされる — クエリごとのアップストリームコストはゼロ。
### ファイア・アンド・フォーゲット D1 書き込み
`recordSearch()` は `ctx.waitUntil()` 内で呼び出される — API応答にレイテンシを追加しない。D1書き込みは応答がフラッシュされた後に実行される。
---
## キャッシュ戦略
ソース応答は **D1** にキャッシュされ、`expires_at` カラムで手動TTLが適用される。KVは応答キャッシュには使用されない — 低レイテンシのアトミックインクリメントが重要なレート制限、サーキットブレーカー、実行中の同時実行カウンターのために予約されている。```typescript
// lib/cache.ts
export async function cacheGet<T>(
db: D1Database,
key: string,
bypass?: boolean, // true when ?refresh=1
): Promise<T | null>
export async function cachePut<T>(
db: D1Database,
key: string,
value: T,
ttl: number, // seconds
): Promise<void>
キャッシュキーは source:normalised_query のパターンに従います — 例: internetdb:1.1.1.1, crtsh:example.com。
ソースごとのTTL(lib/cache.ts より):
エラーはキャッシュされません — 失敗したフェッチは次のリクエストで常に再試行されます。期限切れの行はミスとして返され、遅延的に上書きされます。バックグラウンドのクリーンアップは不要です。
KVベースのスライディングウィンドウ: 1IPあたり1時間に100リクエスト。lib/ratelimit.ts に実装され、app/api/lookup/route.ts でルックアップが実行される前に適用されます。
レート制限ヘッダーはすべてのレスポンスで返されます:``` X-RateLimit-Limit: 100 X-RateLimit-Remaining: 87 X-RateLimit-Reset: 1716912000
枯渇時、APIは `429` と `Retry-After` を返します。
---
## サーキットブレーカー
各ソースにはKVで追跡されるサーキットブレーカーがあります。ソースが5分間のウィンドウ内で**50%の障害率**(最低4リクエスト)を超えると、ブレーカーが開き、そのソースは**15分間**スキップされ(`{ status: 'skipped' }` を返す)、その後自動的に復旧します。
すべてのブレーカーの現在の状態は、すべてのAPIレスポンスの `meta.circuitBreakers` に含まれています。
プロダクションで手動でブレーカーをリセットするには:```bash
curl -X POST https://seekyou.seekyou.workers.dev/api/admin/reset-breaker \
-H "Authorization: Bearer $ADMIN_TOKEN" \
-H "Content-Type: application/json" \
-d '{"source": "nvd"}'
GrayHatWarfare は API キーごとに 1 日あたり 100 リクエストを許可します。SeekYou は最大 18 個のキーをローテーションし、実質的に 1 日あたり 1,800 リクエストを実現します:```typescript // lib/keyring.ts — round-robin across keys with remaining quota const key = await keyRing.next(env, 'GRAYHATWARFARE_API_KEY')
キーは `GRAYHATWARFARE_API_KEY_1` から `GRAYHATWARFARE_API_KEY_18` まであり、Wrangler シークレットとして保存されます。
---
## D1 永続化
### スキーマ (`schema.sql`)```sql
CREATE TABLE IF NOT EXISTS searches (
id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(8)))),
query TEXT NOT NULL,
query_type TEXT NOT NULL CHECK (query_type IN ('ip','domain','asn')),
result_json TEXT NOT NULL,
duration_ms INTEGER,
created_at INTEGER NOT NULL DEFAULT (unixepoch())
);
CREATE INDEX IF NOT EXISTS idx_searches_query
ON searches (query, created_at DESC);
CREATE TABLE IF NOT EXISTS saved_targets (
id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(8)))),
query TEXT NOT NULL UNIQUE,
label TEXT,
notes TEXT,
result_json TEXT, -- snapshot of last cron lookup
checked_at INTEGER, -- unix seconds — when cron last re-queried
created_at INTEGER NOT NULL DEFAULT (unixepoch())
);
CREATE INDEX IF NOT EXISTS idx_saved_targets_created
ON saved_targets (created_at DESC);
wrangler d1 execute seekyou --file=schema.sql
### ヘルパー関数
**`lib/searches.ts`** — 検索履歴:```typescript
// Write a search row (fire-and-forget safe)
await recordSearch(db, query, queryType, resultJson, durationMs)
// Read last N distinct queries for the homepage (default 5)
const recent = await getRecentSearches(db, 5)
// → [{ query: '1.1.1.1', query_type: 'ip', created_at: 1716912000 }, ...]
lib/targets.ts — 保存されたターゲット:```typescript
// Upsert a target (idempotent on query)
const id = await saveTarget(db, query, label, notes)
// List all saved targets const targets = await listTargets(db)
// Remove by id await removeTarget(db, id)
// Fetch one (used by cron before re-querying) const target = await getTarget(db, id)
// Write latest snapshot after cron re-query await updateTargetSnapshot(db, id, resultJson)
---
## Cronワーカー
スタンドアロンのWorker(`worker/cron.ts`)は、`wrangler.cron.toml`を介して個別にデプロイされます。これは**時間ごとのトリガー**で実行され、2つのジョブを実行します。
1. **ブロックリストの更新** — Feodo/SSLBLのバルクリストが古くなっていないか確認し、必要に応じて再ダウンロードします。
2. **保存済みターゲットのスイープ** — 保存されたすべてのターゲットを再クエリし、型指定された`TargetDiff`を計算し、新しいスナップショットをD1に永続化し、変更が検出されたときにWebhookペイロードをPOSTします。
### 型指定された差分(`lib/diff.ts`)
再クエリごとに、`diffHostResults(prev, next)`は、以下の項目を含む構造化された`TargetDiff`を生成します:
| シグナル | 検出内容 |
|---|---|
| `ports` | 開いた/閉じたポート(ポートごとの方向) |
| `cves` | 出現/解決されたCVE(CVSSの深刻度とスコアを含む) |
| `threats` | URLhaus、Feodo、SSLBL、ThreatFoxフィードの変更 |
| `geo` | 国、ASN、またはプライマリホスト名の変更 |
| `certExpiry` | 30日以内に期限切れになる証明書または新たに期限切れになった証明書(証明書ごとに1回発動) |
| `risk` | リスクスコアの差分 — Δ ≥ 5ポイントの場合のみ`hasChanges`に現れる |
`summariseDiff(diff, query)`は、構造体をログやWebhookリレー用の人間が読める文字列に変換します。
### Webhookペイロード
`diff.hasChanges`がtrueで`WEBHOOK_URL`が設定されている場合、cronは以下をPOSTします:```json
{
"sentAt": 1716912000,
"events": [
{
"targetId": "abc123",
"query": "1.2.3.4",
"checkedAt": 1716912000,
"summary": "1.2.3.4:\n port 3389 opened\n CVE-2021-44228 appeared [CRITICAL 10]",
"diff": {
"diffedAt": 1716912000,
"hasChanges": true,
"ports": [{ "port": 3389, "direction": "opened" }],
"cves": [{ "id": "CVE-2021-44228", "direction": "appeared", "severity": "CRITICAL", "score": 10 }],
"threats": [],
"geo": [],
"certExpiry": [],
"risk": { "prev": 20, "next": 55, "delta": 35 }
}
}
]
}
diff フィールドは完全に構造化されています — 利用者は特定の変更タイプに基づいて分岐でき、文字列行を解析する必要はありません。 summary フィールドは Slack/Discord リレー用に事前フォーマットされています。
cron worker をデプロイ:```bash wrangler deploy --config wrangler.cron.toml
cronワーカーのシークレットは別途設定されます:```bash
wrangler secret put NVD_KEY --config wrangler.cron.toml
wrangler secret put ABUSECH_KEY --config wrangler.cron.toml
wrangler secret put WEBHOOK_URL --config wrangler.cron.toml # optional — fires on any hasChanges
npm i -g wrangler)git clone https://github.com/Teycir/SeekYou cd SeekYou npm install
cp .env.example .env
npm run dev
アプリは `http://localhost:3000` で利用できます。ローカル開発では、KVとD1はWranglerのローカルSQLiteベースのエミュレーションを使用します — 基本的なテストにはCloudflareアカウントへのアクセスは不要です。
### Cloudflareリソースの作成(初回)```bash
# Create KV namespace — copy the ID into wrangler.toml
wrangler kv namespace create KV
# Create D1 database — copy the ID into wrangler.toml
wrangler d1 create seekyou
# Apply schema
wrangler d1 execute seekyou --file=schema.sql
bash scripts/deploy.sh
スクリプトは `opennextjs-cloudflare build` を実行し、Pages 出力ディレクトリを準備し、`wrangler pages deploy .open-next` を呼び出します。`npm run deploy` や裸の `wrangler deploy` は **使用しないでください** — これらは Workers (非 Pages) ランタイムを対象としており、失敗します。
cron ワーカーを個別にデプロイするには:```bash
wrangler deploy --config wrangler.cron.toml
wrangler.toml)```tomlname = "seekyou" pages_build_output_dir = ".open-next" compatibility_date = "2025-05-01" compatibility_flags = ["nodejs_compat"]
[[kv_namespaces]] binding = "KV" id = ""
[[d1_databases]] binding = "DB" database_name = "seekyou" database_id = ""
---
## Secrets and environment variables
すべての秘密情報は Wrangler のシークレットとして保存され、ソースコードや `.env` には決して保存されません。
### 必須のシークレット```bash
wrangler secret put NVD_KEY # NVD API key (optional — higher rate limits)
wrangler secret put ABUSECH_KEY # abuse.ch API key (URLhaus/ThreatFox/MalwareBazaar)
wrangler secret put ADMIN_TOKEN # Bearer token for /api/admin/* endpoints
# GrayHatWarfare — repeat for each key you have (1–18)
wrangler secret put GRAYHATWARFARE_API_KEY_1
wrangler secret put GRAYHATWARFARE_API_KEY_2
# ... up to GRAYHATWARFARE_API_KEY_18
.env.example (ローカル開発のみ)```bashNVD_KEY=your_nvd_key_here ABUSECH_KEY=your_abusech_key_here ADMIN_TOKEN=change_me GRAYHATWARFARE_API_KEY_1=your_ghw_key_here
> **セキュリティ注意:** `.env` は絶対にコミットしないでください。`.gitignore` に含まれています。もしシークレットがコミットされた場合は、すべてのキーをローテーションし、BFG (`bfg --delete-files .env`) で Git 履歴をクリーンアップしてください。
---
## ライセンス
**Business Source License 1.1 (BSL)**
Copyright © 2026 Teycir Ben Soltane <[email protected]>
許可: 個人利用、研究、教育、非商用プロジェクト、社内業務ツール。
制限: 商用SaaS提供、サービスとしての再販、競合製品。
リリース日から4年後、本ソフトウェアは Apache 2.0 に移行します。
詳細な条件は [docs/LICENSE.md](https://github.com/teycir/seekyou/blob/master/docs/LICENSE.md) をご覧ください。
---
## 著者
**Teycir Ben Soltane**
メール: [email protected]
GitHub: [@Teycir](https://github.com/Teycir)
---
## 謝辞
- [InternetDB](https://internetdb.shodan.io) (Shodan)
- [IPinfo](https://ipinfo.io)
- [RIPE stat](https://stat.ripe.net)
- [RDAP](https://rdap.org)
- [crt.sh](https://crt.sh)
- [HackerTarget](https://hackertarget.com)
- [Robtex](https://www.robtex.com)
- [abuse.ch](https://abuse.ch) — URLhaus, ThreatFox, MalwareBazaar, Feodo, SSLBL
- [NVD](https://nvd.nist.gov) (NIST)
- [CIRCL](https://www.circl.lu/services/cve-search/)
- [OSV.dev](https://osv.dev)
- [GrayHatWarfare](https://grayhatwarfare.com)
- [Internet Archive](https://web.archive.org) (Wayback Machine)
---
## 🌐 関連プロジェクト
プライバシー重視およびセキュリティツールをもっと探す:
### プライバシーと暗号化
- **[Timeseal](https://github.com/Teycir/Timeseal)** - デッドマンズスイッチ搭載の時間制限付き暗号化ボールト。AES-256分割鍵暗号、一時的な封印。
- **[Sanctum](https://github.com/Teycir/Sanctum)** - 暗号学的に否認可能なゼロトラスト暗号化ボールト。XChaCha20-Poly1305、Argon2id。
- **[GhostChat](https://github.com/Teycir/GhostChat)** - WebRTCによる真のP2P暗号化チャット。サーバー不要、保存なし、自己破壊メッセージ。
- **[xmrproof](https://github.com/Teycir/xmrproof)** - Monero支払い確認、100%クライアントサイド。
- **[GhostReceipt](https://github.com/Teycir/GhostReceipt)** - ゼロ知識証明による匿名領収書生成。
### セキュリティツール
- **[BurpAPISecuritySuite](https://github.com/Teycir/BurpAPISecuritySuite)** - APIセキュリティテストのためのBurp Suite拡張機能。15種類の攻撃タイプ、108以上のペイロード、BOLA/IDOR検出。
- **[Mcpwn](https://github.com/Teycir/Mcpwn)** - Model Context Protocolサーバー向け自動化セキュリティスキャナー。RCE、パストラバーサル、プロンプトインジェクションを検出。
- **[DiffCatcher](https://github.com/Teycir/DiffCatcher)** - Gitリポジトリ発見、差分キャプチャ、コード要素抽出。
- **[HoneypotScan](https://github.com/Teycir/HoneypotScan)** - セキュリティ研究のためのハニーポット検出サービス。
- **[CheckAPI](https://github.com/Teycir/CheckAPI)** - 複数プロバイダー対応のLLM APIキーバリデーター。プライバシー重視、クライアントサイド検証。
### MCPセキュリティサーバー
- **[burp-mcp-server](https://github.com/Teycir/burp-mcp-server)** - Burp Suite Professional用MCPサーバー。AIアシスタント経由の脆弱性スキャン。
- **[nuclei-mcp](https://github.com/Teycir/nuclei-mcp)** - Nuclei用MCPサーバー。マルチターゲットスキャン、深刻度フィルタリング。
- **[nmap-mcp](https://github.com/Teycir/nmap-mcp)** - Nmap用MCPサーバー。ステルス偵察、脆弱性/NSEスキャン。
- **[frida-mcp](https://github.com/Teycir/frida-mcp)** - Frida用MCPサーバー。動的インストルメンテーション、SSLピンバイパス。
---
## 💼 提供サービス
- 🔒 **プライバシーファースト開発** - P2Pアプリケーション、暗号化通信、ゼロ知識システム
- 🚀 **Webアプリケーション開発** - Next.js、React、TypeScriptによるフルスタック開発
- 🔧 **エッジコンピューティングソリューション** - Cloudflare Workers、Pages、D1、KV、Durable Objects
- 🛡️ **セキュリティツール開発** - Burp拡張機能、侵入テストツール、自動化フレームワーク
- 🤖 **AI統合** - LLM搭載アプリケーション、インテリジェント自動化、カスタムAIソリューション
- 🔍 **OSINTと脅威インテリジェンス** - カスタム偵察ツール、脅威フィード集約、IOC相関
**お問い合わせ**: [teycirbensoltane.tn](https://teycirbensoltane.tn) | フリーランスプロジェクトやコンサルティングのご依頼を受け付けています
---
<div align="center">
**💚 によって構築されました [Teycir Ben Soltane](https://teycirbensoltane.tn) 💚**
</div>
| レイヤー | ソース | 提供内容 | 認証要件 |
|---|
| 1 | InternetDB | オープンポート、CPE、CVE ID | なし |
| 1 | IPinfo | 地理、ISP、ASN、Anycastフラグ | なし |
| 1 | RIPE stat | BGPプレフィックス、ASNホルダー、RIR | なし |
| 1 | RDAP | 登録情報、連絡先、ネームサーバー、CIDR | なし |
| 2 | crt.sh | 証明書履歴、SAN、発行元チェーン | なし |
| 2 | HackerTarget | パッシブDNS — 逆IP & ホスト検索 | なし |
| 2 | Robtex | 逆/前方DNS、AS情報 | なし |
| 2 | URLhaus | マルウェア配布URL | ABUSECH_KEY |
| 2 | ThreatFox | IOCデータベース | ABUSECH_KEY |
| 2 | MalwareBazaar | マルウェアサンプルのメタデータ | ABUSECH_KEY |
| 2 | Feodo Tracker | ボットネットC2 IP | なし(一括ダウンロード) |
| 2 | SSLBL | 悪意のあるSSL証明書 | なし(一括ダウンロード) |
| 3 | NVD + CIRCL | CVE詳細、CVSS v2/v3スコア | NVD_KEY(オプション) |
| 4 | GrayHatWarfare | 露出したS3/Azure/GCSバケット | GRAYHATWARFARE_API_KEY_1..18 |
| 4 | Wayback | 過去のCDXスナップショット | なし |
| ソース | TTL |
|---|
| CVE (NVD/CIRCL) | 30日 |
| Wayback | 7日 |
| BGP, RDAP, Robtex | 24時間 |
| crt.sh, HackerTarget passive DNS | 12時間 |
| GrayHatWarfare | 6時間 |
| InternetDB, IPinfo | 1時間 |
| Feodo, SSLBL (bulk) | 1時間 |
| URLhaus, ThreatFox, MalwareBazaar | 30分 |