俺様サーバー構築記 - Arch Linux から FreeNAS への ssh 接続@デスクトップパソコン

[俺様サーバー構築記 - 基本方針](https://qiita.com/katz_engineer/items/dbabcff4e14e9db2b10f)で書いたやりたい事の内「データの自動バックアップシステムの確立」に着手し、ZFS データ送受信の機能を使って FreeNAS にバックアップする方針にしたのは[前回](https://qiita.com/katz_engineer/items/f40e84cb8696c00651b8)書いた通りです。

[前回](https://qiita.com/katz_engineer/items/f40e84cb8696c00651b8)は ssh 互換ソフトの dropbear を使えるように整備しました。

今回はデスクトップパソコン（我が家のサーバ）から FreeNAS へ dropbear で接続できるようにします。

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

以下、デスクトップパソコン（我が家のサーバ）のマシン名を server0 とします。

```console:デスクトップパソコン（サーバ側）
# hostname
server0
```

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

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

```console
# whoami
root
# mkdir -p ~/.ssh
# cd ~/.ssh
# dropbearkey -t ecdsa -s 256 -f id_dropbear >authorized_keys
Generating 256 bit ecdsa key, this may take a while...
# cat authorized_keys
Public key portion is:
ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBLuuIEvB1ZufKyyHUDqrYiieeXyyfX7fsw6kI1Dflpvmj/2CqpwPcNLTHtxrwtYDQXae3HvCepykAu9WQz5gM3c= root@anju
Fingerprint: sha1!! 00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff:01:23:45:fd
```

# FreeNAS 設定

## ssh

FreeNAS の Web インターフェイスを操作して、下記のように設定します。SSH の TCP ポート番号はデフォルトの 22 ではない方が良いと言われています。悪人にとってわかりにくい番号にしましょう。

0. メニュー>サービス>SSH を選択
0. SSHの設定:
 - TCP ポート番号: 60022
 - パスワード認証の許可: OFF （セキュリティを考慮するとやっぱりOFFの方が良いでしょう）
 - TCPポートフォワーディングの許可: OFF （これもセキュリティ的にOFFの方が…）
0. SSH サービスを ON

## グループ作成

複数のマシンをバックアップする為に、マシン毎にユーザを作成する事にします。そのユーザ群の為のグループを下記の条件で作成します。

- グループ名: bak_zfs
- sudoを許可: ON
- グループIDの繰り返しを許可: OFF

```zfs``` のスナップショット作成その他のコマンドは root 権限が無いと実行できません。その為 bak_zfs グループは ```sudo``` コマンドを使用できるように設定します。

```sudo``` 実行の際のパスワード要求は抑制しておきます、自動化する際の問題になってしまうので。その代わり ```zfs``` コマンドしか実行できないように制限します。

念の為 ```zfs``` コマンドのフルパスを確認。

```console:FreeNAS
# which zfs
/sbin/zfs
```

FreeNAS の Web インターフェースでシェルを起動して、 sudoers ファイルを編集する為に ```visudo``` コマンドを実行。

```console:FreeNAS
# visudo
```

```%bak_zfs ALL=(ALL) ALL``` と書かれている行がありますので、これを下記のように書き換えて保存終了します。

```%bak_zfs ALL= NOPASSWD: /sbin/zfs```

これらの一連の操作を一行野郎 one liner にまとめて自動化したくて調べたんですが、その為には sudoers ファイルを直接操作するしか無さそうです… 可能ではありますが、まあ、行儀は悪いですね。vi マクロを作成する手もありますけど、そこまでする事は無いかなと。そんな訳で今回は素直に手作業しました。

## ユーザ作成

バックアップ用のユーザを下記の条件で作成。

- ユーザ名: bak_server0
- ユーザーのプライマリーグループを作成: OFF
- プライマリグループ: bak_zfs
- Create Home Directory In: /mnt/tank/home/bak_server0 （```/mnt/tank``` の下のどこかにします）
- シェル: bash （何でも良い筈です）
- フルネーム: user to backup server0
- メール: （空欄）
- パスワード: （空欄）
- パスワードでのログインを無効にする: OFF
- Microsoft Account: OFF
- SSH公開鍵: （上述の、デスクトップパソコン server0 の root ユーザの ~/.ssh/authorized_keys から、ssh-rsa の行を行頭から行末までコピペ）
- 補助グループ: （空欄）

これで、ユーザ bak_server0 として FreeNAS に ssh 接続可能になります。

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

まずは接続テストから。FreeNAS マシンのIPアドレスが 10.0.0.108 の場合:

```console:デスクトップパソコン（サーバ側）
# hostname
server0
# whoami
root
# dbclient -l bak_server0 -p 60022 10.0.0.108 "whoami"

Host '10.0.0.108' 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:b7)
Do you want to continue connecting? (y/n) y
bak_server0
```

```sudo``` コマンドの制限を確認します（```zfs``` コマンド以外はエラー）

```console:デスクトップパソコン（サーバ側）
# dbclient -l bak_server0 -p 60022 10.0.0.108 "sudo whoami"

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

sudo: no tty present and no askpass program specified
# dbclient -l bak_server0 -p 60022 10.0.0.108 "sudo zfs list" | head -n1
NAME                                                    USED  AVAIL  REFER  MOUNTPOINT
```

最後の ```sudo zfs list``` 実行結果にフィルタ処理をして最初の行だけ取り出したのは、チェックを自動化する為の布石です。

```console:デスクトップパソコン（サーバ側）
# dbclient -l bak_server0 -p 60022 10.0.0.108 "sudo zfs list" | head -n1 | diff -bs <(echo "NAME USED AVAIL REFER MOUNTPOINT") - --label sudo_zfs_list
Files sudo_zfs_list and - are identical
```

という訳で、うまくいったようです。
やったね :thumbsup_tone2: