
マルチホストUFWファイアウォールダッシュボード — ルールを平易な英語で説明し、セキュリティの弱点を検出、接続診断を提供
マルチホストUFWファイアウォールダッシュボード。SSH経由でLinuxホストに接続し、ファイアウォールルールとリッスンポートを解析し、すべてを平易な英語で説明し、セキュリティ上のギャップをフラグします。

| Route | 説明 |
|---|---|
/ | ホストカード、サービスピル、ギャップ数を含む概要ダッシュボード |
/host/{name} | ホスト詳細。タブ付きビュー:説明付きルール、未カバーポート、リッスンポート、生出力 |
Browser --> Cloudflare Tunnel --> Reverse Proxy --> FencePost (:8890)
FastAPI container
|-- SSH --> Host 1 (ufw status, ss -tlnp)
|-- SSH --> Host 2
|-- SSH --> Host N
'-- POST --> Notification webhook
FencePostは読み取り専用です。ファイアウォールルールを変更することはなく、レポートのみを行います。
<user> ALL=(ALL) NOPASSWD: /usr/sbin/ufw status verbose, /usr/sbin/ufw status numbered, /usr/bin/ss -tlnp
git clone <repo-url> && cd fencepost
# SSHキーを追加
cp ~/.ssh/your_key ssh/id_ed25519
chmod 600 ssh/id_ed25519
# テンプレートから環境ファイルを作成
cp .env.example .env
# .env を実際の認証情報で編集
timezone: Australia/Melbourne
hosts:
- name: My Server
hostname: 192.168.1.10
ssh_user: deploy
ssh_port: 22
is_docker_host: false
networks:
"192.168.1.0/24": "LAN"
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
# 環境変数をロード(bash/zsh)
export $(grep -v '^#' .env | xargs)
uvicorn app.main:app --reload --port 8890
http://localhost:8890 を開きます。
注意:ローカルモードでは、config.yaml で指定されたパスのSSHキー(ssh.key_path)を使用します。ローカル開発では、これをローカルの ssh/id_ed25519 にオーバーライドするとよいでしょう。
ssh:
key_path: ssh/id_ed25519
timeout: 10
docker compose up -d --build
http://localhost:8890 を開きます。コンテナは compose.yaml を介して .env から自動的に認証情報を読み取ります。
認証情報は .env(gitignored)に保存され、compose.yaml から参照されます。機密情報をリポジトリにコミットしないでください。
app/
main.py # FastAPIのルートと認証
models.py # HostFirewallState、UFWRule、ListeningPortのデータクラス
parser.py # ufw status と ss の出力をパース
explainer.py # ルールを平易な英語に変換
diagnose.py # 接続診断エンジン
gap_detector.py # 未カバーのリッスンポートを検出
ssh_client.py # Paramikoラッパー、並列ホスト取得
eventfeed.py # 変更検出とウェブフック投稿
templates/
base.html # レイアウト、CSS、ナビゲーション
overview.html # ホストダッシュボードグリッド
host_detail.html # ホストごとのタブ付き詳細ビュー
diagnose.html # 接続診断フォームと結果
login.html # 認証ページ
config.yaml # ホスト定義、VLAN、デバイス、タイムゾーン
compose.yaml # Docker Composeサービス定義
Dockerfile # Python 3.12 slimイメージ
.env.example # 環境変数のテンプレート
ssh/ # SSHキーディレクトリ(キーはコミットしない)
data/ # ランタイム状態(last_state.json、コミットしない)
config.yaml の hosts: にエントリを追加ssh-copy-id -i ssh/id_ed25519.pub user@host/etc/sudoers.d/fencepost を作成し、必要なNOPASSWDルールを記述docker compose up -d --buildconfig.yaml に設定し、NOTIFICATIONS_API_KEY 環境変数を指定すると、FencePostはダッシュボードの更新ごとに変更イベントを投稿します。
イベントには冪等性キーが含まれ、重複を防ぎます。
MIT
/diagnose| ルール単位のトレース可視化を備えた接続診断ツール |
/login | セッションベースの認証 |
| セクション | 目的 |
|---|
timezone | 表示するタイムスタンプのIANAタイムゾーン(例:Australia/Melbourne、UTC) |
hosts | SSHターゲットの配列:name、hostname、ssh_user、ssh_port、is_docker_host |
ssh | key_path(秘密鍵へのパス)と timeout(秒) |
networks | VLAN用のCIDR-to-nameマッピング。ルールの説明と診断で使用 |
devices | 診断ページのクイック選択ボタン用の名前付きIP |
notifications | オプションのウェブフック:url、channel(APIキーは環境変数で設定) |
| 変数 | デフォルト | 説明 |
|---|
FENCEPOST_USERNAME | admin | ログインユーザー名 |
FENCEPOST_PASSWORD | fencepost | ログインパスワード |
FENCEPOST_SECRET_KEY | change-me | セッションCookie署名キー |
FENCEPOST_CONFIG | config.yaml | 設定ファイルへのパス |
NOTIFICATIONS_API_KEY | 通知ウェブフックのBearerトークン |