Openssh - 允许 root 访问 sftp 和 ssh

Openssh - 允许 root 访问 sftp 和 ssh

我想在我的服务器上配置 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

强制执行 指定的命令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

相关内容