web-dev-qa-db-ja.com

SSHキーが禁止されている場合はパスワードをキャッシュする

私はそれを計算するので、私はssh経由で頻繁にアクセスしなければならないサーバーを持っています。さて、コンピュータセンターは(安全ではない)SSHキーを明示的に禁止します。彼らは、他の人間の前で可能な限り毎回キーボードで私のパスワードをタイプするのがはるかに安全なログイン方法であると感じます。

さて私は彼らの考えを変えることはできません(私が試した)。

SSHパスワードを少なくとも一時的に保存する方法、GITがパスワードを一定期間キャッシュに保存する方法はありますか?

44
user2667180

接続の再利用

SSHv2は同じ認証された接続が複数の「チャンネル」を確立することを可能にします - 対話型シェル、バッチコマンド、SFTP、そしてエージェント転送やTCP転送のような二次的なもの。ご使用のサーバーはおそらくデフォルトで接続多重化をサポートしています。 (あなたの管理者が文句を言っても、それはどこにもあなたのパスワードをキャッシュしていません - それは全体の接続をキャッシュしています。)

OpenSSHではこれを利用するためにControlMasterControlPathオプション(-Mと-S)があります。

  1. -Mを使用して「マスター」SSH接続を開始します。 (まだ設定にControlPathがないので、-Sを使ってコマンドラインでそれを指定する必要があります。それは長く生きる必要があるので、私はバックグラウンドに落とすために-fNオプションを追加します。

    $ ssh [email protected] -fNMS ~/.ssh/bar.socket
    [email protected]'s password:
    

    あなたはローカルのShellに戻りました。

  2. マスターを介して新しい接続を開始します。

    $ ssh [email protected] -S ~/.ssh/bar.socket
    

    君も仲間だ。

  3. これをGit/rsync/SFTPに役立つようにするためには、あなたの設定でControlPathを設定する必要があります。なぜなら、いつも-Sを指定することはできないからです。

    Host *
        ControlPath ~/.ssh/S.%r@%h:%p
    

あなたはこれを自動化することができます - 最近のOpenSSHのバージョンにもControlPersistがあり、まだなければバックグラウンドで自動的にマスター接続を確立します。これにより、ステップ1をスキップして、通常どおりsshを使用することができます。

  1. ~/.ssh/configでの設定:

    Host *
        ControlPath ~/.ssh/S.%r@%h:%p
        ControlMaster auto
        ControlPersist 15m
    
  2. 最初の接続はパスワードを要求します。

    $ ssh [email protected]
    [email protected]'s password:
    [foo@bar:~]$ exit
    
  3. 第二はしません:

    $ ssh [email protected]
    [foo@bar:~]$ yay
    

マルチプレックスマスターを制御する(停止するかTCP転送を設定する)には、-Oオプションを使用します。

同様の方法が 最近のPuTTYバージョン でサポートされています。

62
grawity

sshpassを使う

sshpass( githubのmanページ )は自動的にSSHへのパスワード。それを使用する安全な方法はこれです:

% echo 'correct horse battery staple' > ~/.ssh/compute_password
% chmod go-rw ~/.ssh/compute_password

% sshpass -f ~/.ssh/compute_password ssh foo@Host

これは、パスフレーズのない秘密鍵ファイルのように、~/.ssh/compute_passwordからパスワードを読み取ります。 sshpassコマンドを小さなシェルスクリプトまたはシェルエイリアスに入れると、その完全なコマンドを入力しなくて済みます。残念ながら、私はこれを~/.ssh/configから行う方法を見つけていません。

(コマンドラインで直接パスワードをsshpassに指定することも可能ですが、psを実行できる人にはパスワードが漏れるため、これは避けるべきです)

他の方法との比較

このアプローチはもちろん公開鍵認証を適切に設定するよりも安全性が劣りますが、おそらくそれはすでにわかっているでしょう。

それはまた、接続の再利用に関する@ grawityの答えよりも安全性は劣りますが、対話的にパスワードを入力する必要が全くないという利点があります。

@ grawityの回答は、パスフレーズと秘密鍵のキャッシュによるpubkey authの代替手段と考えることができます(例:ssh-agent)。それから私の答えは、秘密鍵ファイルにパスフレーズを付けずにpubkey authに代わるものになるでしょう。

19
marcelm

パスワードマネージャを使用してください。

一部のパスワードマネージャ(例:KeePassXC)は '自動入力'機能を持っています。パスワードをパスワードマネージャに保存し、マネージャの実行時にデータベースのロックを解除し、sshがパスワードの入力を要求するたびに、パスワードマネージャが長いパスワードをコンソールに書き込むようにするキーの組み合わせを押す。

(データベースをロック解除するためのパスワードを除いて)コピーする必要はなく、何でも覚えていて、あなたがログインしようとするたびにそれらの30文字をマッシュすることなく強いパスワードを持つことができます。

あなたはこのリストからあなたのお気に入りを選ぶことができます: https://en.wikipedia.org/wiki/List_of_password_managers

1
styrofoam fly

もう1つの方法はGUI SSHクライアントを使用することです。 Windowsでは、明らかな選択は PuTTY です。 Linux版のPuTTYもあります。特に、UbuntuのようなDebianベースのほとんどのディストリビューションでは、通常そのリポジトリにPuTTYが含まれています。

他の本当に良いクライアントは Termius です。 WindowsやLinuxだけでなく、OSX、iOS、Androidもサポートしています。それは主に携帯電話用に設計されていますが、デスクトップ版は実際にはかなり良いです。

私が間違えていないのであれば、Windows上の由緒あるHyperterminalにもsshクライアントが組み込まれていましたが、私は長い間Windowsを使っていなかったので、私は完全に確信が持てません。

すべてのGUIクライアントには、ユーザー名とパスワードを含む接続設定を保存する機能があります。

0
slebetman