2026年5月20日

2026年5月20日

WordPressのバックアップを安全に保管する方法

はじめに

バックアップファイルが盗まれたり、同じサーバーに保存したバックアップがサイトと一緒に消失したりする事例が多くあります。バックアップは暗号化してオフサイト(別の場所)に保存することで、本当の「保険」になります。

症状・原因

  • バックアップをサーバー内の同じディレクトリに保存している
  • バックアップファイルがWebから直接アクセスできる状態になっている
  • バックアップが本当に復元できるか検証していない
  • バックアップファイルが暗号化されておらず、漏洩リスクがある

解決手順

ステップ1:バックアップの現状を確認する

# 現在のバックアップ状況を確認
ls -lah /var/www/html/wp-content/uploads/backup* 2>/dev/null || echo "No backups in uploads"
ls -lah /var/backups/wordpress/ 2>/dev/null

# バックアップファイルがWebからアクセス可能か確認
curl -I "https://example.com/wp-content/uploads/backup.zip"
# 200が返る場合は危険 → アクセスをブロックする必要がある

# WP-CLI でインストール済みバックアッププラグインを確認
wp plugin list | grep -i "backup\|duplicator\|updraft"

ステップ2:バックアップファイルへのWebアクセスをブロックする

# .htaccess: バックアップディレクトリを保護

# バックアップファイルの直接ダウンロードをブロック
<FilesMatch "\.(zip|tar\.gz|sql|bak|backup)$">
    Order Deny,Allow
    Deny from all
</FilesMatch>

# UpdraftPlus のバックアップディレクトリを保護
<IfModule mod_rewrite.c>
    RewriteRule ^wp-content/updraft/ - [F,L]
</IfModule>
# Nginx: バックアップファイルへのアクセスをブロック
location ~* \.(zip|tar\.gz|sql|bak|backup)$ {
    deny all;
    access_log off;
    log_not_found off;
}

location /wp-content/updraft/ {
    deny all;
}

ステップ3:バックアップを暗号化する

#!/bin/bash
# バックアップを作成して暗号化するスクリプト

WP_PATH="/var/www/html"
BACKUP_DIR="/var/backups/wordpress"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_NAME="wp-backup-${DATE}"
ENCRYPTION_KEY="your-secure-encryption-password"  # 別途安全な場所に保管

mkdir -p $BACKUP_DIR

# WordPress ファイルをアーカイブ
tar -czf "${BACKUP_DIR}/${BACKUP_NAME}-files.tar.gz" \
    -C /var/www html/wp-content

# データベースをエクスポート
wp --path=$WP_PATH db export "${BACKUP_DIR}/${BACKUP_NAME}-db.sql"

# ファイルとDBをまとめてアーカイブ
tar -czf "${BACKUP_DIR}/${BACKUP_NAME}.tar.gz" \
    "${BACKUP_DIR}/${BACKUP_NAME}-files.tar.gz" \
    "${BACKUP_DIR}/${BACKUP_NAME}-db.sql"

# OpenSSL で AES-256-CBC 暗号化
openssl enc -aes-256-cbc -pbkdf2 -iter 100000 \
    -in "${BACKUP_DIR}/${BACKUP_NAME}.tar.gz" \
    -out "${BACKUP_DIR}/${BACKUP_NAME}.tar.gz.enc" \
    -k "$ENCRYPTION_KEY"

# 暗号化前のファイルを削除
rm -f "${BACKUP_DIR}/${BACKUP_NAME}.tar.gz" \
    "${BACKUP_DIR}/${BACKUP_NAME}-files.tar.gz" \
    "${BACKUP_DIR}/${BACKUP_NAME}-db.sql"

echo "暗号化バックアップ作成完了: ${BACKUP_NAME}.tar.gz.enc"

# 復号化する場合:
# openssl enc -d -aes-256-cbc -pbkdf2 -iter 100000 \
#     -in backup.tar.gz.enc -out backup.tar.gz -k "$ENCRYPTION_KEY"

ステップ4:Amazon S3 にオフサイト保存する

# AWS CLI をインストール
pip3 install awscli
aws configure  # アクセスキー・シークレット・リージョンを設定

# S3 バケットを作成
aws s3 mb s3://my-wordpress-backups --region ap-northeast-1

# バケットのパブリックアクセスをブロック(重要)
aws s3api put-public-access-block \
    --bucket my-wordpress-backups \
    --public-access-block-configuration \
    "BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true"

# バックアップを S3 にアップロード
aws s3 cp "${BACKUP_DIR}/${BACKUP_NAME}.tar.gz.enc" \
    s3://my-wordpress-backups/$(date +%Y/%m)/

# S3 にライフサイクルルールを設定(古いバックアップを自動削除)
aws s3api put-bucket-lifecycle-configuration \
    --bucket my-wordpress-backups \
    --lifecycle-configuration '{
        "Rules": [{
            "ID": "delete-old-backups",
            "Status": "Enabled",
            "Filter": {"Prefix": ""},
            "Expiration": {"Days": 90}
        }]
    }'
// wp-config.php に UpdraftPlus の S3 設定を追加
// UpdraftPlus → 設定 → リモートストレージ → Amazon S3 で設定
// または定数で設定:
define('UPDRAFTPLUS_S3_BUCKET', 'my-wordpress-backups');
define('UPDRAFTPLUS_S3_REGION', 'ap-northeast-1');

ステップ5:バックアップの復元テストを定期実行する

#!/bin/bash
# バックアップ検証スクリプト(月1回実行推奨)

BACKUP_FILE="/var/backups/wordpress/latest-backup.tar.gz.enc"
TEST_DIR="/tmp/backup-test"
ENCRYPTION_KEY="your-secure-encryption-password"

# テスト用ディレクトリを作成
mkdir -p $TEST_DIR

# 暗号化バックアップを復号化
openssl enc -d -aes-256-cbc -pbkdf2 -iter 100000 \
    -in $BACKUP_FILE \
    -out "${TEST_DIR}/backup.tar.gz" \
    -k $ENCRYPTION_KEY

if [ $? -eq 0 ]; then
    echo "✅ 復号化成功"
    # アーカイブの整合性を確認
    tar -tzf "${TEST_DIR}/backup.tar.gz" > /dev/null 2>&1
    if [ $? -eq 0 ]; then
        echo "✅ アーカイブ整合性OK"
    else
        echo "❌ アーカイブが壊れています"
        # 管理者にメール通知
        echo "バックアップファイルが破損しています" | \
            mail -s "[警告] バックアップ検証失敗" admin@example.com
    fi
else
    echo "❌ 復号化失敗 - 暗号化キーを確認してください"
fi

# テストファイルを削除
rm -rf $TEST_DIR

注意事項

  • 暗号化キーはバックアップファイルとは別の場所(パスワードマネージャー、安全な物理媒体)に保管してください。キーを失うと暗号化バックアップは復元不可能です
  • S3バケットはパブリックアクセスを必ず無効にしてください。デフォルトではバケット内のファイルがインターネットから公開される可能性があります
  • バックアップは「作成したこと」より「復元できること」が重要です。月1回はテスト復元を実施してください

まとめ

バックアップの安全な保管は①FilesMatchでバックアップファイルのWebアクセスをブロック、②openssl enc -aes-256-cbc -pbkdf2でAES-256暗号化して平文ファイルを即削除、③aws s3 cpでS3バケット(パブリックアクセスブロック済み)にオフサイト保存、④S3ライフサイクルルールで90日後に自動削除、⑤月次で復号化→アーカイブ整合性検証を実施して復元可能性を確認します。

お気軽にご相談ください

お見積りへ お問い合わせへ