俺様サーバー構築記 - Arch Linux に Dropbear をインストール@デスクトップパソコン＆ノートパソコン

# 能書き

私の自宅環境で、サーバもクライアントも、マシンが一通り揃ってきました。[俺様サーバー構築記 - 基本方針](https://qiita.com/katz_engineer/items/dbabcff4e14e9db2b10f)でやりたい事として挙げた事を手掛ける段階に、いよいよなってきました。

そして早速、最初の「FreeNASとはiSCSIではなくてNFSでストレージを共有」でつまづきました…:sob:

NFSの最新プロトコル NFSv4 を使うには Kerberos を立てなければならないとの事。 Kerberos サーバ自体は FreeNAS が持っているようなので、これを利用すれば良いのかも知れませんが。その前に Kerberos 認証とは何か？という所から勉強しなければなりません。

NFSv3 でも良いんですが、そうするとユーザIDがマシン間で一致していないとまずそうです。

色々面倒臭え…:persevere: Kerberos はひとまず諦めました。

その代わり、やりたい事の一つ「データの自動バックアップシステムの確立」を前倒して手掛けます。サーバマシンのデータを FreeNAS にバックアップします。と言っても rsync では面白くありません。折角 ZFS にしているので、ここは ZFS データ送受信を試みます。

そして ZFS データの通信路には ssh を使う訳ですが、ssh については [dropbear というコマンドを以前使ってみた](https://qiita.com/katz_engineer/items/8a3e6d8ab6814a7b2693)ので、これを採用します。折角なのでノートパソコンにも dropbear を入れて、サーバに dropbear でログインできるようにします。

参考文献: [Dropbear + 公開鍵認証](https://qiita.com/katz_engineer/items/8a3e6d8ab6814a7b2693)

今回は dropbear の設定まで。ZFS データ転送は次回にします。

# dropbear・デスクトップパソコン（サーバ側）

## インストールと起動

例によってスナップショットを撮っておいて、それからインストールします。

```console:サーバ側
# zfs snapshot tank/main@$(date +%Y%m%d_%H%M%S)_before_dropbear
# pacman -S dropbear
```

相変わらず、デフォルトの設定ファイル ```/etc/dropbear``` は無いようです。

```console:サーバ側
# ls -a /etc/dropbear
.  ..
```

そしてデフォルト設定ではセキュリティがガタガタなのも相変わらずのようです。

```console:サーバ側
# 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
```

systemd ドロップインファイルを利用して設定を変更します。一般的なsshdの防犯設定の常識に従って、以下の条件を追加しておきます。

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

ポート番号に関しては色々意見があるようですし、技術面に限ってみても付けていいポート番号の範囲があるようですので、調べて調整しましょう。

参考文献: [2.3.2 ドロップインファイル - 2.3 ユニットファイルの編集 - 2 ユニットファイル - systemd - ArchWiki](https://wiki.archlinux.jp/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)

```console:サーバ側
# export SYSTEMD_EDITOR=vi
# systemctl edit dropbear
  〈vi が起動するので、下記の通りに編集〉
# cat /etc/systemd/system/dropbear.service.d/override.conf
[Service]
ExecStart=
ExecStart=/usr/bin/dropbear -RFgswp 60022
```

そして起動。このまま起動しっぱなしにするよう設定します。

```console:サーバ側
# systemctl enable dropbear
Created symlink /etc/systemd/system/multi-user.target.wants/dropbear.service -> /usr/lib/systemd/system/dropbear.service.
# systemctl start dropbear
# systemctl status dropbear
* dropbear.service - Dropbear SSH Server
   Loaded: loaded (/usr/lib/systemd/system/dropbear.service; enabled; vendor preset: disabled)
  Drop-In: /etc/systemd/system/dropbear.service.d
           `-override.conf
   Active: active (running) since Mon 2019-05-06 11:29:34 JST; 10s ago
 Main PID: 1288 (dropbear)
    Tasks: 1 (limit: 4915)
   Memory: 400.0K
   CGroup: /system.slice/dropbear.service
           `-1288 /usr/bin/dropbear -RFgswp 60022

May 06 11:29:34 〈マシン名〉 systemd[1]: Started Dropbear SSH Server.
May 06 11:29:34 〈マシン名〉 dropbear[1288]: Not backgrounding
```

## 一般ユーザ作成

ログインする為の一般ユーザを作成します。

```console:サーバ側
# useradd -m taro
# passwd taro
New password: 〈taro のパスワード〉
Retype new password: 〈確認の為 taro のパスワードをもう一度〉
passwd: password updated successfully
```

なお、鍵はクライアント側で作成してからコピーします。詳細は後程。

# dropbear・ノートパソコン（クライアント側）

## インストール

こちらもスナップショットを撮ってからインストールします。

```console:クライアント側
$ su
パスワード:
# zfs snapshot tank/main@$(date +%Y%m%d_%H%M%S)_before_dropbear
# pacman -S dropbear
  〈省略〉
# exit
exit
```

## 秘密鍵と公開鍵を生成

（2019/05/12 修正ここから）

```dropbearkey``` コマンドを使用して秘密鍵と公開鍵を作成します。暗号強度の観点から、楕円曲線暗号 ecdsa を使用します。2007年における推奨（予想）では、2019年は 224 ビットの鍵長で十分と考えられていたようです。しかし ```dropbearkey``` コマンドでは 224 ビットを指定できません。今回は 256 ビットにしました。

参考文献: [図2 暗号の安全性指標 - 暗号の安全性評価 - NICT NEWS](https://www.nict.go.jp/publication/NICT-News/1303/01.html)

（2019/07/17 修正ここから）

また、```dropbearkey``` コマンドは標準出力に公開鍵を出力しますが、余計な行もくっつけてくれます。 ```authorized_keys``` ファイルには公開鍵の行だけを書き込むようにします。

```console:クライアント側
$ mkdir ~/.ssh
$ cd ~/.ssh
$ dropbearkey -t ecdsa -s 256 -f id_dropbear | tail -n+2 | head -n1 >authorized_keys
Generating 256 bit ecdsa key, this may take a while...
```
（2019/07/17 修正ここまで）
（2019/05/12 修正ここまで）

## 公開鍵をサーバにコピー

公開鍵 ```authorized_keys``` をサーバにコピーする方法ですが。サーバもクライアントも手元にあるのでUSBメモリでも使ってパパッと持ち運べば十分なのですが、今回は一捻りしてみます。

クライアント側にインストールした dropbear にはサーバも含まれているので、これをパスワードOKのオプションで起動し、サーバ側からパスワード認証で接続します。コピーが完了したら dropbear を終了させます。

```console:クライアント側
$ su
パスワード:
# systemctl start dropbear
```

IPアドレスは ```hostname -i``` で取得できるようです。これは便利！っていうか、 ```hostname``` なんて基本中の基本のコマンドなんだから知っとけよって話ですね… スミマセン。

```console:クライアント側
# hostname -i
10.0.0.246
```

ここからはデスクトップパソコン（サーバ側）の操作です。

（2019/05/06 修正ここから）
```dbclient``` の標準出力をリダイレクトして ```.ssh/authorized_keys``` に追記しようとすると、なぜか上書きになってしまいます。原因不明。仕方が無いので一捻りしています。

```console:サーバ側
# su - taro
$ mkdir .ssh
$ dbclient 10.0.0.246 "cat .ssh/authorized_keys" | cat >>.ssh/authorized_keys

Host '10.0.0.246' is not in the trusted hosts file.
(ecdsa-sha2-nistp256 fingerprint sha1!! 00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff:01:23:45:67)
Do you want to continue connecting? (y/n)
taro@10.0.0.246's password: 〈taro のパスワード〉
$ ls -l .ssh
total 3
-rw-r--r-- 1 taro taro 840 May  6 14:46 authorized_keys
-rw-r--r-- 1 taro taro 840 May  6 14:46 known_hosts
$ rm .ssh/known_hosts
$ exit
exit
# hostname -i
10.0.0.251
```
（2019/05/06 修正ここまで）

```.ssh/known_hosts``` は削除しておきます。一応。

これで公開鍵をサーバへコピーできたので、クライアントから接続して動作確認。

```console:クライアント側
# exit
exit
$ dbclient -p 60022 10.0.0.251 "hostname"

Host '10.0.0.251' is not in the trusted hosts file.
(ecdsa-sha2-nistp256 fingerprint sha1!! 00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff:01:23:45:78)
Do you want to continue connecting? (y/n) y
〈サーバのマシン名〉
```

## dropbear サーバを止める

```console:クライアント側
$ su
パスワード:
# systemctl stop dropbear
```

そしてうっかり起動しないようにしておきましょう。

```console:クライアント側
# export SYSTEMD_EDITOR=vi
# systemctl edit dropbear
  〈vi が起動するので、下記の通りに編集〉
# cat /etc/systemd/system/dropbear.service.d/override.conf
[Service]
ExecStart=
# systemctl start dropbear
Failed to start dropbear.service: Unit dropbear.service has a bad unit file setting.
See system logs and 'systemctl status dropbear.service' for details.
# exit
exit
```

これでOKでしょう！やったね！:thumbsup_tone2: