FreeNAS (現 TrueNAS )では設定ファイルをWebGUIからダウンロードしたり、アップロード復元したり出来ますが、もしもの時に備え、定期的にこの設定ファイルをバックアップする仕組みを組んでみました。
設定ファイルは、FreeNAS WebGUIのSystem → General 頁の一番下にあるSAVE CONFIGボタン押し下げで、保存することが出来ます(2つのチェックボックスはデフォルトで外れているので、共にチェック入れてからSAVEする)。
ダウンロードしたtarの中身はこのようになっています。
1 2 3 |
$ tar -tvf ./nas30-FreeNAS-11.3-U1-20201221143928.tar -rw-r----- root/operator 454656 2020-12-21 14:34 freenas-v1.db -rw------- root/www 32 2016-01-28 23:48 pwenc_secret |
障害発生等でまっさらな状態から組み直す際には、システムの初期状態からIPアドレスだけ先に付与し、WebGUIからこの設定ファイルをアップロードすることで、設定を元通り復元することが出来るというわけです。そんな大切な設定ファイルの自動バックアップを次の要件でセットアップします。
近年ではランサムウェアによる被害も増えていることから、その格好の攻撃先になりやすいsmb共有フォルダへの保存を避け、scpでの転送を前提にしています。尚、執筆時のFreeNASバージョンは11.3U1です。
FreeNAS側のsshキーペアを生成
バックアップした設定ファイルを同じサブネット内の別のNASへscpにて転送するわけですが、自動化ではその際にsshの鍵認証が必要になります。WebGUIにそれらしき項目があるので試してみたのですが、どうもこれはFreeNASシステム同士のレプリケーション等、限定的な用途やFreeNASへのアクセスに関する項目のようで、今回の目的にはそぐわないようです。
詳しくはとても綺麗に整えられた公式ドキュメントが用意されているのでそちらへどうぞ。
仕方無いので通常通り、コンソールから手動で鍵ペアを生成します。
1 2 3 4 5 |
# ssh-keygen -t rsa -b 4096 # ls -la .ssh -rw------- 1 root wheel 3243 Dec 22 08:56 id_rsa -rw-r--r-- 1 root wheel 742 Dec 22 08:56 id_rsa.pub -rw-r--r-- 1 root wheel 266 Dec 21 15:26 known_hosts |
生成された鍵ペアのうち、公開鍵(id_rsa.pub)を接続先である別のNASへSCPを使って転送します(転送先では便宜上、id_rsa.pub.nas30とリネームしています)。
1 |
# scp .ssh/id_rsa.pub root@192.168.2.31:~/.ssh/id_rsa.pub.nas30 |
設定保存先のNASへ公開鍵を登録
FreeNASよりSCPで転送されたPublic Key公開鍵(id_rsa.pub.nas30)をAlt-Fが稼働するD-Link DNS-323 2Bay NASのsshdのauthorized_keysファイルに追加します(特にGUIは用意されていないのでsshコンソールにて)。但し、Alt-Fではこうしたシステム領域のファイルは、システム起動毎にその都度生成されるので、先ず、
1 |
/root/.ssh/authorized_keys |
に公開鍵を追記して疎通確認をして問題無くアクセス出来ることを確認の上、起動時のユーザスクリプトに指定されているHDDストレージ領域の保存先にも忘れずに追加して、再起動して公開鍵が消えてしまうのを防ぎます。
1 |
/mnt/md0/config/Alt-F/authorized_keys |
FreeNAS設定バックアップスクリプト
同じBSD系のpfSense同様、FreeNASは設定ファイルを常に決められた場所(/data)に保持しているので、バックアップはそのファイルを保存すれば良いだけです。当該フォルダには次のようなファイルが収められています。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
root@nas30 # ls -la /data drwxrwxr-x 2 root www 2 Jun 22 2020 crash -rw-r--r-- 1 root www 424 Jun 22 2020 dhparam.pem -rw-r----- 1 www www 1060864 Jun 22 2020 factory-v1.db -rw-r----- 1 root operator 454656 Dec 21 14:34 freenas-v1.db -rw-r----- 1 root www 1060864 Jun 22 2020 freenas-v1.db.bak -rw-r--r-- 1 root www 1389 Jun 22 2020 manifest -rw-r--r-- 1 root www 5 Dec 21 14:00 mfi.pkl drwxr-xr-x 2 root www 3 Jun 22 2020 pkgdb -rw------- 1 root www 32 Jan 28 2016 pwenc_secret -rw------- 1 root www 32 Jun 22 2020 pwenc_secret.bak drwxr-xr-x 2 root www 3 Jul 2 08:44 sentinels drwxr-xr-x 2 root www 4 Nov 13 08:24 zfs |
ここから、次の2つのファイルをバックアップ対象として選択します。
- freenas-v1.db : 設定データベース
- pwenc_secret : パスワードシークレット
これらをtarで固めるわけですが、FreeNASではバージョンが異なる設定は復元適用出来ないことが多いことから、WebGUIにより生成されるバックアップファイルの例に習い、そのファイル名にバージョン番号を付与しておくことにします。
以上より今回組んだ設定バックアップスクリプトは次のようになります。
1 2 3 4 5 6 7 8 9 10 11 |
#!/bin/bash # # BACKUP FREENAS CONFIG DB WITH HASH SEC srcPath="/data" dstPath="/mnt/md0/config/nas30/" dstSSH="root@192.168.2.31" declare -a arrSrc=("freenas-v1.db" "pwenc_secret") tarName=`uname -n | awk -F'.' '{print $1}'`"-"`cat /etc/version | awk '{print $1}'`"-"`date "+%Y%m%d%H%M%S"`".tar" tar -cvf - -C $srcPath ${arrSrc[@]} | ssh $dstSSH "cat - > $dstPath$tarName" |
FreeNASのタスクへジョブ登録
FreeNASのWebGUI上で、設定バックアップスクリプトを定期実行するcronジョブを登録します。Tasks → Cron Jobs 頁にて、右上のADDボタン押下で新規ジョブを作成します。
SAVE CRON JOBで保存しジョブ一覧に戻り、作成したジョブが正しく登録されていることを確認します。
試しにこのジョブをRUN NOWしてみましょう。期待通りに設定ファイルが保存されていました。
1 2 3 4 5 6 7 8 9 |
# ls -l /mnt/md0/config/nas30 -rw-r--r-- 1 root root 460800 Jun 17 2020 nas30-FreeNAS-11.3-U1-20200617093505.tar -rw-r--r-- 1 root root 460800 Jun 19 2020 nas30-FreeNAS-11.3-U1-20200619021701.tar -rw-r--r-- 1 root root 460800 Jun 20 2020 nas30-FreeNAS-11.3-U1-20200620021701.tar -rw-r--r-- 1 root root 460800 Dec 22 10:51 nas30-FreeNAS-11.3-U1-20201222105116.tar # tar -tvf /mnt/md0/config/nas30/nas30-FreeNAS-11.3-U1-20201222105116.tar -rw-r----- 0/5 457728 2020-12-22 10:28:57 freenas-v1.db -rw------- 0/80 32 2016-01-28 23:48:45 pwenc_secret |
このままではNASの容量の許す限り設定ファイルは増え続けるので、以前紹介した世代管理する仕組みをNAS上で定期的に走らせて、保持する世代数を制限する必要があるでしょう。