ssh-agent による公開鍵認証と SSH agent forwarding による多段ログイン

1 min read読了の目安(約1500字

ssh で公開鍵認証を使用し、デフォルトの秘密鍵(~/.ssh/id_rsa)以外でログインする場合は -i オプションで秘密鍵を指定する必要があるが、ssh-agent を使うことで指定が不要になる。さらに SSH agent forwarding 機能を使うと、秘密鍵をローカル PC に置いたまま、ログイン先のサーバーからさらに別のサーバーにログインすることもできる。

イメージ

ssh-agent

秘密鍵の登録

  1. ローカル PC で ssh-agent を起動する。macOS では自動的に起動するので不要。

    eval `ssh-agent`
    
  2. ローカル 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