![允许使用authorized_keys对任意目录使用受限rsync (rrsync)脚本](https://linux22.com/image/87578/%E5%85%81%E8%AE%B8%E4%BD%BF%E7%94%A8authorized_keys%E5%AF%B9%E4%BB%BB%E6%84%8F%E7%9B%AE%E5%BD%95%E4%BD%BF%E7%94%A8%E5%8F%97%E9%99%90rsync%20(rrsync)%E8%84%9A%E6%9C%AC.png)
自动备份
我想实现一个备份解决方案,将数据从 Web 服务器 (WebServer) 的各个目录复制到本地备份服务器 (BackupServer)。备份应该在无人值守的情况下运行,因此我想使用基于密钥的身份验证和无密码私钥。
特权 Rsync
我要备份的目录只能由特权用户读取。我想使用 rsync 来复制文件。我创建了一个专用的备份用户,并允许用户使用 sudo 执行 rsync,而不会提示使用 visudo 规则输入密码:
backup-user ALL = NOPASSWD: /usr/bin/rsync
安全考虑
我想通过向 Web 服务器的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' [email protected]:/media/data /backups/Server/
额外说明
我知道authorized_hosts中的command =“...”部分确实将该用户的可执行命令限制为所提供的命令,但是使用正常的rsync,我可以执行类似的操作来提供我想要备份的路径一个参数:
command="/usr/bin/rsync --server --sender -vlogDtpre.is . ${SSH_ORIGINAL_COMMAND//* \//\/}"
这不适用于 rrsync。
接受的解决方案
尽管从技术上讲这不是问题的明确答案,但我认为吉尔斯发布的解决方案是一个非常好的方法。我为要备份的实际目录的所有视图创建了一个根文件夹。因此,我可以安全地将身份验证限制为仅 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
答案1
一种可能性是创建您希望专用用户能够备份的目录的只读视图,使用绑定文件系统。根本不要使用 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
。