带有 chroot 的 SSH 只能工作“sftp”、“rsync”(两者)?

带有 chroot 的 SSH 只能工作“sftp”、“rsync”(两者)?

我的 Ubuntu 服务器中有两个用户和一个共享文件夹:

  1. 用户writer,具有写入权限/var/shared。它是一个使用 SSH 密钥定期从远程更改此文件夹中的文件的应用程序。

  2. 用户reader由多个具有 SSH 密钥的客户端使用,他们可以在未经我许可的情况下获取该密钥,这就是为什么我需要限制此 shell 中可用的命令。

问题:

我需要限制用户可以访问的命令,reader以便它只能使用 sftp 和 rsync 协议(没有像mkdirlstop、 ... 这样的标准命令)。只有目录/var/shared必须是可读的,并且必须是根路径,例如,不需要cd进入它,它已经/在 sftp 或 rsync 中。

我如何编写一个 shell 脚本,以便我可以将它应用于将给出这种行为的usermod -s用户?reader我找不到任何样本。我如何使writer也保持“监禁” /var/share,以便路径相同?

笔记:

  1. 我已经尝试过sshd_configMatch指令ForceCommand internal-sftpChrootDirectory。这要求ChrootDirectory为 root 所有并且不可写(755 或更少),并且不支持rsync.

  2. 我已经尝试过rssh,但它对于登录用户的主目录之外的目录不起作用。所以我无法将用户chroot到具有不同权限的同一目录。

  3. command=".." ssh-rsa....我尝试在文件中使用authorized_keys,但不知道如何启用我需要的行为,我只检查rrsyncrsync 文档中的脚本。这个方法没有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 绑定安装或某种符号链接解决方法在该目录中进行访问。

如果您需要限制sftprsync,则需要借助通过 ssh 公钥或通过ssh 公钥SSH_ORIGINAL_COMMAND强制执行的“包装器”来检查服务器上的环境变量,该变量在用户经过身份验证后填充,并包含客户端正在进行哪种连接的信息建立。因为它会有内部,因为它会有,对于只是会话,它会有,IIRC,变量为空,因为它会是。在服务器上经过身份验证的用户下运行!ForceCommandcommandsftpsftp-serverrsyncrsyncsshssh datedateSSH_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/

相关内容