ローカルのモデルに SSH アクセスを与える安全な方法は、鍵を決して渡さないことです。モデルにはツールを呼ばせます——カストディアン(鍵を預かる仕組み)として振る舞う MCP サーバーです。これが鍵を保持し(あるいは短期証明書を発行し)、あなたが列挙したホストにのみ到達し、ホストごとのコマンド許可リストを強制し、その一つひとつを記録します。こうすれば、乗っ取られたプロンプトにできるのは、カストディアンを通じて操作を依頼することだけです。あなたのなりすましはできず、列挙していないホストにも届きません。人がまず誤解するのはここです。モデルを自分のハードウェアで動かしても、守られるのはプロンプトであってサーバーではありません——「ローカルだから安全」は正しくなく、そのモデルがシェルを手にしたときに起きることについては何も手を打っていません。
ローカルモデルが盛り上がっています。ワークステーション上の Ollama、自前のエンドポイントの背後にあるオープンウェイトのモデル、セルフホストのコーディングエージェント——動かす理由はまっとうです。プライバシー、コスト、レート制限がない、飛行機の中でも動く。そして、モデルがすでにあなたのプロンプトを処理しているなら、次の当然の一歩は、それをあなたのインフラに向けることです。ログを追尾させる、サービスを再起動させる、マイグレーションを流させる——そこで本当の問いが立ち現れます。
なぜ「ローカル」はサーバーアクセスを安全にしないのか
モデルがデータセンターで動こうと、机の下のマシンで動こうと、まったく同じだけ危険なものが 2 つあります。
鍵はいまも持参人型の資格情報(bearer credential)です。 id_ed25519 をエージェントの環境に置いて ssh を自分で実行できるようにすれば、そのバイト列を持つ者は——人であれ何であれ——その鍵を信頼するすべてのホストの上であなた自身になります。モデルをローカルで動かしてもそれは変わりません。たまたまあなたが所有しているマシンに、その複製が移るだけです。しかも、やはり取り消せません。いったん鍵がモデルのコンテキストを通ってしまうと——環境変数、マウントしたファイル、ツール呼び出し、トランスクリプト——それが行くべきでない場所に行き着かなかったことを、もはや証明できません。「モデルは私の鍵を見たか?」への唯一の誠実な答えは、すべてのホストでローテーションすることです。
ローカルのモデルも混乱します。 プロンプトインジェクションにクラウドのモデルは必要ありません。汚染されたログ行、悪意あるファイル名、仕掛けのあるツール結果、前のめりすぎる計画——ローカルのモデルも、ホスト型と同じようにそれらすべてに反応します。むしろリスクはより大きいかもしれません。人はローカルの構成をより信用し、ガードレールを少なめに組み、より広いアクセスを与えてしまうからです。まさに「自分のマシンにあるから」という理由で。それは誤った直感です。重みがローカルにあるからといって、モデルの判断が優れているわけではありません。
ですから、目標はどのエージェントでも同じです——モデルには、資格情報を持つことなく仕事をさせ、すべての操作をスコープ付きで、見えて、取り消せるものにすることです。
まずい三つのやり方
生の鍵を貼り付ける。 直接的な経路で、最悪でもあります。スコープも有効期限もなく、上で述べた取り消し不能も付いてきます。ステージングにデプロイする鍵は、たいてい 2 ホップ先の本番データベースにも届いてしまいます。
長命なトークンを発行する。 決して失効しないデプロイトークンや「自動化用」の資格情報です。鍵よりきれいに見えますが、手順が増えただけで同じ持参人問題です。取り消すのに、それが存在することを思い出す必要があるようなら、それは生みの実験よりも長生きします。
専用の root ログインを与えて放っておく。 直感は正しい——別個のアイデンティティ——のに、やり方が間違っています。ボットユーザー用に公開鍵を authorized_keys に置けば、監査証跡のないアクセスを作ってしまいます。モデルのコマンドを他の誰のものとも区別するものがなく、午前 2 時に何かが壊れたとき、あなたは bash の履歴と雰囲気からそのセッションを組み立て直すはめになります。
共通する糸は、モデルが常駐する資格情報を持ち、可観測性が後回しになっていることです。
うまくいくパターン:複製ではなく、カストディアン
発想を逆にします。モデルは資格情報をそもそも一切持つべきではありません。
- モデルは依頼し、カストディアンが署名する。 仲介役(ブローカー)が鍵を保持し(あるいは短期証明書を発行し)、モデルの代わりに認証します。モデルのコンテキストが侵害されても、手に入るのはブローカーを通じて操作を依頼する能力であって、どこからでもあなたになりすます能力ではありません。
- スコープは明示的。 モデルが到達するのは、あなたが列挙したホストだけです。新しいホストは、既定ではなく、新たな決定です。
- コマンドは取り締まられる。 ホストごとに、モデルにフルのシェルを与えるか、コマンドの許可リストにするか、何も与えないかを決めます——こうして「nginx を再起動」は Web 層で許可され、「何でもどうぞ」は決して許可されません。
- 人がライブで見守れる。 事後の検証だけではなく、しかも記録は「これはモデルがやった」と「これは自分がやった」を区別します。
- 取り消しはローテーションではなくトグル。 そもそも何も共有していないので、アクセスをオフにするのに何のコストもかかりません。
どれも特別なものではありません——本格的なインフラチームで、証明書ベースの SSH がすでに動いているやり方とおおむね同じです。難点はいつも、自分で配線するのが一仕事だということで、だから人は上のまずい選択肢のどれかに飛びついてしまいます。
ローカルモデルへの配線
MCP——Model Context Protocol——が、これをきれいに実現する方法で、クライアントを選びません。MCP に対応したクライアントならどれでも動かせるので、あなたのモデルが Claude でも、Ollama の背後のオープンウェイトのモデルでも、自分でホストする何かでも関係ありません。
- ローカルモデルを、MCP に対応したクライアントから動かす(MCP を話すコーディングエージェントやチャットクライアント)。
- SSH の前面に立つ MCP サーバーに向ける——鍵を手渡すのではなく、モデルの代わりに認証するサーバーです。
- 使いたいホストだけを有効にし、 各ホストのコマンドポリシー(フル / 許可リスト / ブロック)を設定する。
- セッションを視界に入れておき、 監査ログに書き込ませる。こうして、モデルが実行するすべてのコマンドが、誰のものか特定でき、再生できるようにする。
モデルはツールを手にします——セッションを開く、コマンドを実行する、ファイルを読み書きする——そして認証はカストディアンが行います。あなたの鍵が、あなたのマシンでも他のどこでも、モデルの環境に入ることは決してありません。しかも資格情報を持つのがモデルではなくカストディアンなので、代わりにホスト型のエージェントに手を伸ばした瞬間にも、同じ配線がそのまま通用します——Claude Code を SSH でも OpenAI Codex を SSH でも、反対側にクラウドのモデルを置いて、この同一のパターンを前面に立てています。
Termalin ではどうしているか
Termalin は MCP サーバーを内蔵した SSH クライアントなので、このパターンは一仕事ではなく、既定の姿です。
- あなたのマシンで、 付属のローカルサーバーをエージェントに登録します(
claude mcp add termalin -- <path>/termalin-mcp、または任意の MCP クライアントでの同等の操作)。モデルが到達するのは、あなたが有効にしたホストだけで——エージェントアクセスは既定でオフです——認証は Termalin の鍵カストディアン(あなたの代わりに鍵を預かり、署名する仕組み)を通ります。あなたが一度鍵をアンロックすれば、Termalin がモデルの代わりに署名し、モデルが読める鍵ファイルはどこにも存在しません。 - ホストごとにポリシーを設定します——フルアクセス、コマンドの許可リスト、またはブロック——こうして、混乱したローカルのモデルが、そのマシンであなたが一度も許可していないものを実行することはできません。
- その様子を見守れます。 エージェントのセッションはライブのターミナルタブとして動き、ウォッチグリッドがそれをミラーし、モデルが動かしているタイルが光ります。すべてのコマンドはセッション録画に印が付き——出力のみで、あなたのキー入力は決して記録しません——発信元のデバイスと IP とともに監査ログに書き込まれます。
- アプリを動かしていない? モデルを Termalin のホスト型 MCP エンドポイントに向けます。特定のサーバーにスコープを絞り、有効期限を持ち、コマンドが取り締まられ、各実行を短期証明書で認証する API キーを使って。こうすれば、漏れた鍵でさえ、列挙されていないホストに届いたり、許可されたコマンドの外で実行したりはできません。
どちらにしても、あなたが望んだ性質は保たれます。ローカルのモデルがあなたのサーバーを操作でき、しかも鍵を一度も見ていない、という性質です。
まずは面白みのないホスト 1 台から
本番から始めないでください。影響の小さいマシン——ステージングサーバー、お遊び用の VPS——を登録し、許可リストに設定して、モデルに本物の雑務を与えます。エラーが出るまでログを追尾する、設定を直す、サービスを再起動する、といったことです。動いているあいだはグリッドを開いたままにします。最初の 1 時間で分かること——どう振る舞うか、どこでためらうか、曖昧さをどう扱うか——が、2 台目を登録するかどうか、そしてどれだけの自由を与えるかを教えてくれます。
それがカストディアンモデルの静かな見返りです。あなたは 1 台ずつ広げていきます。踏み出すどの一歩も、取り返せないものではないからです——モデルがどこで動いていようと。
Termalin は、MCP サーバー、鍵カストディアン、ホストごとのエージェントポリシーを内蔵した、無料でクロスプラットフォームの SSH クライアントです——ダウンロードするか、鍵を安全に扱う仕組みをお読みください。