Mac OS X Lionを使用し、SSH経由でリモートホストに毎日ログインしています。私はリモート認証にSSHキーペアを使用し、すべてのホストのログインフレーズを自動化する必要がないという事実にもかかわらず、端末が私のSSH秘密キーにアクセスするためのパスフレーズを要求することは依然として非常に煩わしいです。
セキュリティ上の理由から、SSH秘密鍵にアクセスするためのパスフレーズが必要だと思います。端末が起動時に一度だけ正確にフレーズを要求し、それを記憶し、後のSSHセッションで秘密鍵を自動的に使用するようにする方法はありますか?
Gentoo Linuxで正常に動作するkeychain
というスクリプトがあります。しかし、Mac OS X Lionでそれを理解することはありません。さらに、ssh-agent
、ssh-add
など、非常に多くの威圧的な用語があります。これらのSSHツールキットに関するさまざまな資料を読んだり、イライラした実験を行ったりした後、さらに混乱しました。
したがって、私はStackExchangeに来て、次の質問についてのアドバイスを探しました。
ssh-agent
、ssh-add
、keychain
、Keychain Access.app
とは何ですか。Keychain Access.app
の何が問題になっていますか?以前のようにSSHフレーズを保存しません。ここで私がやったことをリストします。うまくいけば、私が逃したステップについての手がかりがあります。
手順1. MacでSSHキーペアを作成します。
$ ssh-keygen -t rsa -C "[email protected]"
# Set a passphrase for accessing the private key.
ステップ2. SSH公開鍵をリモートホストにコピーします。例として、キーをlocalhost、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
どんなフィードバックでも歓迎します。ありがとう!
ssh-agent
は、まさにあなたが求めていることを行うので、働きたい作品です。エージェントはデーモンとして実行され、秘密鍵を「追加」すると、その鍵が記憶され、初期接続時にリモートsshd
に自動的に提供されます。 (ssh-add
は、手動で秘密鍵をssh-agent
に手動で追加するために実行するコマンドです)。
OS Xでは、Leopard以降、ssh-agent
またはssh-add
を手動で実行する必要はありません。サーバーに接続しようとすると、「ただ起こる」はずです。キーごとに1回、UIパスワードダイアログが表示されます。これにより、(特に)キーをssh-agent
に自動的に追加できるため、再度プロンプトが表示されることはありません。
これは、$SSH_AUTH_SOCK
ソケットで接続をリッスンするlaunchd
構成を使用して処理され、最初に必要なときに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でも同じことを行いました。
「問題」を解決する過程で、いくつかの関連トピックをグーグルで調べ、ssh-agent
、ssh-add
、keychain
、KeyChain Access.app
がどのように機能するかについてメモを書き留めました。最終的に、この問題はまったく問題ではなく、問題はすべて私についてであり、いわゆるssh-login-without-asking-passphrase-every-time Macでそのまま使用できます。
しかし、このプロセスは私にいくつかの経験をもたらします。私は、これらの用語について混乱している誰かを助けることを期待して、ここに私のメモを書き留めます。
2つのパスワード用語:
passphrase
は、SSH秘密鍵にアクセスするときに必要なフレーズを指します。password
は、Macにログインするために必要なフレーズを示します。これで、これらのツールキットの機能、つまりMacのssh-agent
、ssh-add
、keychain
、Keychain Access.app
を理解できるようになりました。
ssh-agent
は、SSHパスフレーズを入力せずにSSH秘密鍵の使用を可能にする重要なサービスです。 ssh-agent
はこのように機能します。最初に、SSHプライベートキーをメインメモリに保存、つまりcacheします。次に、このセッションの後で、リモート認証にSSH秘密SSHキーが必要になると、ssh-agent
がメインメモリで秘密キーを見つけて、リモートプロセスに渡します。 SSHパスフレーズの入力を求められる唯一の機会は、最初にssh-agent
によって秘密鍵が追加されたときです。ssh-add
はssh-agent
コレクションの一部であり、ssh-agent
内のSSHキーの管理に役立ちます。 ssh-add
コマンドを使用して、ssh-agentの鍵リングの秘密鍵をリスト、追加、削除します。次に、ssh-add
がssh-agent
サービスと通信してタスクを実行します。keychain
は、ssh-agent
サービス(存在しない場合は新しいサービスを開始)を検索し、ssh-add
を呼び出してSSH秘密鍵を追加するスクリプトです。 keychain
にはシンプルでわかりやすいアイデアがあり、通常はssh-agentが自動的に起動しないLinuxでうまく機能します。Keychain Access.app
は、最も複雑なコンポーネントのようです。 Mac OS Xのユニバーサルトークンストレージサービスです。パスワード、証明書など、さまざまなトークンを格納し、トークンを要求するアプリのトークンagentとして機能します。 SSH秘密鍵のケースでは、最初にSSH秘密鍵へのアクセス要求を把握し、ウィンドウをポップアップして、トークンの一種であるSSHパスフレーズをKeychain Access.app
の鍵リングに保存するように求めます。次に、認証に秘密鍵を使用するときは、Keychain Access.app
が再びウィンドウをポップアップして、特権を付与するかどうかを尋ねます。大きなyesを取得した後、keychain Access.app
はssh-agent
のストレージに秘密鍵を追加します。2つのことに注意する必要があります。
ssh-agent
サービスを開始し、/tmp
の下のソケットをリッスンします。Keychain Access.app
はSSHパスフレーズを保存するため、ユーザーの作業を妨げることなくssh-agent
に秘密鍵を追加できます。はい、ありません。SSHフレーズを入力する必要はありませんが、このエントリを初めて作成するときに特権を付与するには、Macアカウントのログインパスワードを入力する必要があります。したがって、要約すると、SSH-login-without-asking-passphraseはMac OS Xでそのまま動作します
ここで他の解決策が人々のために機能しない場合、以下は私のために働きました。
〜/ .sshディレクトリ内のすべての秘密鍵について、対応する公開鍵も存在することを確認してください。公開鍵の名前は秘密鍵とまったく同じにしてくださいが、末尾に.pub
を付けてください。適切な公開鍵がすでにある場合は、それを再生成してみてください。
公開鍵を再作成する必要がある場合は、簡単に作成できます。
ssh-keygen -y -f ~/.ssh/my_key > ~/.ssh/my_key.pub
my_key
を、キーが呼び出されるものに置き換えます。
その後、MacOSはキーチェーン内のキーパスフレーズを必要に応じて記憶します。
注-パスフレーズを入力して保存すると、キーチェーンは1回限りのアクションになります(OPのようにログインセッションごとに1回ではありません)。ただし、問題のMacへのログインがパスワードで保護されている場合、パスフレーズはそのログインパスワードで保護されます。また、このソリューションは私には意味がありません...秘密鍵に加えて公開鍵は必要ありませんが、何らかの理由でMacOSXが必要とします。
(元々 answer からApple Stack Exchange)の同様の質問へ)
~/.ssh
フォルダーの構成に関して言及することがほとんどないのは、ディレクトリのアクセス許可を制限することです。
Sshがパスワードを要求しないようにするには、ユーザーのホームディレクトリのアクセス許可を700
に設定し、~/.ssh
フォルダーのアクセス許可を700
に設定する必要がありました。
それ以外の場合は、すべてのキーを正しく生成してコピーしても、パスワードの入力を求め続けます。認証ログにエラーメッセージが生成されますが、ほとんどの場合、これはエンドユーザーには見えません。
この回答は、この質問の解決策ではありません。しかし、それは非常に近いです(私の問題の解決策を探している間に私はこの質問に終わりました)。
この質問で説明されているように、私のMac上のリモートサーバーに対してもSSHを大量に実行していますが、Keychain Access.app
アプリはキーフレーズを保存しました。SSHサーバーで認証するためにキーが必要になるたびに入力する必要はありません。
ただし、MacでSSHサーバーを有効にして、リモートで接続できるようにしました。 Macにリモートでログオンしているとき、別のホストにSSHで接続したいときは常にキーフレーズが尋ねられました。
現在のセッションでキーフレーズを保存できる solution を見つけました。これは誰かに役立つかもしれないと思ったので、この投稿/回答。
あなたが試した別のことは、_ssh-copy-id
_をk="$(cat ~/.ssh/id_rsa.pub)"; ssh [email protected] "umask 0077; mkdir -p ~/.ssh; echo "$k" >> ~/.ssh/authorized_keys2"
のようなものに置き換えることでした。
私はこの問題に戸惑っています。 sshは、Apple以外の部門のすべてのマシンで機能します(MacBookまたはiMacは関係ありません)。私はようやくパスワードの入力に飽きて、これをデバッグすることにしました。
IMacにアクセスして、共有設定パネルでsshdを無効にしました。次に、ルートにsuし、「/ usr/sbin/sshd -d」と入力して、デバッグモードでsshdを起動しました。次に、そのマシンにsshを実行しようとしたところ、すぐにプロトコル2を使用しようとしましたが、すべて正常に使用されているようですが、sshdは、 "authorized_keys"が見つからなかったとすぐに報告しました。私のlinux、solaris、you-name-it unixボックスはすべて問題なく受け入れられるauthorized_keys2ファイルがありました。私は単にauthorized_keys2をauthorized_keysとBOOMにコピーしました。今は完全に動作します。
* keys2ではなく* keysが不明な理由。特に、os xがknown_hosts2に非常に満足している場合。
いずれにせよ、これですべてのAppleボックスにログインできるようになりました。または、爆破されたパスワードなしでリモートコマンドを実行できるようになりました:プロンプト...