GNU/Linux >> Linux の 問題 >  >> Linux

Ssh –パスワードプロンプトなしでSsh-addを自動的に実行する方法は?

ネットワーク上の複数のコンピューター(静的イーサネット)間で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などのサイトで複数のアカウントを使用することもできます。

関連:Php:imagecropauto —使用可能なモードの1つを使用して画像を自動的にトリミングします

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を確認することが重要です。 パスフレーズを含むスクリプトには適切な権限が設定されているため、キーの所有者だけが読み取り、書き込み、実行できます。


Linux
  1. パスワードプロンプトなしでルートとして特定のプログラムを実行する方法は?

  2. Ssh –パスワードなしでSudoを実行できる場合、Sudoを実行するにはTtyが必要ですか?

  3. cronjob でパスワードなしの MySQLdump

  1. SSH2 から OpenSSH にパスワードなしで SSH および SCP を実行する方法

  2. UNIX / Linux で SSH を使用して Rsync をセットアップする方法 (パスワードなしの rsync)

  3. Linux でパスワード プロンプトを中断せずに SCP を実行する方法

  1. パスワードなしでSSHログインを設定する方法

  2. パスワードなしで別のユーザーとしてスクリプトを実行するには?

  3. UNIX / Linux で SSH を使用してパスワードなしで Rsync をセットアップする方法は?