sshその2(公開鍵認証)

元は暗号化の手法で、公開鍵暗号とは一対の鍵(それぞれを公開鍵、秘密鍵とする)を
  • 公開鍵で暗号化したものは、秘密鍵のみが復号可能
  • 秘密鍵で暗号化したものは、公開鍵のみが復号可能
となるように作る暗号方式のこと。
秘密鍵を当人のみが保持している前提の下で、暗号通信を正しくやりとり出来るかどうかで本人であることの確認手段として使うことも出来るのが公開鍵認証である。

公開鍵認証は人だけでなくマシンの存在証明としても用いられる(ホスト鍵)。sshで最初に接続したときに出てきたメッセージはこれに関連するものである。

パスフレーズは秘密鍵の一部分に相当する。パスフレーズと秘密鍵ファイルを足し合わせて初めて完全な秘密鍵になる。
パスフレーズの変更は完全な秘密鍵の分割の仕方を変えているだけなので、パスフレーズの変更は公開鍵には何も影響しない。

数学的な原理

公開鍵方式の一つであるRSA暗号は非常に大きな数の因数分解を計算機で行うことの困難を安全性の根拠にしている
過去のTA小話http://ks.ms.u-tokyo.ac.jp/ta/2007II/kyn/rsa/rsa.pdfなどを参照のこと

長々と説明したけど、つまるところ…
公開鍵認証とは公開鍵/秘密鍵を使ってパスワードを使わずにログインできるための仕組み

(実習2.1) 公開鍵認証の使用


まず、秘密鍵/公開鍵のペアを作成する

$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/hoge/.ssh/id_rsa): (特に指定がなければそのままEnter)
Enter passphrase (empty for no passphrase): (パスフレーズを設定する。入力しても画面には反映されない)
Enter same passphrase again: (確認のため再度入力する)
e Your identification has been saved in /home/hoge/.ssh/id_rsa.
Your public key has been saved in /home/hoge/.ssh/id_rsa.pub.
The key fingerprint is:
aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa hoge@eduxxb
The key's randomart image is:
+--[ RSA 2048]----+
| o               |
| .+              |
| oo.             |
|oo.              |
|o .     S        |
|E. o =   .       |
|..= * + .        |
| ..*.o +         |
|  .o. o .        |
+-----------------+

これで鍵の作成完了。~/.ssh以下のid_rsaが秘密鍵、id_rsa.pubが公開鍵である。

scpで公開鍵をリモートにコピーする

$ scp .ssh/id_rsa.pub hoge@eduxxa:

公開鍵を所定の場所に配置する。

$ ssh hoge@eduxxa
hoge@eduxxa:~$ mkdir -p .ssh
hoge@eduxxa:~$ cat id_rsa.pub >> .ssh/authorized_keys
hoge@eduxxa:~$ exit

">" でリダイレクトしたりファイルをmvしたりしてももかまわないのだが、.ssh/authorized_keysには複数の公開鍵をおさめておくことができ、
その場合は">>"でファイルに追記していくことになる。

次にsshログインしようとするとパスワードではなくパスフレーズを訊かれるようになる

$ ssh hoge@eduxxa
Enter passphrase for key '/home/hoge/.ssh/id_rsa':

scpでも同様にパスフレーズが訊かれるようになっているはず

$ scp fuga.txt hoge@eduxxa:

(発展課題) ssh-keygen -t dsaとすると、id_rsaの代わりにid_dsaなる公開鍵が作られる。両者の違いは何か?

(実習2.2) 秘密鍵パスフレーズ変更


パスフレーズはパスワード同様に定期的に変更したほうがよい。パスフレーズを変更するには以下のコマンドを実行する。

$ ssh-keygen -p

コマンドを実行し、認証に必要なパスフレーズが変わったことを確認しよう。またそのとき、リモートにある公開鍵には何も変更を加えていないことに注意する。

(実習2.3) 認証エージェントの活用


ssh-agentを用いると一旦入力したパスフレーズの入力を自動化できる。複数のマシンに公開鍵を使ってログインする場合に便利。

$ eval `ssh-agent`
Agent pid xxxxx

`は逆引用符であることに注意。

(発展課題) このような手続きをとる理由は何故か?

エージェントが管理する鍵を管理するにはssh-addコマンドを用いる。デフォルトでは鍵は一切登録されていないので、必ず追加する必要がある。

$ ssh-add

コマンドを入力すると鍵のパスフレーズを訊かれるので正しく入力すること。特に何も指定しなければデフォルトの場所( ~/.ssh/id_rsa )にある鍵を追加する。

以下、ssh-agentが起動している間はsshで公開鍵認証をしようとするとエージェントが代わりに認証してくれ、パスフレーズ入力の必要がなくなる。sshで隣のマシンにログインして確認してみよう。

ssh-agentは通常ログアウトすると終了するが、明示的に終了させたい場合は-kオプションを用いる。

$ ssh-agent -k

なおWindowsにもsshクライアントがあり、有名なところでは
  • Tera Term
  • putty
がある。これらを使っても同様にリモートログインすることが出来る。各自調べてみよう。

またsshサーバを運用することは、ユーザにログインするのと同等の権限を容易に与えることであり、特にインターネット上(数理基幹ネットワークも!)にsshサーバを置くことは非常に危険度の高い行為であることに注意されたい。何らかの事情でsshサーバを管理する(orさせられる)ことになった場合、サーバの設定には厳重な注意を要する。

Comments