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

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

ネットワーク(静的イーサネット)の複数のコンピュータ間でSSH経由で通信したいと思います。これを行うには実行する必要があります。ssh-add特定のコンピュータにログインするたびに。

一度設定した後、ログインするかコンピュータを再起動するたびにパスワードを要求しないようにするにはどうすればよいですか?

ファイルにいくつかの行を追加する方法があることを知っていますが、bash_profile特定のシステムを再起動またはログインするたびに、まだパスワードを入力する必要があります。

if [ -z "$SSH_AUTH_SOCK" ] ; then
    eval `ssh-agent -s`
    ssh-add
fi

ベストアンサー1

これは、セキュリティと利便性のバランスを示す典型的な例です。幸いなことに、多くのオプションがあります。最適なソリューションは、使用シナリオと必要なセキュリティレベルによって異なります。

パスワード付きSSHキー、なし ssh-agent

認証にキーを使用するたびにパスワードを入力する必要があります。セキュリティの面では、これが最善の選択肢ですが、使いやすさは最悪です。これにより、再入力が必要な負担を軽減するために脆弱なパスワードを選択する可能性があります。

パスワードを含むSSHキー ssh-agent

以下を追加すると、~/.bash_profileログイン時にssh-agentSSHキーが自動的に起動してロードされます。

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固定位置を介して(例:コリン・アンダーソンの回答。これは、複数のプロキシインスタンスを作成するよりも改善された機能です。ただし、明示的に終了しない限り、ログアウト後も復号化されたキーはメモリに残ります。

デスクトップでは、SSHエージェントがデスクトップ環境に含まれています。GNOMEキーリングSSHエージェント通常、ログインセッション中にSSHキーを初めて使用するときにパスワードを求めるメッセージが表示され、セッションが終了するまで復号化された秘密鍵をメモリに保存できるため、より良いアプローチになります。

パスワードを含むSSHキー ssh-ident

ssh-identssh-agent必要に応じてユーザーに代わってIDを管理およびロードするユーティリティです。アクセスが必要な端末、SSH、またはログインセッションの数に関係なく、必要な場合にのみキーを追加しますssh-agent。また、接続されているホストまたはssh呼び出すディレクトリに応じて、さまざまなプロキシとさまざまなキーセットを追加して使用できます。これにより、他のホストへのプロキシ転送を使用するときにキーを分離できます。また、GitHub などのサイトで複数のアカウントを使用できます。

を有効にするには、ssh-identそれをインストールして次のエイリアスをに追加します~/.bash_profile

alias ssh='/path/to/ssh-ident'

パスワードを含むSSHキー keychain

keychainssh-agentあなたに代わってそれを管理し、ssh-agentログインセッションの終わりにも実行を続ける小さなユーティリティです。その後、ログイン時にkeychain既存のインスタンスに接続しますssh-agent。実際には、再起動後に初めてログインするときにのみパスワードを入力するだけです。その後のログインでは、ssh-agent既存のインスタンスの暗号化されていないキーが使用されます。これはcron、パスワードのないSSHキーを持たない操作でパスワードのないRSA / DSA認証を許可するのにも役立ちます。

を有効にするには、インストールしてkeychain次のように追加します~/.bash_profile

eval `keychain --agents ssh --eval id_rsa`

セキュリティの観点からはssh-identkeychain特定のセッション寿命に限定されたインスタンスよりも悪いですが、ssh-agent高いレベルの利便性を提供します。セキュリティを強化するために、keychain一部の人々はキーチェーン呼び出し--clearにオプションを追加します~/.bash_profile。これにより、上記のようにログインcron時にパスワードを再入力する必要がありますが、ユーザーがログアウトしても暗号化されていないキーにアクセスできます。これkeychain ウィキページより多くの情報と例があります。

パスワードのないSSHキー

セキュリティの観点から見ると、これは秘密鍵が公開されると完全に保護されないため、最悪のオプションです。ただし、これは再起動後にパスワードを再入力する必要がないようにする唯一の方法です。

パスワードを含むSSHキー ssh-agentパスワードを次に渡してください。 ssh-add スクリプトから

ssh-addたとえば、スクリプトからパスワードを渡すのは単純なアイデアのように見えるかもしれませんが、echo "passphrase\n" | ssh-add見るほど単純ではありません。ssh-add パスワードを読まないでstdin直接/dev/tty開いて読んでください。

これができる解決済みそしてexpect、対話型アプリケーションを自動化するツールです。以下は、スクリプトに保存されたパスワードを使用してSSHキーを追加するサンプルスクリプトです。

#!/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キーを使用するよりもセキュリティの面では優れていません。この方法を使用するには、expectパスワードを含むスクリプトにキー所有者のみを読み、書き込み、および実行するための適切な権限が設定されていることを確認してください。

おすすめ記事