本記事は筆者の指示・構成に基づき、AI(ChatGPT)によって生成されています。
内容は筆者が確認・修正を行っていますが、AI生成であることを理解した上でご利用ください。
はじめに(この記事の目的)
本記事では、筆者がLinux系サーバーを運用・学習する中で確認・検証・記録した内容を整理します。
同じ作業を行う方が再現できるよう、背景・目的・手順・注意点を丁寧に解説します。
筆者の学習記録であると同時に、実用的なガイドとして活用できる構成です。
この記事の対象
- Linux系OSでサーバーを自己管理している方
- コマンドや設定の目的を理解しながら安全に操作したい方
- 実践的な例と検証手順を知りたい方
作業環境
- OS:Linux系OS(x86_64 相当)
- 接続方法:SSH(公開鍵認証)
- ユーザー:一般ユーザー(sudo権限あり)
この記事の目的と概要
本記事ではバックアップ確認の安全運用(暗号化+クラウド保存)と日次検証に関する設定・確認・操作方法を解説します。
以下の流れで進めます。
- 作業前の確認と前提整理
- ステップごとの具体的手順
- コマンドとその解説
- 作業前後の比較
- 安全策と復旧方法
実施手順(ステップ解説)
ステップ1:作業前の状態確認
# 目的:OSカーネルや主要サービスの稼働状況を確認(※サービス名は環境に合わせて置換)
# 用語:カーネル(OSの中核部分)
uname -r
sudo systemctl status web.service db.service ids.service firewall.service --no-pager
# 目的:ディスクとサイト領域のサイズ目安を把握(※サイトパスは環境に合わせる)
df -h
sudo du -sh /srv/www/site /etc /home
# 目的:rclone・GPG・wp-cliなど前提コマンドの導入確認
rclone version
gpg --version
wp --info 2>/dev/null || echo "wp-cli未導入"
本節では、変更作業の前にサーバーの基本情報を確認します。
カーネルは再起動後の反映有無の判断材料です。
主要サービスの稼働はセキュリティと可用性に直結します。
rclone(クラウド連携ツール)とGnuPG(暗号化ツール)はバックアップの前提です。
wp-cli(WordPress操作ツール)は更新確認に利用します。
出力例:
X.Y.Z-...-generic
● web.service - Web Server
Active: active (running)
● db.service - Database Server
Active: active (running)
Filesystem Size Used Avail Use% Mounted on
/dev/vda2 25G 3.8G 20G 17% /
128M /srv/www/site 24M /etc 80K /home
rclone v1.xx.x
gpg (GnuPG) 2.3.x
WP-CLI version: 2.x.x
ステップ2:バックアップ(暗号化→クラウド保存)の実装
# 目的:フルバックアップスクリプトを配置(/usr/local/bin/full_backup.sh)
# 基本構文:teeでファイル作成 → 実行権限付与
# 主なオプション:mysqldump --single-transaction、tar --exclude、gpg --symmetric、rclone copy
sudo tee /usr/local/bin/full_backup.sh >/dev/null <<'SH'
#!/usr/bin/env bash
set -Eeuo pipefail
BK_ROOT="/secure/backup/path/daily"
NOW="$(date +%F_%H%M%S)"
RETENTION_DAYS=7
RCLONE_REMOTE="remote:Backup"
SITE_ROOT="/srv/www/site"
TARGETS=("/etc" "$SITE_ROOT" "/home")
log(){ echo "[$(date +%F_%T)] $*"; }
trap 'log "ERROR: line $LINENO で失敗"; exit 1' ERR
mkdir -p "$BK_ROOT" && chmod 700 "$BK_ROOT"
log "Start backup at $NOW"
# DBダンプ(環境の認証方法に合わせて設定ファイル等を利用)
if mysql -e "SELECT 1;" >/dev/null 2>&1; then
GETDBS=(mysql -N -e)
DUMP=(mysqldump --single-transaction --quick --routines --triggers)
else
GETDBS=() ; DUMP=()
fi
if [ ${#GETDBS[@]} -gt 0 ]; then
DBS="$("${GETDBS[@]}" "SHOW DATABASES;" | grep -Ev '^(information_schema|performance_schema|sys)$' || true)"
for db in $DBS; do log "Dump DB: $db"; "${DUMP[@]}" "$db" > "$BK_ROOT/${db}_${NOW}.sql"; done
fi
# ファイルアーカイブ(自己巻き込みと機密は除外)
tar \
--exclude="$BK_ROOT" \
--exclude="${SITE_ROOT}/wp-content/cache" \
--exclude="${SITE_ROOT}/wp-content/uploads/cache" \
-czf "$BK_ROOT/files_${NOW}.tar.gz" "${TARGETS[@]}"
# インストールパッケージ一覧
rpm -qa | sort > "$BK_ROOT/packages_${NOW}.txt"
# 暗号化(パスフレーズファイルは改行なし・600)
PASSPHRASE_FILE="/secure/secret/backup_passphrase"
[ -f "$PASSPHRASE_FILE" ] || { log "ERROR: $PASSPHRASE_FILE not found. Create it (600)."; exit 1; }
log "[Encrypt] GPG symmetric AES256"
for f in "$BK_ROOT"/*"${NOW}"*; do
[ -f "$f" ] || continue
gpg --batch --yes --symmetric --cipher-algo AES256 \
--passphrase-file "$PASSPHRASE_FILE" \
-o "${f}.gpg" "$f"
shred -u "$f"
done
# チェックサム
( cd "$BK_ROOT" && sha256sum *"${NOW}"*.gpg > "SHA256SUMS_${NOW}.txt" )
# クラウド送信(rcloneリモート名は一般化)
log "Upload to $RCLONE_REMOTE"
rclone copy "$BK_ROOT" "$RCLONE_REMOTE" --transfers=4 --checkers=8
# ローカル世代管理
log "Prune local > ${RETENTION_DAYS}d"
find "$BK_ROOT" -type f -mtime +${RETENTION_DAYS} -delete
log "Backup OK at $NOW"
SH
sudo chmod 700 /usr/local/bin/full_backup.sh
# 目的:バックアップの自動実行(毎日深夜帯の任意時刻の例:03:00)
# 基本構文:rootのcrontabにジョブ追加
( sudo crontab -l; echo '0 3 * * * /usr/local/bin/full_backup.sh >> /var/log/backup/full_backup.log 2>&1' ) | sudo crontab -
# 目的:暗号化パスフレーズを安全に作成(改行なし・600)
sudo mkdir -p /secure/secret
sudo bash -c 'echo -n "例:Use-Strong-Secret" > /secure/secret/backup_passphrase'
sudo chmod 600 /secure/secret/backup_passphrase
sudo mkdir -p /var/log/backup && sudo touch /var/log/backup/full_backup.log
本節では、バックアップの自動化と暗号化を実装します。
rclone(クラウド連携)でクラウド側へアップロードし、GnuPG(暗号化)で漏えいを防ぎます。
cron(定期実行)で毎日深夜帯にバックアップが動作します。
tarでは自己巻き込み防止のためバックアップ保存先を除外し、機密ファイルは含めない方針です。
出力例:
[YYYY-MM-DD_HH:MM:SS] Start backup at YYYY-MM-DD_HHMMSS
[Encrypt] GPG symmetric AES256
[YYYY-MM-DD_HH:MM:SS] Upload to remote:Backup
[YYYY-MM-DD_HH:MM:SS] Backup OK at YYYY-MM-DD_HHMMSS
ステップ3:作業後の状態確認
# 目的:ローカル成果物の確認(.gpgとSHA256SUMS)
sudo -i
ls -lh /secure/backup/path/daily | tail
cd /secure/backup/path/daily
LATEST_SUM=$(ls -1t SHA256SUMS_*.txt | head -n1)
sha256sum -c "$LATEST_SUM" | head
# 目的:復号テスト(DBダンプの先頭を確認)
gpg --batch --yes --decrypt \
--passphrase-file /secure/secret/backup_passphrase \
"$(ls -1t /secure/backup/path/daily/appdb_*.sql.gpg | head -n1)" | head
# 目的:クラウド側の確認(rcloneのcheck)
rclone check /secure/backup/path/daily remote:Backup
本節では、暗号化済み成果物とハッシュ整合性を確認します。
復号テストにより、実際に復元可能なバックアップであることを確かめます。
rcloneのcheckでローカルとクラウドの差分がないことを検証します。
出力例:
files_YYYY-MM-DD_HHMMSS.tar.gz.gpg: OK
appdb_YYYY-MM-DD_HHMMSS.sql.gpg: OK
-- MariaDB dump ...
NOTICE: remote 'Backup': 0 differences found
作業前後の比較
項目 | 作業前 | 作業後 |
---|---|---|
バックアップ方式 | 未整備または平文保存 | GPG暗号化+クラウド二重保存(汎用リモート名) |
自動実行 | 未設定 | cronで毎日深夜帯に実行(時刻は例示) |
整合性確認 | 未実施 | SHA256SUMSで検証 |
復元手順 | 未整備 | DB/ファイルの復元コマンドを整備(パスはダミー) |
機密ファイル混入 | 混入の懸念あり | tarで保存先と機密を除外 |
使用したコマンド一覧と解説
コマンド | 目的 | 解説 |
---|---|---|
mysqldump | DBダンプ | 基本構文:mysqldump [--single-transaction] DB名 > dump.sql 。InnoDBの整合性を保つため --single-transaction を使用します。 |
tar | ファイル圧縮 | 基本構文:tar -czf アーカイブ名.tar.gz 対象 。--exclude で保存先や機密を除外します。 |
gpg | 暗号化 | 基本構文:gpg --symmetric --cipher-algo AES256 -o 出力.gpg 入力 。復号は gpg --decrypt 入力.gpg です。 |
sha256sum | 整合性検証 | 基本構文:sha256sum ファイル > SHA256SUMS.txt 。検証は sha256sum -c です。 |
rclone | クラウド転送 | 基本構文:rclone copy ローカル リモート: 。--transfers や--checkers で並列度を調整します。 |
crontab | 定期実行 | 基本構文:分 時 日 月 曜 コマンド 。深夜帯の任意時刻で日次実行します。 |
systemctl | サービス確認 | 基本構文:systemctl status サービス 。環境に合わせてサービス名を指定します。 |
安全策と復旧方法
- 安全策:暗号化パスフレーズは
/secure/secret/backup_passphrase
に保存し、権限600で管理します。
内容は改行なしで、サーバー外のパスワードマネージャにも保管します。 - 安全策:tarでは
$BK_ROOT
、秘密情報、設定ファイルディレクトリなどを除外します。
具体パスは公開用には記載しません。 - 復旧方法(DB):
gpg --decrypt appdb_*.sql.gpg | mysql -u <USER> -p <DBNAME>
で復元します。
接続情報は環境変数や設定ファイルで安全に渡します。 - 復旧方法(ファイル):
gpg --decrypt files_*.tar.gz.gpg | tar -xz -C /
で展開し、必要に応じて所有権・サービス再起動を行います。
注意点・落とし穴
- パスフレーズに改行が含まれると復号で戸惑ったため、
echo -n
で作成します。 - クラウドリモート名や保存先の実名公開は避けます。
公開用資料では一般化した名称を使用します。 - バックアップ保存先を除外しないと、tarで自己巻き込みが発生しエラーになりやすいです。
- 具体的なOS・カーネル・サービス名・時刻は公開時に抽象化します。
まとめ
本記事ではバックアップ確認の安全運用(暗号化+クラウド保存)と日次検証を解説しました。
作業前後での比較と安全策を意識することで、トラブルを未然に防げます。
読者のLinux運用の一助になれば幸いです。
実践課題
- 月に一度、復号テスト(DBのみ)を実施し、手順を記録します。
公開用資料では具体パスを記載しない方針を徹底します。 - 週に一度、検証ログを点検します。
通知連携(メールやチャット)を用いてエラー検知を自動化します。