基于 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:
|
|
在已经安装 rsync 的情况下,通过 which rrsync
查看命令是否安装以及获得实际路径,我这里(Debian 12)位于 /usr/bin/rrsync
。
设置用户
首先,在远程目标主机上创建一个用户 sync
来作为操作用户,如果基于特殊原因需要使用 root,建议上述操作设置为 forced-commands-only。
|
|
以上命令创建了一个名为 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
,那么应该写入的内容是:
|
|
解释如下:
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
目录下写入以下配置:
|
|
那么,原来的 rsync 同步命令是:
|
|
在配置 rrsync 后,需要替换为:
|
|