Ssh

允許使用 authorized_keys 對任意目錄進行受限 rsync (rrsync) 腳本

  • October 7, 2021

自動備份

我想實現一個備份解決方案,將數據從 Web 伺服器 (WebServer) 的各個目錄複製到本地備份伺服器 (BackupServer)。備份應該在無人值守的情況下執行,因此我想使用基於密鑰的身份驗證和無密碼私鑰。

特權 Rsync

我要備份的目錄只能由特權使用者讀取。我想使用 rsync 來複製文件。我創建了一個專用的備份使用者,並允許使用者使用 sudo 執行 rsync,而不會提示使用 visudo 規則輸入密碼:

backup-user ALL = NOPASSWD: /usr/bin/rsync

安全注意事項

我想通過將命令列表添加到 WebServer 的 authorized_keys 文件來限製備份使用者可以執行的命令來提高安全性。我安裝了本文中提到的rrsync

command="/usr/bin/rrsync",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-forwarding ssh-rsa AAAA134143NzaC1yc...

Rrsync 需要一個子目錄

與普通 rsync 相比, rrsync期望在授權密鑰文件中提供一個子目錄,如本文所述

command="/usr/share/rsync/rrsync  /var/backup/client1/",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-forwarding ssh-rsa 

此限制有效,但它只允許我備份一個特定目錄,即 /var/backup/client1/

我想在 rsync 命令中提供我想從 BackupServer 備份的目錄。是否有可能像 rsync 一樣使用 rrsync,例如:

rsync -avze ssh --rsync-path='sudo rrsync' backupuser@111.222.33.44:/media/data  /backups/Server/

附加說明

我知道 authorized_hosts 中的 command="…" 部分確實將此使用者的可執行命令限制為完全提供的命令,但是使用正常的 rsync,我可以做這樣的事情來提供我想要備份的路徑一個參數:

command="/usr/bin/rsync --server --sender -vlogDtpre.is . ${SSH_ORIGINAL_COMMAND//* \//\/}"

這不適用於 rrsync。

接受的解決方案

雖然從技術上講不是這個問題的明確答案,但我認為 Gilles 發布的解決方案是一個非常好的方法。我為要備份的實際目錄的所有視圖創建了一個根文件夾。出於這個原因,我可以安全地將身份驗證限制為僅 rrsync。

One time todo

   sudo mkdir /mnt/Backups-Rsync-Readonly
   sudo chown -R rsync-backup /mnt/Backups-Rsync-Readonly
   sudo mkdir /mnt/Backups-Rsync-Readonly/VAR-WWW
   sudo mkdir /mnt/Backups-Rsync-Readonly/MySQL-Backups
   sudo setfacl -m u:rsync-backup:rx /mnt/Backups-Rsync-Readonly/
   sudo setfacl -m u:rsync-backup:rx /mnt/Backups-Rsync-Readonly/MySQL-Backups
   sudo setfacl -m u:rsync-backup:rx /mnt/Backups-Rsync-Readonly/VAR-WWW

創建視圖(重啟後消失)

   sudo bindfs -o perms=0000:u=rD,force-user=rsync-backup /var/www /mnt/Backups-Rsync-Readonly/VAR-WWW
   sudo bindfs -o perms=0000:u=rD,force-user=rsync-backup /MySQL-Dumps /mnt/Backups-Rsync-Readonly/MySQL-Backups

Fstab 版本

   /home/stefan/Scans    /mnt/Backups-Rsync-Readonly/VAR-WWW fuse.bindfs perms=0000:u=rD,force-user=rsync-backup 0   0

授權密鑰

command="/usr/bin/rrsync -ro /mnt/Backups-Rsync-Readonly",from="192.168.0.10",no-pty,no-agent-forwarding,no-port-forwarding,no-X11-forwarding ssh-rsa AAAAB

一種可能性是使用bindfs創建您希望專用使用者能夠備份的目錄的只讀視圖。根本不要使用 sudo;發出rrsync唯一允許該使用者使用的命令。一次性設置:

mkdir /somewhere/backup-views /somewhere/backup-views/dir1 /somewhere/backup-views/dir2
chmod 700 /somewhere/backup-views
setfacl -m u:rx:backup-user /somewhere/backup-views

每次啟動後設置:

bindfs -o perms=a+r-w /actual/dir1 /somewhere/backup-views/dir1
bindfs -o perms=a+r-w /actual/dir2 /somewhere/backup-views/dir2

或相應的行/etc/fstab

/actual/dir1 /somewhere/backup-views/dir1 bindfs perms=a+r-w
/actual/dir2 /somewhere/backup-views/dir2 bindfs perms=a+r-w

然後設置備份使用者rsync執行/somewhere/backup-views

引用自:https://unix.stackexchange.com/questions/276198