我正在为 sftp 设置 chroot 并使用了教程的组合(来源1,来源2)并最终得到以下配置/etc/ssh/sshd_config
:
Match Group sftpusers
ForceCommand internal-sftp
ChrootDirectory /var/sftp/
PermitTunnel no
AllowAgentForwarding no
AllowTcpForwarding no
X11Forwarding no
sftp 基本文件夹/var/sftp
和用户创建如下:
groupadd sftpusers
adduser myuser01
mkdir -p /var/sftp/myuser01
usermod -a -G sftpusers myuser01
chown myuser01:myuser01 /var/sftp/myuser01
systemctl restart sshd
现在,当我尝试登录时,我最终会进入该/var/sftp
文件夹,该文件夹演示了登录的工作原理。
由于我希望用户最终进入该文件夹,因此我尝试在该行下/var/sftp/<userid>
设置以下配置:sshd_config
Match Group
ChrootDirectory /var/sftp/%u
client_loop: send disconnect: Broken pipe
当我这样做时,我在尝试登录时收到错误。根据ssh_config
变量应该被接受的手册页,如下:
ChrootDirectory 接受标记 %%、%h 和 %u。
有任何想法吗?
环境:
- 操作系统:Ubuntu 18.04.4 LTS
- sshd:OpenSSH_7.6p1 Ubuntu-4ubuntu0.3,OpenSSL 1.0.2n 2017 年 12 月 7 日
答案1
chown myuser01:myuser01 /var/sftp/myuser01
...
ChrootDirectory /var/sftp/%u
OpenSSH 的 SSH 服务器Chroot目录指令要求 chroot 目录及其父目录由 root 拥有:
Chroot目录
指定身份验证后 chroot(2) 的目录路径名。在会话启动时,sshd(8) 检查路径名的所有组成部分是否为 root 拥有的目录,任何其他用户或组都无法写入这些目录。chroot 后,sshd(8) 将工作目录更改为用户的主目录。
我没有测试过这个,但我思考如果您/etc/passwd
在 chroot 环境中创建一个文件,其中包含相关用户的一行,那么 sshd 将将该行中的主目录字段视为 chroot 环境中用户的主目录。如果这确实有效,那么您可以使用它让用户会话从 chroot 目录以外的某个位置的工作目录开始。
答案2
在您的示例中,/var/sftp
并且/var/sftp/usero1
需要由root
任何其他用户拥有且不可写
您的问题很可能是您这样做的:
chown myuser01:myuser01 /var/sftp/myuser01
root:root
相反,它应该由chmod 755
sudo mkdir /var/sftp
sudo mkdir /var/sftp/myuser01
sudo chown -R root:root /var/sftp
chmod -R 755 /var/sftp
既然用户目录由root:root
其他人拥有且不可写入,您的用户应该能够登录到该目录并通过 sshd internal-sftp 进行 chroot
ForceCommand internal-sftp
ChrootDirectory /var/sftp/
所以,把它们放在一起:
sudo groupadd sftpusers
sudo mkdir /var/sftp
sudo mkdir /var/sftp/myuser01
sudo chown -R root:root /var/sftp
chmod -R 755 /var/sftp
sudo adduser -h /var/sftp/myuser01 myuser01
sudo usermod -a -G sftpusers myuser01
编辑你的/etc/ssh/sshd_config
并将其添加到末尾:
Match Group sftpusers
ForceCommand internal-sftp
ChrootDirectory /var/sftp/%u
PermitTunnel no
AllowAgentForwarding no
AllowTcpForwarding no
X11Forwarding no
然后保存后重启sshd
systemctl restart sshd
我的问题是,这意味着用户“myuser01”对其基本目录没有任何写访问权限......所以在我的情况下,这还不错 - 我实际上需要“myuser01”有一个 www 目录他们需要访问 - 我解决了这个问题
sudo mkdir /var/sftp/myuser01/www/
sudo chown myuser01:myuser01 /var/sftp/myuser01/www/
(更改名称以遵循此处的命名约定)
如果您只想为该用户创建一个 SFTP chroot 监狱,那么这将起作用 - 他们只能使用 SFTP,但您不需要构建一整套 chroot 的命令和库供他们使用。否则,您需要将所需的命令添加到其 bin 目录中,并将所需的库添加到其/lib
目录中,并且我认为 和 的本地副本/etc/passwd
以及/etc/group
所需的组和用户条目(我自己还没有测试过这一点)只需要一个 SFTP chroot 监狱)
答案3
ChrootDirectory 必须包含支持用户会话所需的文件和目录。对于交互式会话,这至少需要一个 shell(通常为 sh(1))和基本 /dev 节点,例如 null(4)、zero(4)、stdin(4)、stdout(4)、stderr(4) 和tty(4) 设备。 对于使用 SFTP 的文件传输会话,如果使用进程内 sftp 服务器,则无需额外配置环境,但在某些操作系统上,使用日志记录的会话可能需要 chroot 目录中的 /dev/log(有关详细信息,请参阅 sftp-server(8))。
答案4
以下内容对我有用。下面只是一个例子。
- 编辑
/etc/ssh/sshd_config
并修改并启用该行如下Subsystem sftp internal-sftp
- 然后转到文件末尾(如果已经存在则进行修改)。 SFTP 基本文件夹将是
/home/sftp
Match Group sftpusers ChrootDirectory /home/sftp ForceCommand internal-sftp X11Forwarding no AllowTcpForwarding no
- 保存文件并重启ssh服务
systemctl restart sshd
然后执行以下命令。sftpuser
将成为我们的用户;sftpusers
将是我们的团体,所以将来
- 只需为 SFTP 创建新用户并添加到
sftpusers
.useradd -d /home/sftp -s /bin/false -g users -G sftpusers sftpuser
- 设置密码
sftpuser
passwd sftpuser
- 执行以下几行
chown root:root /home/sftp #rights for group & others chmod go+rx /home/sftp mkdir /home/sftp/{upload,download} chown sftpuser:users /home/sftp/{upload,download} chown sftpuser:sftpusers /home/sftp/{upload,download}
现在,您可以从任何远程服务器或 SFTP 客户端验证 SFTP:
sftp [email protected]