俺様サーバー構築記 - 基本方針で書いたやりたい事の内「データの自動バックアップシステムの確立」に着手し、ZFS データ送受信の機能を使って FreeNAS にバックアップする方針にしたのは前回書いた通りです。
前回は ssh 互換ソフトの dropbear を使えるように整備しました。
今回はデスクトップパソコン(我が家のサーバ)から FreeNAS へ dropbear で接続できるようにします。
デスクトップパソコン(サーバ側)
以下、デスクトップパソコン(我が家のサーバ)のマシン名を server0 とします。
# hostname
server0
root ユーザで秘密鍵と公開鍵を作成します。暗号強度の観点から、楕円曲線暗号 ecdsa を使用します。2007年における推奨(予想)では、2019年は 224 ビットの鍵長で十分と考えられていたようです。しかし dropbearkey
コマンドでは 224 ビットを指定できません。今回は 256 ビットにしました。
参考文献: 図2 暗号の安全性指標 - 暗号の安全性評価 - NICT NEWS
# 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 ではない方が良いと言われています。悪人にとってわかりにくい番号にしましょう。
- メニュー>サービス>SSH を選択
- SSHの設定:
- TCP ポート番号: 60022
- パスワード認証の許可: OFF (セキュリティを考慮するとやっぱりOFFの方が良いでしょう)
- TCPポートフォワーディングの許可: OFF (これもセキュリティ的にOFFの方が…)
- SSH サービスを ON
グループ作成
複数のマシンをバックアップする為に、マシン毎にユーザを作成する事にします。そのユーザ群の為のグループを下記の条件で作成します。
- グループ名: bak_zfs
- sudoを許可: ON
- グループIDの繰り返しを許可: OFF
zfs
のスナップショット作成その他のコマンドは root 権限が無いと実行できません。その為 bak_zfs グループは sudo
コマンドを使用できるように設定します。
sudo
実行の際のパスワード要求は抑制しておきます、自動化する際の問題になってしまうので。その代わり zfs
コマンドしか実行できないように制限します。
念の為 zfs
コマンドのフルパスを確認。
# which zfs
/sbin/zfs
FreeNAS の Web インターフェースでシェルを起動して、 sudoers ファイルを編集する為に visudo
コマンドを実行。
# 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 の場合:
# 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
コマンド以外はエラー)
# 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
実行結果にフィルタ処理をして最初の行だけ取り出したのは、チェックを自動化する為の布石です。
# 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
という訳で、うまくいったようです。
やったね