普段はパスフレーズ無しの「鍵」を使うので不要なのだが、パスフレーズを設けてもその入力無しでsshらを行いたい。
そんなのをサポートするのがこの「ssh-agent」
まずはssh-keygenで鍵を作ります。
[illya@c ~]$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/illya/.ssh/id_rsa):
Created directory '/home/illya/.ssh'.
Enter passphrase (empty for no passphrase): <<--- ここにパスフレーズを入力
Enter same passphrase again:
Your identification has been saved in /home/illya/.ssh/id_rsa.
Your public key has been saved in /home/illya/.ssh/id_rsa.pub.
The key fingerprint is:
df:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:51 illya@c.sybyl.local
The key's randomart image is:
+--[ RSA 2048]----+
| ooE |
:
:
| . +.. |
+-----------------+
[illya@c ~]$
[illya@c ~]$ ls -l .ssh/
合計 8
-rw------- 1 illya fate 1766 2月 4 07:37 id_rsa
-rw-r--r-- 1 illya fate 401 2月 4 07:37 id_rsa.pub
[illya@c ~]$
これで「~/.ssh/」には
が作られる。
この公開鍵を相手側の「~/.ssh/authorized_keys」に加える
* ssh-agentを使うからとて公開鍵の登録が不要になる訳ではない. 単にパスフレーズの入力の手間を省くのみ
ここではマシンAのユーザが、マシンBのrootにパスフレーズ認証でログインする場合を想定します
公開鍵をUSBメモリにコピーさせ、相手方のマシンのrootの「/root/.ssh/authorized_keys」に内容をコピーします
単にコピペでも可
[root@2nd ~]# cat /media/usb0/id_rsa.pub >> /root/.ssh/authorized_keys
* .sshは「700」、authorized_keysは「600」であるとこ
っで、まずはパスフレーズで接続してみます
[illya@c ~]$ ssh -l root 2nd
Enter passphrase for key '/home/illya/.ssh/id_rsa': <<--- ここにパスフレーズを入力
Last login: Sun Feb 4 09:30:25 2018 from c.sybyl.local
[root@2nd ~]#
次にssh-agentによる接続を試みる
「ssh-agent」は秘密鍵とそのパスフレーズを保持して、相手方の要望に自動的に応じてくれるもの。
こちら側でいちいちパスフレーズを入力する手間を省いてくれる
まずは「ssh-agent」を起動。これは一度起動したらデーモンのように常駐します。
そして環境変数SSH_AGENT_PIDとSSH_AUTH_SOCKが定義されます。
[illya@c ~]$ eval `ssh-agent`
Agent pid 31485
[illya@c ~]$ ps -ef |grep ssh-agent
illya 31485 1 0 09:43 ? 00:00:00 ssh-agent
[illya@c ~]$ echo $SSH_AGENT_PID
31651
[illya@c ~]$ echo $SSH_AUTH_SOCK
/tmp/ssh-5ZBOnDa6Q6ry/agent.31636
[illya@c ~]$
一旦ログアウトしても起動しっぱなしなのですが、再度ログインしても環境変数SSH_AGENT_PIDとSSH_AUTH_SOCKは引き継がれません。
なので、ログアウト時にはこの「ssh-agent」を停止させるようにします。
bashなら「.bash_logout」を下記のようにします
[illya@c ~]$ vi .bash_logout
# ~/.bash_logout
ssh-agent -k
[illya@c ~]$
これでログアウトすると同時に「ssh-agent」も停止してくれます。
[root@c ~]# su - illya
最終ログイン: 2018/02/04 (日) 09:52:48 JST日時 pts/2
[illya@c ~]$
[illya@c ~]$ eval `ssh-agent`
Agent pid 31935
[illya@c ~]$
[illya@c ~]$ exit
ログアウト
unset SSH_AUTH_SOCK;
unset SSH_AGENT_PID;
echo Agent pid 31935 killed;
[root@c ~]#
次に、ssh-agentが稼働している状態で秘密鍵とそのパスフレーズを記録させます。
まずは、起動直後は鍵を持っていないのであるが、その確認
[illya@c ~]$ eval `ssh-agent`
Agent pid 32032
[illya@c ~]$ ssh-add -l
The agent has no identities.
[illya@c ~]$
「ssh-add -l」で鍵を保持しているかを確認する。当然ながらこの段階では「The agent has no identities.」と鍵はまだ持っていない。
次に、鍵を登録してみる
[illya@c ~]$ ssh-add
Enter passphrase for /home/illya/.ssh/id_rsa:
Identity added: /home/illya/.ssh/id_rsa (/home/illya/.ssh/id_rsa)
[illya@c ~]$
[illya@c ~]$ ssh-add -l
2048 df:9e:ad:58:9c:d8:03:a8:90:bd:0c:4a:f0:b5:51:51 /home/illya/.ssh/id_rsa (RSA)
[illya@c ~]$
「ssh-add」で鍵を登録するが、既定では「$HOME/.ssh/id_rsa」が読み込まれ、そのパスフレーズを要求されます。
*別の鍵(2nd-root)を指定したい場合は「ssh-add .ssh/2nd-root」と秘密鍵をパス指定します。
そして相手方にアクセスしてみます。
[illya@c ~]$ ssh -l root 2nd
Last login: Sun Feb 4 09:31:59 2018 from c.sybyl.local
[root@2nd ~]#
とパスワード無しで、「ssh-agent」の中継で行けました。
一応、HostbasedAuthenticationでもGSSAPIAuthenticationでもPasswordAuthenticationでもないとするために
下記コマンドでも確認してみた。
[illya@c ~]$ ssh -o HostbasedAuthentication=no \
> -o GSSAPIAuthentication=no \
> -o PasswordAuthentication=no \
> -o PubkeyAuthentication=yes -l root 2nd
Last login: Sun Feb 4 10:03:49 2018 from c.sybyl.local
[root@2nd ~]#
確かにPubkeyAuthentication、鍵による認証で繋がりました。