読者です 読者をやめる 読者になる 読者になる

Raspberry PiをSSH公開鍵認証方式にしてみた

f:id:sunrise683:20150104100939j:plain
photo credit: ghalfacree via photopin cc

raspberrypiでsshの公開鍵認証方式を設定しました。SSH2では暗号化方式として、DSAとRSAが利用可能のようですが、RSAの方が強度が高いため、今回はこちらを使って設定をしたいと思います(この部分はもう少し掘り下げて勉強する必要があるかもしれません。今回はRSAが主流ということで割り切り、こちらを使いたいと思います)。

公開鍵認証を利用するためには、設定したいサーバ上に秘密鍵(id_rsa公開鍵(id_rsa.pub)を作成します。この2つのファイルは秘密鍵とそれに対する公開鍵(あるいは、公開鍵とそれに対する秘密鍵)で、「キーペア」と呼ばれます。秘密鍵と公開鍵には一般的に以下の特性があるそうです。

* 秘密鍵で暗号化したデータは公開鍵でしか復号できない
* 公開鍵で暗号したデータは秘密鍵でしか復号できない

SSHで公開鍵認証を行った場合、秘密鍵はクライアント側、公開鍵がサーバ側に配置されます。そして、クライアントから公開鍵認証によるSSH接続を受けた場合、サーバとクライアント間で以下のやりとりが行われます。

1. サーバ側で適当なデータを公開鍵で暗号化
2. 暗号化されたデータをクライアントへ送信
3. データを秘密鍵で復号化
4. 復号化したデータをサーバへ送信
5. 受け取ったデータと元のデータを比較

元々の公開鍵認証方式では公開鍵は、文字通り公開されているのでしょうけれども、SSHサーバの公開鍵認証方式では公開されているわけではなく、あくまでキーペア(公開鍵と秘密鍵)を使っているということ、でしょうか。

pi@raspberrypi ~/.ssh $ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/pi/.ssh/id_rsa):
/home/pi/.ssh/id_rsa already exists.
Overwrite (y/n)? y
Enter passphrase (empty for no passphrase):
Enter same passphrase again:....

pi@raspberrypi ~/.ssh $ pwd
/home/pi/.ssh
pi@raspberrypi ~/.ssh $ ls -l
total 12
-rw------- 1 pi pi 1679 Jan  3 12:02 id_rsa
-rw-r--r-- 1 pi pi  396 Jan  3 12:02 id_rsa.pub
-rw-r--r-- 1 pi pi 1432 Dec 28 22:02 known_hosts

無事に秘密鍵と公開鍵を作成することが出来ました。次に公開鍵を有効化するよう配置する必要があります。ファイルの権限(パミッション)も600に変更する必要があります。

pi@raspberrypi ~/.ssh $ mv ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys
pi@raspberrypi ~/.ssh $ chmod 600 ~/.ssh/authorized_keys

キーペア(秘密鍵と公開鍵)の作成と実装が完了したので、次にSSHに対して「秘密鍵を使用するよ」という設定をします。秘密鍵の設定オプションは「sshd_config」内の「PubkeyAuthentication 」なので、現在の設定を確認します。

pi@raspberrypi ~/.ssh $ cat /etc/ssh/sshd_config | grep Pubkey
PubkeyAuthentication yes

デフォルトの状態で公開鍵認証となっているようなので、このままにします。もし「PubkeyAuthentication no」となっている場合には、設定を書き換えてSSHを再起動する必要があります。

サーバ側の設定が終わったので、今度はクライアントから公開鍵認証によりSSH接続してみたいと思います。クライアントにSSH秘密鍵(id_rsa)をコピーして、接続時にそれを設定します。

クライアントがWindowsの場合にはwinscpによりファイルをコピーし、teraterm, puttyといったSSHクライアントソフトで指定すればO.K.です。また、異なるLinuxの場合にも秘密鍵をコピーして、sshコマンドのiオプションでそのファイルを指定することで可能です。ただ毎回iオプションを設定するのは面倒なので、ssh_configを利用して管理していこうと思います。私の環境(CentOS 6.6 64bit)ssh_configファイルは/etc/ssh下に入っていましたが、~/.ssh/configは存在しなかったので、コピーしました。

[root@rishiridake ~]# cp -p /etc/ssh/ssh_config ~/.ssh/config
[root@rishiridake ~]# cd .ssh
[root@rishiridake .ssh]# ls
config  ida_rsa.raspi  known_hosts

コピーしたconfigファイルを編集し、ホスト名ごとに秘密鍵を指定しておきます。

[root@rishiridake ~]# cd ~/.ssh
[root@rishiridake .ssh]# vi config
Host raspi
    HostName        raspi
    IdentityFile    ~/.ssh/id_rsa.raspi
    User            pi

では、実際に公開鍵認証を使ってCentOSからRaspberryPiにアクセスしてみたいと思います。

[root@rishiridake .ssh]# cd
[root@rishiridake ~]# ssh raspi
Linux raspberrypi 3.12.28+ #709 PREEMPT Mon Sep 8 15:28:00 BST 2014 armv6l

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sat Jan  3 13:21:38 2015 from rishiridake

外部接続できるSSHサーバを絞っておいて、そこから各サーバに接続できるよう上記の設定を行えば、簡単にSSH接続することが出来ます。