池の上にも

平均以下の理解力で、色々アウトプットしてみるブログ

自分のSSH 使い方変遷

自分がこれまでに辿った、SSHの使い方を整理してみる。

SSH 原始時代

愚直にパスワードを入力してログインしてた頃。-lでユーザを指定するより、@で指定するのが覚えやすかったため、@を使用する派。

$ ssh <user>@<remote-host>
Password: 

<remote-host> $ 

SSH 石器時代

前時代の方法だと、ログインするたびにパスワードを入力しないといけなくて、それだと手間なので、公開鍵認証を覚えた。

公開鍵認証では、公開鍵をリモートホストに事前に登録しておけば、以降はローカルホストの秘密鍵を指定して接続すればパスワードなしでログインできる。自分としては、公開鍵というより公開錠前と考えたほうがイメージし易かった。公開錠前を接続したいホストにコピーして配布して、秘密鍵で公開錠前を開けるイメージ。

http://blakesmith.me/images/public_private_many.png *1

ssh-keygenコマンドで作成される~/.ssh/id_rsa秘密鍵、~/.ssh/id_rsa.pubが公開鍵。パスフレーズの入力が求められるが、これは秘密鍵を使うためのもので、リモートとのやり取りには関与しないらしい。zipにかけるパスワードのようなものなので、なくても良いはず。

$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 

公開鍵のリモートホストへの登録は、公開鍵(~/.ssh/id_rsa.pub)の内容を、リモートホストの~/.ssh/authorized_keysに追記することで実施する。~/.ssh/authorized_keysがない時は、新規作成して、パーミッションを600に設定する。このあたりの処理はssh-copy-idを使うと、リモートホストのauthorized_keysへの書き込みを自動で実施してくれる。

$ ssh-copy-id <user>@<remote-host>
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/<user>/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
<user>@<remote-host>'s password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh '<user>@<remote-host>'"
and check to make sure that only the key(s) you wanted were added.

SSH 青銅器時代

前時代の方法だと、ログインするときに秘密鍵を指定しないといけない。それに、ユーザ名とリモートホストを入力するのも面倒になってきた。

$ ssh -i ~/.ssh/id_rsa <user>@<remote-host>

それだと手間なので、~/.ssh/configに設定を書くことを覚えた。

Host remote-host
  HostName <remote-host>
  IdentityFile ~/.ssh/id_rsa
  User <user>

これでタイプする量が減って、かなり楽になった。

$ ssh remote-host

SSH 鉄器時代

秘密鍵に設定できるパスフレーズもあったほうが良い気がしてきた。かと言って、接続のたびにパスフレーズを打つ気にはならない。

なので、ssh-agentを使うことを覚えた。

ssh-agentを起動して、ssh-agentに秘密鍵を渡しておくと、以降の秘密鍵を使用する際にパスフレーズを入れる必要がなくなる。

まずは、ssh-agentを起動する。

$ eval `ssh-agent`

ssh-agentに秘密鍵を追加、それと秘密鍵を持っているかを確認する。

$ ssh-add ~/.ssh/id_rsa
Enter passphrase for /home/<user>/.ssh/id_rsa: 
Identity added: /home/<user>/.ssh/id_rsa (/home/<user>/.ssh/id_rsa)
$ ssh-add -l
2048 SHA256:f4l2f1eJfZnICjvpEfmV3KsiE2Xat7eYn3leJOnLGv1 /home/<user>/.ssh/id_rsa (RSA)

さらにssh-agentが強力なのが、リモートホスト秘密鍵を持ってきてくれる機能。ssh-agentが秘密鍵を持ってきてくれるので、踏み台サーバの先にいる目的のリモートホストに公開鍵を登録しておけば、パスワードなしでログインできる。

ssh利用時に-Aオプションを付けると、ssh-agentがリモートホスト秘密鍵を持ってきてくれる。なお、-Aオプションを入れるのが億劫な場合は、.ssh/configにForwardAgent yesを追加しておくと良い。

$ ssh -A remote-host
remote-host$ ssh-add -l
2048 SHA256:f4l2f1eJfZnICjvpEfmV3KsiE2Xat7eYn3leJOnLGv1 /home/<user>/.ssh/id_rsa (RSA)

ssh-agent起動は、.bashrcに書いておいて自動実行すると良いらしい。なお、ssh-agentは、OS起動時に既に起動している場合があるので、その場合ssh-agentの起動は実行不要。

# start SSH agent
ssh-add -l &>/dev/null
if [ "$?" == 1 ]; then
  test -r ~/.ssh-agent && \
    eval "$(<~/.ssh-agent)" >/dev/null

  ssh-add -l &>/dev/null
  if [ "$?" == 1 ]; then
    (umask 066; ssh-agent > ~/.ssh-agent)
    eval "$(<~/.ssh-agent)" >/dev/null
  fi
fi

あと、以下のaliasを書いておけば、初回のssh実行時にのみssh-addを実行できるので便利。

# add ssh-add to SSH command
alias ssh='ssh-add -l &>/dev/null || ssh-add && unalias ssh; ssh'

おわりに

SSHについては、まだまだ知らないだけで進化の余地ありそう。暇があれば調査してみたいと思う。