尝试仅在 chroot jail 中为一个用户设置 SFTP

pzk*_*pfw 8 ssh chroot sftp ubuntu-12.04

希望你们能帮忙看看我是否在这里做了一些奇怪的事情,我正在尝试使用我设置的用户登录,FileZilla 显示给我:

Command:    open "///@///" Command: Pass: ********
Status: Connected to ///
Error:  Connection closed by server with exitcode 1
Error:  Could not connect to server
Run Code Online (Sandbox Code Playgroud)

所以,我进入了 auth.log,我看到了这个:

Feb 12 11:08:49 sshd[12056]: Accepted password for /// from /// port /// ssh2
Feb 12 11:08:49 sshd[12056]: pam_unix(sshd:session): session opened for user /// by (uid=0)
Feb 12 11:08:50 sshd[12164]: subsystem request for sftp by user ///
Feb 12 11:08:50 sshd[12056]: pam_unix(sshd:session): session closed for user ///
Run Code Online (Sandbox Code Playgroud)

这是相关用户的密码条目:

///:x:666:666:///,,,:/chroot:/usr/bin/rssh
Run Code Online (Sandbox Code Playgroud)

如果我尝试自己运行 rssh,我会发现Allowed commands: sftp它似乎设置正确。至于我设置为主文件夹的文件夹,它归用户所属的组“sftp”所有。

显然我在这里做错了,所以我应该尝试接近解决方案的任何提示。

编辑:如果我将 /usr/bin/rssh 更改为 /bin/bash,它工作正常,但用户仍然可以浏览整个系统,这并不理想。基本上,我希望用户直接进入一个目录,就读取写入文件而言,在那里做他们想做的任何事情,但无法进入文件系统,运行其他二进制文件等等。

Dev*_*tor 9

1. 创建一个新组

创建一个名为 sftpusers 的组。只有属于这个组的用户才会被自动限制在这个系统上的 SFTP chroot 环境中。

# groupadd sftpusers
Run Code Online (Sandbox Code Playgroud)

2. 创建用户(或修改现有用户)

假设您要创建一个用户 guestuser,该用户只能在 chroot 环境中执行 SFTP,而不能执行 SSH。

以下命令创建guestuser,将此用户分配到sftpusers 组,将/incoming 作为主目录,将/sbin/nologin 设置为shell(这将不允许用户ssh 并获得shell 访问权限)。

# useradd -g sftpusers -d /incoming -s /sbin/nologin guestuser
# passwd guestuser
Run Code Online (Sandbox Code Playgroud)

验证用户是否已正确创建。

# grep guestuser /etc/passwd
guestuser:x:500:500::/incoming:/sbin/nologin
Run Code Online (Sandbox Code Playgroud)

如果您想修改现有用户并使其仅成为 sftp 用户并将其放入 chroot sftp jail,请执行以下操作:

# usermod -g sftpusers -d /incoming -s /sbin/nologin john
Run Code Online (Sandbox Code Playgroud)

在相关说明中,如果您必须将文件从 Windows 传输到 Linux,请使用前 7 个 sftp 客户端列表中提到的任何一个 sftp 客户端。

3. 在 sshd_config 中设置 sftp-server 子系统

您应该指示 sshd 为 sftp 使用 internal-sftp(而不是默认的 sftp-server)。

修改 /etc/ssh/sshd_config 文件并注释掉以下行:

#Subsystem       sftp    /usr/libexec/openssh/sftp-server
Run Code Online (Sandbox Code Playgroud)

接下来,将以下行添加到 /etc/ssh/sshd_config 文件中

Subsystem       sftp    internal-sftp
Run Code Online (Sandbox Code Playgroud)

它应该是这样的:

# grep sftp /etc/ssh/sshd_config
#Subsystem      sftp    /usr/libexec/openssh/sftp-server
Subsystem       sftp    internal-sftp
Run Code Online (Sandbox Code Playgroud)

4. 为组指定 Chroot 目录

您只想将某些用户(即属于 sftpusers 组的用户)放入 chroot jail 环境中。在 /etc/ssh/sshd_config 的末尾添加以下几行

Match Group sftpusers
        ChrootDirectory /sftp/%u
        ForceCommand internal-sftp
Run Code Online (Sandbox Code Playgroud)

在上面:

  • 匹配组 sftpusers – 这表示以下行将只匹配属于组 sftpusers 的用户
  • ChrootDirectory /sftp/%u – 这是用户通过身份验证后将用于 chroot 的路径。%u 表示用户。因此,对于 john,这将是 /sftp/john。
  • ForceCommand internal-sftp – 这会强制执行 internal-sftp 并忽略 ~/.ssh/rc 文件中提到的任何命令。

5. 创建 sftp 主目录

由于我们在上面指定了 /sftp 作为 ChrootDirectory,所以创建这个目录(它相当于典型的 /home 目录)。

# mkdir /sftp
Run Code Online (Sandbox Code Playgroud)

现在,在 /sftp 下,为属于 sftpusers 组的用户创建单独的目录。即只允许执行 sftp 并且将在 chroot 环境中的用户。

# mkdir /sftp/guestuser
Run Code Online (Sandbox Code Playgroud)

因此,/sftp/guestuser 相当于guestuser 的/。当guestuser sftp 到系统并执行“cd /”时,他们只会看到“/sftp/guestuser”下目录的内容(而不是系统的真实/)。这就是 chroot 的力量。

因此,在此目录 /sftp/guestuser 下,创建您希望用户看到的任何子目录。例如,创建一个传入目录,用户可以在其中 sftp 文件。

# mkdir /sftp/guestuser/incoming
Run Code Online (Sandbox Code Playgroud)

6. 设置适当的权限

为了让 chroot 正常工作,您需要确保在上面刚刚创建的目录上正确设置了适当的权限。

设置用户权限,分组到sftpusers组,如下图。

# chown guestuser:sftpusers /sftp/guestuser/incoming
Run Code Online (Sandbox Code Playgroud)

传入目录的权限如下所示。

# ls -ld /sftp/guestuser/incoming
drwxr-xr-x 2 guestuser sftpusers 4096 Dec 28 23:49 /sftp/guestuser/incoming
Run Code Online (Sandbox Code Playgroud)

/sftp/guestuser 目录的权限如下所示

# ls -ld /sftp/guestuser
drwxr-xr-x 3 root root 4096 Dec 28 23:49 /sftp/guestuser

# ls -ld /sftp
drwxr-xr-x 3 root root 4096 Dec 28 23:49 /sftp
Run Code Online (Sandbox Code Playgroud)

7.重启sshd并测试Chroot SFTP

重启sshd:

# service sshd restart
Run Code Online (Sandbox Code Playgroud)

测试 chroot sftp 环境。如下所示,当gusetuser 执行sftp 并执行“cd /”时,他们只会看到传入的目录。

# sftp guestuser@thegeekstuff.com
guestuser@thegeekstuff's password:

sftp> pwd
Remote working directory: /incoming

sftp> cd /
sftp> ls
incoming
Run Code Online (Sandbox Code Playgroud)

当guestuser 将任何文件从sftp 传输到/incoming 目录时,它们将真正位于系统上的/sftp/guestuser/incoming 目录下。