Dropbear + 公開鍵認証

# 前書き

sshサーバについて調べていたら、[ArchWikiでDropbearなるツールが紹介されている](https://wiki.archlinuxjp.org/index.php/Secure_Shell#Dropbear)のを見つけました。少しぐぐってみましたが、OpenSSHより軽いという事でラズパイ(Raspberry Pi)にも導入事例がある模様。ArchLinuxにおいてもAURではなく公式リポジトリに置かれているとの事なので、安定性や機能も最低線は担保されていると見てよろしいでしょう…というのはちょっと信頼し過ぎ、かな？ま、気を付けましょう。友を信じよ、信じ過ぎるな。

という訳でArchLinuxにDropbearをインストールして、ssh接続できる環境を作ります。最終的にはパスワードを入力しなくてもつながるようにしたいので、公開鍵認証を試みます。

# Dropbear

[本家サイトはこちら](https://matt.ucc.asn.au/dropbear/dropbear.html)ですが、ほとんど参考になりません。ごく簡単な紹介だけに留まっています。最も参考になったのは、インストール後のmanページでした…(```man dropbear```)。

## インストール

```
# pacman -S dropbear
resolving for conflicting packages...

Packages (1) dropbear-2017.75-1

Total Download Size:   0.14 MiB
Total Installed Size:  0.68 MiB

:: Proceed with installation [Y/n]
```
でyを入力。後は完了まで待つだけです。

そして、他のディストリビューションだと /etc に設定ファイルがあるようですが、ArchLinuxは淡白ですね。何もありません。

```
# ls -a /etc/dropbear
.  ..
```

また、そのせいか、今日（2017/07/02）ぐぐった範囲では、どうもイマイチ参考になるサイトがありません。というわけでmanを参照しながら少し試行錯誤します。その関係で、以下の説明は時々修正する可能性がありますので、そのつもりでお願いします。

ちなみにデフォルト設定のままだとセキュリティ的にかなりマズいです。下記、dropbear.serviceのExecStartで指定されているdropbearオプションを見て下さい。

```
# cat /usr/lib/systemd/system/dropbear.service
[Unit]
Description=Dropbear SSH Daemon
After=network.target

[Service]
Type=simple
ExecStart=/usr/bin/dropbear -F -P /run/dropbear.pid -R

[Install]
WantedBy=multi-user.target
```

とはいえ最初は動作テストという事で、まずはこのまま実行します。

```
# systemctl start dropbear
```

違うマシンからsshで接続してみます。まずはIPアドレスを確認。下記の通り、IPアドレスは10.0.1.120です。

```
# ip -f inet addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
3: nic0: <BROARDCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    inet 10.0.1.120/24 brd 10.0.1.255 scope global dynamic nic0
       valid_lft 69037sec preferred_lft 69037sec
```

サーバマシンの名前も確認。

```
# hostname
taro
```

## パスワード認証による接続

サーバとは異なるマシンから接続します。私の常用マシンはMacなので、以下の手順にて。最初は実験なので、rootでログインします。

```
$ ssh root@10.0.1.120
The authenticity of host '10.0.1.120 (10.0.1.120)' can't be established.
RSA key fingerprint is c9:6b:30:a0:36:76:40:7c:bc:dc:00:2a:f5:12:7f:00.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.0.1.120' (RSA) to the list of known hosts.
root@10.0.1.120's password: 《rootのパスワード》
[root@taro ~]#
```

で、接続テストOK!

## 公開鍵認証による接続・ssh-keygen

秘密鍵と公開鍵の組を生成し、サーバには公開鍵を登録しておきます。鍵生成時にパスフレーズを指定しなければ、パスワード無しでログイン可能になります。

手順としては、[上述](#パスワード認証による接続)の接続テストの直後になります。即ちパスワード認証による接続設定の完了が前提です。またちょっとイタズラして、鍵のビット数を4096ビットよりも少し大きい5120ビットにしてみます。

なお、作業しているクライアントマシン(Mac)の名前はmacclientで、ユーザ名はhanakoです。

```
$ ssh-keygen -b 5120 -N "" -C "root@everywhere" -f ~/.ssh/id_rsa
Generating public/private rsa key pair.
Your identification has been saved in /Users/hanako/.ssh/id_rsa.
Your public key has been saved in /Users/hanako/.ssh/id_rsa.pub.
The key fingerprint is:
2d:ac:dc:e7:e4:ab:77:3b:9b:2b:8a:5c:79:16:ca:1d root@everywhere
The key's randomart image is:
+--[ RSA 5120]----+
|                 |
|                 |
|                 |
|       . .       |
|        S E      |
|     . + = o     |
|      o * *      |
|     . o Bo o.   |
|      o o+++==   |
+-----------------+
$ ssh root@10.0.1.120 "mkdir -v ~/.ssh; cat - >>~/.ssh/authorized_keys" <~/.ssh/id_rsa.pub 
root@10.0.1.120's password: 
mkdir: created directory '/root/.ssh'
```

以上が準備です。これからが接続確認。

```
$ ssh root@10.0.1.120
[root@taro ~]#
```

見事にパスワード無しで接続できました！

## 公開鍵認証による接続・dropbearkey

ssh-keygenによって生成した鍵で成功したからには心配はありませんが、ちょっとしたイタズラをしてみます。dropbearサーバ側でクライアント用の鍵ペアを作って、秘密鍵をクライアントにコピーして使ってみます。

ついでにrootではない一般ユーザを追加して、そのユーザとしてログインを試みます。ユーザ名は、常用マシン（上述のmacclient）のユーザとは異なるjiroにします。作業内容をわかり易くする狙いですが、実運用では同じ名前にするのが一般的でしょう。

```
# useradd -m jiro
# passwd jiro
New password: 《jiroのパスワード》
Retype new password:  《jiroのパスワード》
```

さて本題です。

```
# su jiro
$ mkdir -v ~/.ssh
mkdir: created directory '/home/jiro/.ssh'
$ dropbearkey -t rsa -f ~/.ssh/id_dropbear >~/.ssh/authorized_keys
Generating key, this may take a while...
$ exit
exit
```

ちなみに、dropbearkeyで作れる鍵は4096ビットまでのようです。残念。

```
$ dropbearkey -t rsa -s 5120 -f ~/.ssh/id_dropbear
Exited: Bits must satisfy 512 <= bits <= 4096, and be a multiple of 8
```

常用マシンにて、秘密鍵をOpenSSHフォーマットで受け取ります。

```
$ ssh jiro@10.0.1.120 "dropbearconvert dropbear openssh ~/.ssh/id_dropbear -" >~/.ssh/jiro.key
jiro@10.0.1.120's password: 《jiroのパスワード》
Key is a ssh-rsa key
Wrote key to '-'
```

この鍵でssh接続します。

```
$ ssh -i ~/.ssh/jiro.key jiro@10.0.1.120
[jiro@taro- ~]$
```

dropbearで作成した鍵を使用して、sshコマンドで接続できました！

ちなみにdropbearのクライアントコマンドdbclientを使う場合は下記のようになります。

```
# dbclient -i ~jiro/.ssh/id_dropbear jiro@localhost

Host 'localhost' is not in the trusted hosts file.
(ecdsa-sha2-nistp521 fingerprint md5 ec:db:96:《省略》:5f:c1:d9)
Do you want to continue connecting? (y/n) y
[jiro@taro ~]$
```

初めて接続したlocalhostを信用するかどうか聞かれますが、2回目以降の接続では当然これはありません。一度信用した接続先にはいきなりつながります。この辺の挙動はOpenSSHのsshコマンドと同じです。

```
# dbclient -i ~jiro/.ssh/id_dropbear jiro@localhost
[jiro@taro ~]$
```

# セキュリティ

## 起動オプション

systemdには[ドロップインファイル](https://wiki.archlinuxjp.org/index.php/Systemd#.E3.83.89.E3.83.AD.E3.83.83.E3.83.97.E3.82.A4.E3.83.B3.E3.83.95.E3.82.A1.E3.82.A4.E3.83.AB)なる方法によって差分のみ記述すれば上書き出来るそうですな。その時のエディタはデフォルトではnanoのようですが、[環境変数SYSTEMD_EDITORによって変更可能](https://bbs.archlinux.org/viewtopic.php?id=197575)らしい。

という訳で、一般的なsshdの防犯設定の常識に従って、以下の条件を追加しておきます。

* rootの直接ログイン禁止（rootユーザに絞り込んだ攻撃への対策）
* パスワードログイン禁止（ブルートフォースアタック対策）
* ポート番号の変更（攻撃の前提となるポートを絞らせない） →今回はポート番号10000にしておきます。可能ならば乱数で決めるのが一番安全です。

dropbearサーバで下記のように修正します。

```
# export SYSTEMD_EDITOR=vi
# systemctl edit dropbear
# cat /etc/systemd/system/dropbear.service.d/override.conf
[Service]
ExecStart=
ExecStart=/usr/bin/dropbear -Fgswp 10000
```

## 関連ファイルのパーミッション

```
# chmod -R go-rwx ~/.ssh
# ls -ld ~/.ssh{,/*}
drwx------ 1 root root  52 Jul  4 23:48 /root/.ssh
-rw------- 1 root root 909 Jul  3 23:55 authorized_keys
-rw------- 1 root root 263 Jul  4 23:49 known_hosts
# chmod -R go-rwx /home/*/.ssh
# ls -ld /home/*/.ssh{,/*}
drwx------ 1 jiro jiro  52 Jul  4 23:58 /home/jiro/.ssh
-rw------- 1 jiro jiro 480 Jul  4 23:58 /home/jiro/.ssh/authorized_keys
-rw------- 1 jiro jiro 804 Jul  4 23:58 /home/jiro/.ssh/id_dropbear
```

## 再起動

```
# systemctl restart dropbear
```

# 後書き

ArchLinuxにDropbearサーバを立てて、クライアントとしてはsshコマンドとdbclientコマンド（Dropbearのクライアントコマンド）の両方で接続できました。いずれでも公開鍵認証できる事も確認しました。

これでsshサーバが少し軽くなります。やったね！:thumbsup: