Raspbian Jessie Lite の SSH/公開鍵認証 設定

Raspbian Jessie Lite に SSH 公開鍵認証 の 設定を行います.

作業環境

  • Windows 7
  • Raspbian Jessie Lite

使用するアルゴリズムの選択

なるべく強度が高く安全なものを使いたいので、今回は Ed25519、エドワーズ曲線デジタル署名アルゴリズム を 使うことにします.

アルゴリズムや強度については、こちらの記事を参考にさせて頂きました. RSA で 鍵長を増やすことばかり考えていましたが、勉強になりました. ありがとうございます.

キー・ペア の 生成

ssh-keygen を 使い、キー・ペアを生成します. ed25519 は 鍵長 が 256 bit 固定とのことなので、-t ed25519 のみの指定となります.
ファイルの場所は特に問題ないのでデフォルトのままにしました. パスフレーズは設定したほうが安全です. 秘密鍵のファイルをとられてしまうと、守るものがなくなり素通しとなってしまいます.
ssh-keygen は Microsoft が 開発している Win32-OpenSSH を 使いました. (2017年3月13日 追記)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
c:\> ssh-keygen -t ed25519 -C ""
Generating public/private ed25519 key pair.
Enter file in which to save the key (C:\Users\[username]/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in C:\Users\[username]/.ssh/id_ed25519.
Your public key has been saved in C:\Users\[username]/.ssh/id_ed25519.pub.
The key fingerprint is:
SHA256:T69X1O58qiKv7Sp/aPJTI+PpzUdOZDO+EcD5ldc8ON8
The key's randomart image is:
+--[ED25519 256]--+
| . . .o.|
| + oo.+|
| o .ooo|
| B ..E|
| S .+ = . |
| ooo.= . .|
| . *.=.+ o |
| o B+o.= +|
| B*OB+...XX|
+----[SHA256]-----+

公開鍵 を Raspberry Pi へ 送る

生成したキーペアで認証ができるように公開鍵を Raspberry Pi へ 送ります.
ssh-copy-id コマンド が あると、簡単に転送できるのですが Windows 7 および Microsoft の Win32-OpenSSH では ssh-copy-id が ないので、scp で 転送してから、SSH 接続して鍵登録をします.

1
2
3
c:\> scp %USERPROFILE%\.ssh\id_ed25519.pub pi@raspberrypi.local:~
pi@raspberrypi.local's password: [PASSWORD]
id_ed25519.pub 100% 83 0.1KB/s 00:00

SSH で Raspberry Pi で接続し、公開鍵の設定をします.

1
2
3
4
5
pi@raspberrypi:~ $ mkdir ~/.ssh
pi@raspberrypi:~ $ chmod 700 ~/.ssh
pi@raspberrypi:~ $ cat ~/id_ed25519.pub >> ~/.ssh/authorized_keys
pi@raspberrypi:~ $ chmod 600 ~/.ssh/authorized_keys
pi@raspberrypi:~ $ rm -f ~/id_ed25519.pub

Raspberry Pi の SSH サーバ 設定

公開鍵で認証できるようになったので、パスワード認証を止めます.
合わせて root ユーザ の ログインも禁止します. (パスワードも公開鍵もないのでログインのしようもないのですが明示的に止めておきます)
以下に設定部分を抜粋します.

1
2
3
4
5
6
7
pi@raspberrypi:~ $ sudo nano /etc/ssh/sshd_config
# Authentication:
PermitRootLogin no
RSAAuthentication no
# Change to no to disable tunnelled clear text passwords
PasswordAuthentication no

設定後 SSH サーバ を 再起動します. 再起動する前に公開鍵認証でログインできていることを再度確認しておきます. パスワード認証が行えなくなるため、公開鍵認証で入れないと SSH で ログインできなくなります.

1
pi@raspberrypi:~ $ sudo systemctl reload ssh

pi ユーザ の パスワード削除

ついでに pi ユーザ の パスワードを削除します. これにより、Raspberry Pi へのアクセスは SSH からの 公開鍵認証 に しぼることができます. (ネットワーク障害などで完全に入れなくなることもありますが、その際には諦めるということで…)
とはいえ シングル・ユーザ・モード や 本体ごと or SD カード を 持っていかれれば簡単に入られてしまいますが、デフォルトで誰でも知っているパスワードを持っている必要もないので消しておきます.

1
2
3
4
5
6
7
pi@raspberrypi:~ $ sudo cat /etc/shadow | grep pi
pi:$7$anh205TS$KBB826BAAEqF/kSsT71NkzkaBAjh8bbKrnn6b4oikeABwQTPHHoGRnaXXX.KX9MEn1eDm9XMSurRWiqg1pVXXX/:17067:0:99999:7:::
pi@raspberrypi:~ $ sudo passwd -d pi
pi@raspberrypi:~ $ sudo cat /etc/shadow | grep pi
pi::17067:0:99999:7:::


これで、だいリモートアクセスを保護できるようになりました. ラズパイ自体が小さく(特に Zero)、また IoT デバイス のように使ったりするつもりなので シングルモード や SD カードが心配なので、追々調べていきます.