02/Documentation
セキュリティ: 実行前にお読みください
Collieが公開するもの、保護の仕組み、書き込み認証情報としてのデバイスのペアリング
Collieは設計上、マシンへのリモートシェルアクセスを提供します。 Collie の単一の API 呼び出しにより、実行中のターミナルペインへ任意のキーストロークを直接送信できます。URL にネットワークアクセスできるユーザーは誰でも、すべてのペイン(ソースコード、シークレット、環境変数、エージェントの出力)を読み取り、実行ユーザーとしてコマンドを実行できます。
サンドボックスやコマンドのホワイトリストはありません。コマンドのフィルタリングはこのツールの目的に反するためです。この URL は root ログインと同等として扱ってください。
リスクモデル
主なセキュリティ境界とリスク:
- 実行ユーザーの権限で動作します。 Collieは、
~/.ssh、git push --force、rm -rf、sudoを含む実行ユーザーの全アクセス権限を継承します。 - ローカルの全システムユーザーがポートにアクセスできます。 標準的なターミナルマルチプレクサのソケット(
tmux、zellij、herdr)は、ファイルシステムパーミッションによって他のローカルユーザーからのアクセスを制限します。CollieはローカルTCPポートをリッスンするため、すべてのローカルUIDに公開されます。ペアリングやデバイスごとのゲートにより書き込みアクセスは制限されますが、すべてのローカルユーザーが読み取り操作を実行可能なままとなります。これにより実行リスクは制限されますが、データの漏洩は防止できません(ARCHITECTURE.md §6)。 - 単一のインスタンスがすべてのセッションを公開します。 デフォルトでは、1つの Collie プロセスが、Herdr の設定ルート配下で検出されたすべてのマルチプレクサセッション(サンドボックスセッションを含む、マルチセッション)のフロントエンドとして動作します。
- 書き込みは
<state-dir>/audit.logに記録されます。COLLIE_STATE_DIRで変更していない限り~/.local/state/collie/audit.logに配置されます。サーバーはすべての受信キーストローク、応答、ファイルアップロード、ペイン/タブのライフサイクルイベントをログに記録します。監査ログはアクセス制御ではなく、事後の可視性を提供する点に注意してください (ARCHITECTURE.md §6)。 - デフォルトの防御制御。 Collie はループバックインターフェースにのみバインドし、トラフィックを
tailscale serveまたは同等のリバースプロキシ経由でのみルーティングし、厳格な CSP ルール、同一生成元チェック、ホストヘッダー検証を適用します。ペインの出力はinnerHTMLではなく React テキストノードとしてレンダリングされます。tailscale funnelを使用したり、生のポートを公開したりしないでください。特定のハードウェアを承認するには、ペアリング を直接使用するか、プロキシがデバイス ID を挿入する場合は後述の2つのCOLLIE_DEVICE_*変数を使用します。
| 変数 | 機能 |
|---|---|
COLLIE_ALLOW_NON_LOOPBACK_BIND=1 | ループバック限定バインドを無効化します。未設定の場合、ブリッジは 0.0.0.0 へのバインドを拒否します。 |
COLLIE_ALLOW_ANY_HOST=1 | ホストヘッダー検証を無効化します。この検証はデフォルトで有効になっており、不一致時にアクセスを遮断します。 |
COLLIE_TRUSTED_USER | Tailscale-User-Login ヘッダーが存在しないか一致しないリクエストを拒否します。 |
COLLIE_TRUSTED_USER_OPTIONAL=1 | Tailscale-User-Login ヘッダーがないリクエストを許可します(タグ付きノードはこのヘッダーを送信しません)。 |
COLLIE_DEVICE_HEADER | プロキシがデバイス ID を挿入する際に使用するヘッダー名。 |
COLLIE_DEVICE_ALLOWLIST | 書き込みを許可するデバイス ID のカンマ区切りリスト。それ以外のデバイスはすべて読み取り専用のままになります(docs/deployment.md)。 |
🚫 Collie ではtailscale funnelを絶対に使用しないでください。 Funnel はトラフィックをパブリックインターネットにルーティングしますが、tailscale serveはアクセスをプライベートな tailnet に制限します。Funnel 経由で Collie を実行するユースケースはサポートされていません。
Tailscale の ACL および COLLIE_TRUSTED_USER を使用してアクセスをさらに制限します。本ソフトウェアは無保証で現状有姿のまま提供されます。
マシンから外部へ送信される情報
デフォルトおよびポリシーとして、何も送信されません。Collie はインストールのイベント、利用統計、クラッシュレポート、アナリティクスを一切送信しません。これらを有効にするフラグも存在しません。
自発的に行われる唯一のアウトバウンド通信は更新チェックです。GitHubの公開タグAPI (bridge/update.ts) への匿名 HTTPS GET リクエストであり、現在のバージョンを最新のタグと比較します。ユーザーやマシンに関するデータは送信されず、静的なユーザーエージェント collie-update-check のみが含まれます。
今後データ収集が追加される場合でも、明示的なオプトインが前提となります。デフォルトはオフであり、目に見える形で確認を求め、フラグやデフォルト設定によって有効化されることはありません。この約束を撤回することは破壊的変更に該当します (ADR 0034)。
デバイスのペアリング: 書き込み認証情報
bin/collie pair # on the host — prints an 8-character code and a QR code, good for 10 minutesスマートフォンでCollieを開き、設定 → ペアリング済みデバイスに移動して、デバイスのラベルとともにコードを入力します。または、コマンドによって表示されたQRコードをスキャンして、コードが入力された状態でその画面を直接開きます。スマートフォンは返されたトークンを保存します。Collieはハッシュのみを保持し、トークンは一度だけ表示されます。プロセスを再起動する必要はありません。実行中のデーモンは、次のリクエスト時にペアリングと失効を適用します。
2つのデバイス制限は異なる目的を持ち、どちらか一方、両方、またはいずれも使用しない構成が可能です:
| 確認内容 | 信頼対象 | 失効方法 | |
|---|---|---|---|
COLLIE_DEVICE_HEADER | このデバイスは管理者のリストに存在するか? | サニタイズされた名前を挿入するプロキシ | COLLIE_DEVICE_ALLOWLIST を編集して再起動 |
| ペアリング | このデバイスは自身が発行した認証情報を保持しているか? | ネットワーク上の要素はなし | collie devices revoke <label> (即時反映) |
ペアリングに追加のインフラは不要です。ヘッダーを挿入するプロキシが存在しない直接の tailscale serve 構成に適しています。
どちらのオプションも書き込みアクセスのみを制限します。同一オリジンチェックを通過する読み取りリクエストは引き続き許可されます。
bin/collie devices list # what holds a credential, and when each was last seen
bin/collie devices revoke old-phone # effective immediately, no restart書き込み制限は、1台以上のデバイスがペアリングされている間のみ有効です。collie pair を実行するまでデバイスはペアリングされないため、それまでは読み取りと書き込みの両方が従来どおり動作します。まず現在のスマートフォンをペアリングしてください。最後のデバイスの登録を解除すると、ロックアウトを防ぐために制限が再び無効化されます。
コード入力を5回失敗するとコードが無効になるため、collie pair を再実行する必要があります。
複数のインスタンスを実行しているホストでは、コマンドの前に COLLIE_INSTANCE=<name> を付加し、スマートフォンでその特定のインスタンスURLを開いてください (単一ホスト上での複数 Collie インスタンスの実行)。