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


俺様サーバー構築記 - 基本方針で書いたやりたい事の内「データの自動バックアップシステムの確立」に着手し、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 ではない方が良いと言われています。悪人にとってわかりにくい番号にしましょう。

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

グループ作成

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

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

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

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

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

FreeNAS
# which zfs
/sbin/zfs

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

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 の場合:

デスクトップパソコン(サーバ側)
# 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

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