必要な場合にのみ、SSHキーのパスフレーズを要求される方法


15

(私はこのサイトで関連するように見える質問の多くを読んでおり、これは本当に新しい質問だと思います。)

たくさんのサーバーにたくさんのキーがあり、それらはすべてパスフレーズで保護されています。

私はパスワードを入力するのと同じくらいパスフレーズを入力するのが好きです-それは本当の生産性の低下です。

  • ログインシェルでssh-agent + ssh-addコマンドを使用すると、ログイン時にパスフレーズを1回入力するだけで済みます。

  • キーチェーンを使用すると、ログアウト後もssh-agentを有効に保つことができます。たとえば、起動時にパスフレーズを1回入力するだけで済むようにしたり、1時間程度それを保持したりできます。

私が抱えている問題は、これらのソリューションの両方が通常シェルログインで開始されることです(例.zshrc)ロック解除する必要がない場合でも、ログイン時にパスフレーズを入力することに依存しています。(私は、キーチェーンがエージェントを無期限に生き続けることに満足していません。)

必要な場合にのみ、(エージェントの)パスフレーズの入力を求められます

したがって、サーバーAにログインし、何らかの操作を行ってから、サーバーBにsshして、その時点でパスフレーズを要求することができます。サーバーBで何らかの操作を行い、ログアウトします。Aに戻って、さらに作業を行い、再びBにsshします。パスフレーズは必要ありません(エージェントが保持しています)。

これはGnomeのようなグラフィカルデスクトップで可能です。sshを試みるとすぐに、秘密鍵のロックを解除するパスフレーズを要求するポップアップが表示されます。だからこれは私がコンソールからのものです。


パスフレーズなしでssh-keyを生成しないのはなぜですか?とにかくこのトラブルをすべて経験するつもりですか?
devnull

1
誰かが侵入して、パスワードなしのキー(またはアクティブなsshエージェント)がある場合、他の多くのサーバーにもアクセスできます。また、パスフレーズなしのキーは盗まれ、他の場所で使用される可能性があります。
artfulrobot

私の知る限り、ある程度のセキュリティを犠牲にすることなく、やりたいことを行う方法はありません。:あなたはすでにそれを読んでいない場合には多くの可能性になり、ここでトーマス・ナイマンによる綿密な答えがありましたunix.stackexchange.com/a/90869/82289を。私の会社では、Tmuxとのsshセッションを管理する中間サーバーを使用してこれを回避しています。
devnull

@DevNullは、デスクトップではできるが端末ではできないのはおかしいようです。キーが追加されていない場合、エージェントがttyにジャンプすることだけが必要ですか?これは、GUIのものが動作する方法でなければなりませんか?
artfulrobot

ここで私の答えを見るかもしれません:unix.stackexchange.com/a/184160/89706(質問のリンク:unix.stackexchange.com/questions/90853/…
ジョニーウォン

回答:


14

シェルの起動スクリプトには何も追加しないでください。これは不必要なハッカーです。

代わりに、追加

AddKeysToAgent yes

.ssh / configに

このように、ssh-addは、最初に別のボックスにsshしたときに自動的に実行されます。ssh-agentから有効期限が切れたとき、またはリブートした後にのみ、キーを再入力する必要があります。


投票の際に人々がコメントすることを願っています。正しくないことが重要である場合、それがなぜ正しくないかを知っています。投稿してくれてありがとう、私はあなた自身の提案を試す時間がありませんでした。
artfulrobot

私もクロスポストのせいだろうか?
トビー

これは私のために動作します。ただし、openssh(7.2)へのごく最近の追加です。誰にも役立つ場合、openssh 7.3はDebian Sidで利用可能です。
artfulrobot

@artfulrobot:奇妙なことに、これとまったく同じ動作(sshの最初の呼び出しでのauto-ssh-add)が何年も働いていたので、しばらく前にようやく停止しました。原因を探して、AddKeysToAgentを見つけて、停止した理由は偶然に.ssh / configとAddKeysToAgentを一緒に削除しなければならなかったためだと思いました。OpenSSH 7.2がリリースされるずっと前になぜ機能していたのでしょうか?私はこれを想像していません:-)
トビー

@Tobyこれはまさに私が必要とするものです。残念なことに、ssh-agentはkubuntuで自動的に起動しないようです。そのため、次に解決する必要があります。
-Ogaday

7

Zshにpreexec、コマンドラインで入力されたコマンドが実行される前に関数を実行するフックがあります。sshコマンドラインで検索するフックがあり、見つかった場合は、sshエージェントの存在を確認します。それが見つからない場合は、それがキーチェーンに実行されます。

そのため、キーチェーンはsshコマンドの前にのみ実行され、その後必要な場合にのみ実行されます。

あなたのこれを入れてください~/.zshrc

function check_ssh {
  [[ $3 =~ '\bssh\b' ]] || return
  [[ -n "$SSH_AGENT_PID" && -e "/proc/$SSH_AGENT_PID" ]] \
    && ssh-add -l >/dev/null && return
  eval `keychain --eval id_dsa --timeout 60`
}    
autoload -U add-zsh-hook
add-zsh-hook preexec check_ssh

ここで行われるのは、コマンドが入力されるたびcheck_sshに、コマンドが実行される前に呼び出されることです。

関数の最初の行は、sshZsh正規表現を使用するために展開されたコマンドをチェックします。sshワード境界持っている必要があります\bいずれかの側に。これは、関数の戻りが見つからない場合。

次の行では、環境変数にSSHエージェントプロセスがあり、そのプロセスがプロセステーブルにまだ存在し、少なくとも1つのキーがエージェントに追加されていることを確認します。すべてが問題なければ、sshエージェントがセットアップされ、何もする必要がないので、戻ります。

最後に、キーチェーンを開始し、エージェントを1時間生存させます。

または、機能をトリガーしないようなgitrsyncまたは埋め込まれたsshのものに関する問題が残っscpています(これらを正規表現に追加できます)。


がなくてもzsh、同じ効果を持つ短いスクリプトを作成してPATH、実際のsshクライアントの前に配置できます。直接実行するのではなく読む場合rsync他のユーザーと連携することもあります。PATH/usr/bin/ssh
-ilkkachu

2

zshについては、多かれ少なかれあなたが望むことをするためのユーティリティとラッパーのセットを書きました。 https //www.vinc17.net/unix/index.en.html#zsh-ssh-utils

実際、これはさらに行わssh-agentれます。すべてのログインセッションで共有されるため(デスクトップまたはSSH経由で、ログインシェルを起動するとGNU Screenもサポートされます。たとえば、shell -zsh~/.screenrcファイルれます)、最後のセッションは終了します。

注:すべてのキーに1つのパスフレーズのみを使用しています。さまざまなパスフレーズの動作がわかりません。いくつかの変更が必要になる場合があります。


うわー、それは非常に多くのコードです。素晴らしい仕事と共有してくれてありがとう。もっとシンプルなものが必要だと思います-SSHは私にとって非常に重要なツールです。
artfulrobot
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.