🛡️

rsyncとSSH鍵認証で実現する、安全で自動化されたサーバーバックアップ

に公開

はじめに

サーバー運用において、バックアップは単なる「推奨事項」ではなく「義務」です。ハードウェアの故障、操作ミス、サイバー攻撃など、データが失われるリスクは常に存在します。

手動でのバックアップは忘れがちで、手間もかかります。理想は、一度設定すればあとは自動で動き続けてくれる、堅牢なバックアップシステムです。

この記事では、自身のWikiメモを元に、 プライマリサーバー(本番機) から セカンダリサーバー(バックアップ機) へ、ファイルとデータベースを安全かつ自動的にバックアップする、古典的でありながら非常に強力な方法を解説します。

全体像

今回構築するシステムの全体像は以下の通りです。

  1. SSH鍵認証を設定し、セカンダリサーバーからプライマリサーバーへパスワードなしで安全に接続できるようにする。
  2. セカンダリサーバーからrsyncコマンドを実行し、プライマリサーバーのファイルを差分同期する。
  3. セカンダリサーバーからmysqldumpコマンドをSSH経由で実行し、プライマリサーバーのデータベースをダンプ、転送、インポートする。
  4. これらの処理をシェルスクリプトにまとめ、cronで定期的に自動実行する。

Step 1: パスワードなしSSH接続の準備

自動化の鍵となるのが、パスワードを使わずにSSH接続を可能にする「公開鍵認証」です。

1. セカンダリサーバーで鍵ペアを生成
バックアップを実行する側(セカンダリ)で、秘密鍵と公開鍵のペアを作成します。

# rootユーザーで実行
ssh-keygen -t rsa
# パスフレーズは空のままEnterを押す

これで、~/.ssh/id_rsa(秘密鍵)と~/.ssh/id_rsa.pub(公開鍵)が生成されます。

2. プライマリサーバーに公開鍵を登録
次に、バックアップされる側(プライマリ)に、バックアップ専用のユーザー(例: support)を作成し、そのユーザーの~/.ssh/authorized_keysファイルに、先ほど生成したセカンダリサーバーの公開鍵 (id_rsa.pub) の中身を追記します。

# プライマリサーバーでの作業
# supportユーザーを作成
adduser support
su -l support

# authorized_keysファイルを作成・編集
mkdir ~/.ssh
chmod 700 ~/.ssh
vi ~/.ssh/authorized_keys # ここに公開鍵をペースト
chmod 600 ~/.ssh/authorized_keys

これで、セカンダリサーバーのrootユーザーは、プライマリサーバーのsupportユーザーとしてパスワードなしでSSHログインできるようになります。

Step 2: ファイルのバックアップ (rsync)

rsyncは、差分だけを効率的に転送できる非常に高機能な同期ツールです。
セカンダリサーバーで、以下のようなシェルスクリプトを作成します。

rsync_backup.sh

#!/bin/sh
PRIMARY_IP="192.168.1.10" # プライマリサーバーのIP
SRC_DIR="/home/webusers/"  # バックアップしたいディレクトリ
DEST_DIR="/backup/webusers/" # 保存先ディレクトリ

/usr/bin/rsync \
  --delete \
  -auvz \
  -e "ssh -i /root/.ssh/id_rsa" \
  support@${PRIMARY_IP}:${SRC_DIR} ${DEST_DIR}
  • --delete: 送信元で削除されたファイルは、バックアップ先でも削除します。
  • -a: パーミッションやタイムスタンプを維持したままコピーします。
  • -u: 送信元より新しいファイルは上書きしません。
  • -v: 詳細な情報を表示します。
  • -z: 転送中にデータを圧縮します。

Step 3: データベースのバックアップ (mysqldump)

データベースは、SSHのポートフォワーディングとパイプを組み合わせることで、ダンプファイルを一度もディスクに書き出すことなく、直接セカンダリサーバーのMySQLに流し込めます。

mysql_backup.sh

#!/bin/sh
PRIMARY_IP="192.168.1.10"
MYSQL_ROOT_PASS="your_pass"

# プライマリでmysqldumpを実行し、その標準出力をgzipで圧縮
# → SSH経由で受信し、zcatで解凍
# → セカンダリのmysqlコマンドに標準入力として流し込む
ssh support@${PRIMARY_IP} "/usr/bin/mysqldump -u root -p${MYSQL_ROOT_PASS} --single-transaction --all-databases | gzip" \
  | zcat \
  | /usr/bin/mysql -u root -p${MYSQL_ROOT_PASS}

この一行は非常に強力で、効率的にデータベースのレプリケーション(に近いこと)を実現します。

Step 4: cronでの自動化

最後に、作成したシェルスクリプトをcronに登録して、定期的に実行されるようにします。

# セカンダリサーバーでcrontabを編集
crontab -e
# 毎日AM 4:05にファイルバックアップを実行
5 4 * * * /root/bin/rsync_backup.sh > /dev/null 2>&1

# 毎日AM 5:05にデータベースバックアップを実行
5 5 * * * /root/bin/mysql_backup.sh > /dev/null 2>&1

おわりに

SSH鍵認証、rsyncmysqldump、そしてcron。これらは一つ一つがLinuxの基本的なツールですが、組み合わせることで、非常に堅牢で信頼性の高い自動バックアップシステムを構築できます。
一度設定してしまえば、あとはシステムが黙々とあなたのデータを守り続けてくれます。ぜひ、あなたの大切なサーバーにも、安心のバックアップ体制を導入してみてください。


この記事で紹介した内容以外にも、技術情報をブログで発信しています。
MEANTECH
https://meantech.fontfontfont.com/

Discussion