linux 下同步方案以及站點檔案的防篡改(偽)

Erasin發表於2014-04-08

linux 下同步方案以及站點檔案的防篡改(偽)

通道: 使用ssh協議通訊,利用ssh的 authorized_keys 特性,使用ssh-keygen生成不帶有密碼的金鑰。 執行: crond來設定執行週期

注: 下面 local 指本地,server指同步的伺服器,pwd 指當前目錄路徑

安全方面, 使用普通非登入(nologin)使用者進行資料的交換。

靜態檔案同步 - rsync

視訊檔案和圖片檔案比較大,不適合監控具體內容,利用 rsync 同步資料夾,可以快速計算資料夾對比索引同步。

rsync --log-file="/local/rsync.log" -az --delete -e ssh user@ssh-server-ip:/server/pwd /local/pwd

不使用同步刪除時,去除 --delete 即可。

站點中心同步 - git 防篡改

使用git自動管理中心站點程式碼,檢測站點檔案變動,防止客戶端的檔案篡改以及新增刪除等。

A-server:中心端

在站點根目錄中新增過濾列表檔案 .gitignore

*.log
*.html
upload/
log/
cache/

則在檢測變動的時候,可以過濾 所有 log,html字尾和 upload,log,cache等變動的資料夾。

如果沒有庫索引則建立git庫

$ git init 
$ git add .
$ git commit -a -m "site source init"

建議 建立分支 develop 開發分支,本地執行成功後推送到伺服器,然後合併到master供同步端拉取

B-client: 同步端

拷貝站點

$ git clone user@ip:/pwd/.git

每5m 更新下拉 master 分支 檔案資料。

流程:

指令碼功能實現

  1. 檢測檔案變動
  2. 無有變動則拉取伺服器A的變動內容
  3. 有變動的時候則將變動檔案提交到臨時git分支中,並刪除。 之後拉取伺服器A的變動內容
  4. 同時將被篡改的內容部分寫入到日誌檔案中去。

#!/bin/bash
# file : /pwd/shell/gitpull.sh

# 修改地址
cd `pwd`
# 修改日誌地址
gitlog='/pwd/git.log'

today=`date +%Y%m%d`
gitstatus=`git status`
echo '檢測庫狀態'
if [[ $gitstatus == *"working directory clean"* ]];then 
    echo '無任何改變'
    echo '拉取'
    git pull >> $gitlog
else 
    echo '有檔案變動'
    echo '將改變提交到分支 '$today
    git checkout -b $today 

    echo '寫入日誌'
    touch $gitlog
    echo " " >> $gitlog 
    date '+%Y-%m-%d %H:%M' >> $gitlog
    echo "==========================================" >> $gitlog
    git diff >> $gitlog
    echo "==========================================" >> $gitlog
    echo " " >> $gitlog 

    git add .
    git commit -a -m 'its change'
    echo '回到 master'
    git checkout master
    echo '刪除分支'
    git branch -D $today
    echo '拉取'
    git pull >> $gitlog
fi

新增執行

$ crontab -e
*/5 * * * * /pwd/shell/gitpull.sh

會產生5m的時間差。

參見crontab 定時任務

mysql 檔案備份

非均衡負載,可查閱mysql 主從同步

#!/bin/bash
# filename: bakmysql.sh

# set path 檔案儲存位置

bakpath='/pwd/backup/'
logfile='/pwd/backup/bak.log'

themonth=${bakpath}`date +%y%m`'/'
theday=${themonth}`date +%d`'/' 
thetime=${theday}`date +%Y%m%d%H%M`'.dbname.sql.bak' 

declare -i month=`date +%y%m`
month=$month-2

echo '' >> $logfile
echo `date +%D\ %T` >> $logfile

for i in `ls -F $bakpath`; do
    if [[ -d $bakpath$i ]]; then
        if [[ $i < $month ]]; then
            echo 'delete out 2 month '$i >> $logfile
            rm -rf ${bakpath}$i
        fi
    fi
done

if [[ -d $themonth ]]; then
    echo $themonth 'is exist;' >> $logfile
else
    echo 'makedir ' $theday >> $logfile
    mkdir -p $theday
fi

if [[ -d $theday ]]; then
    echo $theday 'is exist;' >> $logfile
else
    echo 'makedir ' $theday >> $logfile
    mkdir $theday
fi

echo 'bakup mysqldatabase dbname - '${thetime} >> $logfile
mysqldump -uroot -p123456 dbname > $thtime 

# -h host

新增每 30m 執行

$ crontab -e
*/30 * * * * /pwd/shell/mysqlbak.sh

相關文章