我想在我的服务器上配置 sftp 以供 root 用户访问。
我将配置更改为/etc/ssh/sshd_config
:
PermitRootLogin yes
AuthorizedKeysFile .ssh/authorized_keys
PermitEmptyPasswords yes
ChallengeResponseAuthentication no
Compression no
ClientAliveInterval 15
ClientAliveCountMax 4
#Other options are commented
[...]
Subsystem sftp /usr/libexec/sftp-server
Match user root
ChrootDirectory /
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp
它可以正常工作,我可以通过 sftp 连接到我的服务器,但现在我再也无法通过 ssh 连接了。我收到以下消息:
This service allows sftp connections only.
同样的情况也发生在Match group root
我如何配置 sftp 以允许 root 但同时保留 ssh?
更新:
注释 ForceCommand 内部 sftp 选项 ssh 仍然有效,但我无法通过 sftp 连接。sshd_config:Subsystem sftp /usr/libexec/sftp-server
Match user root
ChrootDirectory /
X11Forwarding no
AllowTcpForwarding no
#ForceCommand internal-sftp
错误:
user@notebook:~$ sftp root@my_device
Warning: the ECDSA host key for 'my_device' differs from the key for the IP address 'xx.xx.xx.xx'
Offending key for IP in /home/myUser/.ssh/known_hosts:78
Matching host key in /home/myUer/.ssh/known_hosts:93
Are you sure you want to continue connecting (yes/no)? yes
Connection closed.
Connection closed
在服务器端:
root@my_device:~# cat /var/log/auth.log | grep ssh
2024-01-17T19:25:21.659884+00:00 my_device sshd[30592]: Accepted none for root from xx.xx.xx.xx port 38024 ssh2
2024-01-17T19:25:21.881328+00:00 my_device sshd[30592]: Received disconnect from xx.xx.xx.xx port 38024:11: disconnected by user
2024-01-17T19:25:21.881997+00:00 my_device sshd[30592]: Disconnected from user root xx.xx.xx.xx port 38024
注意:如果我也删除它,Subsystem sftp /usr/libexec/sftp-server
因为在尝试通过 sftp 连接时出现了不同的错误:
subsystem request failed on channel 0
答案1
该ForceCommand
指令仅允许 root 使用 sftp,请尝试注释掉该行。
答案2
OpenSSH 手册页sshd_配置(5)描述如下:
强制执行 指定的命令
ForceCommand
,忽略客户端提供的任何命令(~/.ssh/rc
如果存在)。使用带有 选项的用户登录 shell 调用该命令-c
。这适用于 shell、命令或子系统执行。它在Match
块内最有用。客户端最初提供的命令在SSH_ORIGINAL_COMMAND
环境变量中可用。指定 的命令internal-sftp
将强制使用进程内 SFTP 服务器,该服务器在与 一起使用时不需要支持文件ChrootDirectory
。默认值为none
。
正如这里所述,您ForceCommand internal-sftp
只允许 SFTP。
此外,PermitRootLogin yes
很危险,因为它启用了 root 密码验证,并且ChrootDirectory /
并不是真正的限制chroot 监狱完全没有。建议
- 使用公钥认证
root
或者完全禁用root
登录 - 使用
sudo
而不是直接root
登录 sudo
对具有特权的任何用户使用公钥认证- 使用密码
sudo
(与前者一起,它实际上是升级权限的 MFA)。
我不断提醒这些,因为服务器故障是针对与业务环境相关的问题,而您当前的配置并未在此背景下展示合理的做法。
答案3
您可以尝试运行这个 ansible playbook,它会检查您的 ssh 配置并创建一个安全的 ssh 配置。 https://github.com/dev-sec/ansible-collection-hardening/tree/master/roles/ssh_hardening
运行此命令后,您只需要在 sshd_config 中允许 rootlogin,然后 ssh 和 sftp 都可以正常工作
答案4
好吧,这里的问题是/usr/libexec/sftp-server
服务器端不存在。我使用新的 Yocto 构建将其添加到图像中,然后我能够使用默认配置通过 root 通过 ssh 和 sftp 进行连接:
# override default of no subsystems
Subsystem sftp /usr/libexec/sftp-server
# Example of overriding settings on a per-user basis
#Match User anoncvs
# X11Forwarding no
# AllowTcpForwarding no
# PermitTTY no
# ForceCommand cvs server