ネットワーク上の複数のコンピューター(静的イーサネット)間でSSHを介して通信したい。これを行うには、特定のマシンにログインするたびにssh-addを実行する必要があります。ログインまたは再起動するたびにパスフレーズを要求されないように、一度設定するとどうすればよいですか。私のマシン?
bash_profile
にいくつかの行を追加する方法があることを私は知っています ファイルですが、特定のマシンで再起動/ログインするたびにパスワードを入力する必要があります。
if [ -z "$SSH_AUTH_SOCK" ] ; then
eval `ssh-agent -s`
ssh-add
fi
承認された回答:
これは、セキュリティと利便性の間のトレードオフの典型的な例です。幸いなことに、いくつかのオプションがあります。最も適切な解決策は、使用シナリオと必要なセキュリティレベルによって異なります。
パスフレーズ付きのssh-key、いいえ ssh-agent
これで、認証にキーを使用するたびにパスフレーズを入力する必要があります。これはセキュリティの観点からは最良のオプションですが、使い勝手は最悪です。これにより、弱いパスフレーズが順番に選択される可能性もあります。これにより、パスフレーズを繰り返し入力する負担が軽減されます。
ssh-key with passphrase、with ssh-agent
以下を~/.bash_profile
に追加します ssh-agent
を自動的に起動します ログイン時にssh-keyをロードします:
if [ -z "$SSH_AUTH_SOCK" ] ; then
eval `ssh-agent -s`
ssh-add
fi
これで、ログインのたびにパスフレーズを入力する必要があります。使いやすさの観点からは少し優れていますが、これにはssh-agent
という欠点があります。 ログインセッション中にキーを使用するかどうかに関係なく、パスフレーズの入力を求められます。新しいログインごとに、個別のssh-agent
も生成されます。 明示的に強制終了されない限り、ログアウト後もメモリ内に追加されたキーで実行され続けるインスタンス。
ssh_agent
を強制終了するには ログアウト時に、以下を~/.bash_logout
に追加します
if [ -n "$SSH_AUTH_SOCK" ] ; then
eval `/usr/bin/ssh-agent -k`
fi
または次の~/.bash_profile
trap 'test -n "$SSH_AUTH_SOCK" && eval `/usr/bin/ssh-agent -k`' 0
複数のssh-agent
を作成する Collin Andersonの回答など、ファイルシステム内の固定された場所にエージェントへの永続的な通信ソケットを作成することで、インスタンスを回避できます。これは、複数のエージェントインスタンスを生成するよりも改善されていますが、明示的に強制終了されない限り、復号化されたキーはログアウト後もメモリに残ります。
デスクトップでは、Gnome Keyring SSH Agentなどのデスクトップ環境に含まれているssh-agentは、通常、ログインセッション中にssh-keyが初めて使用されたときにパスフレーズの入力を求めるように作成できるため、より適切なアプローチになります。セッションが終了するまで、復号化された秘密鍵をメモリに保存します。
ssh-key with passphrase、with ssh-ident
ssh-ident
ssh-agent
を管理できるユーティリティです あなたに代わって、必要に応じてIDをロードします。 ssh-agent
へのアクセスを必要とする端末、ssh、またはログインセッションの数に関係なく、必要に応じて1回だけキーを追加します。 。また、接続先のホスト、またはsshの呼び出し元に応じて、異なるエージェントと異なるキーのセットを追加して使用することもできます。これにより、異なるホストでエージェント転送を使用するときにキーを分離できます。また、GitHubなどのサイトで複数のアカウントを使用することもできます。
ssh-ident
を有効にするには 、インストールして、次のエイリアスを~/bash_profile
に追加します :
alias ssh='/path/to/ssh-ident'
ssh-key with passphrase、with keychain
keychain
ssh-agent
を管理する小さなユーティリティです あなたに代わってssh-agent
を許可します ログインセッションが終了しても実行を継続します。以降のログインでは、keychain
既存のssh-agent
に接続します 実例。実際には、これは、再起動後の最初のログイン時にのみパスフレーズを入力する必要があることを意味します。以降のログインでは、既存のssh-agent
からの暗号化されていないキー インスタンスが使用されます。これは、cron
でパスワードなしのRSA/DSA認証を許可する場合にも役立ちます。 パスワードなしのsshキーのないジョブ。
keychain
を有効にするには 、インストールして、~/.bash_profile
に次のようなものを追加します :
eval `keychain --agents ssh --eval id_rsa`
セキュリティの観点から、ssh-ident
およびkeychain
ssh-agent
よりも悪い インスタンスは特定のセッションの存続期間に制限されますが、高レベルの利便性を提供します。 keychain
のセキュリティを向上させるため 、一部の人は--clear
を追加します ~/.bash_profile
のオプション キーチェーンの呼び出し。これを行うことにより、上記のようにログイン時にパスフレーズを再入力する必要がありますが、cron
ユーザーがログアウトした後も、ジョブは暗号化されていないキーにアクセスできます。 keychain
wikiページにはより多くの情報と例があります。
パスフレーズなしのssh-key
セキュリティの観点から、これは最悪のオプションです。秘密鍵は公開された場合に備えて完全に保護されていないためです。ただし、これが、再起動後にパスフレーズを再入力する必要がないことを確認する唯一の方法です。
ssh-key with passphrase、with ssh-agent
、パスフレーズの受け渡し ssh-add
スクリプトから
パスフレーズをssh-add
に渡すのは簡単なアイデアのように思えるかもしれませんが スクリプトから、例えばecho "passphrase\n" | ssh-add
、これはssh-add
のように単純ではありません stdin
からパスフレーズを読み取らない 、ただし/dev/tty
を開きます 直接読むために。
これはexpect
で回避できます 、インタラクティブアプリケーションを自動化するためのツール。以下は、スクリプトに保存されているパスフレーズを使用してssh-keyを追加するスクリプトの例です。
#!/usr/bin/expect -f
spawn ssh-add /home/user/.ssh/id_rsa
expect "Enter passphrase for /home/user/.ssh/id_rsa:"
send "passphrase\n";
expect "Identity added: /home/user/.ssh/id_rsa (/home/user/.ssh/id_rsa)"
interact
パスフレーズはスクリプト内でプレーンテキストで保存されるため、セキュリティの観点から、これはパスワードなしのssh-keyを使用するよりも優れているとは言えません。このアプローチを使用する場合は、expect
を確認することが重要です。 パスフレーズを含むスクリプトには適切な権限が設定されているため、キーの所有者だけが読み取り、書き込み、実行できます。