私は Mac OS X Lion を使用しており、毎日 SSH 経由でリモート ホストにログインしています。リモート認証に SSH キー ペアを使用しており、すべてのホストのログイン フレーズを自動化する必要がないにもかかわらず、ターミナルが SSH 秘密キーにアクセスするためのパスフレーズを要求するのは非常に煩わしいです。
セキュリティ上の理由から、SSH 秘密鍵にアクセスするためのパスフレーズは必須だと思います。ターミナルが起動時に 1 回だけフレーズを要求し、それを記憶して、その後の SSH セッションで自動的に秘密鍵を使用するようにする方法はありますか?
Gentoo Linux では問題なく動作する というスクリプトがありますkeychain
。しかし、Mac OS X Lion ではわかりませんでした。さらに、 、 など、非常に多くの威圧的な用語がありますssh-agent
。ssh-add
これらの SSH ツールキットに関するさまざまな資料を読み、いくつかの試行錯誤を繰り返した後、私はさらに混乱しました。
そこで、私は StackExchange にアクセスし、以下の質問についてのアドバイスを求めました。
ssh-agent
、、とは何ですかssh-add
?またkeychain
、Keychain Access.app
それらはどのように相互作用しますか?- ログイン時に SSH 秘密鍵のパスフレーズを一度入力し、後で SSH セッションを作成するときに自由に使用するにはどうすればよいですか?
- えーっと... 何が問題なんでしょうか
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 でも同じ機能を実行していました。
答え2
「問題」を解決する過程で、私はいくつかの関連トピックをグーグルで検索し、、、、がどのように機能するかについていくつかのメモを書き留めました。最終ssh-agent
的に、この問題はまったく問題ではなく、代わりに問題はすべて私に関するものであり、いわゆるssh-add
keychain
KeyChain Access.app
毎回パスフレーズを尋ねずに ssh ログインする箱から出してすぐにMacで完璧に動作します。
しかし、このプロセスによって、私はいくつかの経験を積むことができました。これらの用語について混乱している人の役に立つことを願って、ここにメモを書き留めておきます。
パスワードの用語は 2 つあります。
passphrase
SSH 秘密鍵にアクセスするときに必要なフレーズを指します。password
Mac にログインするために必要なフレーズを指します。
これで、これらのツールキットが何をするのか、つまり、ssh-agent
Mac上で、、、が何なのかがわかりました 。ssh-add
keychain
Keychain Access.app
ssh-agent
SSHパスフレーズを入力せずにSSH秘密鍵を使用できるようにする重要なサービスです。ssh-agent
このように動作します。まず、保存するか、キャッシュは、SSH 秘密鍵をメイン メモリに保存します。その後、このセッションの後半で、リモート認証に SSH 秘密鍵が必要になったときに、はssh-agent
メイン メモリ内の秘密鍵を見つけてリモート プロセスに渡します。SSH パスフレーズの入力を求められるのは、ssh-agent
最初に によって秘密鍵が追加されたときだけです。ssh-add
ssh-agent
は、 の SSH キーの管理に役立つコレクションの一部ですssh-agent
。ssh-add
コマンドを使用して、ssh-agent のキーリング内の秘密キーを一覧表示、追加、削除します。次に、サービスssh-add
と通信してssh-agent
タスクを実行します。keychain
サービスを検索しssh-agent
(存在しない場合は新しいサービスを開始)、ssh-add
SSH 秘密鍵を追加するために呼び出すスクリプトです。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 つあります。
- Mac OS X Lion は
ssh-agent
起動時に自動的にサービスを開始し、 の下のソケットをリッスンします/tmp
。 Keychain Access.app
SSH パスフレーズを保存するので、邪魔されることなく秘密鍵を追加できます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"