如何设置 chroot 和非 chroot sftp?

如何设置 chroot 和非 chroot sftp?

我正在尝试设置 Openssh 服务器以允许仅 chroot sftp 用户以及非 chroot sftp 和 ssh 用户。我的精简版(删除了注释和空行) /etc/ssh/sshd_config 如下所示:

Port 22
Protocol 2
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key
UsePrivilegeSeparation yes
KeyRegenerationInterval 3600
ServerKeyBits 768
SyslogFacility AUTH
LogLevel INFO
LoginGraceTime 120
PermitRootLogin yes
StrictModes yes
RSAAuthentication yes
PubkeyAuthentication yes
IgnoreRhosts yes
RhostsRSAAuthentication no
HostbasedAuthentication no
PermitEmptyPasswords no
ChallengeResponseAuthentication no
X11Forwarding yes
X11DisplayOffset 10
PrintMotd no
PrintLastLog yes
TCPKeepAlive yes
AcceptEnv LANG LC_*
#Subsystem sftp /usr/lib/openssh/sftp-server
Subsystem sftp intenal-sftp
UsePAM yes
Match Group sftpusers
        ChrootDirectory /var/sftp/%u
        ForceCommand internal-sftp

我由此取得的成就:

  • sftupsers 组中的用户可以将其文件通过 sftp 传输到其目录中,但无法登录。请检查。
  • 不在 sftpusers 中的用户可以通过 ssh 登录。查看。
  • 不在 sfttpusers 中的用户可以不是sftp 文件。哎呀。

如果我将Subsystem sftp-line 更改为注释掉的版本,“特权”用户可以 sftp 和 ssh,但 chrooted 用户不能再 sftp。

使用上面的配置文件,我Connection closed by server with exitcode 127从 FileZilla 和Fatal: Received unexpected end-of-file from SFTP serverpsftp 收到错误消息。

知道如何解决这个问题吗?

答案1

Subsystem sftp intenal-sftp

应该是“内r纳尔”。

答案2

您不必总是放置Subsystem sftp internal-sftp.这误会就大了!

定义什么Subsystem?让我们检查sshd_config(5)

 Subsystem
         Configures an external subsystem (e.g. file transfer daemon).
         Arguments should be a subsystem name and a command (with optional
         arguments) to execute upon subsystem request.

         The command sftp-server implements the SFTP file transfer
         subsystem.

         Alternately the name internal-sftp implements an in-process SFTP
         server.  This may simplify configurations using ChrootDirectory
         to force a different filesystem root on clients.

         By default no subsystems are defined.

仅当您不想在 chroot 中设置所有文件(即)时,才需要将sftp子系统更改为。internal-sftpChrootDirectory

举个例子 - 如果您想要拥有自己的包装器来执行任何特殊操作并“强制”用户使用 sftp,则您不能拥有,Subsystem sftp internal-sftp因为您无法将其internal-sftp作为命令调用/执行,这是其内部 OpenSSH 的魔力。对于实际情况 - 您希望在rsyncSFTP 会话结束时自动镜像通过 SFTP 上传的所有文件 - 因此您不能使用,internal-sftp但您应该使用sftp子系统的默认值,手动填充 chroot 并仅调用/usr/libexec/sftp-server(或任何其他路径)并rsync在结束后的sftp-server运行。

人们应该阅读手册页来了解后台发生的事情,而不是盲目地遵循任何建议。

相关内容