SSHエージェント転送を使って、サーバーへのデプロイをシンプルにすることができます。 そうすることで、キー(パスフレーズなしの!)をサーバー上に残さずに、ローカルのSSHキーを使用できます。
GitHub とやり取りするために SSH キーを既に設定している場合は、おそらく についてご存知でしょう。 これは、バックグラウンドで実行され、キーをメモリにロードした状態にし続けるので、キーを使うたびにパスフレーズを入力する必要がなくなります。 便利なのは、それらがサーバー上で既に動作しているかのように、サーバーからローカルの にアクセスさせることを選択できることです。 これは、友人のコンピュータをあなたが使えるように、友人のパスワードを友人に入力してもらうように頼むようなものです。
SSH エージェント転送の詳細については、Steve Friedl の Tech ヒント ガイドを参照してください。
SSHエージェント転送のセットアップ
SSHキーがセットアップされており、動作していることを確認してください。 まだの場合は、SSH キーの生成に関するガイドを使用できます。
ターミナルに を入力して、ローカル キーが機能することをテストできます。
$ 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をセットアップしましょう。
-
任意のテキスト エディターを使用して、 でファイルを開きます。 このファイルが存在しない場合は、ターミナルで と入力して作成できます。
-
ファイルに次のテキストを入力し、 をサーバーのドメイン名または IP に置き換えます。
Host example.com ForwardAgent yes
警告
この設定をすべての SSH 接続に適用するように、 のようなワイルドカードを使用したくなる場合があります。 これはローカルの SSH キーを SSH 接続で入る すべての サーバーと共有することになるので、実際には良い考えではありません。 キーに直接アクセスされることはないかもしれませんが、接続が確立されている間は あなたと同じように それらのキーが使われるかもしれません。 追加するサーバーは、信用でき、エージェント転送で使おうとしているサーバーのみにする必要があります。
SSHエージェント転送のテスト
そのエージェント転送がサーバーで動作していることをテストするには、サーバーに SSH 接続し、 をもう一度実行します。 すべてうまくいっているなら、ローカルでやった場合と同じプロンプトが返ってくるでしょう。
ローカル キーが使用されているかどうかわからない場合は、サーバー上の 変数を調べることもできます。
$ echo "$SSH_AUTH_SOCK"
# Print out the SSH_AUTH_SOCK variable
> /tmp/ssh-4hNGMk8AZX/agent.79453
この変数が設定されていないなら、エージェント転送は動作していないということです。
$ 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でのみ動作します。 サーバー上の ファイルを確認し、URL が次のような SSH スタイルの URL であることを確認します。
[remote "origin"]
url = git@github.com:YOUR_ACCOUNT/YOUR_PROJECT.git
fetch = +refs/heads/*:refs/remotes/origin/*
SSHキーはローカルで動作していなければならない
エージェント転送を通じてキーを動作させるには、まずキーがローカルで動作していなければなりません。 SSH キーの生成に関するガイドは、SSH キーをローカルに設定するのに役立ちます。
システムがSSHエージェント転送を許可していなければならない
システム設定でSSHエージェント転送が許可されていないことがあります。 システム設定ファイルが使われているかは、ターミナルで以下のコマンドを入力してみればチェックできます。
$ 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
上記の例では、最初にファイル が読み込まれ、次に が読み取られます。 以下のコマンドを実行すれば、そのファイルが設定を上書きしているかを調べることができます。
$ cat /etc/ssh_config
# Print out the /etc/ssh_config file
> Host *
> SendEnv LANG LC_*
> ForwardAgent no
この例の ファイルでは、エージェントの転送をブロックする方法として、特に を記述しています。 この行をファイルから削除すれば、エージェント転送は改めて動作するようになります。
サーバーはインバウンド接続でSSHエージェント転送を許可していなければならない
エージェント転送は、サーバーでブロックされているかもしれません。 サーバーへの SSH 接続および の実行により、エージェント転送が許可されていることを確認できます。 このコマンドの出力は、が設定されていることを示しているはずです。
ローカルの が実行されている必要がある
ほとんどのコンピューターでは、オペレーティングシステムが自動的に起動してくれます。 ただし、Windowsでは、手動で行う必要があります。 Git Bash を開くたびに を開始する方法に関するガイドがあります。
コンピューターで が実行されていることを確認するには、ターミナルで次のコマンドを入力します。
$ echo "$SSH_AUTH_SOCK"
# Print out the SSH_AUTH_SOCK variable
> /tmp/launch-kNSlgU/Listeners
あなたのキーが利用可能である必要があります。
キーが見えることを確認するには、次のコマンドを実行して確認してください。
ssh-add -L
コマンドが「識別情報が利用できません」と表示された場合、キーを追加する必要があります。
ssh-add YOUR-KEY
ヒント
macOS では、 がリブート中に再起動されると、このキーを "忘れます"。 ただし、以下のコマンドでキーチェーンにSSHキーをインポートできます。
ssh-add --apple-use-keychain YOUR-KEY
メモ
--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」をご覧ください。
パスフレーズの入力を求め続けられるときは、場合によっては ~/.zshrc ファイル (または bash 用の ~/.bashrc ファイル) にコマンドを追加してください。