Synology NASを用いた3-2-1-1-0バックアップの実現
検証に利用した構成
NAS本体:Synology DS220j
DSM: 7.2.1-69057 Update 4
セットしたHDD:中古で購入した1TB×2(RAID1構成)
ハードウェア:
CPU:Realtek RTD1296 SoC
CPUクロックレート 1.4 GHz
CPUコア数 4
合計物理メモリ: 512MB
目的
3-2-1-1-0バックアップの実現
前提
3-2-1-1-0ルールは、 3-2-1ルールを拡張した、現代において想定されるリスクに備えた基準。
これらルールに従ってバックアップを管理することで、データの保管と復旧をより確実にし、データ損失や情報漏えいのリスクを軽減できます。
諸々まとまってる記事
3-2-1ルールとは?
「3-2-1ルール」は、アメリカの写真家であるピーター・クローグ氏が提唱。
その後、2012年にUS-CERT(United States Computer Emergency Readiness Team)によってバックアップの際に遵守すべきルールとして提示された。
バックアップの最適な実践方法として、
- データは3つの異なるメディアに保持する(3) ※本データ以外に2つのメディアにコピーする
- データをコピーするストレージは、異なる2つ以上の種類である必要がある(2)
- 1つのコピーはオフサイト(自社施設と物理的に距離のある場所に保存する(1)」
3-2-1-1-0 とは?
仮想・物理・クラウドで幅広いプラットフォームのデータ保護製品(バックアップとレプリケーション)を開発するソフトウェアベンダーVeeamで、バノーバー氏が提唱するルール。
上記の3-2-1ルールに加えて、
- コピーの1つはオフラインかイミュータブル(変更できない状態)にする (1)
- 自動復元確認終了後にエラーが出ない(ゼロ)体制にする(0)
不変性の確保→例えばランサムウェアで、バックアップ対象のファイルが暗号化されてしまった場合、バックアップ先のファイルが上書きされてしまうことを防ぐことができる
エラーゼロ→ある日突然リカバリを実行しても、うまく行かない可能性が高いので、普段からのテストやドリル、プロセスの検証、社内あるいは顧客とのコミュニケーション プランも前もって策定しておくことで、リカバリ時のトラブルを防ぐ
3-2-1-1-0 バックアップ実現のための方法
- オフサイトのバックアップ先として、コスト面で優位性があり、データの取得も即時できるBackblazeを採用
▼cloudオブジェクトストレージについて、とてもわかりやすくまとめていただいている記事
Synologyのアプリケーションで用意されている手段
- Hyper Backup
- Cloud sync
の2つが用意されている。
この2つの違いについては、backblazeのyoutubeでわかりやすく説明されている。
今回は、不変性の確保を目的とするため、Hyper Backupで数ヶ月前までの状態を保持できるようHyperBackupを使う。
※youtubeから引用
BackblazeへのHyper Backupのやり方
上記の動画や、こちらを元に実施すれば、簡単に設定できる
その他の設定記事(日本語・こちらの例ではbackup先はローカルを指定)Hyper Backupの問題
バックアップを差分履歴をもって行えることで、クラウド上にイミュータブル(指定世代前までのファイル構成を保存できる)な状態で保存できるので、
コピーの1つはオフラインかイミュータブル(変更できない状態)にする (1)
こちらに対応できた。
では、
自動復元確認終了後にエラーが出ない(ゼロ)体制にする(0)
こちらについてはどうか?
HyperBackupからのリストアは、NAS上のアプリケーション「HyperBackup」でしか行えない。
PCで使えるHyperBackupExplolerというツールもあるのだが
いくつか問題があり、
- 閲覧できる対象は、ローカルにあるバックアップファイルか、Synologyが提供するクラウドc2のどちらかのみで、Backblazeに保存したファイルは確認できない
→したがって、閲覧する場合、全ファイルを一度ローカルに落としてから閲覧する必要があり、トラブル時に1つのファイルを閲覧したい、という場合でも全ファイルのダウンロードを待つ必要がある。
ファイルサイズが大きい場合、数時間の待機が生じる可能性もある
- HyperBackupExplolerはあくまでファイルインデックス情報を元にファイルの構成を閲覧し、ファイルを操作したい場合は1つずつダウンロードする必要があり、ここから全ファイルを復元することはできない
→つまり、データを復旧したければ、Synology NAS上のHyperBackupアプリケーションからでしか実行できない
結論
SynologyのアプリケーションHyperBackupを使って3-2-1-1-0ルールの実現は可能だが、
ベンダーロックインされる
resticを用いた検証
もう少し自由にデータを扱いたいので、バックアップモジュールのresticを使って検証してみる。
公式より
Linux、BSD、Mac、Windowsからバックアップできる、モダンなバックアッププログラム
- セルフホスティングやオンラインサービスを含む、様々なストレージへのbackup
- サーバーや複雑なセットアップなしで実行できる単一の実行ファイル(シンプル構成)
- バックアップしたファイルのうち、変更された差分のみを効率的に転送する
- プロセスのあらゆる部分で暗号を注意深く使用されたセキュアな設計
- 必要なときにファイルを確実に復元できるように、検証可能
- 無料で使用でき、オープンソース
具体的なやり方
resticのforumで、具体的なやり方が質問されていて参考になりました
他の参考記事
resticを使う場合、基本的にコマンドでのスクリプト実行になる。
Synologyのドライブ中、どこにファイルが保存されているのかを把握しなければいけない。
Synologyのコンソールにアクセスできるようにする
telnetかsshを有効にする
共有フォルダの場所は?
記事の通り、ログインしてdf -h
で確認したところ、
やはり /volume1
直下に、作成した共有フォルダ(日本語もそのまま)が展開されていることがわかった。
restic実行の為の準備
ファームウェア更新などの影響がないよう、上記のforumでのやり取りの通り、resticのバイナリを配置するパスなどの事前設定を行う。
事前に必要なディレクトリを作成しておく
パスの<user>部分は任意のユーザー名に
sudo mkdir -p /volume1/homes/<user>/.local/bin
sudo mkdir -p /volume1/homes/<user>/.cache/restic
resticで利用するパスワードをファイルに保管
sudo bash -c 'echo xxxxx > /volume1/homes/<user>/.restic-password.txt'
resticで利用する環境変数を読み込むため、 .bashrcにまとめておく
sudo vi /volume1/homes/<user>/.bashrc
export PATH=$PATH:/volume1/homes/<user>/.local/bin
export RESTIC_CACHE_DIR=/volume1/homes/<user>/.cache/restic
#resitcで利用するパスワード保管ファイルを設定
export RESTIC_PASSWORD_FILE=/volume1/homes/<user>/.restic-password.txt
#backblaseのリポジトリ(s3: の後ろにリポジトリを指定)、keyid, tokenをセット
export RESTIC_REPOSITORY=s3:s3.us-east-xxx.backblazeb2.com/<bucket_name>
export AWS_ACCESS_KEY_ID=xxxxxxxxxxxxxxxxxxxxx
export AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxx
synologyのシステム情報を確認
$ uname -a
xxxxxxxx@DS220j_NAS:/volume1$ uname -a
Linux DS220j_NAS 4.4.302+ #69057 SMP Fri Jan 12 17:01:55 CST 2024 aarch64 GNU/Linux synology_rtd1296_ds220j
CPUはARMの64bitであることが分かったので
該当するresticのモジュールをresticのgithubからダウンロードして、指定の場所にバイナリを展開する。
sudo wget https://github.com/restic/restic/releases/download/v0.16.4/restic_0.16.4_linux_arm64.bz2
sudo bash -c 'bunzip2 -c restic_0.16.4_linux_arm64.bz2 > /volume1/homes/<user>/.local/bin/restic'
タスクスケジューラで実行するスクリプト
#/bin/bash
set -xe
source /volume1/homes/<user>/.bashrc
restic version
#バックアップしたいディレクトリと、除外ディレクトリなどを指定してバックアップ実行
restic backup \
--exclude /volume1/sample_data1/exclude_path \
/volume1/sample_data1 /volume1/sample_data2
restic forget -d 7 -w 4 -m 3 --prune
あとは、スクリプトをSynologyのタスクスケジューラから実行すればOK
タスクスケジューラ→作成→トリガーされたタスク→ユーザー指定のスクリプト
resticのGUI client
Rust+webviewでマルチプラットフォームのアプリが作れるtauriで作られている方がいるので
これを利用すると便利そう
残タスク
- resticバックアップスクリプトに、validation処理を追加
- スクリプト実行・失敗時のメール送信機能を追加
- init用のスクリプトは初回だけ実行して、安全のために削除しておく
- 3-2-1-1-0のゼロを満たす検証方法を考える。例えばディレクトリ構造をスナップショット取って、定期的にresticからrestoreして正しいことを確認するフローを運用に組み込むなど