我编写了以下运行良好的脚本。它将创建一个 sftp 用户,当用户登录时,他们将处于 中/var/base/test1
,他们无法在此目录中写入,他们需要输入/var/base/test1/test1
,然后才能写入。
/var/base/test1/test1
但是,这有点烦人,理想情况下我希望用户通过 ftp 登录时进入目录。有没有办法实现这一点?如果我将 ChrootDirectory(在 sshd_config 中)更改为/var/base/test1/test1
,则 ftp 用户将无法再登录。
mkdir -p /var/base/test1/test1
chown root:root /var/base/test1
chown root:root /var/base
chmod 755 /var/base/test1
adduser --disabled-password --gecos test1
echo “test1:apassword” | chpasswd
chown test1:test1 /var/base/test1/test1
vim /etc/ssh/sshd_config
systemctl restart sshd
sshd_配置:
Match User test1
ForceCommand internal-sftp
PasswordAuthentication yes
ChrootDirectory /var/base/test1
PermitTunnel no
AllowAgentForwarding no
AllowTcpForwarding no
X11Forwarding no
答案1
简短回答
这是不可能的,但设置 home/test1
作为一种解决方法。
长答案
openssh
要求ChrootDirectory
和所有指向它的路径组件都属于 root 所有,并且其他任何人都无法写入。这是一项安全措施,以确保 不会ChrootDirectory
被恶意操纵,例如被替换为指向完全其他地方的符号链接。如果 或其ChrootDirectory
任何父目录不属于 root 所有,或不是组或世界可写的,则sshd
拒绝登录。如果发生这种情况,您会在 中看到类似以下内容/var/log/auth.log
:
Jun 10 07:54:01 ubuntu-bionic sshd[2251]: fatal: bad ownership or modes for chroot directory "/var/base/test1"
Jun 10 07:54:01 ubuntu-bionic sshd[2173]: pam_unix(sshd:session): session closed for user test1
错误信息应该会给你指明正确的方向。
这也明确说明了sshd_config 手册页:
Chroot目录
指定在认证后 chroot(2) 到的目录路径名。在会话启动时,sshd(8) 检查路径名的所有组件是否都是 root 拥有的目录,且其他任何用户或组都无法写入。chroot 之后,sshd(8) 将工作目录更改为用户的主目录。[...]为了安全起见,防止目录层次结构被系统上的其他进程(尤其是 jail 之外的进程)修改非常重要。配置错误可能会导致 sshd(8) 无法检测到的不安全环境。
解决方法
但是,您可以将用户的主目录设置为/test1
( sudo usermod test1 -d /test1
),这样在chroot
应用 后目录将更改为/var/base/test1/test1
。这样,用户无需更改为 ,test1
而是sftp
在该目录中开始其会话。
$ sftp -P 2222 test1@localhost
test1@localhost's password:
Connected to localhost.
sftp> pwd
Remote working directory: /test1