{"meta":{"title":"SSHエージェント転送の利用","intro":"サーバーへのデプロイを簡単にするために、SSHエージェント転送をセットアップして、安全にローカルのSSHキーを使うことができます。","product":"認証","breadcrumbs":[{"href":"/ja/authentication","title":"認証"},{"href":"/ja/authentication/connecting-to-github-with-ssh","title":"SSH を使用した接続"},{"href":"/ja/authentication/connecting-to-github-with-ssh/using-ssh-agent-forwarding","title":"SSHエージェントの転送"}],"documentType":"article"},"body":"# SSHエージェント転送の利用\n\nサーバーへのデプロイを簡単にするために、SSHエージェント転送をセットアップして、安全にローカルのSSHキーを使うことができます。\n\nSSHエージェント転送を使って、サーバーへのデプロイをシンプルにすることができます。 そうすることで、キー（パスフレーズなしの！）をサーバー上に残さずに、ローカルのSSHキーを使用できます。\n\nGitHub とやり取りするために SSH キーを既に設定している場合は、おそらく `ssh-agent` についてご存知でしょう。 これは、バックグラウンドで実行され、キーをメモリにロードした状態にし続けるので、キーを使うたびにパスフレーズを入力する必要がなくなります。 便利なのは、それらがサーバー上で既に動作しているかのように、サーバーからローカルの `ssh-agent` にアクセスさせることを選択できることです。 これは、友人のコンピュータをあなたが使えるように、友人のパスワードを友人に入力してもらうように頼むようなものです。\n\nSSH エージェント転送の詳細については、[Steve Friedl の Tech ヒント ガイド](http://www.unixwiz.net/techtips/ssh-agent-forwarding.html)を参照してください。\n\n## SSHエージェント転送のセットアップ\n\nSSHキーがセットアップされており、動作していることを確認してください。 まだの場合は、[SSH キーの生成に関するガイド](/ja/authentication/connecting-to-github-with-ssh)を使用できます。\n\nターミナルに `ssh -T git@github.com` を入力して、ローカル キーが機能することをテストできます。\n\n```shell\n$ ssh -T git@github.com\n# Attempt to SSH in to github\n> Hi USERNAME! You've successfully authenticated, but GitHub does not provide\n> shell access.\n```\n\nいいスタートを切ることができました。 サーバーへのエージェント転送ができるよう、SSHをセットアップしましょう。\n\n1. 任意のテキスト エディターを使用して、`~/.ssh/config` でファイルを開きます。 このファイルが存在しない場合は、ターミナルで `touch ~/.ssh/config` と入力して作成できます。\n\n2. ファイルに次のテキストを入力し、`example.com` をサーバーのドメイン名または IP に置き換えます。\n\n   ```\n    Host example.com\n   ```\n\nForwardAgent yes\n\n> \\[!WARNING]\n> この設定をすべての SSH 接続に適用するだけのために、`Host *` のようなワイルドカードを使いたくなる場合があります。 これはローカルの SSH キーを SSH 接続で入る *すべての* サーバーと共有することになるので、実際には良い考えではありません。 キーに直接アクセスされることはないかもしれませんが、接続が確立されている間は *あなたと同じように* それらのキーが使われるかもしれません。\n> **追加するサーバーは、信用でき、エージェント転送で使おうとしているサーバーのみにする必要があります。**\n\n## SSHエージェント転送のテスト\n\nそのエージェント転送がサーバーで動作していることをテストするには、サーバーに SSH 接続し、`ssh -T git@github.com` をもう一度実行します。 すべてうまくいっているなら、ローカルでやった場合と同じプロンプトが返ってくるでしょう。\n\nローカル キーが使用されているかどうかわからない場合は、サーバー上の `SSH_AUTH_SOCK` 変数を調べることもできます。\n\n```shell\n$ echo \"$SSH_AUTH_SOCK\"\n# Print out the SSH_AUTH_SOCK variable\n> /tmp/ssh-4hNGMk8AZX/agent.79453\n```\n\nこの変数が設定されていないなら、エージェント転送は動作していないということです。\n\n```shell\n$ echo \"$SSH_AUTH_SOCK\"\n# Print out the SSH_AUTH_SOCK variable\n> [No output]\n$ ssh -T git@github.com\n# Try to SSH to github\n> Permission denied (publickey).\n```\n\n## SSHエージェント転送のトラブルシューティング\n\n以下は、SSHエージェント転送のトラブルシューティングの際に注意すべきことです。\n\n### コードをのチェックアウトにはSSH URLを使わなければならない\n\nSSH転送はHTTP(s) URLでは動作せず、SSH URLでのみ動作します。 サーバー上の `.git/config` ファイルを確認し、URL が次のような SSH スタイルの URL であることを確認します。\n\n```shell\n[remote \"origin\"]\n  url = git@github.com:YOUR_ACCOUNT/YOUR_PROJECT.git\n  fetch = +refs/heads/*:refs/remotes/origin/*\n```\n\n### SSHキーはローカルで動作していなければならない\n\nエージェント転送を通じてキーを動作させるには、まずキーがローカルで動作していなければなりません。\n[SSH キーの生成に関するガイド](/ja/authentication/connecting-to-github-with-ssh)は、SSH キーをローカルに設定するのに役立ちます。\n\n### システムがSSHエージェント転送を許可していなければならない\n\nシステム設定でSSHエージェント転送が許可されていないことがあります。 システム設定ファイルが使われているかは、ターミナルで以下のコマンドを入力してみればチェックできます。\n\n```shell\n$ ssh -v URL\n# Connect to the specified URL with verbose debug output\n> OpenSSH_8.1p1, LibreSSL 2.7.3\n> debug1: Reading configuration data /Users/YOU/.ssh/config\n> debug1: Applying options for example.com\n> debug1: Reading configuration data /etc/ssh_config\n> debug1: Applying options for *\n$ exit\n# Returns to your local command prompt\n```\n\n上記の例では、最初にファイル `~/.ssh/config` が読み込まれ、次に `/etc/ssh_config` が読み取られます。 以下のコマンドを実行すれば、そのファイルが設定を上書きしているかを調べることができます。\n\n```shell\n$ cat /etc/ssh_config\n# Print out the /etc/ssh_config file\n> Host *\n>   SendEnv LANG LC_*\n>   ForwardAgent no\n```\n\nこの例の `/etc/ssh_config` ファイルでは、エージェントの転送をブロックする方法として、特に `ForwardAgent no` を記述しています。 この行をファイルから削除すれば、エージェント転送は改めて動作するようになります。\n\n### サーバーはインバウンド接続でSSHエージェント転送を許可していなければならない\n\nエージェント転送は、サーバーでブロックされているかもしれません。 サーバーへの SSH 接続および `sshd_config` の実行により、エージェント転送が許可されていることを確認できます。 このコマンドの出力は、`AllowAgentForwarding` が設定されていることを示している必要があります。\n\n### ローカルの `ssh-agent` が実行されている必要がある\n\nほとんどのコンピューターでは、オペレーティング システムによって自動的に `ssh-agent` が起動されます。 ただし、Windowsでは、手動で行う必要があります。\n[Git Bash を開くたびに `ssh-agent` を開始する方法に関するガイドがあります](/ja/authentication/connecting-to-github-with-ssh/working-with-ssh-key-passphrases#auto-launching-ssh-agent-on-git-for-windows)。\n\nコンピューターで `ssh-agent` が実行されていることを確認するには、ターミナルで次のコマンドを入力します。\n\n```shell\n$ echo \"$SSH_AUTH_SOCK\"\n# Print out the SSH_AUTH_SOCK variable\n> /tmp/launch-kNSlgU/Listeners\n```\n\n### キーが`ssh-agent`に対して利用可能である必要があります。\n\nキーが `ssh-agent` から見えることを確認するには、次のコマンドを実行します。\n\n```shell\nssh-add -L\n```\n\nコマンドが「識別情報が利用できません」と表示された場合、キーを追加する必要があります。\n\n```shell\nssh-add YOUR-KEY\n```\n\n> \\[!TIP]\n> macOS では、`ssh-agent` がリブート中に再起動されると、このキーを \"忘れます\"。 ただし、以下のコマンドでキーチェーンにSSHキーをインポートできます。\n>\n> ```shell\n> ssh-add --apple-use-keychain YOUR-KEY\n> ```\n\n> \\[!NOTE]\n> `--apple-use-keychain` オプションでは、ssh-agent に SSH キーを追加すると、パスフレーズがキーチェーンに自動的に格納されます。 パスフレーズをキーに追加しない場合は、`--apple-use-keychain` オプションを指定せずにコマンドを実行します。\n>\n> `--apple-use-keychain` オプションは、Apple の標準バージョンの `ssh-add` です。 Monterey (12.0) より前の macOS バージョンでは、`--apple-use-keychain` と `--apple-load-keychain` フラグでそれぞれ構文 `-K` と `-A` が使用されていました。\n>\n> Apple の標準バージョンの `ssh-add` をインストールしていない場合は、エラーが発生することがあります。 詳しくは、「[エラー: ssh-add: 違法オプション -- apple-use-keychain](/ja/authentication/troubleshooting-ssh/error-ssh-add-illegal-option----apple-use-keychain)」をご覧ください。\n>\n> パスフレーズの入力を求め続けられるときは、場合によっては `~/.zshrc` ファイル (または bash 用の `~/.bashrc` ファイル) にコマンドを追加してください。\n\n[tech-tips]: http://www.unixwiz.net/techtips/ssh-agent-forwarding.html\n\n[generating-keys]: /authentication/connecting-to-github-with-ssh\n\n[ssh-passphrases]: /authentication/connecting-to-github-with-ssh/working-with-ssh-key-passphrases\n\n[autolaunch-ssh-agent]: /authentication/connecting-to-github-with-ssh/working-with-ssh-key-passphrases#auto-launching-ssh-agent-on-git-for-windows"}