SSHエージェントフォワーディングとは何ですか?どのように使用しますか?
SSHエージェントフォワーディングを使用すると、作業しているサーバーに機密データを残す心配なく、リモートでプライベートなローカルSSHキーを使用できます。これはsshに組み込まれており、設定と使用が簡単です。
SSHエージェントとは何ですか?
あなたの公開SSHキーはあなたのユーザー名やアイデンティティのようなもので、誰とでも共有できます。あなたの秘密SSHキーはパスワードのようなもので、あなたのコンピュータにローカルに保存されます。しかし、これはパスワードを付箋紙に書いて保存するようなもので、誰でもアクセスできればそれを見ることができます。ですので、セキュリティのために、SSHはキーを生成するときにパスフレーズを要求します(そのステップをスキップしていなければいいのですが)そしてそのパスフレーズを使ってあなたの秘密鍵を暗号化および復号化します。
しかし、これはプライベートキーを使用するたびにパスフレーズを入力する必要があることを意味しますので、煩わしくなります。この問題を管理するために、ほとんどのSSH実装ではエージェントを使用し、解読されたキーをメモリに保持します。これにより、一度ロックを解除すれば、再起動するまで持続し、パスフレーズのプロンプトなしでサーバーに安全にログインできるようになります。もちろん、SSHサーバーがしっかりとロックされていることを確認したいでしょう。
SSHエージェントフォワーディングとは何ですか?
SSHエージェントフォワーディングは、もう一層深くなるようなものです。例えば、リモートサーバーに接続していると想像してみてください。そして、あなたは
git pull
GitHubに保存しているいくつかのコード。GitHubのSSH認証を使用したいが、リモートサーバーにはプライベートキーを置きたくなく、自分のマシンのみに置きたい。
この問題を解決するには、ローカルのSSHエージェントをリモートサーバーに開くことができます。これにより、接続中にリモートサーバーがあなたの代わりに動作できます。これは、秘密鍵をインターネット上に送信することはありませんし、暗号化されている間でさえ送信されません;単にリモートサーバーがあなたのローカルSSHエージェントにアクセスし、あなたの身元を確認できるようにするだけです。
こういう仕組みです:リモートサーバーにGithubからコードを引き出すよう依頼すると、Githubはサーバーに「あなたは誰ですか?」と尋ねます。通常、サーバーは自分のid_rsaファイルを参照して答えるのですが、代わりにその質問をあなたのローカルマシンに転送します。あなたのローカルマシンがその質問に答えて、応答(あなたのプライベートキーは含まれていません)をサーバーに送り、それがGithubに再転送されます。Githubはあなたのローカルマシンがその質問に答えたことには興味がなく、ただ答えられたことを確認し、接続を許可するだけです。
SSHエージェントフォワーディングを有効にする方法
Mac および Linux では、SSH エージェントフォワーディングが ssh に組み込まれており、ssh-agent プロセスは自動的に起動します。あなたがしなければならないのは、あなたのキーが ssh-agent に追加されていることを確認し、ssh をフォワーディングを使用するように設定することです。
ssh-agentにキーを追加する
ローカルエージェントにキーを追加するために ssh-add ユーティリティを使用できます。あなたの秘密鍵が id_rsa に保存されていると仮定すると、次のように実行できます:
ssh-add ~/.ssh/id_rsaキーをid_rsaを使用する代わりに手動で貼り付けることもできます。キーが正しく追加されているかを確認してください:
ssh-add -Lもしそうなら、あなたのキーを出すはずです。
macOSにキーを追加する
macOSでは、代わりに次のコマンドを実行する必要があります:
ssh-add -K ~/.ssh/id_rsa
-Kフラグは、macOSのキーチェーンにキーを保存します。これは、再起動後にキーを記憶させるために必要です。
クライアントの設定で転送を許可する
ローカルマシンの~/.ssh/configファイルを開くか、空であれば新しく作成します。このサーバーのドメインに対してエージェント転送が有効になるように新しいルールを設定します:
Host example
ForwardAgent yes
あなたはexampleをあなたのサーバーのドメイン名またはIPアドレスで置き換えるべきです。ホスト用にワイルドカード*を使用できますが、その場合、接続するすべてのサーバーにプライベートキーへのアクセスを転送することになるため、おそらくそれは望ましくないでしょう。
オペレーティングシステムによっては、macOSでは/etc/ssh/ssh_config、Ubuntuでは/etc/ssh_configにSSHの設定ファイルが存在する可能性があります。これらのファイルはユーザー設定ファイルである~/.ssh/configを上書きすることがあるため、競合がないことを確認してください。#から始まる行はコメントアウトされており、影響を与えません。
任意のドメインのエージェント転送を手動で有効にすることも可能です。これは、ssh -A user@hostを使用することで、すべての設定ファイルをバイパスします。設定に触れずに転送を行う簡単な方法を望む場合は、alias ssh="ssh -A"をbashの設定に追加できますが、これはワイルドカードホストを使用するのと同じであり、安全性を重視する用途にはお勧めしません。
SSHフォワーディングのテスト
もし手元に2つのサーバーがない場合、SSHフォワーディングが機能しているかをテストする最も簡単な方法は、ローカルマシンからあなたのパブリックキーをGithubプロファイルに追加し、リモートサーバーからSSH接続を試みることです。
ssh git@github.comうまくいった場合は、ユーザー名が表示され、サーバーにプライベートキーを置くことなくリポジトリからコードをプッシュおよびプルできるはずです。
Windowsクライアント用のSSHフォワーディングを設定する
WindowsはUnixオペレーティングシステムではないため、setupは最初にsshをどのように実行しているかによって異なります。
Windows用のLinuxサブシステムを使用している場合、Windowsでbashを実行できるようにするためのセットアップは、LinuxやmacOSと同じになります。これは、コマンドラインを実行するためにLinuxのディストリビューションを完全に仮想化しているからです。
Git Bashを使用している場合、セットアップはLinuxと同じですが、シェルを起動するときに手動でssh-agentを起動する必要があります。これは.bashrcのスタートアップスクリプトを使って行うことができます。
PuTTYを使用している場合、設定は非常に簡単です。設定から、接続 > SSH > 認証に移動し、「エージェントの転送を許可する」を有効にします。
同じパネルからプライベートキーのファイルを追加することもできます。PuTTYはSSHエージェントを自動的に処理するので、設定ファイルをいじる必要はありません。
SSHフォワーディングが機能しない場合の対処法
まず、SSHキーが実際に存在することを確認してください;存在しない場合は、ssh-keygenを実行することができ、これによりあなたのプライベートキーが~/.ssh/id_rsaに、パブリックキーが~/.ssh/id_rsa.pubに配置されます。
SSHキーが通常の認証で正しく動作していることを確認し、それらをssh-agentに追加してください。ssh-addを使用してキーを追加できます。
ssh-agentプロセスも実行されている必要があります。macOSとLinuxでは、自動的に起動するはずですが、次のコマンドで実行中であることを確認できます:
echo "$SSH_AUTH_SOCK"
正しく設定されていれば、Listeners ソケットが返されるはずです。
設定ファイルが正しく構成されており、ForwardAgent yesを含むことを確認し、この動作を上書きしている他の設定ファイルがないか確認してください。SSHがどの設定ファイルを使用しているかを確認するには、sshを詳細モードで実行できます:
ssh -v git@github.comどの設定ファイルが使用されているかを表示する必要があります。このリストで後に表示されるファイルは、前のファイルよりも優先されます。
もちろん、コマンドラインオプションは設定ファイルを上書きします。もしエージェントフォワーディングがssh -Aで動作しない場合、そしてあなたのキーがエージェントに適切に設定されているなら、何か他に問題がありますので、チェーン内のサーバーへの接続を確認する必要があります。


