【ComfyUI】外部通信を検知して停止するAirgap Guardノードを作って公開しました
はじめに
この記事から読み始めた方向けに、前回の記事と同じような書き出しです。
友人、知人、家族、クライアント、ペットなど、プライバシーに関わるデータを使って学習や生成をさせたいときはローカル生成AIを使うのがベスト。
ローカル生成に期待するのは、データを完全に自分のマシン上にとどめておくこと。でも、野良カスタムノードなどまで含めたときに、じつはサプライチェーンリスクがあるのではないか。
ほとんどは安全だとわかっていても、生成時には完全にオフラインに切り替える方が、確実な安全が確保できます。
そのために必要なアプリを作成して配布したのが前回。
今回のテーマは…
仮に前回配布したAirgap Trayを使ったとしても、「うっかり切り忘れたまま生成しちゃった😋」というケースはあり得ます。
むしろアプリを導入したことで気が緩んでしまい、切り忘れが増えるまである…かも知れません。
そこで、さらなる安全性のために、Airgap Trayと組み合わせて一層強力にオフライン生成を推し進めるカスタムノードを作りました。
というわけで、この記事は前回の記事の続編です。今回の記事で配布するカスタムノードを活かすには、前回の記事で紹介した筆者作のアプリが前提になります。まだお読みでない方は先に前回の記事から読んでください。
キルスイッチでは足りないかも
ほぼ前書きで書いちゃいましたが、せっかくダブルクリックでairgap状態に出来る、いわばネット接続のキルスイッチがあったとしても、うっかりトレイ上の緑の丸を確認せずに生成を開始してしまい、しまった!ってなる可能性は高いと思います。
もちろんほぼ確実に、(パートナーノードなどを除けば)ローカルの画像データなどを外部に送信することなどないのですが、野良カスタムノードなどを無批判にインストールしてしまいがちな以上、確実に絶対大丈夫なんて言い切れません。
この「うっかりオンライン」、どうやって防止したらいいかなと考えて、着想を得たので今回のカスタムノードに至りました。
Jun's Airgap Guardカスタムノードについて
一体どんなノード?
これは
pythonで書かれたコードなのでネットに勝手に接続できる
出力ノードであれば独立させておいても無視されない
エラーを発生させれば生成が止められる
という特性を利用して、ノードがアクティブになった際に指定したURLに対して接続を試行し、それが通ったか通らなかったかに応じてエラーを発生させるかさせないか、あるいは単に状態だけを通知するかを選ぶというだけのノードです。
何の役に立つの?
このノードを普段お使いのワークフローに突っ込んでおくだけで、自動的に「オフラインじゃない場合は止める」機能が追加されます。
お察しの通りこのノードだけではあまり役に立たず、Airgap Trayと組み合わせることで真価を発揮します。
Airgap Trayでの止め忘れがあっても、このノードを入れておくことで停止できるため「うっかりでのネットワークオンライン生成」をシンプルに防止できます。
インストール
いつも通りGithubに上げておきました。
パス名は必要に応じて読み替えてください。ComfyUIのインストールディレクトリを
D:\App\ComfyUI
と仮定すると
D:\App\ComfyUI\custom_nodes
以下に移動してcloneするか、あるいはzipをダウンロードして展開してください。特に必要な対からパッケージなどはないので、そのままでインストール終了するはずです。
インストール後はComfyUIを起動し直してください。
使い方
最低限の構成として、このノードと「整数」ノードの組み合わせで動作します。ComfyUIの仕組み上「同一の結果になる場合は無視」という原則があり、ノードを単体で置いた場合、ワークフローにシード値などの変更された点がなければ、チェックが行われない可能性が出てしまいます。
そこで、整数ノードを一つ用意し、生成後の制御を「randomize」に設定した上で「プローブトークン」に接続しておいてください。
本当にごくごくわずかな可能性として、ほぼあり得ませんが、乱数値が生成される際に、元の値と同一の値になってしまうケースもないとは言えません。でも可能性としてはほぼ無視できるので、Airgap Trayの安全性を最大限引き出せると思います。
さて、入力が必要な項目は最低一つ。それは「接続を試行するウェブサイトのURL」です。指定したサイトに接続できるか出来ないかでエラーを発生させるかが決まります。相手のサイトに迷惑にならないよう、太い回線を持っていそうなサイトのURLを書いておけば大丈夫と思います。
また、実行もそんなに頻回でなければ問題ないと思いますが、念のため一回の試行からは1秒以上時間をおくようにしましょう(ふつうは確実に1秒以上あきます)。
タイムアウトは相手サーバからの返値をどの程度の時間待機するか。
そして動作モードですが
オンラインなら停止→接続が成功したらエラーを発生
オフラインなら停止→接続が失敗したらエラーを発生
停止しない→接続の成功や失敗などだけが知りたい場合
という感じで選びます。オフラインで確実に使いたい場合は、Airgap Trayあるいはケーブル引き抜きや機内モードなどでネットを切断した後で、「オンラインなら停止」を選択しておきます。

エラーはこんな感じです。

何らかの結果が出ると、ノード下部のバッジのステータスが変化します。

まとめ
こだわらなければどうということもないことではありますが、今後サプライチェーンリスクが高まる可能性を考えると、確実なオフライン生成の保証への需要は高まると思います。
このカスタムノードがその一助になれば幸いです。
