# SSHエージェント転送の利用

サーバーへのデプロイを簡単にするために、SSHエージェント転送をセットアップして、安全にローカルのSSHキーを使うことができます。

SSHエージェント転送を使って、サーバーへのデプロイをシンプルにすることができます。 そうすることで、キー（パスフレーズなしの！）をサーバー上に残さずに、ローカルのSSHキーを使用できます。

GitHub とやり取りするために SSH キーを既に設定している場合は、おそらく `ssh-agent` についてご存知でしょう。 これは、バックグラウンドで実行され、キーをメモリにロードした状態にし続けるので、キーを使うたびにパスフレーズを入力する必要がなくなります。 便利なのは、それらがサーバー上で既に動作しているかのように、サーバーからローカルの `ssh-agent` にアクセスさせることを選択できることです。 これは、友人のコンピュータをあなたが使えるように、友人のパスワードを友人に入力してもらうように頼むようなものです。

SSH エージェント転送の詳細については、[Steve Friedl の Tech ヒント ガイド](http://www.unixwiz.net/techtips/ssh-agent-forwarding.html)を参照してください。

## SSHエージェント転送のセットアップ

SSHキーがセットアップされており、動作していることを確認してください。 まだの場合は、[SSH キーの生成に関するガイド](/ja/authentication/connecting-to-github-with-ssh)を使用できます。

ターミナルに `ssh -T git@github.com` を入力して、ローカル キーが機能することをテストできます。

```shell
$ ssh -T git@github.com
# Attempt to SSH in to github
> Hi USERNAME! You've successfully authenticated, but GitHub does not provide
> shell access.
```

いいスタートを切ることができました。 サーバーへのエージェント転送ができるよう、SSHをセットアップしましょう。

1. 任意のテキスト エディターを使用して、`~/.ssh/config` でファイルを開きます。 このファイルが存在しない場合は、ターミナルで `touch ~/.ssh/config` と入力して作成できます。

2. ファイルに次のテキストを入力し、`example.com` をサーバーのドメイン名または IP に置き換えます。

   ```
    Host example.com
   ```

ForwardAgent yes

> \[!WARNING]
> この設定をすべての SSH 接続に適用するだけのために、`Host *` のようなワイルドカードを使いたくなる場合があります。 これはローカルの SSH キーを SSH 接続で入る *すべての* サーバーと共有することになるので、実際には良い考えではありません。 キーに直接アクセスされることはないかもしれませんが、接続が確立されている間は *あなたと同じように* それらのキーが使われるかもしれません。
> **追加するサーバーは、信用でき、エージェント転送で使おうとしているサーバーのみにする必要があります。**

## SSHエージェント転送のテスト

そのエージェント転送がサーバーで動作していることをテストするには、サーバーに SSH 接続し、`ssh -T git@github.com` をもう一度実行します。 すべてうまくいっているなら、ローカルでやった場合と同じプロンプトが返ってくるでしょう。

ローカル キーが使用されているかどうかわからない場合は、サーバー上の `SSH_AUTH_SOCK` 変数を調べることもできます。

```shell
$ echo "$SSH_AUTH_SOCK"
# Print out the SSH_AUTH_SOCK variable
> /tmp/ssh-4hNGMk8AZX/agent.79453
```

この変数が設定されていないなら、エージェント転送は動作していないということです。

```shell
$ echo "$SSH_AUTH_SOCK"
# Print out the SSH_AUTH_SOCK variable
> [No output]
$ ssh -T git@github.com
# Try to SSH to github
> Permission denied (publickey).
```

## SSHエージェント転送のトラブルシューティング

以下は、SSHエージェント転送のトラブルシューティングの際に注意すべきことです。

### コードをのチェックアウトにはSSH URLを使わなければならない

SSH転送はHTTP(s) URLでは動作せず、SSH URLでのみ動作します。 サーバー上の `.git/config` ファイルを確認し、URL が次のような SSH スタイルの URL であることを確認します。

```shell
[remote "origin"]
  url = git@github.com:YOUR_ACCOUNT/YOUR_PROJECT.git
  fetch = +refs/heads/*:refs/remotes/origin/*
```

### SSHキーはローカルで動作していなければならない

エージェント転送を通じてキーを動作させるには、まずキーがローカルで動作していなければなりません。
[SSH キーの生成に関するガイド](/ja/authentication/connecting-to-github-with-ssh)は、SSH キーをローカルに設定するのに役立ちます。

### システムがSSHエージェント転送を許可していなければならない

システム設定でSSHエージェント転送が許可されていないことがあります。 システム設定ファイルが使われているかは、ターミナルで以下のコマンドを入力してみればチェックできます。

```shell
$ ssh -v URL
# Connect to the specified URL with verbose debug output
> OpenSSH_8.1p1, LibreSSL 2.7.3
> debug1: Reading configuration data /Users/YOU/.ssh/config
> debug1: Applying options for example.com
> debug1: Reading configuration data /etc/ssh_config
> debug1: Applying options for *
$ exit
# Returns to your local command prompt
```

上記の例では、最初にファイル `~/.ssh/config` が読み込まれ、次に `/etc/ssh_config` が読み取られます。 以下のコマンドを実行すれば、そのファイルが設定を上書きしているかを調べることができます。

```shell
$ cat /etc/ssh_config
# Print out the /etc/ssh_config file
> Host *
>   SendEnv LANG LC_*
>   ForwardAgent no
```

この例の `/etc/ssh_config` ファイルでは、エージェントの転送をブロックする方法として、特に `ForwardAgent no` を記述しています。 この行をファイルから削除すれば、エージェント転送は改めて動作するようになります。

### サーバーはインバウンド接続でSSHエージェント転送を許可していなければならない

エージェント転送は、サーバーでブロックされているかもしれません。 サーバーへの SSH 接続および `sshd_config` の実行により、エージェント転送が許可されていることを確認できます。 このコマンドの出力は、`AllowAgentForwarding` が設定されていることを示している必要があります。

### ローカルの `ssh-agent` が実行されている必要がある

ほとんどのコンピューターでは、オペレーティング システムによって自動的に `ssh-agent` が起動されます。 ただし、Windowsでは、手動で行う必要があります。
[Git Bash を開くたびに `ssh-agent` を開始する方法に関するガイドがあります](/ja/authentication/connecting-to-github-with-ssh/working-with-ssh-key-passphrases#auto-launching-ssh-agent-on-git-for-windows)。

コンピューターで `ssh-agent` が実行されていることを確認するには、ターミナルで次のコマンドを入力します。

```shell
$ echo "$SSH_AUTH_SOCK"
# Print out the SSH_AUTH_SOCK variable
> /tmp/launch-kNSlgU/Listeners
```

### キーが`ssh-agent`に対して利用可能である必要があります。

キーが `ssh-agent` から見えることを確認するには、次のコマンドを実行します。

```shell
ssh-add -L
```

コマンドが「識別情報が利用できません」と表示された場合、キーを追加する必要があります。

```shell
ssh-add YOUR-KEY
```

> \[!TIP]
> macOS では、`ssh-agent` がリブート中に再起動されると、このキーを "忘れます"。 ただし、以下のコマンドでキーチェーンにSSHキーをインポートできます。
>
> ```shell
> ssh-add --apple-use-keychain YOUR-KEY
> ```

> \[!NOTE]
> `--apple-use-keychain` オプションでは、ssh-agent に SSH キーを追加すると、パスフレーズがキーチェーンに自動的に格納されます。 パスフレーズをキーに追加しない場合は、`--apple-use-keychain` オプションを指定せずにコマンドを実行します。
>
> `--apple-use-keychain` オプションは、Apple の標準バージョンの `ssh-add` です。 Monterey (12.0) より前の macOS バージョンでは、`--apple-use-keychain` と `--apple-load-keychain` フラグでそれぞれ構文 `-K` と `-A` が使用されていました。
>
> Apple の標準バージョンの `ssh-add` をインストールしていない場合は、エラーが発生することがあります。 詳しくは、「[エラー: ssh-add: 違法オプション -- apple-use-keychain](/ja/authentication/troubleshooting-ssh/error-ssh-add-illegal-option----apple-use-keychain)」をご覧ください。
>
> パスフレーズの入力を求め続けられるときは、場合によっては `~/.zshrc` ファイル (または bash 用の `~/.bashrc` ファイル) にコマンドを追加してください。

[tech-tips]: http://www.unixwiz.net/techtips/ssh-agent-forwarding.html

[generating-keys]: /authentication/connecting-to-github-with-ssh

[ssh-passphrases]: /authentication/connecting-to-github-with-ssh/working-with-ssh-key-passphrases

[autolaunch-ssh-agent]: /authentication/connecting-to-github-with-ssh/working-with-ssh-key-passphrases#auto-launching-ssh-agent-on-git-for-windows