我的 Ubuntu 服务器中有两个用户和一个共享文件夹:
用户
writer
,具有写入权限/var/shared
。它是一个使用 SSH 密钥定期从远程更改此文件夹中的文件的应用程序。用户
reader
由多个具有 SSH 密钥的客户端使用,他们可以在未经我许可的情况下获取该密钥,这就是为什么我需要限制此 shell 中可用的命令。
问题:
我需要限制用户可以访问的命令,reader
以便它只能使用 sftp 和 rsync 协议(没有像mkdir
、ls
、top
、 ... 这样的标准命令)。只有目录/var/shared
必须是可读的,并且必须是根路径,例如,不需要cd
进入它,它已经/
在 sftp 或 rsync 中。
我如何编写一个 shell 脚本,以便我可以将它应用于将给出这种行为的usermod -s
用户?reader
我找不到任何样本。我如何使writer
也保持“监禁” /var/share
,以便路径相同?
笔记:
我已经尝试过
sshd_config
和Match
指令ForceCommand internal-sftp
了ChrootDirectory
。这要求ChrootDirectory
为 root 所有并且不可写(755 或更少),并且不支持rsync
.我已经尝试过
rssh
,但它对于登录用户的主目录之外的目录不起作用。所以我无法将用户chroot到具有不同权限的同一目录。command=".." ssh-rsa....
我尝试在文件中使用authorized_keys
,但不知道如何启用我需要的行为,我只检查rrsync
rsync 文档中的脚本。这个方法没有chroot
我需要的功能。
至少能给我一个这样的贝壳的样品吗?这可以通过脚本实现吗?
欢迎使用 Bash 和 C++(如果需要)。输出ldd /bin/bash
:
linux-vdso.so.1 => (0x00007fff7e9d1000)
libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f79dfd8b000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f79dfb87000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f79df7bd000)
/lib64/ld-linux-x86-64.so.2 (0x000055bd0767c000)
答案1
首先ChrootDirectory
必须由root拥有并且不能被其他用户写入。因此/var/shared
在你的情况下不能是ChrootDirectory
价值。
我建议创建一个只能由 root 用户写入的目录,并可以/var/shared
通过 Linux 绑定安装或某种符号链接解决方法在该目录中进行访问。
如果您需要限制sftp
或rsync
,则需要借助通过 ssh 公钥或通过ssh 公钥SSH_ORIGINAL_COMMAND
强制执行的“包装器”来检查服务器上的环境变量,该变量在用户经过身份验证后填充,并包含客户端正在进行哪种连接的信息建立。因为它会有内部,因为它会有,对于只是会话,它会有,IIRC,变量为空,因为它会是。在服务器上经过身份验证的用户下运行!ForceCommand
command
sftp
sftp-server
rsync
rsync
ssh
ssh date
date
SSH_ORIGINAL_COMMAND
这可能是包装器的开始:
#!/usr/bin/env bash
set -eu
set -o pipefail
[[ -z "${SSH_ORIGINAL_COMMAND:-}" ]] && exit 1
case "${SSH_ORIGINAL_COMMAND}" in
"/usr/libexec/openssh/sftp-server")
exec /usr/libexec/openssh/sftp-server
;;
"rsync --server"*)
exec ${SSH_ORIGINAL_COMMAND}
;;
*)
exit 1
;;
esac
正如您所看到的,ssh -v
它为您提供有关服务器将执行哪些命令的信息。因此,您/tmp
也可以更改包装器中的其他内容。
$ rsync -a -e "ssh -v" bin localhost:/tmp/ 2>&1 | grep '^debug.*Sending command:'
debug1: Sending command: rsync --server -logDtpre.iLsfxC . /tmp/