バックアップの動作確認と自動監視スクリプトの導入

グラフ RockyLinux運用メモ

本記事は筆者の指示・構成に基づき、AI(ChatGPT)によって生成されています。
内容は筆者が確認・修正を行っていますが、AI生成であることを理解した上でご利用ください。

はじめに(この記事の目的)

本記事では、筆者がLinuxサーバーを運用・学習する中で確認・検証・記録した内容を整理します。
同じ作業を行う方が再現できるよう、背景・目的・手順・注意点を丁寧に解説します。
筆者の学習記録であると同時に、実用的なガイドとして活用できる構成です。

この記事の対象

  • Linuxや他のディストリビューションを自己管理している方
  • コマンドや設定の目的を理解しながら安全に操作したい方
  • 実践的な例と検証手順を知りたい方

作業環境

  • OS:Linux系OS(x86_64)
  • 接続方法:SSH(公開鍵認証)
  • ユーザー:一般ユーザー(sudo権限あり)

この記事の目的と概要

本記事ではバックアップ確認(漏洩防止版):手動&自動(スクリプト込み・設定手順つき)に関する設定・確認・操作方法を解説します。
以下の流れで進めます。

  • 作業前の確認と前提整理
  • ステップごとの具体的手順
  • コマンドとその解説
  • 作業前後の比較
  • 安全策と復旧方法

実施手順(ステップ解説)

ステップ1:作業前の状態確認(手動確認の短縮リファレンス)

# 1) 最新バックアップのログ(目的:直近の成否とエラー行の有無を確認)
#    基本構文:tail -n 行数 ファイル
#    主なオプション:-n(行数指定)
sudo tail -n 30 /var/log/secure/backup_job.log

# 2) 生成物の有無・日付(目的:.gpg と SHA256SUMS が同日に作成されているか確認)
#    基本構文:ls -lh ディレクトリ | tail
#    主なオプション:-l(詳細表示), -h(人に読みやすい単位)
sudo ls -lh /secure/backups/daily | tail

# 3) 整合性(SHA256)(目的:暗号化ファイルの破損有無を検証)
#    基本構文:sha256sum -c チェックサムファイル
#    主なオプション:-c(検証モード)
LATEST_SUM=$(ls -1t /secure/backups/daily/SHA256SUMS_*.txt | head -n1)
sudo sha256sum -c "$LATEST_SUM" | head

# 4) 復号テスト(DBの先頭だけ)(目的:実際に復元可能かを確認)
#    基本構文:gpg --decrypt 入力.gpg | head
#    主なオプション:--batch, --yes(非対話), --passphrase-file(パスフレーズ指定)
sudo gpg --batch --yes --decrypt \
  --passphrase-file /secure/keys/backup_passphrase \
  "$(ls -1t /secure/backups/daily/appdb_*.sql.gpg | head -n1)" | head

# 5) クラウド突き合わせ(目的:ローカルとクラウドの差分有無を確認)
#    基本構文:rclone check ローカル パス リモート:パス
#    主なオプション:--quiet(静かな出力)
sudo rclone check /secure/backups/daily remote:BackupVault

本項では、バックアップの成否と健全性を手動で点検します。
ログで直近の実行結果を確認し、ローカルの成果物が日付整合しているかを見ます。
SHA256で整合性を検証し、GnuPG(暗号化・復号のツール)で復号テストを行います。
最後にrclone(クラウドストレージ連携ツール)でクラウドとの同期を確認します。

出力例:
... Backup OK at 2025-08-10_190254
archive_2025-08-10_190254.tar.gz.gpg
SHA256SUMS_2025-08-10_190254.txt
archive_2025-08-10_190254.tar.gz.gpg: OK
-- MariaDB dump 10.19  Distrib 10.5.27-MariaDB
NOTICE: remote 'BackupVault': 0 differences found

ステップ2:自動確認スクリプトの導入(スクリプト配置・設定・cron登録)

# 役割:最新バックアップ有無、鮮度判定、SHA256整合性、復号テスト、クラウド同期待ち合わせを一括実行し、結果をログへ追記します。
# 期待実行タイミング:毎日 深夜帯(例:バックアップ後の30〜90分後)

# 1) スクリプト設置
sudo tee /usr/local/bin/backup_check.sh >/dev/null <<'SH'
#!/usr/bin/env bash
# /usr/local/bin/backup_check.sh
set -Eeuo pipefail

# ===== 設定(必要に応じて編集) =====
BK_DIR="/secure/backups/daily"
RCLONE_REMOTE="remote:BackupVault"
PASSPHRASE_FILE="/secure/keys/backup_passphrase"
LOG="/var/log/secure/backup_check.log"
FRESH_MINUTES=1440             # 24時間以内かの閾値
DB_PREFIX="appdb_"             # 復号テスト対象のDBダンプ接頭辞
REQUIRE_DRIVE_CHECK=true       # rclone check を必須とするか
# ==================================

exec 9>/var/lock/backup_check.lock
flock -n 9 || { echo "[$(date '+%F %T')] SKIP: already running" >> "$LOG"; exit 0; }

ts() { date '+%F %T'; }
ok() { echo "✅ $*"; }
warn(){ echo "⚠️  $*"; }
err(){ echo "❌ $*"; }

{
  echo "[$(ts)] ===== Backup Check Start ====="

  # 前提ファイル・コマンド確認
  [[ -d "$BK_DIR" ]] || { err "BK_DIR not found: $BK_DIR"; exit 1; }
  command -v gpg     >/dev/null || { err "gpg not found"; exit 1; }
  command -v rclone  >/dev/null || { err "rclone not found"; exit 1; }
  [[ -f "$PASSPHRASE_FILE" ]] || { err "Passphrase file not found: $PASSPHRASE_FILE"; exit 1; }

  # 最新成果物の存在確認
  LATEST_FILE="$(ls -1t "$BK_DIR"/*.gpg 2>/dev/null | head -n1 || true)"
  if [[ -z "${LATEST_FILE:-}" ]]; then
    err "バックアップファイル(*.gpg)が見つかりません"
    exit 1
  fi
  echo "最新バックアップ: $LATEST_FILE"
  echo "更新日時: $(stat -c '%y' "$LATEST_FILE" 2>/dev/null || stat -f '%Sm' -t '%F %T' "$LATEST_FILE")"

  # 鮮度(例:24時間以内)確認
  if find "$LATEST_FILE" -mmin -${FRESH_MINUTES} | grep -q .; then
    ok "24時間以内に作成されています"
  else
    warn "最終更新が${FRESH_MINUTES}分以上前です"
  fi

  # SHA256 整合性チェック
  LATEST_SUM="$(ls -1t "$BK_DIR"/SHA256SUMS_*.txt | head -n1 || true)"
  if [[ -z "${LATEST_SUM:-}" ]]; then
    err "SHA256SUMS_*.txt が見つかりません"
  elif sha256sum -c "$LATEST_SUM" --quiet; then
    ok "整合性チェックOK(sha256sum)"
  else
    err "整合性チェックNG(sha256sum)"
  fi

  # 復号テスト(DBダンプの先頭だけ確認)
  DB_SAMPLE="$(ls -1t "$BK_DIR"/${DB_PREFIX}*.sql.gpg 2>/dev/null | head -n1 || true)"
  if [[ -z "${DB_SAMPLE:-}" ]]; then
    warn "復号テスト用のDBダンプが見つかりません(prefix=${DB_PREFIX})"
  else
    if gpg --batch --yes --decrypt \
          --passphrase-file "$PASSPHRASE_FILE" \
          "$DB_SAMPLE" 2>/dev/null | head -n1 | grep -q "MariaDB dump"; then
      ok "復号テストOK(DBヘッダを確認)"
    else
      err "復号テストNG(DBヘッダを確認できず)"
    fi
  fi

  # クラウド側との突き合わせ
  if [[ "$REQUIRE_DRIVE_CHECK" == "true" ]]; then
    if rclone check "$BK_DIR" "$RCLONE_REMOTE" --quiet; then
      ok "クラウド同期OK(差分なし)"
    else
      err "クラウド同期NG(差分あり or エラー)"
    fi
  else
    warn "クラウドチェックはスキップ設定(REQUIRE_DRIVE_CHECK=false)"
  fi

  echo "[$(ts)] ===== Backup Check End ====="
} >> "$LOG" 2>&1
SH

# 2) 実行権限とログファイル
sudo chmod 700 /usr/local/bin/backup_check.sh
sudo mkdir -p /var/log/secure
sudo touch /var/log/secure/backup_check.log
sudo chmod 600 /var/log/secure/backup_check.log

# 3) cron登録:毎日 深夜帯(例:02:30)に実行
#    基本構文:(既存crontabを出力し、新規エントリを付与して再設定)
( sudo crontab -l; echo '30 2 * * * /usr/local/bin/backup_check.sh' ) | sudo crontab -

# 4) 初回動作確認(目的:手動で実行して動作とログを確認)
sudo /usr/local/bin/backup_check.sh
sudo tail -n 50 /var/log/secure/backup_check.log

本項では、自動確認スクリプトを導入します。
スクリプトは最新成果物の存在、作成時刻の鮮度、SHA256整合性、復号テスト、rcloneによるクラウドとの一致を検証し、ログに追記します。
cronで毎日深夜帯に実行し、バックアップ後の健全性を自動点検します。

出力例:
[2025-08-11 02:30:00] ===== Backup Check Start =====
最新バックアップ: /secure/backups/daily/archive_2025-08-10_190254.tar.gz.gpg
更新日時: 2025-08-10 19:03:10
✅ 24時間以内に作成されています
✅ 整合性チェックOK(sha256sum)
✅ 復号テストOK(DBヘッダを確認)
✅ クラウド同期OK(差分なし)
[2025-08-11 02:30:01] ===== Backup Check End =====

ステップ3:作業後の状態確認(自動確認ログの見方)

# 直近の結果を確認(目的:最新の判定状況を素早く確認)
# 基本構文:tail -n 行数 ファイル
sudo tail -n 30 /var/log/secure/backup_check.log

# エラー・警告のみ抽出(目的:異常検知の効率化)
# 基本構文:grep "パターン" ファイル
sudo grep "ERROR\|❌\|⚠️" /var/log/secure/backup_check.log

# 実行ブロック単位で確認(目的:1回分の開始〜終了をまとめて読む)
# 基本構文:awk '/開始/,/終了/' ファイル
sudo awk '/===== Backup Check Start =====/,/===== Backup Check End =====/' /var/log/secure/backup_check.log

本項では、自動確認スクリプトの実行結果を効率よく読み取る方法を示します。
直近の結果、エラー・警告の抽出、1回分の実行ブロックの確認により、異常の早期発見と原因切り分けを実施します。

出力例:
✅ 24時間以内に作成されています
✅ 整合性チェックOK(sha256sum)
✅ 復号テストOK(DBヘッダを確認)
✅ クラウド同期OK(差分なし)

作業前後の比較

項目作業前作業後
バックアップ確認の方法手動で都度ログ・成果物を確認自動スクリプトで毎日検証し、必要に応じて手動確認
整合性検証手動でsha256sumを実行自動でSHA256検証を実行しログ化
復号テスト手動でgpgを実行自動でDBヘッダまで検証しログ化
クラウド突き合わせ手動でrclone check自動でrclone checkを実行しログ化
多重起動対策未実施flockで多重起動を防止

使用したコマンド一覧と解説

コマンド目的解説
tailログ確認基本構文:tail -n 行数 ファイル
末尾の出力を素早く確認します。
ls成果物一覧基本構文:ls -lh パス
-lで詳細、-hで人に読みやすい単位を表示します。
sha256sum整合性検証基本構文:sha256sum -c SHA256SUMS.txt
ファイルの破損有無を検証します。
gpg復号テスト基本構文:gpg --batch --yes --decrypt 入力.gpg
パスフレーズファイルで非対話復号します。
rcloneクラウド照合基本構文:rclone check ローカル リモート:
差分なしを確認します。
crontab定期実行基本構文:(crontab -l; echo "時刻 コマンド") | crontab -
日次実行を設定します。
awkログ抽出基本構文:awk '/開始/,/終了/' ファイル
ブロック単位に抽出します。
grepエラー抽出基本構文:grep "パターン" ファイル
エラー・警告のみ抽出します。
flock多重起動防止基本構文:flock -n FD
同時実行を避けます。
find鮮度判定基本構文:find ファイル -mmin -分
指定分以内の更新かを確認します。
stat更新時刻取得基本構文:stat -c '%y' ファイル
詳細な時刻情報を取得します。

安全策と復旧方法

  • パスフレーズファイルは/secure/keys/backup_passphraseに保存し、権限600で管理します。
    改行混入を避けるためecho -nで作成します。
  • バックアップ後の復旧確認は月1回以上、DBの復号テストを実施します。
    クラウドとの整合性はrclone checkで確認します。

注意点・落とし穴

  • 最終更新が24時間以上前の場合は、バックアップ側のcron設定とジョブログ(例:/var/log/secure/backup_job.log)を確認します。
  • 整合性NGはディスク・転送エラーの可能性があるため、その世代を保全し再取得します。
  • 復号テストNGはパスフレーズの改行混入や権限不備の可能性があるため、echo -nで再作成し、権限600を確認します。
  • クラウドの同期NGはネットワークやトークン期限切れの可能性があるため、rclone configを再点検します。

まとめ

本記事ではバックアップ確認(漏洩防止版):手動&自動(スクリプト込み・設定手順つき)を解説しました。
作業前後での比較と安全策を意識することで、トラブルを未然に防げます。
読者のLinux運用の一助になれば幸いです。

実践課題

  1. 手動確認を月1回実施し、復号テストの結果を記録します。
  2. 自動確認スクリプトのログを毎朝確認し、エラー時のみメールやSlack通知を受け取る運用に整えます。

関連記事

参考リンク