文章原文:https://tlanyan.pp.ua/use-rsync-daemon-to-sync-files-between-servers/
一直使用 rsync
命令在主機間快速同步文件,例如定時 備份WordPress文件和數據庫 到其他主機。
之前對 rsync 瞭解不深,一直使用 shell
方式同步文件。爲了避免連接時輸入密碼,便在多個主機間分發公鑰。今天意識到這種做法有嚴重的安全問題:如果某臺主機被黑,黑客能輕易漫遊所有主機!
於是再次研究 rsync
,發現可以使用rsync daemon跨主機安全同步。
本文鏈接:https://tlanyan.pp.ua/use-rsync-daemon-to-sync-files-between-servers/
使用rsync daemon跨主機安全同步
rsync的三種工作模式
rsync
命令有三種用法,對應三種工作模式:
-
本機同步,類似於
cp
命令:rsync [選項] SRC DEST;
-
shell
遠程同步,類似於scp
命令:# 遠程主機文件同步到主機 rsync [選項] USER@HOST**:SRC DEST # 本機文件同步到遠程主機 rsync [選項] SRC USER@HOST:**DEST
-
daemon
遠程同步:# 遠程主機文件同步到本地,可使用::或用rsync://指定daemon模式 rsync [選項] USER@HOST**::**SRC DEST rsync [選項] **rsync://**USER@HOST/SRC DEST
# 本機文件同步到遠程主機 rsync [選項] SRC USER@HOST**::**DEST rsync [選項] SRC **rsync://**USER@HOST/DEST
shell
和daemon
模式的區別是shell
模式使用一個冒號:
,而daemon
模式使用兩個冒號::
或用rsync://
顯式指定。
前兩種工作模式比較簡單,直接輸入源和目標路徑即可進行數據同步。第三種用法區分客戶端和服務端,需要在服務端配置才能正常工作。
接下來我們介紹使用daemon
方式進行數據同步。
rsync daemon模式
類似於 V2ray,rsync
命令既可以用作客戶端,也可以用作服務端。我們平常用的 rsync
便是作爲客戶端使用,加上--daemon
參數則變成服務端模式。
CentOS 7、Ubuntu/Debian系統安裝 rsync
後會自動配置好rsync服務,但在 CentOS 8 系統中需要額外安裝 rsync-daemon
包纔會配置rsync服務:
# Ubuntu/Debian安裝rsync sudo apt update sudo apt install -y rsync # CentOS/RHEL安裝rsync sudo yum install -y rsync # CentOS 8安裝rsync daemon sudo yum install -y rsync-daemon
rsync daemon的默認配置文件是 /etc/rsyncd.conf
,Ubuntu/Debian默認沒創建。編輯 /etc/rsyncd.conf
,寫入類似以下內容(#號開頭的行是註釋):
# rsyncd.conf的配置項分全局參數和模塊參數,全局參數只有少數幾個,一般保持默認即可 # 模塊以[模塊名]開頭,後續參數僅作用於該模塊 # 卸載模塊外的參數適用於所有模塊 # rsyncd.conf文件的指令和值請參考 man rsyncd.conf
# 歡迎文件 motd file = /etc/rsyncd.motd
# 用戶和組id uid = root gid = root
# 是否chroot,出於安全考慮建議爲yes use chroot = yes # 是否記錄傳輸記錄 transfer logging = no # 是否只讀,值爲true時客戶端無法上傳 read only = false # 是否只寫,值爲true時客戶端無法下載 write only = false # 默認拒絕所有主機連接 hosts deny = *
# 用戶名密碼文件,每一行格式是:用戶名:密碼,例如 # tlanyan:12343112 # 該文件權限必須設置爲600,除非strict mode設置爲false secrets file = /etc/rsyncd.secrets
# 定義名爲backup的模塊 [backup] # 模塊說明 comment = backup directory # 模塊路徑,請求改成自己的 path = /data # 允許的主機ip hosts allow = xx.xx.xx.xx # 允許的用戶名 auth users = tlanyan # 是否允許列出該模塊,建議爲no list = no
上述配置文件中,/etc/rsyncd.motd
和 /etc/rsyncd.secrets
需自行創建,例如:
# 設置歡迎標語 echo '歡迎使用Rsync Daemon' > /etc/rsyncd.motd # 設置用戶名和密碼 echo 'tlanyan:12343112' >> /etc/rsyncd.secrets # 設置密碼文件權限 chmod 600 /etc/rsyncd.secrets
然後啓動rsync
服務:
# CentOS/RHEL systemctl enable rsyncd systemctl start rsyncd
# Ubuntu/Debian的服務名爲rsync systemctl enable rsync systemctl start rsync
rsync daemon默認監聽873端口,開啓了防火牆需要放行端口(阿里雲/AWS/GCP等網頁後臺有安全組,需要登錄並放行):
# 啓用了firewalld的CentOS 7/8等系統 firewall-cmd --permanent --add-port=873/tcp firewall-cmd --reload
# 啓用了iptables的CentOS 7/8等系統 iptables -I INPUT -p tcp --dport 873 -j ACCEPT
# 啓用了ufw的Ubuntu/Debian等系統 ufw allow 873/tcp
使用rsync daemon同步文件
接下來,在授權的機器上使用授權用戶同步文件:
rsync -avP 授權用戶@服務器ip::backup /var/www/data/
連接過程中需要輸入rsyncd.secrets
中的用戶密碼,也可以使用--password-file
指定密碼文件而無需每次手動輸入:
# 將密碼寫入文件 echo '12343112' > secrets # 設置密碼文件權限 chmod 600 secrets # 免密同步文件 rsync -avP --password-file=secrets 授權用戶@服務器ip::backup /var/www/data/
除了使用兩個冒號**::**,其他使用方式與shell方式都相同。
rsync daemon總結
使用rsync daemon,避免了跨主機同步時的安全隱患,並且可以指定授權ip和授權用戶,實踐中推薦使用。
參考
4. rsync 安裝配置實踐