Mac OS X Lion で毎回パスフレーズを入力せずに SSH 秘密鍵を使用してログインするにはどうすればよいですか?

Mac OS X Lion で毎回パスフレーズを入力せずに SSH 秘密鍵を使用してログインするにはどうすればよいですか?

私は Mac OS X Lion を使用しており、毎日 SSH 経由でリモート ホストにログインしています。リモート認証に SSH キー ペアを使用しており、すべてのホストのログイン フレーズを自動化する必要がないにもかかわらず、ターミナルが SSH 秘密キーにアクセスするためのパスフレーズを要求するのは非常に煩わしいです。

セキュリティ上の理由から、SSH 秘密鍵にアクセスするためのパスフレーズは必須だと思います。ターミナルが起動時に 1 回だけフレーズを要求し、それを記憶して、その後の SSH セッションで自動的に秘密鍵を使用するようにする方法はありますか?

Gentoo Linux では問題なく動作する というスクリプトがありますkeychain。しかし、Mac OS X Lion ではわかりませんでした。さらに、 、 など、非常に多くの威圧的な用語がありますssh-agentssh-addこれらの SSH ツールキットに関するさまざまな資料を読み、いくつかの試行錯誤を繰り返した後、私はさらに混乱しました。

そこで、私は StackExchange にアクセスし、以下の質問についてのアドバイスを求めました。

  1. ssh-agent、、とは何ですかssh-add?またkeychainKeychain Access.appそれらはどのように相互作用しますか?
  2. ログイン時に SSH 秘密鍵のパスフレーズを一度入力し、後で SSH セッションを作成するときに自由に使用するにはどうすればよいですか?
  3. えーっと... 何が問題なんでしょうかKeychain Access.app?以前のように SSH フレーズを保存しません。

ここで私が行ったことをリストします。見逃した手順についての手がかりがあることを願っています。

ステップ 1. Mac で SSH キー ペアを作成します。

$ ssh-keygen -t rsa -C "[email protected]"
# Set a passphrase for accessing the private key.

ステップ 2. SSH 公開キーをリモート ホストにコピーします。例として、キーをローカルホスト (Mac) にコピーします。

$ ssh-copy-id USER@localhost
# Enter the login password for USER at localhost, not my SSH passphrase

ステップ 3. 次に、SSH キー ペア認証を使用してリモート ホスト (ここでは localhost) に接続してみます。

$ ssh USER@locahost
Enter passphrase for key '/Users/YOUR_ACCOUNT/.ssh/id_rsa': 
# Enter my SSH passphrase, not the login password.

ステップ 4. リモート ホストからログアウトし、再度接続してみます。 ターミナルが SSH フレーズを再度要求してきます。

よく聞かれる質問は、「ssh-agent は Mac でうまく動作しますか?」です。率直に言って、何が起こっているのか私には全く分かりません。ここでは実行結果をいくつか示します。

$ echo $SSH_AUTH_SOCK
/tmp/launch-M48niA/Listeners
$ echo $SSH_AUTH_PID
(EMPTY)
$ ssh-add -l
Could not open a connection to your authentication agent.
$ ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-Z54zXukQiP/agent.26769; export SSH_AUTH_SOCK;
SSH_AGENT_PID=26770; export SSH_AGENT_PID;
echo Agent pid 26770;
$ ssh-add -l
Could not open a connection to your authentication agent.
$ echo $SSH_AUTH_SOCK
/tmp/launch-M48niA/Listeners
$ echo $SSH_AUTH_PID
(STILL EMPTY)
$ ssh-agent  # Oh no, anther ssh-agent with different PID
SSH_AUTH_SOCK=/tmp/ssh-cx0B4FUX8B/agent.26898; export SSH_AUTH_SOCK;
SSH_AGENT_PID=26899; export SSH_AGENT_PID;
echo Agent pid 26899;
$ ps -e | grep -i ssh
26769 ??         0:00.03 ssh-agent
26899 ??         0:00.02 ssh-agent

フィードバックをお待ちしています。ありがとうございます!

答え1

ssh-agentは、まさにあなたが尋ねている通りの動作をするので、動作させたい部分です。エージェントはデーモンとして実行され、秘密鍵を「追加」すると、その鍵が記憶され、最初の接続時にリモートに自動的に提供されますsshd。 (ssh-addは、秘密鍵を手動で に追加するために実行するコマンドですssh-agent)。

OS X では、Leopard 以降、ssh-agentまたは をssh-add手動で実行する必要はまったくありません。サーバーに接続しようとすると、自動的に実行されます。キーごとに 1 回、UI パスワード ダイアログが表示されます。このダイアログでは、(他の機能の中でも) キーを自動的に に追加できるssh-agentため、再度プロンプトが表示されることはありません。

launchdこれは、ソケット上の接続をリッスンし$SSH_AUTH_SOCK、最初に必要なときに自動的に起動する構成を持つことで処理されます。ssh-agentその後は、ssh-agent新しいキーを開く必要がある場合にのみ資格情報の入力を求められます。

それでもうまくいかない場合は、正しいlaunchd構成ファイルが存在していることを確認してください。

/System/Library/LaunchAgents/org.openbsd.ssh-agent.plist

何らかの理由でまだ動作しない場合は、手動で実行するための「古い」方法を以下に示します。

http://timesinker.blogspot.com/2007/08/getting-ssh-agent-going-on-mac-osx.html

また、Leopard がリリースされて以来使用しなくなったこのアプリケーションもありますが、基本的に以前のバージョンの Mac OS X でも同じ機能を実行していました。

http://www.sshkeychain.org/

答え2

「問題」を解決する過程で、私はいくつかの関連トピックをグーグルで検索し、、、、がどのように機能するかについていくつかのメモを書き留めました。最終ssh-agent的に、この問題はまったく問題ではなく、代わりに問題はすべて私に関するものであり、いわゆるssh-addkeychainKeyChain Access.app毎回パスフレーズを尋ねずに ssh ログインする箱から出してすぐにMacで完璧に動作します。

しかし、このプロセスによって、私はいくつかの経験を積むことができました。これらの用語について混乱している人の役に立つことを願って、ここにメモを書き留めておきます。

パスワードの用語は 2 つあります。

  • passphraseSSH 秘密鍵にアクセスするときに必要なフレーズを指します。
  • passwordMac にログインするために必要なフレーズを指します。

これで、これらのツールキットが何をするのか、つまり、ssh-agentMac上で、、、が何なのかがわかりました 。ssh-addkeychainKeychain Access.app

  • ssh-agentSSHパスフレーズを入力せずにSSH秘密鍵を使用できるようにする重要なサービスです。ssh-agentこのように動作します。まず、保存するか、キャッシュは、SSH 秘密鍵をメイン メモリに保存します。その後、このセッションの後半で、リモート認証に SSH 秘密鍵が必要になったときに、はssh-agentメイン メモリ内の秘密鍵を見つけてリモート プロセスに渡します。SSH パスフレーズの入力を求められるのは、ssh-agent最初に によって秘密鍵が追加されたときだけです。
  • ssh-addssh-agentは、 の SSH キーの管理に役立つコレクションの一部ですssh-agentssh-addコマンドを使用して、ssh-agent のキーリング内の秘密キーを一覧表示、追加、削除します。次に、サービスssh-addと通信してssh-agentタスクを実行します。
  • keychainサービスを検索しssh-agent(存在しない場合は新しいサービスを開始)、ssh-addSSH 秘密鍵を追加するために呼び出すスクリプトです。keychainシンプルでわかりやすいアイデアで、ssh-agent が通常は自動的に起動しない Linux でも問題なく動作します。
  • Keychain Access.app最も複雑なコンポーネントのようです。これはMac OS Xのユニバーサルトークンストレージサービスです。パスワード、証明書などのさまざまなトークンを保存し、トークンとして機能します。エージェントトークンを要求するアプリの場合。SSH 秘密鍵の場合、最初に SSH 秘密鍵へのアクセス要求を把握し、トークンの一種である SSH パスフレーズを のKeychain Access.appキーリングに保存するように求めるウィンドウをポップアップ表示します。次に、認証に秘密鍵を使用するときに、Keychain Access.app権限を付与するかどうかを尋ねるウィンドウが再度ポップアップ表示されます。「はい」という返事が返ってくると、keychain Access.app秘密鍵が のストレージに追加されますssh-agent

注目すべき点が 2 つあります。

  1. Mac OS X Lion はssh-agent起動時に自動的にサービスを開始し、 の下のソケットをリッスンします/tmp
  2. Keychain Access.appSSH パスフレーズを保存するので、邪魔されることなく秘密鍵を追加できますssh-agent。はい、SSH フレーズを入力する必要はありませんが、このエントリを初めて作成するときに権限を付与するために Mac アカウントのログイン パスワードを入力する必要があります。

まとめると、パスフレーズを尋ねない SSH ログインは、Mac OS X でそのまま動作するはずです。

答え3

ここで紹介した他の解決策がうまくいかない場合のために、次の解決策が私にはうまくいきました。

~/.ssh ディレクトリ内の各秘密鍵について、対応する公開鍵も存在することを確認してください。公開鍵の名前が秘密鍵とまったく同じで、.pub末尾に が付いていることを確認してください。適切な公開鍵が既にある場合は、再生成してみてください。

公開鍵を再作成する必要がある場合は、次のように簡単に行うことができます。

ssh-keygen -y -f ~/.ssh/my_key > ~/.ssh/my_key.pub

my_keyキーの名前に置き換えます。

その後、MacOS はキーチェーン内のキーパスフレーズを適切に記憶します。

注: パスフレーズを入力してキーチェーンに保存するのは、1 回限りのアクションになりました (OP が希望したようにログイン セッションごとに 1 回ではありません)。ただし、問題の Mac へのログインがパスワードで保護されている場合、パスフレーズはそのログイン パスワードによって保護されます。また、この解決策は私には意味がありません... 秘密キーに加えて公開キーは必要ないはずですが、何らかの理由で MacOSX ではそれが必要です。

(元々は答えApple Stack Exchangeの同様の質問に対して

答え4

ssh-copy-id他に試すことができたのは、のようなものに置き換えることです。k="$(cat ~/.ssh/id_rsa.pub)"; ssh [email protected] "umask 0077; mkdir -p ~/.ssh; echo "$k" >> ~/.ssh/authorized_keys2"

関連情報