Slide 1

Slide 1 text

BackupPC でバックアップを取得した話 鹿児島Linux勉強会 2022.01(オンライン開催) https://kagolug.connpass.com/event/234546/ ブログ記事版 https://blog.yamano.dev/posts/2022/01/backuppc/ Yoshihisa Yamano

Slide 2

Slide 2 text

お前誰? 鹿児島県出身 学生時代にkagolugの第0回より第13回(2016年03月)まで現地参加していた。 現在は東京都在住で、オンライン開催にお邪魔しております。 好きなディストリビューションはArch Linux。 https://www.yamano.dev/ 最近、 Debian への移行が進み、 Arch Linux の環境が無くなりました。

Slide 3

Slide 3 text

Linux Backup

Slide 4

Slide 4 text

Backup tools Standard utils dump, tar, cpio, dd, rsync + ShellScript ... Free utils Amanda, Bacula ... 基本的に単体ではバックアップと呼べない物 (LVM|ZFS|Btrfs) Snapshot, DRBD Replication, Lsyncd ...

Slide 5

Slide 5 text

BackupPC High-performance, enterprise-grade backup https://backuppc.github.io/backuppc/

Slide 6

Slide 6 text

About Linux, macOS, Microsoft Windows をターゲットに取得可能 ファイル単位のバックアップ rsync, NFS, smb 等を用いるので、クライアントはエージェントレス WebUI と ユーザ管理機能が付随 複数ターゲット間での重複排除 世代管理, 圧縮 ...

Slide 7

Slide 7 text

環境(前提) サーバは国内VPSを用い、 100Mbps の IPv4/IPv6 デュアルスタック。 クライアントIPv4は DS-Lite(CGN) 配下にありリーチ不可。 クライアントIPv6は ICMP 及び SSH(公開鍵認証 Ony) が公開されており、グロー バル(VPS)からリーチできる。 WebUI は WireGuard による IPv4 ローカル接続で利用する。 バックアップの為の rsync(ssh) は、グローバルに流す。 共通のドメインを設定している。 $ grep search /etc/resolv.conf search yoshihisa.link

Slide 8

Slide 8 text

サーバ Debian bullseye グローバルホスト名: gsv1.yoshihisa.link ローカルネットワーク向けホスト名: gsv1.wg.yoshihisa.link クライアント Debian sid グローバルホスト名: desktop.yoshihisa.link (AAAA only)

Slide 9

Slide 9 text

どのプロトコルを選ぶか Microsoft Windows でも可能であれば rsync を用いるのが望ましい。 rsync を用いる場合、サーバとクライアントのチェックサムを確認し転送するので、ク ライアントマシンのCPUを多く利用するが、ネットワーク帯域は少く済む。 https://backuppc.github.io/backuppc/BackupPC.html https://github.com/backuppc/cygwin-rsyncd

Slide 10

Slide 10 text

Install backuppc パッケージを導入し、設定された BASIC 認証の仮パスワードを異なるもの に変更しておく。 (gsv1)$ sudo apt install backuppc # - ウェブサーバが問われるので apache2 とする。 # - システムユーザ backuppc が作成されプロセスが動作する。 # - BASIC 認証として backuppc ユーザと仮パスワードが設定されるので、変更する。 (gsv1)$ sudo htpasswd /etc/backuppc/htpasswd backuppc

Slide 11

Slide 11 text

BackupPC config WebUI からも変更可能 (gsv1)$ sudoedit /etc/backuppc/config.pl (gsv1)$ diff -uprN config.pl /etc/backuppc/config.pl --- snip --- -$Conf{RsyncSshArgs} = ['-e', '$sshPath -l root']; +$Conf{RsyncSshArgs} = ['-e', '$sshPath -l backuppc']; --- snip --- -$Conf{Language} = 'en'; +$Conf{Language} = 'ja'; RsyncSshArgs : デフォルトではサーバの backuppc ユーザが ssh -l root client して rsync を実行するので、クライアントにも backuppc ユーザを作成し ておき、これを利用するように変更。 Language : WebUI の表示言語に変更。

Slide 12

Slide 12 text

他の重要なパラメータ CgiAdminUsers / CgiAdminUserGroup : Webサーバの認証ユーザ (REMOTE_USER)のうち、管理ユーザとするユーザ名/グループ名。該当しない一 般ユーザは、自身に関連付けられたクライアントに関する操作のみ可能。 PingMaxMsec : バックアップを開始する前に行われる ICMP 疎通確認で許容する RTT。遠いリージョン間でバックアップを実施する場合や、モバイル回線を用い る場合は変更検討。

Slide 13

Slide 13 text

Apache config デフォルトでは HTTP かつ localhost からのアクセスに限定されているので、 HTTPS に変更し、コメントの記載通りに Require local をコメントアウトしておく。 (gsv1)$ readlink /etc/apache2/conf-available/backuppc.conf /etc/backuppc/apache.conf (gsv1)$ diff -uprN apache.conf /etc/backuppc/apache.conf --- snip --- - #SSLRequireSSL + SSLRequireSSL --- snip --- # Comment out this line once you have setup HTTPS and uncommented SSLRequireSSL - Require local + #Require local # This line ensures that only authenticated users may access your backups Require valid-user

Slide 14

Slide 14 text

HTTPS を有効化する為、 ssl mod と default-ssl site を有効化しておく。 (gsv1)$ sudo a2enmod ssl (gsv1)$ sudo a2ensite default-ssl.conf (gsv1)$ sudo apache2ctl configtest Syntax OK

Slide 15

Slide 15 text

今回、 WebUI は WireGuard によるローカル接続のみ許可するので、ファイアウォー ルを変更。 (gsv1)$ sudoedit /etc/nftables.conf tcp dport https ct state new ip saddr { client_network1/24, client_network2/24 } iif wg0 accept (gsv1)$ sudo nft -f /etc/nftables.conf (gsv1)$ sudo nft list ruleset 設定反映の為、 backuppc と apache を再起動。 (gsv1)$ sudo systemctl restart backuppc apache2

Slide 16

Slide 16 text

ウェブブラウザからアクセス 管理者(backuppc)で BASIC認証 を通過すると、下記のような画面になる。 (今回の例: https://gsv1.wg.yoshihisa.link/backuppc/ )

Slide 17

Slide 17 text

Debian パッケージではデフォルトで localhost クライアントをバックアップする設定 が入っているので、これを削除しておく。

Slide 18

Slide 18 text

設定ファイルをエディタで編集する事でも可能。 (gsv1)$ tail -4 /etc/backuppc/hosts host dhcp user moreUsers # <--- do not edit this line #farside 0 craig jill,jeff # <--- example static IP host entry #larson 1 bill # <--- example DHCP host entry localhost 0 backuppc クライアントと同名のディレクトリが /var/lib/backuppc/pc に存在し、クライアン ト固有のログファイルなどが格納されている。 削除しないでおくと、「削除して良いよ」という通知メールが届く。 (gsv1)$ sudo rm -rf /var/lib/backuppc/pc/localhost

Slide 19

Slide 19 text

ssh 設定 サーバで backuppc ユーザの秘密鍵を生成し、クライアントでのバックアップ専用ユ ーザ作成と公開鍵の設定をしておく。 (gsv1)$ sudo su - backuppc (gsv1)backuppc$ ssh-keygen -t ed25519 (gsv1)backuppc$ vi .ssh/config (gsv1)backuppc$ cat .ssh/config Host desktop Hostname desktop_ipv6

Slide 20

Slide 20 text

クライアント設定 クライアントに backuppc ユーザを作成し、サーバの秘密鍵に対応する公開鍵を設定 しておく。 [yoshihisa@desktop ~]$ sudo useradd -d /var/lib/backuppc -m backuppc [yoshihisa@desktop ~]$ sudo usermod -L backuppc [yoshihisa@desktop ~]$ sudoedit ~backuppc/.ssh/authorized_keys # もしパスワード認証などが許可されているなら (gsv1)backuppc$ ssh-copy-id desktop backuppc ユーザが root 権限で rsync を実行できるようにする。 [yoshihisa@desktop ~]$ sudoedit /etc/sudoers.d/backuppc [yoshihisa@desktop ~]$ sudo cat /etc/sudoers.d/backuppc backuppc ALL=(ALL:ALL) NOPASSWD: /usr/bin/rsync

Slide 21

Slide 21 text

最後に、パスワードレスで ssh が可能か確認しておく。 (gsv1)backuppc$ ssh desktop whoami backuppc 必要に応じて公開鍵に制限を付けておく。 [yoshihisa@desktop ~]$ sudoedit ~backuppc/.ssh/authorized_keys from=”gsv1_ipv6”,no-agent-forwarding,no-port-forwarding,no-X11-forwarding,no-pty ssh-ed25519 AAAA.......

Slide 22

Slide 22 text

クライアント追加 前述の通り、 desktop で名前解決できるので、 host としては desktop を指定。 user: バックアップのコントロールや参照ができる BackupPC ユーザ。 moreUsers: user と異なり、ホストに関するメールが送付されない。

Slide 23

Slide 23 text

ホスト固有の設定はグローバル設定が引き継がれているので、必要部分のみ Overwrite

Slide 24

Slide 24 text

設定した項目 XferMethod : バックアップに使うプロトコル。rsyncを利用するのでrsyncに変 更。 RsyncShareName : バックアップ対象のディレクトリを指定。今回は、 /home/yoshihisa と /etc 。 RsyncClientPath : クライアントの root ユーザでは無く backuppc ユーザを利用 する事としたので、 /usr/bin/rsync から sudo /usr/bin/rsync に変更。 BackupFilesExclude : バックアップから除外する領域を指定。ユーザホームディ レクトリに存在する ~/.cache や ~/Downloads 等のバックアップ不要なディレク トリを指定。

Slide 25

Slide 25 text

ホスト固有の設定は、 /etc/backuppc/hostname.pl として保存される。 $ sudo cat /etc/backuppc/desktop.pl $Conf{BackupPCNightlyPeriod} = 1; $Conf{RsyncShareName} = [ '/home/yoshihisa', '/etc' ]; $Conf{XferMethod} = 'rsync'; $Conf{RsyncClientPath} = 'sudo /usr/bin/rsync'; $Conf{BackupFilesExclude} = { '/home/yoshihisa' => [ '.cache/', '.config/Slack/', '.mozilla/', 'Downloads/', 'snap/', 'qemu/', 'tmp/' ] };

Slide 26

Slide 26 text

バックアップの取得 WebUI からホストを選択すると、該当ホストのフルバックアップや増分バックアッ プ、指定時間のバックアップ停止が行える。

Slide 27

Slide 27 text

デフォルトであれば、 $Conf{WakeupSchedule} に従い毎時(0時を除く)BackupPCが 起動し、前回のバックアップから閾値を越えたホストに対しバックアップが実行され る。 閾値は、フルバックアップとして FullPeriod 、増分バックアップとして IncrPeriod を 用い、デフォルトでは 1週間毎のフルバックアップと、1日毎の増分バックアップ。

Slide 28

Slide 28 text

バックアップからのリストア バックアップからリストアする際は、 WebUI からバックアップ世代を選択し、ファイ ルやディレクトリを選択してリストアできます。

Slide 29

Slide 29 text

指定したディレクトリへリストア zipファイルとしてダウンロード tarアーカイブとしてダウンロード

Slide 30

Slide 30 text

BlackoutPeriods バックアップ取得前にpingによる疎通確認を実施している。 pingが成功している場合に、特定の時間を実行時間から除外する事ができる。 $Conf{BlackoutBadPingLimit} = 3; $Conf{BlackoutGoodCnt} = 7; $Conf{BlackoutPeriods} = [ { hourBegin => 7.0, hourEnd => 19.5, weekDays => [1, 2, 3, 4, 5], }, ];

Slide 31

Slide 31 text

BlackoutGoodCnt ping が成功する場合にブラックアウト状態となり、 BlackoutPeriods で指定した期間内はバックアップが実行されない。 BlackoutBadPingLimit ブラックアウト状態が解除さる ping 失敗回数。 BlackoutGoodCnt と BlackoutBadPingLimit は期間を対等に見れない。 デフォルトでは約24時間毎に、フルバックアップもしくは増分バックアップのどちら かが実行される。 BlackoutGoodCnt = 7 を満たすには1週間必要。 バックアップ対象がダウンしている場合、 WakeupSchedule に従い約1時間毎に再試 行される為、 BlackoutBadPingLimit = 3 は3時間で条件を満たす。 BlackoutPeriods はブラックアウト時間の設定であり、前述の例(デフォルト)だと、 月 曜 - 金曜 の 07:00 - 19:30 はバックアップが実行されない。

Slide 32

Slide 32 text

ルールを変更 $Conf{BlackoutPeriods} = [ { 'hourBegin' => 6, 'hourEnd' => '23.5', 'weekDays' => [ 0, 6 ] }, { 'hourBegin' => 6, 'hourEnd' => '9.5', 'weekDays' => [ 1, 2, 3, 4, 5 ] }, { 'hourBegin' => 18, 'hourEnd' => '23.5', 'weekDays' => [ 1, 2, 3, 4, 5 ] } ];

Slide 33

Slide 33 text

土, 日 は 6:00 - 23:30 はブラックアウト期間 平日 は 6:00 - 09:30 及び 18:00 - 23:30 をブラックアウト期間 とし、プライベート時間ではバックアップが動作しないように変更。

Slide 34

Slide 34 text

触れてみて WebUI から世代を選択して容易にリストアでき、 rsync でエージェントレスなので、 複数のクライアントPCを持つ場合は使いやすい。 しかし、そこまで頻繁にリストアする事も無いので、この規模のソフトウェアを導入 する必要が有るのかも疑問では有る。 複数のサーバを運用している場合などは、導入するのも面白いかもしれない。

Slide 35

Slide 35 text

次回? Duplicity で ファイルサーバの中身をオブジェクトストレージにバックアップした。 https://blog.yamano.dev/posts/2022/01/duplicity/ root@sv4:~# zfs list /data/{document,music,picture} NAME USED AVAIL REFER MOUNTPOINT tank/data/document 327G 7.36T 327G /data/document tank/data/music 148G 7.36T 148G /data/music tank/data/picture 45.9G 7.36T 45.9G /data/picture root@sv4:~#