基于 rrsync 实现更安全的远程备份策略

使用 rrsync 限制 rsync 可操作目录,实现更安全的 rsync 远程备份策略。

背景

rsync 是一个非常常用的远程备份或者同步方案,通常我们会通过 SSH 隧道来进行 rsync 传输。一般来说会给 rsync 单独建立一个用户,并设置目录的权限来确保一定的安全性。但是如果是 root 用户才能访问的目录就不好进行限制了,或者说我们想把某个用户的操作权限限定在一个特定的目录范围内,以确保安全。

rrsync

rrsync 是一个通过 SSH 登录隧道设置受限 rsync 用户的脚本,随 rsync 安装包提供,利用了 SSH 中的“强制命令”机制。曾经是使用 Perl 编写的,在 3.2.4 版本 中,rrsync 使用 python 进行了重写。

通过 rrsync,可以限制远程客户端只访问特定的目录,并且设置只读或者读写权限。

rrsync 脚本可以在 rsync 的源码中找到,例如 rsync-3.2.7.tar.gz,解压后路径是 support/rrsync。

SSH Forced command

强制命令是 SSH 的一个安全机制,可以通过在 authorized_keys 中公钥前附加 command="cmd" 来强制设置使用该公钥登录服务器时可执行的命令,而不是默认的交互式 shell 或者其他命令。该特性可以用来限制特定用户特定公钥的操作范围,确保安全性。

root?

通常来说,为了确保安全,我们都会禁止 root 用户通过 SSH 登录服务器,但是如果要基于 root 使用 rsync,那就需要允许登录,我们可以将 sshd_config 中的 PermitRootLogin 设置为 forced-commands-only,只允许其执行 forced-commands。

使用 rrsync

安装 rsync

rrsync 通常是 rsync 安装包的一部分,Debian/Ubuntu 中,使用 apt 来安装 rsync:

1
sudo apt install rsync

在已经安装 rsync 的情况下,通过 which rrsync 查看命令是否安装以及获得实际路径,我这里(Debian 12)位于 /usr/bin/rrsync

设置用户

首先,在远程目标主机上创建一个用户 sync 来作为操作用户,如果基于特殊原因需要使用 root,建议上述操作设置为 forced-commands-only。

1
sudo useradd -m -d /home/sync -s /bin/sh sync

以上命令创建了一个名为 sync 的用户,并且设置登录终端和家目录。根据 rrsync 的文档,登录终端使用 bash 是有风险的,因为 bash 可能会尝试执行强制命令之前,先运行用户登录的 bashrc文件,如果用户能够通过复制、共享目录或者其他方式更新 bashrc 文件,则可能产生安全问题。因此需要把用户终端设置为 dash,在 Debian 等发行版中,sh 就是 dash 的符号链接。

设置 authorized_keys

使用 sudo su - sync 切换到 sync 用户,mkdir ~/.ssh 创建 ssh 配置目录,使用 vim ~/.ssh/authorized_keys 编辑 authorized_keys。

假设要使用的公钥是 ssh-ed25519 AAAA....BCD,并且需要限制操作的目录是 /data/backup,那么应该写入的内容是:

1
command="rrsync -ro /data/backup",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-forwarding ssh-ed25519 AAAA....BCD

解释如下:

  • command=rrsync ... 设置该公钥登录的强制命令为 rrsync
  • 将 rsync 的可操作目录限制为 /data/backup
  • 使用 -ro 指定只读模式,如果要只允许写入,使用 -wo,允许读写则省略
  • no-agent-forwarding: 禁止 SSH 代理转发,防止用户通过这个 SSH 会话启动另一个会话
  • no-port-forwarding: 禁止端口转发
  • no-pty: 禁止分配伪终端(pseudoterminal)
  • no-user-rc: 禁止执行 .ssh/rc 文件
  • no-X11-forwarding: 禁止 X11 转发
  • ssh-ed25519 AAAA....BCD: SSH 公钥

经过以上配置,sync 用户如果使用 ssh-ed25519 AAAA....BCD 这个公钥登录,那么就只能通过 rsync 操作 /data/backup 目录。

注意 rrsync 无法对一个公钥设置多个目录,如果有多目录需求,需要使用父目录统一限制或者使用多个 key 分别设置。

使用 rsync

配置 rrsync 后,需要注意的是 /data/backup 这个目录在 rsync 操作时会被映射为 /

例如,使用 rsync 备份远程主机 remote/data/backup 目录到本机 ~/remote_backup,首先设置下 ssh config,在本机 ~/.ssh/config 目录下写入以下配置:

1
2
3
4
Host remote                 # 别名
    User sync               # 用户
    Hostname 1.1.1.1        # IP/域名
    IdentityFile ~/.ssh/remote_id_ed25519 # 私钥

那么,原来的 rsync 同步命令是:

1
rsync -av remote:/data/backup ~/remote_backup

在配置 rrsync 后,需要替换为:

1
rsync -av remote:/ ~/remote_backup

参考资料

0%