使用官方 Docker 存储库时启用 chroot 时 SFTP CPU 使用率过高

使用官方 Docker 存储库时启用 chroot 时 SFTP CPU 使用率过高

我有一个相当小众的问题,涉及 Docker、Fedora 37 和一个 500M 以上的拉取 SFTP 映像,atmoz/sftp.

我从官方存储库安装了 Docker,而不是 Fedora 的,当我尝试登录 SFTP 服务器时,容器使用了 100% 的一个 CPU 核心。一两分钟后,它终于登录并收到sftp>提示。

启动SFTP服务器

docker container run \
--interactive \
--tty \
--rm \
--name sftp-cpu-problem-debug \
--publish 2222:22 \
--env SFTP_USERS=cpuproblem:123:::IN \
atmoz/sftp:alpine

# You might have to kill it from a separate session using docker kill sftp-cpu-problem-debug

尝试登录(在单独的终端会话中)

sftp -P 2222 -oLogLevel=DEBUG3 cpuproblem@localhost
# Password is 123

我也尝试使用 DEBUG3 日志记录启动 SSH 守护进程,但日志条目与其在没有 CPU 问题的情况下工作的日志条目相同。

当我ChrootDirectory %h从容器中的文件中删除该行时/etc/ssh/sshd_config,即使使用官方 Docker 软件包,它也可以毫无问题地登录。当然,这会禁用 chroot。

以下尝试均产生了一个可以正常工作的 SFTP 容器,我可以在其中登录而不会出现 CPU 问题。

  • 使用 Podman 而不是 Docker 来启动使用相同映像的容器,并使用默认启用 chroot 的 SFTP 配置。
  • 使用moby-engineFedora 存储库中的软件包,而不是 Docker 存储库中的官方 Docker 软件包。
  • 在 Debian 上的 WSL2 中使用官方 Docker 存储库包。

这看起来像是某种 Fedora 配置问题,因为相同的版本可以在 Debian 上运行,并且 Fedora 软件包(只是较旧的次要版本)也可以运行。

  • Fedoramoby-engine软件包配置了哪些官方 Docker 软件包没有配置的内容?
    • 这可能不相关,但这让我想起了 Spring Java 应用程序启动缓慢的情况,因为 Spring Security 缺乏熵,并且没有使用/dev/urandom.
    • 这是一个非常奇怪的极端情况。
      • 在给我 SFTP 提示之前,SSH 守护进程试图计算什么?
      • 为什么禁用 chroot 可以解决这个问题?
      • 为什么这在 Debian 上不是问题?
  • 我尝试将 SELinux 设置为 permissive 运行,也尝试使用 运行--privileged,但仍然存在 CPU 问题。
  • 我尝试手动更新容器中的 OpenSSH,但这也没有帮助。

答案1

我今天遇到了这个问题,经过一番strace搜索,我发现了 Alexandru Scvorşov 的以下博客文章:

56. 调试 SFTP 登录后 12 分钟的挂起

您绝对应该阅读它,但简而言之,OpenSSH 使用 BSD 特定的系统调用来关闭所有大于给定整数的文件描述符。此系统调用在 Linux 中不可用,因此回退实现会调用close()每个候选文件描述符,直至达到系统限制。

这篇文章介绍了更多细节,可能有助于解决此问题。

相关内容