限制 ssh 只允许 rsync 命令

主要想解决的问题

为了更好隔离,专门开了个 nginx 的账户来存储 nginx 使用的静态网页。本来想不允许登陆该账户,但从 目前资料来看,如果在 passwd 中配置了 nologin Shell,则会导致连 ssh 都会登陆失败。想对于 bash,使 用 rssh 并不能带来安全级别提升。故当前方案保留了 bash,通过配置 ssh 只允许 rsync 命令。

方案细节

创建 bash 脚本rsynconly.sh

脚本内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash

# make sure the command is rsync
set -- ${SSH_ORIGINAL_COMMAND}
if [ "$1" != "rsync" ] ; then
echo "Error: Only rsync command supportted"
exit 1
fi

# excute the command directly
${SSH_ORIGINAL_COMMAND}

exit 0

把该文件保存到路径/bin/rsynconly.sh,注意加上执行权限chmod +x /bin/rsynconly.sh.

修改sshd_config

找到 Match User 的地方,没有的话最后一行就可以,添加内容如下:

1
2
3
4
5
Match User nginx
X11Forwarding no
AllowTcpForwarding no
PermitTTY no
ForceCommand /bin/rsynconly.sh

这里其实就是对用户 nginx 的 ssh 连接进行限制,强制运行刚刚创建的脚本/bin/rsynconly.sh

重启 sshd 服务

systemctl restart sshd

到此为止,整个搭建就完成了。可以愉快的使用 rsync 通过 ssh 传文件,并同时禁用了 ssh 直接登陆和执 行其他命令。

一些细节

当使用 rsync 上传文件时,会先 ssh 登陆远程主机。可通过rsync -vvv source_file nginx@ip.address: 看到,其实调用了命令ssh -l nginx ip.address rsync --server -vvve.LsfxCIvu . ., 故在脚本 /bin/rsynconly.sh中的${SSH_ORIGINAL_COMMAND}是字符串:rsync --server -vvve.LsfxCIvu . .