iOSでのSSH Agent Forwarding:NeoServerがあなたの秘密鍵をiPhoneに安全に保管
Index
リモートサーバーで git clone を実行したことがある人なら、誰もが同じ問題に直面します。このマシンはどのようにして GitHub で認証を行うのか? 一般的な解決策はどれも理想的とは言えません。秘密鍵をサーバーにコピーすれば、そのサーバーが侵害された瞬間に、すべてのアセットが秘密鍵流出の危険に晒されます。各リポジトリごとにデプロイキー(deploy key)を作成すれば、煩雑な鍵管理の沼にハマることになります。妥協して HTTPS とパーソナルアクセストークン(personal access token)を使用しても、そのトークンはディスク上の .git-credentials ファイルに平文で保存されてしまいます。
SSH agent forwarding(SSH エージェント転送)はこの問題を解決する完璧なソリューションであり、NeoServer はそれを iOS プラットフォームで真に完璧に実現しています。あなたの秘密鍵が iPhone から出ることは決してありませんが、リモートサーバーはコードをプルしたり、コミットをプッシュしたり、次のホストにジャンプしたりするために、一時的にそれを「借用」することができます。
SSH Agent Forwarding の実際の役割
SSH agent は、復号済みの秘密鍵をメモリ上に保持し、ユーザーに代わって認証要求に応答するプロセスです。エージェント転送(OpenSSH CLI では -A パラメータに相当)は、この機能を接続をまたぐ场景に拡張します。iPhone から SSH でサーバーに接続し、転送を有効にすると、サーバーはソケット(socket)を取得し、そのソケットが認証要求をあなたのスマホ上の agent にプロキシします。
実際の効果は以下の通りです:
- リモートサーバー上で
git clone [email protected]:you/private-repo.gitを実行すると、そのまま動作します。GitHub からの認証要求は、あなたの iPhone 上に保存されている鍵によって応答されます。 - 踏み台サーバー(bastion)から
ssh production-db.internalを実行する場合も同様に機能します。しかも、踏み台サーバー上には一切の鍵を保存する必要がありません。 - 秘密鍵自体がリモートサーバー上に現れることは決してありません。ディスク上にも、転送された認証要求を除いてメモリ上にも存在しません。たとえそのサーバーが明日侵害されたとしても、攻撃者には盗める鍵が何もありません。
なぜ iOS ではこれが特に重要なのか
ノートパソコンであれば、ssh-agent や ~/.ssh/config、そして長年培ってきたマッスルメモリーを利用できます。しかしスマホでは、ほとんどの SSH アプリがエージェント転送を全くサポートしていなかったり、非常に使い勝手の悪い実装であったりするため、鍵をターミナルにペーストしたり、トークンをファイルに保存したりするといった、セキュアではない近道を選ばざるを得なくなります。NeoServer はエージェント転送を後付けの機能ではなく、コア機能として扱っています:
- NeoServer に秘密鍵を一度ロードするだけです。 鍵はデバイス上に暗号化されて保存され、Face ID / Touch ID で保護されます。
- 接続ごとにエージェント転送を個別に有効化します。 接続を確立する際、NeoServer はアプリ内の agent をリモートセッションに転送します。
- ノートパソコンと同じように、リモートサーバー上で
git、scp、sshを使用できます。 転送された資格情報が、すべての認証要求に透過的に応答します。
典型的なセッション:リモート開発マシンからプライベートリポジトリをクローンする
これこそが、エージェント転送が設計された当初に解決すべきとされたワークフローです。
- iPhone の NeoServer で、agent forwarding を有効にして、開発サーバーに SSH 接続します。
- そのサーバー上で
git clone [email protected]:yourorg/infra.gitを実行します。GitHub が認証要求を開始し、その要求は iPhone 上の鍵に転送されて自動的に応答されます。 - リポジトリのクローンが完了します。このプロセス全体を通して、あなたの秘密鍵、GitHub のパスワード、パーソナルアクセストークンは、開発サーバー上に一切書き込まれません。
同じ原理が、git pull、git push、SSH 経由でのプライベートリポジトリとの通信、そして第 2 のサーバーへのジャンプにも適用されます。1 台のスマホ上の認証情報で、無数のサーバーに接続し、鍵のコピーゼロを実現します。
ホストのチェーンジャンプ:踏み台サーバーから内部ネットワークへ
エージェント転送は組み合わせて使用することができます。転送を有効にして踏み台サーバーに接続し、そこからさらに内部ホストに接続しても、内部ホストの認証は引き続きあなたのスマホ上の鍵によって応答されます。踏み台サーバーがもたらすセキュリティ(内部ホストが直接外部に公開されない)を享受しつつ、通常であれば踏み台サーバーに事前配置が必要となる資格情報の代价を回避できます。さらに NeoServer は Jump Server(踏み台サーバー)設定をサポートしているため、「踏み台サーバーを経由したジャンプ」というプロセス自体を 1 つの接続設定として保存することができます。
Mosh と tmux を組み合わせて、真のモバイルワークフローを実現
エージェント転送は資格情報のセキュリティに関わるものです。そして NeoServer のその他の機能が接続の安定性を担います:
- Mosh はネットワークの切り替え時にもセッションを維持できるため、移動中の iPhone が転送されたチャネルを切断することはありません。
tmux/zellijにより、シェルがサーバー側で継続的に実行されます。ポケットに入ったスマホがスリープ状態になっても、時間のかかるgit cloneやデプロイ操作は実行され続けます。- SFTP を使用すると、アプリを切り替えることなく、クローンしたばかりのファイルをアプリ内で直接ブラウズして編集でき、シンタックスハイライトも提供されます。
明確にすべきセキュリティ上の注意事項
- エージェント転送は非常に強力な機能ですが、強力な機能には 1 つの鉄則が伴います。信頼するサーバーでのみこの機能を有効にしてください。 転送が有効化された状態で、侵害されたサーバーは、セッションが開いている間にあなたの agent に対して他のホストへの認証を要求する可能性があります。この理由から、NeoServer は接続ごとに独立してオン/オフを切り替えられる設計にしています。自身の開発サーバーでは使用し、共有ホストや信頼できないホストではオフにしてください。
- あなたの秘密鍵は iPhone 上にローカル保存され、あなたのプライベート iCloud 経由でのみ同期されます。NeoServer にはサードパーティの分析や広告ネットワークは一切含まれておらず、アプリは Face ID / Touch ID によるロックで保護されています。
- 2FA(2 要素認証)と秘密鍵認証を組み合わせることで、エージェント転送を含めた多層防御体系が構築されます。あなたが持っているもの(スマホ上の鍵)、サーバーが一時的に借用できる能力(転送された agent)、そして接続時の追加認証要素です。
対象となるユーザー
- リモート開発マシンや CI サーバーでプライベートリポジトリをプルする必要がある開発者
- 踏み台サーバー経由で内部ホストにジャンプする必要がある運用エンジニア
- 「今回だけ」という理由で秘密鍵を
scpで転送してしまいそうになった(tempted)ことがある人 - 共有インフラストラクチャ上で「鍵を残さない(ゼロキーリテンション)」を実現したいチーム
過去にリモートサーバーからの認証を行う際、常にセキュリティと利便性のどちらかを妥協しなければならなかったとしたら、SSH agent forwarding はその妥協を完全に排除します。そして NeoServer は、それをあなたの iPhone 上で直接実現させてくれます。App Store で NeoServer を検索するか、直接 App Store からダウンロードしてください。