セキュリティ
ローカルアプリケーション
エンジンはループバックアドレスでWeb UIとAPIを提供します。Web UI自体は、端末ごとに設定した固定ポートのURLから開けます。初めて使うブラウザーを登録するときだけ、sshcコマンドが一度限りの登録URLを開きます。このURLに含まれる登録情報は、通常の起動ログには残しません。保存したポートを使用できず別のポートへ移った場合は、以前のブラウザー登録を失効し、現在のエンジンへの再登録を求めます。
守る対象
ブラウザー登録後の通常利用では、登録済みのブラウザーだけがWeb UIとAPIを利用できます。ネットワーク上の別端末からは、ループバックアドレスへ直接接続できません。ポート変更時に古いブラウザー登録を失効するため、以前のURLに保存された登録情報を新しいポートでは使えません。
守れない対象
同じOSユーザーとして動くプロセスは、その利用者のSSHファイルやブラウザーのデータへアクセスできる前提で扱っています。sshcは、同じ権限で動く悪意のあるプロセスからこれらを隔離しません。
利用者が行う対策
共有端末ではOSのユーザーアカウントを分け、同じユーザー権限で信頼できないプログラムを実行しないでください。Web UIのポートが変わった場合は、sshcコマンドから現在のエンジンへ登録し直します。
Vault
パスワードありでは、アカウントパスワード、鍵のパスフレーズ、Snippet、同期設定、バックアップをマスターパスワードから導出した鍵で暗号化します。最低4文字・文字種制限なしです。ファイルを持ち出された場合の保護はパスワードの強度に依存します。パスワードは引数や環境変数から受け取りません。既定の自動ロックは12時間で、Settingsで変更できます。
パスワードなしでは端末内にランダムな解錠用の鍵を保存し、起動時に自動解錠します。自動ロックは適用しません。端末鍵と暗号文の両方を読まれた場合の保護はありません。端末鍵は同期されず、同期データの暗号化は独立した同期キーで維持されます。
SSHホスト鍵
未知のホスト鍵は、対話的なTerminalでは利用者の確認後に保存します。StrictHostKeyCheckingをnoまたはaccept-newにした接続先では、OpenSSHと同じく確認なしで保存します。保存済みの鍵が変わっていた場合は、この設定に関係なく接続できません。非対話SSH、SFTP、公開鍵登録では、最終接続先とすべてのProxyJump踏み台が既知である必要があります。
ProxyCommand
SSH設定にProxyCommandがある場合、sshcは接続時にそのコマンドをローカルで実行します。SSH設定とInclude先は、実行可能な設定として扱ってください。内容を確認し、信頼できるファイルだけを使用してください。
Sync
接続設定、Vault内の認証情報、スニペット、同期対象のSSH鍵は、専用の同期キーを使って端末上で暗号化してからアップロードします。ストレージ事業者やS3の認証情報を持つ第三者は、これらの内容を平文では取得できません。ただし、バケット名、S3オブジェクト名、オブジェクトのサイズと更新時刻は暗号化されません。
暗号文を取得した第三者は、オフラインで同期キーの総当たりを試せます。手入力した短い文字列ではなく、sshcが生成したランダムな同期キーを使用してください。
Terminalのデータ
スクロールバックはメモリにだけ保持し、ディスクや同期先には保存しません。OSC 52によるクリップボード操作は設定で制御できます。リモートシェルへ送ったシークレットは、シェルの履歴、TTYのエコー、Terminalの出力に残る可能性があります。
Telnet
Telnetは通信を暗号化せず、サーバー認証も行いません。sshcでは接続前に警告を表示していますが、プロトコル自体を安全にすることはできません。認証情報を送る場合は、信頼できる隔離ネットワークなど、別の保護が必要です。