OpenSSHを使ってrsaでログイン認証の設定

OpenSSHで公開鍵暗号を使ってのログイン認証について軽く調べた。

まず作業の中で登場するものとして、

  1. id_rsa (秘密鍵)
  2. id_rsa.pub (公開鍵)
  3. authorized_keys

の3つがあります。

公開鍵暗号方式についてはこのページがわかりやすいのですが。

公開鍵によって暗号化された情報は、秘密鍵を持つ人にしか解読することができません。なので情報を知りたいAさんは、自分のローカルに秘密鍵と公開鍵を用意し、情報を送るBさんに公開鍵を配ります。BさんはAさんの公開鍵を使って情報を暗号化、送信します。Aさんは自分の秘密鍵を使って情報を解読することができます。

これを認証に利用したのが公開鍵暗号方式の認証です。この方法でBさんから何らかの情報を送りつけて、中身を見る事ができたらAさんだと確認することができます。情報を受けたAさんは、「これで合ってますよね?」とBさんに中身を送り返すことで、Bさんは相手が間違いなくAさんだとわかります。

ログイン認証の場合では、Aさんがクライアント側、Bさんがリモートサーバになります。クライアント側でしなくてはいけないのが、秘密鍵と公開鍵の準備、リモートサーバへ公開鍵を配ることです。一方、リモートサーバではクライアントを確かめるために公開鍵を保存しておかなくてはいけません。そこで公開鍵を保存する場所として出てくるのが、authorized_keysファイルです。

では順番にやってみます。ここはローカルマシンでの作業です。

$ cd .ssh     //.sshディレクトリが無い場合は作ってください
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/username/.ssh/id_rsa):    //無指定でデフォルト名のid_rsaを生成
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/username/.ssh/id_rsa.
Your public key has been saved in /home/username/.ssh/id_rsa.pub.
The key fingerprint is:
...

これで、ローカルに秘密鍵と公開鍵が生成されました。*1 *2
公開鍵の中身をリモートサーバのauthorized_keysに保存します 。

$ scp id_rsa.pub username@xxx.xxx.xxx.xxx:~/.ssh/

リモートにログイン。

$ cd .ssh
$ cat id_rsa.pub >> authorized_keys

ここまでで、秘密鍵、公開鍵、authorized_keysの準備はできました。
これで、リモートサーバ側のsshdを再起動します。

$ /etc/init.d/sshd restart

これで設定は終わりなので、クライアント側に戻ってログインを試してみます。*3

$ ssh username@xxx.xxx.xxx.xxx
Enter passphrase for key '/Users/username/.ssh/id_rsa': 
Last login: Sun Jul  3 01:10:03 2011 from xxx.xxx.xxx.xxx
$

ログインできました。以上で、rsaによるログイン認証は完了です。

*1:OpenSSHでは、ログインの際に.ssh配下のデフォルト名の鍵を読みにいくようです。

*2:-tオプションで暗号化の形式を選択できます。rsaはSSHv2のrsa方式、dsaはSSHv2のdsa方式、rsa1はSSHv1のrsa方式。

*3:場合によっては、"Permission denied (publickey,gssapi-with-mic)."と言われることがある。その場合は、リモート側の.sshディレクトリ、authorized_keysファイルのパーミッションを見直す。[http://d.hatena.ne.jp/h-yano/20080225/1203952174:title=参考]