首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 資料庫遭攻擊篡改:基於從庫備份與主庫 Binlog 的時間點不完整恢復實戰

     編輯:MySQL 綜合教學

MySQL 資料庫遭攻擊篡改:基於從庫備份與主庫 Binlog 的時間點不完整恢復實戰

作者:張正 | 日期:2014-09-26 | QQ:176036317

一、發現問題

開發回報:2014-09-25 21:53:57 某文章表 content 欄位被惡意篡改,全表內容統一改為某篇游記內容。經日誌確認篡改時間點精確到秒。

二、恢復策略

  • 備份策略:從庫每日凌晨備份,保留 30 天
  • Binlog 保留:主庫保留 7 天
  • 恢復方案:還原 09-23 凌晨備份 → 重放 Binlog 至 21:53:56 → 21:53:57 後資料業務確認可捨棄或後續補齊

三、備份時間點確認

# 備份腳本 cron (已被註釋)
# 0 3 * * * /data/opdir/mysqlbak/backup_mysqldump.sh 6084

# 實際備份目錄列表
drwxr-xr-x 2 root root 4096 Sep 23 18:33 20140923  <-- 最新備份
-rw-r--r-- 1 root root 5475 Sep 23 18:33 mysql-bakup.log

備份日誌關鍵資訊:

2014-09-23 18:19:12 begin backup ...   <-- STOP SLAVE 時間點
2014-09-23 18:33:43 end backup ...

關鍵判斷: 從庫備份腳本先 STOP SLAVE 再備份,且監控顯示該時刻主從延遲為 0,故備份反映主庫 2014-09-23 18:19:12 的狀態。以此為 --start-datetime。

篡改時間 2014-09-25 21:53:57,故 --stop-datetime 設為 2014-09-25 21:53:56。

四、具體恢復操作步驟

  1. 拷貝備份檔:
    scp backup_host:/data/mysqlbak/20140923/20140923.db_name.gz recovery_host:/data/opdir/20140926/
  2. 解壓:
    gunzip 20140923.db_name.gz
  3. 導入測試庫:
    mysql -uroot -pxxx -S /tmp/mysql.sock < 20140923.db_name
  4. 拷貝所需 Binlog:
    # 主庫 Binlog 列表
    mysql-bin.000472 (Sep 24)
    mysql-bin.000473 (Sep 25)
    mysql-bin.000474 (Sep 26)
    # 僅需這三個檔案
    scp mysql-bin.00047[2-4] recovery_host:/data/opdir/20140926/
  5. 提取 Binlog 為 SQL:
    mysqlbinlog --database=db_name --start-datetime='2014-09-23 18:19:12' --stop-datetime='2014-09-25 21:53:56' mysql-bin.000472 > 472.sql
    mysqlbinlog --database=db_name --start-datetime='2014-09-23 18:19:12' --stop-datetime='2014-09-25 21:53:56' mysql-bin.000473 > 473.sql
    mysqlbinlog --database=db_name --start-datetime='2014-09-23 18:19:12' --stop-datetime='2014-09-25 21:53:56' mysql-bin.000474 > 474.sql
  6. 導入 Binlog SQL:
    mysql -uroot -pxxx -S /tmp/mysql.sock db_name < 472.sql
    mysql -uroot -pxxx -S /tmp/mysql.sock db_name < 473.sql
    mysql -uroot -pxxx -S /tmp/mysql.sock db_name < 474.sql
  7. 驗證資料正確性:
    SELECT MAX(createtime), MAX(updatetime) FROM table_name;
    -- 確認最新時間約為 20:27,早於篡改時間 21:53

    經業務開發確認無誤後,進行線上切換。

  8. 導出目標表並壓縮傳輸:
    mysqldump -uroot -pxxx -S /tmp/mysql.sock -q db_name table_name > table_name.sql
    gzip table_name.sql
    scp table_name.sql.gz master_host:/target/path/
  9. 線上主庫切換 (業務暫停寫入):
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved