
クラウドの力でリコンを拡張する

ReconSwarm は、分散型セキュリティテスト向けに設計されたモジュール型偵察自動化フレームワークです。クラウドインフラストラクチャをプロビジョニングし、並列の偵察パイプラインを実行し、最小限の設定オーバーヘッドで結果を収集します。
ReconSwarm は、手動でのインフラ管理を行わずにスケーラブルで自動化された偵察ワークフローを必要とする、バグバウンティハンター、ペネトレーションテスター、DevSecOps エンジニア、セキュリティ研究者に適しています。

ReconSwarm は、クラウドプロビジョニング、リモートシステム制御、パイプライン実行、設定管理の間で明確な関心の分離を持つモジュール型アーキテクチャに従います。
ReconSwarm はクラウドプロビジョナーに識別共用体型パターンを使用します。provisioner.type フィールドがアクティブなプロバイダー設定を決定します。
provisioner:
type: yandex_cloud # 識別子フィールド
yandex_cloud: # type: yandex_cloud のときに有効
iam_token: "${YC_TOKEN}"
# key_path: "./sa_auth_key.json"
folder_id: "${YC_FOLDER_ID}"
# ... プロバイダー固有の設定
追加のクラウドプロバイダーは、Provisioner インターフェースを実装し、ファクトリに新しいタイプを追加することで統合できます。
ステージは、ワーカー VM 上で操作を実行する拡張可能なコンポーネントです。
すべてのステージフィールドはテンプレートレンダリングをサポートします。新しいステージタイプを追加して機能を拡張できます。
ReconSwarm サーバーは完全にステートレスです。すべての状態は etcd に永続化されます。
このアーキテクチャにより以下が可能です。
| 機能 | 説明 |
|---|---|
| 水平スケーリング | ロードバランサーの背後で複数のサーバーインスタンスを実行。 |
| ダウンタイムゼロの再起動 | パイプラインの状態を失わずにサーバーを再起動。 |
| クラッシュリカバリ | 新しいサーバーインスタンスが前のインスタンスの続きから実行。 |
| 状態検査 | デバッグと監視のために etcd を直接クエリ。 |
高可用性構成:
┌─────────────┐
│ Client │
└──────┬──────┘
│
┌──────▼──────┐
│Load Balancer│
└──────┬──────┘
┌────────────┼────────────┐
│ │ │
┌──────▼──────┐ ┌───▼───┐ ┌──────▼──────┐
│ Server 1 │ │Server2│ │ Server 3 │
└──────┬──────┘ └───┬───┘ └──────┬──────┘
│ │ │
└────────────┼────────────┘
│
┌──────▼──────┐
│ etcd cluster│
└─────────────┘
すべてのサーバーは同じ etcd クラスターを共有し、任意のリクエストを処理できます。パイプライン実行中にサーバーがクラッシュした場合、別のサーバーが etcd から状態を読み取って実行を継続できます。
注: 現在の実装では、etcd からロードした後、メモリ内でパイプラインを実行します。パイプライン再開を含む完全なクラッシュリカバリは将来のリリースで計画されています。
git clone <repository>
cd reconswarm
go mod download
task build
ReconSwarm はサーバー設定とパイプライン設定を分離します。
| 設定タイプ | ファイル | 説明 |
|---|---|---|
| サーバー | reconswarm.yaml | クラウドプロバイダー、etcd、ワーカープール設定。 |
| パイプライン | 別の YAML ファイル | ターゲットとステージ。-f フラグで指定。 |
サーバー設定は reconswarm.yaml に保存されます(CONFIG_PATH 環境変数で設定可能)。すべての文字列値は ${VAR} または $VAR 構文を使用した環境変数の展開をサポートします。
# Server settings
server:
port: 50051
# Etcd connection for state management
etcd:
endpoints:
- "localhost:2379"
dial_timeout: 5 # seconds
username: "" # optional, supports ${ETCD_USER}
password: "" # optional, supports ${ETCD_PASSWORD}
# Cloud provisioner (discriminated union)
provisioner:
type: yandex_cloud # Provider selector
# Yandex Cloud configuration (active when type: yandex_cloud)
yandex_cloud:
iam_token: "${YC_TOKEN}"
# key_path: "./sa_auth_key.json"
folder_id: "${YC_FOLDER_ID}"
default_zone: "ru-central1-b"
default_image: "fd8b1cmhmncn7lt4tqn4"
default_username: "root"
default_cores: 2
default_memory: 2 # GB
default_disk_size: 20 # GB
# Worker pool settings
workers:
max_workers: 5
setup_commands:
- "apt update"
- "apt install -y docker.io"
パイプライン設定は別の YAML ファイルに保存し、-f フラグで指定します。ラップ形式とアンラップ形式の両方をサポートします。
ラップ形式(推奨):
# pipeline.yaml
pipeline:
targets:
- value: "example.com"
type: crtsh
- value: ["sub1.example.com", "sub2.example.com"]
type: list
stages:
- name: "Run scanner"
type: exec
steps:
- "nmap -sC -sV -iL {{.Targets.filepath}} -oN /opt/recon/scan.txt"
- name: "Collect results"
type: sync
src: "/opt/recon/scan.txt"
dest: "./results/{{.Worker.Name}}.txt"
アンラップ形式(同様にサポート):
# pipeline.yaml
targets:
- value: "example.com"
type: crtsh
stages:
- name: "Run scanner"
type: exec
steps:
- "nmap -iL {{.Targets.filepath}} -oN /opt/recon/scan.txt"
設定値は、以下の2つの形式で環境変数の置換をサポートします。
${VAR} — 中括弧内の完全な変数名$VAR — 単純な変数名環境変数が設定されていない場合、リテラル文字列(${VAR} または $VAR を含む)がそのまま使用されます。
Yandex Cloud との統合には、提供されているセットアップスクリプトを使用します。
Yandex Cloud CLI のインストール(まだインストールされていない場合):
# 公式の Yandex Cloud ドキュメントに従って CLI をインストール
Yandex Cloud CLI の設定:
yc config profile create <profile-name>
yc config set cloud-id <your-cloud-id>
yc config set folder-id <your-folder-id>
認証情報のエクスポート:
source ./secrets-setup.sh
このスクリプトは以下をエクスポートします。
YC_TOKEN — 認証用の IAM トークンYC_FOLDER_ID — リソース管理用のフォルダ IDYC_CLOUD_ID — クラウド ID(必要な場合)設定で参照:
provisioner:
type: yandex_cloud
yandex_cloud:
iam_token: "${YC_TOKEN}"
# key_path: "./sa_auth_key.json"
folder_id: "${YC_FOLDER_ID}"
secrets-setup.sh スクリプトは、実行するたびに新しい IAM トークンを自動生成するため、認証情報をハードコードせずに安全な認証が可能です。
サービスアカウントの作成:
環境の設定:
export GCP_PROJECT_ID="your-project-id"
export GCP_CREDENTIALS_PATH="/path/to/key.json"
設定で参照:
provisioner:
type: gcp
gcp:
project_id: "${GCP_PROJECT_ID}"
credentials_path: "${GCP_CREDENTIALS_PATH}"
default_zone: "us-central1-a"
IAM ユーザーの作成:
環境の設定:
export AWS_ACCESS_KEY_ID="your-access-key"
export AWS_SECRET_ACCESS_KEY="your-secret-key"
設定で参照:
provisioner:
type: aws
aws:
region: "us-east-1"
access_key_id: "${AWS_ACCESS_KEY_ID}"
secret_access_key: "${AWS_SECRET_ACCESS_KEY}"
default_zone: "us-east-1a"
トークンの生成:
環境の設定:
export DO_TOKEN="your-token"
設定で参照:
provisioner:
type: digitalocean
digitalocean:
token: "${DO_TOKEN}"
default_region: "nyc1"
crt.sh 列挙:
targets:
- value: "example.com"
type: crtsh
手動リスト:
targets:
- value: ["sub1.example.com", "sub2.example.com"]
type: list