
2026/01/06 1:47
**Show HN:** *Tailsnitch – Tailscale 用のセキュリティ監査ツール*
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
Tailsnitch は、52項目を7つのカテゴリ(アクセス、認証、ネットワーク、SSH、ログ、デバイス、DNS)に分類した検査で、誤設定や過度に許容的なアクセス制御、ベストプラクティス違反を監査する軽量CLIツールです。
ユーザーは
tailsnitch のようなシンプルなコマンドで実行し、結果を severity(--severity)、カテゴリ(--category)、特定のチェックID(--checks)または tailnet(--tailnet)でフィルタリングでき、SOC 2 証拠として JSON または CSV へエクスポートできます。ツールは
tailsnitch --fix による対話型修復をサポートし、dry‑run、auto‑select、および古いデバイス、保留中の承認、auth keys、タグなどの問題を自動的に修正するオプションがあります。認証は OAuth(推奨)または API キーで行われます;監査モードでは
policy_file:read と devices:core:read のスコープが必要で、修復モードではさらに auth_keys と devices:core が必要です。インストールは簡単です:GitHub Releases から事前ビルドされたバイナリをダウンロードするか、
go install github.com/Adversis/tailsnitch@latest を実行するか、ソースコード(git clone https://github.com/Adversis/tailsnitch.git)をビルドします。既知のリスクは
.tailsnitch-ignore ファイルで抑制できます(例:ACL‑008 や DEV‑006 のようなエントリー)。このファイルは現在とホームディレクトリに検索され、--no-ignore で無効化可能です。Tailnet‑Lock チェック(
DEV‑010、DEV‑012)にはローカルの Tailscale CLI が必要で、遠隔監査時にはマシンの状態を反映し、--tailscale-path を使用して上書きできます。JSON エクスポートはポストプロセッシング(例:
jq で失敗や severity の概要を一覧表示)用に設計されており、--soc2 json または --soc2 csv により SOC 2 証拠の生成もサポートします。最後に、Tailsnitch は CI/CD パイプライン(GitHub Actions など)へ統合でき、重大または高 severity の発見があった場合にビルドを自動的に失敗させることで、チームが継続的にセキュリティポリシーを強制するのに役立ちます。
本文
Tailsnitch – Tailscale 設定のセキュリティ監査ツール
Tailsnitch は、あなたの Tailnet をスキャンし、50 以上の誤設定、過度に許容的なアクセス制御、およびセキュリティベストプラクティス違反を検出します。
クイックスタート
- Tailscale API 認証情報を設定
export TSKEY="tskey-api-..." - 監査実行
tailsnitch - 高重大度の結果のみ表示
tailsnitch --severity high - いくつかの問題を修正(インタラクティブ「yolo」モード)
tailsnitch --fix
インストール
事前ビルド済みバイナリをダウンロード
- GitHub Releases から最新版を入手します。
macOS ユーザーはダウンロード後に隔離解除してください:sudo xattr -rd com.apple.quarantine tailsnitch
Go を使ってインストール
go install github.com/Adversis/tailsnitch@latest
ソースからビルド
git clone https://github.com/Adversis/tailsnitch.git cd tailsnitch go build -o tailsnitch .
認証
Tailsnitch は 2 種類の認証方法をサポートします。両方が設定されている場合は OAuth が推奨です。
| オプション | 説明 |
|---|---|
| OAuth クライアント(推奨) | スコープ付きで監査可能なアクセス権限。従業員退職後も継続します。 |
| API キー | 作成者のユーザーとして動作し、そのユーザーの権限を継承します。 |
OAuth クライアント
export TS_OAUTH_CLIENT_ID="..." export TS_OAUTH_CLIENT_SECRET="tskey-client-..."
クライアントは https://login.tailscale.com/admin/settings/oauth で作成してください。
読み取り専用監査に必要なスコープ:
(最も簡単)または個別:all:read
– ACL ポリシーpolicy_file:read
– デバイス一覧devices:core:read
– DNS 設定dns:read
– 認証キーauth_keys:read
修正モードに必要な追加スコープ:
– デバイス削除、タグ変更(タグ選択が必要)devices:core
– 認証キー削除auth_keys
API キー
export TSKEY="tskey-api-..."
API キーは https://login.tailscale.com/admin/settings/keys で作成します。
使用例
基本監査
tailsnitch # 完全監査 tailsnitch --verbose # 成功したチェックも表示 tailsnitch --json # JSON 出力(処理用) tailsnitch --tailnet mycompany.com # 特定 Tailnet を監査(OAuth のみ)
結果をフィルタリング
tailsnitch --severity high # クリティカル & ハイのみ tailsnitch --category access # ACL 関連 tailsnitch --category auth # 認証・キー関連 tailsnitch --category device # デバイスセキュリティ tailsnitch --category network # ネットワーク公開 tailsnitch --category ssh # SSH ルール tailsnitch --category log # ログ&管理 tailsnitch --checks ACL-001,AUTH-001,DEV-010 # 特定チェックのみ tailsnitch --list-checks # 利用可能な全チェックを表示
インタラクティブ修正モード
tailsnitch --fix # インタラクティブ修正モード tailsnitch --fix --dry-run # 修正のプレビュー(ドライラン) tailsnitch --fix --auto # 安全な修正を自動選択(確認が必要) tailsnitch --fix --no-audit-log # 修正アクションの監査ログを無効化
API で修正可能な項目
| チェック | アクション |
|---|---|
| AUTH-001, AUTH-002, AUTH-003 | 認証キー削除 |
| AUTH-004 | 一時的キーに置き換え |
| DEV-002 | ユーザー・デバイスからタグを削除 |
| DEV-004 | スタールデバイス削除 |
| DEV-005 | 保留中のデバイス承認 |
修正モードでは、手動介入が必要な問題に対して管理コンソールへの直接リンクも提供します。
SOC 2 証拠エクスポート
Common Criteria(CC)制御マッピング付きで SOC 2 監査用証拠レポートを生成します。
tailsnitch --soc2 json > soc2-evidence.json # JSON エクスポート tailsnitch --soc2 csv > soc2-evidence.csv # CSV エクスポート(スプレッドシート向け)
レポートには次が含まれます:
- リソース別テスト結果
- CC コードマッピング(例:
,CC6.1
)CC7.1 - 各制御テストの Pass/Fail/N/A ステータス
- 監査トレイル用タイムスタンプ
CSV 出力例
resource_type,resource_id,resource_name,check_id,check_title,cc_codes,status,details,tested_at device,node123,prod-server,DEV-001,Tagged devices with key expiry disabled,"CC6.1;CC6.3",PASS,"Tags: [tag:server] key expiry enabled","2025-01-05T10:30:00Z" key,tskey-auth-xxx,tskey-auth-xxx,AUTH-001,Reusable auth keys exist,"CC6.1;CC6.2;CC6.3",FAIL,"Reusable key expires in 45 days","2025-01-05T10:30:00Z"
知っているリスクを無視する
.tailsnitch-ignore ファイルを作成し、許容済みのリスクに対して発見結果を抑制します。
# .tailsnitch-ignore # 情報性チェックを無視 ACL-008 # グループは意図的に未使用 ACL-009 # レガシー ACL は我々の用途で許容 # 正当化付き中程度チェックを無視 DEV-006 # 外部デバイスは承認済み契約者 LOG-001 # フロー・ログは Enterprise プランが必要
Ignore ファイルの検索順序(優先度)
- 現在ディレクトリ内の
.tailsnitch-ignore - ホームディレクトリ
~/.tailsnitch-ignore
追加オプション:
tailsnitch --ignore-file /path/to/ignore # 指定ファイルを使用 tailsnitch --no-ignore # Ignore ファイル処理を完全に無効化
JSON エクスポートと処理
tailsnitch --json > audit.json # 完全レポート出力
失敗したチェックを TSV で抽出
tailsnitch --json | jq -r ' .suggestions | map(select(.pass == false)) | .[] | [.id, .title, .severity, .remediation] | @tsv ' > findings.tsv
重大度別のサマリー
tailsnitch --json | jq ' .suggestions | map(select(.pass == false)) | group_by(.severity) | map({severity: .[0].severity, count: length}) '
管理リンク付きクリティカル/ハイ問題リスト
tailsnitch --json | jq -r ' .suggestions | map(select(.pass == false and (.severity == "CRITICAL" or .severity == "HIGH"))) | .[] | "\(.id): \(.title)\n Fix: \(.fix.admin_url // "manual")\n" '
コマンドリファレンス
| フラグ | 説明 |
|---|---|
| JSON 出力 |
| 最小重大度フィルタ(, , , , ) |
| カテゴリフィルタ(, , , , , , ) |
| 個別チェック(カンマ区切り ID またはスラグ) |
| 利用可能な全チェックをリストして終了 |
| 監査対象 Tailnet(API キーのデフォルト) |
| 成功したチェックも表示 |
| インタラクティブ修正モードを有効化 |
| 安全な修正を自動選択( 必須) |
| 修正のプレビューのみ実行( 必須) |
| 修正アクションの監査ログを無効化 |
| SOC 2 証拠エクスポート( または ) |
| Tailnet Lock チェック用 tailscale CLI のパス |
| Ignore ファイルのパス |
| Ignore ファイル処理を無効化 |
| バージョン情報表示 |
セキュリティチェック
Tailsnitch は 7 カテゴリにわたる 52 のセキュリティチェックを実行します。各チェックの詳細は
docs/CHECKS.md を参照してください。
クリティカル(Critical)
| ID | チェック | リスク |
|---|---|---|
| ACL-001 | デフォルト ポリシー | 全デバイスに制限なしアクセスを許可 |
| ACL-002 | SSH autogroup:nonroot の誤設定 | 任意の非 root ユーザーで SSH 可能 |
| ACL-006 | が広すぎる | タグ経由で権限昇格 |
| ACL-007 | autogroup:danger-all 使用 | 外部ユーザーにアクセス許可 |
ハイ(High)
| ID | チェック | リスク |
|---|---|---|
| AUTH-001 | 再利用可能な認証キー | 盗難時に無制限デバイス追加が可能 |
| AUTH-002 | 長期有効認証キー | 暴露期間が長い |
| AUTH-003 | 事前承認されたキー | デバイス承認を迂回 |
| DEV-001 | キー期限なしでタグ付けされたデバイス | 無制限アクセス |
| DEV-002 | ユーザー・デバイスにタグ付け | ユーザー削除後も残存 |
| DEV-010 | Tailnet Lock 無効 | 盗まれたキーへの保護がない |
| DEV-012 | 未署名の Tailnet Lock シグネチャ | 署名されていないノードを確認必要 |
| NET-001 | Funnel 公開 | インターネットから直接アクセス可能 |
| NET-003 | サブネットルーター信頼境界 | ローカルネットワークで暗号化されないトラフィック |
| SSH-002 | Root SSH でチェックモードなし | 再認証が不要 |
ミディアム(Medium)
| ID | チェック | リスク |
|---|---|---|
| ACL-004 | autogroup:member 使用 | 外部ユーザーが含まれる |
| ACL-005 | AutoApprovers 設定 | ルート承認を迂回 |
| AUTH-004 | 非一時的 CI/CD キー | スタールデバイス増加 |
| DEV-003 | 古いクライアント | 脆弱性の可能性 |
| DEV-004 | スタールデバイス | 未使用攻撃面 |
| DEV-005 | 未承認デバイス | 承認待ちキューに存在 |
| DEV-007 | 機密マシン名 | CT ログ公開 |
| DEV-009 | デバイス承認設定 | 有効でない可能性 |
| NET-004 | HTTPS CT ログ公開 | マシン名が公開 |
| NET-005 | Exit node トラフィック可視化 | オペレーターが全トラフィックを閲覧 |
| NET-006 | サーブエクスポージャ | Tailnet 上でローカルサービス公開 |
| SSH-003 | レコーダ UI 公開 | セッションがネットワーク上に表示 |
情報性(Informational)
ログ設定、DNS 設定、ユーザー権限、および手動確認項目に関するチェック。
出力例
+=====================================================================+ | TAILSNITCH SECURITY AUDIT | | Tailnet: example.com | | Version: 1.0.0 (build: abc123) | +=====================================================================+ Using ignore file: .tailsnitch-ignore (3 rules) === ACCESS CONTROLS =================================================== [CRITICAL] ACL-001: Default 'allow all' policy active Your ACL policy omits the 'acls' field. Tailscale applies a default 'allow all' policy, granting all devices full access. Remediation: Define explicit ACL rules following least privilege principle. Source: https://tailscale.com/kb/1192/acl-samples === AUTHENTICATION & KEYS ============================================= [HIGH] AUTH-001: Reusable auth keys exist Found 2 reusable auth key(s). These can be reused to add multiple devices if compromised. Details: - Key tskey-auth-xxx (expires in 45 days) - Key tskey-auth-yyy (expires in 89 days) Remediation: Store reusable keys in a secrets manager. Prefer one-off keys. Source: https://tailscale.com/kb/1085/auth-keys SUMMARY ====================================================================== Critical: 1 High: 3 Medium: 5 Low: 2 Info: 8 Total findings: 19 | Passed: 33
Tailnet Lock チェック
Tailnet Lock チェック(
DEV‑010, DEV‑012)はローカル tailscale CLI を必要とし、ローカルマシンのデーモンに対して実行されます。リモート Tailnet を --tailnet で監査する場合、これらのチェックはローカルステータスを反映し、監査対象 Tailnet の状態ではありません。
必要に応じてカスタム tailscale バイナリパスを指定してください:
tailsnitch --tailscale-path /opt/tailscale/bin/tailscale
CI/CD 統合
CI/CD パイプラインで Tailsnitch を実行し、セキュリティ回帰を検出します。
- name: Audit Tailscale Security env: TS_OAUTH_CLIENT_ID: ${{ secrets.TS_OAUTH_CLIENT_ID }} TS_OAUTH_CLIENT_SECRET: ${{ secrets.TS_OAUTH_CLIENT_SECRET }} run: | tailsnitch --json > audit.json # クリティカルまたはハイ重大度の問題があれば失敗 if tailsnitch --severity high --json | jq -e '.summary.critical + .summary.high > 0' > /dev/null; then echo "Critical or high severity issues found!" tailsnitch --severity high exit 1 fi
参考資料
ライセンス
MIT
コントリビューション
CONTRIBUTING.md を参照してください。