如何在 Linux 建立安全的備份策略 文章首圖

如何在 Linux 建立安全的備份策略

如何在 Linux 建立安全的備份策略

在數位時代,資料就是資產。無論是個人專案、伺服器設定檔,還是客戶資料庫,一旦遺失往往意味著巨大的時間成本與商業損失。許多 Linux 使用者雖然知道備份的重要性,卻常陷入「備份了但無法還原」或「備份佔用過多空間」的困境。

對於中階 Linux 使用者而言,建立一套自動化、加密且具備版本控制的備份策略,是系統管理的基本功。本文将以 Ubuntu 22.04 / Debian 12 為基礎,介紹如何結合 rsynctarcrontab 建立一套輕量級但極具安全性的備份方案。

第一步:規劃備份目錄結構

在執行任何指令前,先建立清晰的目錄結構。建議將備份資料存放在與系統分離的磁碟或目錄中,例如 /backup。為了避免備份自身,請確保備份目標路徑不在來源路徑之下。

# 建立備份根目錄及子目錄
sudo mkdir -p /backup/daily
sudo mkdir -p /backup/weekly

第二步:使用 rsync 進行增量備份

rsync 是 Linux 下最強大的檔案同步工具,支援增量傳輸,僅複製變更的部分,極大化節省頻寬與時間。我們將建立一個腳本來執行每日備份。

建立備份腳本 /usr/local/bin/backup.sh

sudo nano /usr/local/bin/backup.sh

在文件中輸入以下內容:

#!/bin/bash

# 設定變數
SOURCE_DIR="/home/user/project"
BACKUP_DIR="/backup/daily/$(date +%Y-%m-%d)"
LOG_FILE="/var/log/backup.log"

# 檢查來源目錄是否存在
if [ ! -d "$SOURCE_DIR" ]; then
    echo "$(date): Error - Source directory does not exist" >> $LOG_FILE
    exit 1
fi

# 建立當天的備份目錄
mkdir -p "$BACKUP_DIR"

# 執行 rsync 備份
# -a: 保留權限、時間、符號連結等屬性
# -v: 顯示詳細過程
# --delete: 刪除目標端多餘的檔案(保持與來源一致)
# --exclude: 排除不需要備份的目錄(如 .cache, .local)
rsync -av --delete --exclude='.cache' --exclude='.local' "$SOURCE_DIR/" "$BACKUP_DIR/" >> $LOG_FILE 2>&1

# 檢查備份是否成功
if [ $? -eq 0 ]; then
    echo "$(date): Backup successful" >> $LOG_FILE
else
    echo "$(date): Backup failed" >> $LOG_FILE
fi

賦予腳本執行權限:

sudo chmod +x /usr/local/bin/backup.sh

第三步:自動化排程與壓縮

雖然 rsync 效率高,但長期下來會產生大量小檔案。為了節省空間並增強安全性,我們可以每週將備份資料壓縮成加密的 tarball。

首先,安裝必要的壓縮工具:

sudo apt update
sudo apt install zip gpg

接著,建立壓縮腳本 /usr/local/bin/compress_backup.sh

#!/bin/bash

# 設定變數
SOURCE_DIR="/backup/daily"
BACKUP_DIR="/backup/weekly"
LOG_FILE="/var/log/backup_compress.log"
DATE=$(date +%Y-%m-%d)
FILENAME="backup_${DATE}.tar.gz.gpg"

# 建立目標目錄
mkdir -p "$BACKUP_DIR"

# 檢查是否有備份資料可壓縮
if [ -z "$(ls -A $SOURCE_DIR)" ]; then
    echo "$(date): No backup files found" >> $LOG_FILE
    exit 0
fi

# 使用 GPG 加密並壓縮
# --symmetric: 對稱加密(需要密碼)
# -o: 輸出檔案
gpg --batch --yes --passphrase "YourStrongPasswordHere" --symmetric --cipher-algo AES256 \
    -o "$BACKUP_DIR/$FILENAME" \
    <(tar -cf - -C $SOURCE_DIR .) >> $LOG_FILE 2>&1

# 清理舊的原始備份以節省空間(保留最近7天)
find $SOURCE_DIR -maxdepth 1 -type d -mtime +7 -exec rm -rf {} +

第四步:設定 Crontab 自動化執行

最後,我們利用 crontab 讓系統自動執行上述腳本。

  1. 編輯 crontab:

    crontab -e
  2. 加入以下排程:

    • 每天凌晨 2 點執行增量備份
    • 每週日凌晨 3 點執行壓縮備份
    0 2 * * * /usr/local/bin/backup.sh
    0 3 * * 0 /usr/local/bin/compress_backup.sh

常見問題與解決方案

Q1: 備份過程中遇到權限錯誤怎麼辦? A: rsync 預設會保留檔案權限。如果備份包含系統目錄(如 /etc/var),必須使用 sudo 執行腳本,或在 crontab 中設定為 root 使用者執行。建議將腳本放在 /etc/cron.d/ 下並指定 root 使用者。

Q2: 如何驗證備份檔案是否可讀? A: 定期進行還原測試是備份策略的關鍵。可以使用以下指令測試加密壓縮檔是否完整:

   gpg --batch --yes --passphrase "YourStrongPasswordHere" --decrypt backup_weekly/backup_2023-10-01.tar.gz.gpg | tar -tzf -

若列出檔案清單無誤,代表檔案未損壞。

小結

建立安全的 Linux 備份策略並非一蹴可幾,但透過 rsync 確保資料一致性、GPG 確保資料機密性,以及 Crontab 確保自動化執行,我們已經建構了一個堅固的防線。請記住,沒有經過還原測試的備份,等於沒有備份。定期檢查日誌並進行還原演練,才能確保在災難發生時,您的資料安然無恙。