普段はパスフレーズ無しの「鍵」を使うので不要なのだが、パスフレーズを設けてもその入力無しで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/」には

  • 秘密鍵 id_rsa
  • 公開鍵 id_rsa.pub

が作られる。
この公開鍵を相手側の「~/.ssh/authorized_keys」に加える
* ssh-agentを使うからとて公開鍵の登録が不要になる訳ではない. 単にパスフレーズの入力の手間を省くのみ

公開鍵の登録

ここではマシンAのユーザが、マシンBのrootにパスフレーズ認証でログインする場合を想定します
2018y02m04d_075237144.png
公開鍵を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」を起動。これは一度起動したらデーモンのように常駐します。
そして環境変数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、鍵による認証で繋がりました。


トップ   編集 添付 複製 名前変更     ヘルプ   最終更新のRSS
Last-modified: 2018-02-04 (日) 10:06:30 (1168d)