我想创建一个能够做两件事的 ssh 帐户:
- 通过以下方式安装(可以是一个)目录
sshfs
- 使用以下命令执行他/她所需目录的备份和恢复
rsync
我很想有目的地利用ssh
,rsync
而不需要运行额外的rsync
服务器。 (主要问题是一个端口仅用于 的可用性ssh
。如果不可能或大大简化了事情,我可能会考虑sshfs
隧道)。
问题:到目前为止我sftp
只取得了帐户。然而他们缺少rsync
over ssh
,我想补充一下。
长话短说:到目前为止,我已经尝试通过选项指向的自定义脚本将“仅 ftp”帐户方法与“允许的命令包装器”方法结合起来ForceCommand
- 这些详细信息如下所述。
sftp
到目前为止我如何获得唯一的帐户
到目前为止,我已成功将ssh
帐户配置为仅限于sftp
以下教程:https://solderintheveins.co.uk/2011/03/ubuntu-sftp-only-account-how-to/
sshd_config
摘要中,主要通过以下改变来实现:
Subsystem sftp internal-sftp
Match group sftponly
ChrootDirectory %h
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp
并使帐户只属于sftponly
组:
username=LIMITED_USER
sudo useradd -d /home/${username} -s /usr/lib/sftp-server -M -N -g sftponly ${username}
sudo passwd ${username}
sudo mkdir -p /home/${username}/uploads /home/${username}/.ssh
sudo chown ${username}:sftponly /home/${username}/uploads /home/${username}/.ssh
sudo chmod 700 /home/${username}/.ssh
添加/usr/lib/sftp-server
到/etc/shells
。
由于用户以 Ubuntu Server 风格加密了主目录,因此我将他们的授权密钥放在不同的位置(通过/etc/ssh/sshd_config
, AuthorizedKeysFile /etc/ssh/users_configs/%u/authorized_keys
):
sudo mkdir /etc/ssh/users_configs/${username}
cd /etc/ssh/users_configs/${username}
sudo vim /etc/ssh/users_configs/${username}/authorized_keys
# Here copy desired signature for the purpose from the client
sudo chmod 700 /etc/ssh/users_configs/${username}/authorized_keys
sudo chown ${username}:sftponly /etc/ssh/users_configs/${username}/authorized_keys
“ForceCommand”的问题rsync
和到目前为止的尝试
虽然通过安装sshfs
工作正常,但我遇到了以下问题:如何允许用户也安装rsync
?
我尝试删除ChrootDirectory
并更改ForceCommand
为某种“命令过滤器”(即仅允许命令子集),如下所示:https://binblog.info/2008/10/20/openssh-going-flexible-with-forced-commands/:
$ grep -B 1 ForceCommand /etc/ssh/sshd_config
Match group sftponly
ForceCommand /etc/ssh/wrapper.sh
$ sudo cat /etc/ssh/wrapper.sh
#!/bin/sh
(
echo -n '# '
date
echo $SSH_ORIGINAL_COMMAND
) >> /home/"${USER}"/.ssh_commands_history
case "$SSH_ORIGINAL_COMMAND" in
"allowed_command")
eval $SSH_ORIGINAL_COMMAND
;;
*)
echo ERROR;
exit 1
;;
esac
$ sudo touch /home/LIMITED_USER/.ssh_commands_history
$ sudo chown LIMITED_USER:sftponly /home/LIMITED_USER/.ssh_commands_history
$ sudo chmod 0700 /home/LIMITED_USER/.ssh_commands_history
但终究没有成功。 (我执行ssh u@srv ps
并且它被卡住了,而不是像上面提到的例子那样返回 ps 的输出。这里似乎sshd -ddd
也没有ssh -v
帮助)。
因此:我想创建将用于sshfs
和 的帐户rsyncing
。如何使它们正常工作并受到限制以提高安全性?
答案1
ForceCommand
是不是过滤器,但强制命令,无论命令行如名称所示。rsync
需要运行不同的命令(据我所知......是的,sshd -ddd
并且ssh -vvv
提供会有所帮助)。
一种可能性是将ChrootDirectory
、删除ForceCommand
和复制rsync
(可能还有一些shell
)及其依赖项 ( ldd /usr/bin/rsync
) 保留给chroot
.它并不理想,但它应该可以完成工作并隔离用户与文件系统。
答案2
我找到问题出在哪里了!
当我创建包装器脚本时,我错过了它在 bash 中,并且通过其他教程,我将默认 shell 设置为/usr/lib/sftp-server
.
之后,包装器脚本开始工作,我记录了需要允许的命令。
解决方案:
1.恢复外壳(来自/usr/lib/sftp-server
),因此包装器可以工作:usermod -s /bin/bash LIMITED_USER
2.向包装脚本添加了适当的允许命令
'internal-sftp')
/usr/lib/sftp-server
;;
'/bin/true' \
|'rsync --server --sender -logDtpre.iLsfxC . /home/LIMITED_USER' \
|'rsync --server --sender -vlogDtpre.iLsfxC . /home/LIMITED_USER')
eval $SSH_ORIGINAL_COMMAND 2>>${LOGFILE}
exit $?
;;
对于您可能想要允许的确切命令,例如 rsync 命令,只需尝试运行它们,然后从/user/LIMITED_USER/.ssh_commands_history
包装器脚本记录它们的位置进行复制。
PS 我已将其设为社区 wiki,因此我希望这对于其他可能希望使用 sshfs+rsync 功能且限制 ssh 帐户的人来说更加有用。