我正在尝试设置 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 server
psftp 收到错误消息。
知道如何解决这个问题吗?
答案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-sftp
ChrootDirectory
举个例子 - 如果您想要拥有自己的包装器来执行任何特殊操作并“强制”用户使用 sftp,则您不能拥有,Subsystem sftp internal-sftp
因为您无法将其internal-sftp
作为命令调用/执行,这是其内部 OpenSSH 的魔力。对于实际情况 - 您希望在rsync
SFTP 会话结束时自动镜像通过 SFTP 上传的所有文件 - 因此您不能使用,internal-sftp
但您应该使用sftp
子系统的默认值,手动填充 chroot 并仅调用/usr/libexec/sftp-server
(或任何其他路径)并rsync
在结束后的sftp-server
运行。
人们应该阅读手册页来了解后台发生的事情,而不是盲目地遵循任何建议。