ssh-agent による公開鍵認証と SSH Agent Forwarding による多段ログイン
ssh で公開鍵認証を使用し、デフォルトの秘密鍵(~/.ssh/id_rsa)以外でログインする場合は -i
オプションで秘密鍵を指定する必要があるが、ssh-agent を使うことで指定が不要になる。さらに SSH Agent Forwarding 機能を使うと、秘密鍵をローカル PC に置いたまま、ログイン先のサーバーからさらに別のサーバーにログインすることもできる。
ssh-agent
秘密鍵の登録
-
ローカル PC で ssh-agent を起動する。macOS では自動的に起動するので不要。
eval `ssh-agent`
-
ローカル PC の ssh-agent に秘密鍵を登録する。ファイル名を省略するとユーザーのデフォルト秘密鍵(~/.ssh/id_rsa)が登録される。
ssh-add xxxx.pem
SSH ログイン
ssh-agent が起動していれば、毎回 -i
オプションで秘密鍵を指定する必要なくログインすることができる。複数の鍵を登録してある場合は、それぞれの鍵で試行される。そのためあまり多くの鍵を登録すると Too many authentication failures となりサーバーから拒否される場合があるので注意。
ssh <user>@<host>
SSH Agent Forwarding
サーバー設定
踏み台とする SSH サーバーで、Agent Forwading 機能が有効になっている必要がある。
デフォルトで有効になっているかもしれないので、確認する。
# /etc/ssh/sshd_config
AllowAgentForwarding yes
ログイン
踏み台サーバーへのログイン時に -A
オプションをつけることで、ログイン先のサーバーからもローカルの ssh-agent に登録した鍵が使用されるようになる。さらにその先からも多段にログインしたい場合はその都度 -A
オプションをつければ良い。
ssh -A <user>@<host>
設定
毎回 -A
オプションをつけるのが面倒な場合は、接続元のホストで以下のように設定しておく。
# ~/.ssh/config
Host server1.example.com (接続先のホスト名)
ForwardAgent yes
Git over SSH
Git など SSH 経由でアクセスする場合も自動的に ssh-agent に登録した鍵が使用される。
git clone git@<host>:<user>/<repos>.git
別ユーザーに切り換える
別ユーザーに切り換えても ssh-agent を維持するには環境変数を保持する必要がある。sudo に -E オプションをつけて実行する。
sudo -E git clone git@<host>:<user>/<repos>.git
Discussion