創用 CC 授權條款
除非另有註明,本網站的著作Fygul Hether製作,以創用CC 姓名標示-非商業性-禁止改作 4.0 國際 授權條款釋出。

2023年6月22日 星期四

rsync daemon mode

概要

之前寫的《rsync使用簡介》為避免篇幅過長,略過daemon mode的介紹,本文就這部分做點介紹。

簡單解釋rsync daemon mode運行方式,並以一簡單使用範例展示服務器端的設置與用戶端連線方式。展示環境為Kubuntu 22.04,以下範例中所用的命令為了方便說明而有所簡化,若想複製使用,請依實際情況做適當調整,如其中的帳號名稱或密碼,再者,有些設置檔必須以管理員權限才能編輯。

rsync daemon mode運行方式

不同於使用remote shell做連線的方式,遠端機器(rsync server)以daemon mode運行,rsync daemon預設監聽TCP port 873,用戶端以 rsync:// 連線遠端機器。

此情況下,rsync server必須先做些設置,並以daemon mode啟動,以接受用戶端從TCP連線。此時,除非特地採取額外的加密措施,否則資料傳輸是不加密的。SSL/TLS Daemon Setup涉及額外的proxy來處理加密,這部分本文不討論。

在服務器的設置中,可以指定哪個資料夾被同步、守聽的通訊埠號、位址、最多連線數……,以及哪些用戶或主機可連線進來。假定有兩部Web server運行相同的靜態網頁內容,也就是一部當主要服務器,而另一部當鏡像站,可在主要服務器上設置好rsync server,然後提供給鏡像站同步資料過去即可。一些FTP站的多個鏡像站也是利用這種方式達成的。

有幾種執行 rsync daemon 的方式,像 rsync --daemon 做為 stand-alone daemon;本文後面則採用 systemctl 設置為自啟動。

使用範例

這裡以一個簡單情景當使用例來做說明,即類似前述主站與其鏡像站之間的資料同步。此時主站設置成rsync server,而鏡像站即用戶端,這裡為方便說明僅以一個鏡像站為例,實際上可設多個。

服務器端設置

設置檔是 /etc/rsyncd.conf ,其內容大致可區分成整體Global與模組Module兩大部分,一個簡單例子如下:


port = 873
address = 192.168.1.122
max connections = 10

[webdata]
comment = for replication of web site
path = /var/www/data/
secrets file = /etc/rsyncd.secrets

上述 [webdata] 即模組的名稱,底下有幾項參數設定。而更前面的則屬於整體Globle設定。整體設定那部分也可以用 [global] 模組名稱來標示設置區段的開頭。本例只一個模組,必要時可有多個。

可用的模組參數有不少項目,以下只是其中幾項:


comment         註釋,即描述文字
path            供資料同步的目錄路徑。每個模組都必須提供這項
max connections 最大連線數
read only       是否唯讀
secrets file    存放可連線用戶名稱與密碼的檔案
hosts allow     可連線主機
hosts deny      拒絕連線的主機
dont compress   哪些檔案傳輸時不壓縮

視實際使用情形,模組參數也可使用在整體設定的區段中。

依以上述例子,要新增編輯 /etc/rsyncd.secrets ,內放連線用戶名稱與密碼,如:

myname:mypassword

存檔後調整該檔案僅root可讀寫,必要時調整擁有權給root:


sudo chmod 600 /etc/rsyncd.secrets
sudo chown root.root /etc/rsyncd.secrets

這樣,一個簡單的設置基本完成了。再來,記得設置防火牆,啟動rsync並設置自啟動:


sudo ufw allow 873/tcp
sudo systemctl start rsync
sudo systemctl enable rsync

檢視目前執行的狀態:


systemctl status rsync

用戶端連線

由於服務器端設置了 secrets file ,這裡要用 --password-file=FILE 參數指定密碼檔,以便把密碼傳給主機。故先產生好密碼檔,例如:


sudo vim /root/secrets

其中僅在第一行存放密碼:

mypassword

調整成僅root可讀寫,必要時調整擁有權給root:


sudo chmod 600 /root/secrets
sudo chown root.root /root/secrets

此例在用戶端本機同步過來的資料放 /var/www/data/ ,依慣例 /var/www 的擁有權會設給 www-data ;再者,若使用目前帳號執行 rsync 把檔案放置其中時,為避免權限因素導致無法寫入,可將當前帳號 fygul 加入 www-data 群組,並設置群組可寫入:


sudo chown www-data:www-data -R /var/www
sudo addgroup fygul www-data
sudo chmod g+w -R /var/www

再來要執行rsync了,看一下rsync daemon的命令型式:


Pull:
    rsync [OPTION...] [USER@]HOST::SRC... [DEST]
    rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
Push:
    rsync [OPTION...] SRC... [USER@]HOST::DEST
    rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST)

此例用戶端所用的命令如下,其中的遠端機器ip為192.168.1.122:


rsync -av --delete --password-file=/root/secrets myname@192.168.1.122::webdata /var/www/data/

注意與rsync daemon連線時, USER@HOST::SRC 這段是用雙冒號。

或者用 rsync:// 則是:


rsync -av --delete --password-file=/root/secrets rsync://myname@192.168.1.122/webdata /var/www/data/

讓系統排程式執行上述命令,即可在指定時間更新鏡像站內容。

其他問題

上述以--password-file存取/root/secrets,可以不必用到sudo。但如果有其他原因必須在系統排程,或在腳本程式中以sudo方式執行rsync,又要如何避免輸入sudo密碼呢?

假定要以上述帳號執行 sudo rsync ,又要避免打密碼,那得在 /etc/sudoers 添加如下文字,讓該帳號執行 sudo rsync 時不問密碼:

fygul ALL = NOPASSWD: /usr/bin/rsync

實際操作時別直接以編輯器修改該檔,而是要透過 sudo visudo ,它會以 vi 開啟該檔供修改,但在存檔前會做些檢查,減少出錯機會。

※較安全的作法是另外設個本機帳號專門做此類同步資料的工作,並限制此帳號不可用ssh做遠端登入。

再來利用 --rsync-path 指定以該帳號執行 rsync ,而不是把sudo放在整個命令的開頭,像:

rsync --rsync-path="sudo -u fygul rsync" ...後略

如果不是用在命令腳本,而是在命令行以目前帳號直接執行時就不指定帳號,改為 --rsync-path="sudo rsync"

在此用法,還是有可能遇到同步過來的資料在寫入檔案或目錄出現權限不足的問題,那就要設法調整權限以利順利寫入。

結語

本文以一個簡單使用例說明如何設置並使用rsync daemon,這種運行方式,適合像鏡像站資料同步這類可做簡單的身分驗證,而資料傳輸時無需加密的使用情況。

若是有資料傳輸必須加密的需求時,主機端得另行安裝reverse proxy來處理加密工作,這方面待以後有機會再另寫一篇。

為避免篇幅過長,本文只提供簡要的說明,較詳細資訊可查閱後述參考與連結。

參考與連結

  1. Ubuntu Manpage: rsyncd.conf - configuration file for rsync in daemon mode
  2. How to setup the rsync daemon on Linux
  3. Ubuntu - Set Up Rsync Server
  4. rsync content as sudo user
  5. rsync run as root sudo without password
  6. Ubuntu Manpage: sudoers — default sudo security policy plugin

沒有留言:

張貼留言