服务器突然耗尽熵

服务器突然耗尽熵

自昨天重启以来,我们的一个虚拟服务器(Debian Lenny,使用 Xen 虚拟化)一直在耗尽熵,导致在尝试通过启用 SSH / TLS 的协议进行连接时出现超时等情况。有没有办法检查哪些进程正在消耗所有熵?

编辑:

我尝试过的:

  • 添加额外的熵源:time_entropyd、rng-tools 将 urandom 反馈到随机、伪随机文件访问中——每秒产生约 1 MiB 的额外熵,问题仍然存在
  • 通过 lsof、netstat 和 tcpdump 检查异常活动 – 没有发现任何异常。没有明显的负载或其他异常
  • 停止守护进程、重新启动永久会话、重新启动整个虚拟机 - 行为没有变化

最终有效的方法如下:

  • 等待。从昨天中午开始,就不再有连接问题了。熵仍然有点低(128 字节峰值),但 TLS/SSH 会话不再有明显的延迟。我正在慢慢将我们的客户端切换回 TLS(所有五个!),但我现在不期望行为有任何变化。所有客户端现在都再次使用 TLS,没有问题。真的,真的很奇怪。

答案1

lsof没有作为诊断实用程序来源的情况下,使用审计设置某些东西是否可行?没有打开就无法耗尽熵池/dev/random,因此如果您在处理打开时进行审计/dev/random,罪魁祸首(或至少是需要进一步检查的候选集)应该会很快消失。

答案2

通常,对于需要“足够”熵的面向公众的服务器,我会建议使用诸如熵密钥之类的东西,这是一种向 Linux 熵池添加随机位的硬件设备 (USB)。但您不会与外界交流。

虚拟机可能存在缺乏外部随机性的问题。

您的评论“备份域控制器”确实增加了熵的可能用途:Windows 域确实在证书中使用随机数。

答案3

也许lsof(列出打开的文件)可能会有所帮助。这显示哪个进程当前保持打开的文件。在您的情况下,这仅在您发现进程消耗熵时才有帮助,如果该进程不会长时间保持句柄打开。

$ lsof /dev/urandom
COMMAND     PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
xfce4-ses  1787   to   15r   CHR    1,9      0t0 8199 /dev/urandom
applet.py  1907   to    9r   CHR    1,9      0t0 8199 /dev/urandom
scp-dbus-  5028   to   10r   CHR    1,9      0t0 8199 /dev/urandom
firefox    6603   to   23r   CHR    1,9      0t0 8199 /dev/urandom
thunderbi 12218   to   23r   CHR    1,9      0t0 8199 /dev/urandom

这只是我工作站的一个示例。但深入研究 lsof 可能会有所帮助。

答案4

如果没有更好的解决方案,您可以使用大炮并全局包装 open() 系统调用来记录尝试打开 /etc/[u]random 的进程。

只需编写一个定义 open() 的库,该库会记录日志,然后调用原始 libc open()。

提示:人ld.so/etc/ld.so.预加载

我们这里也发生过类似的事情: https://stackoverflow.com/questions/9614184/how-to-trace-per-file-io-operations-in-linux

警告:我自己从来没有这样做过。可能会破坏你的系统,因为每一个open() 将运行您的库。在调试环境中或如果您是 RM Stallman,则可能没问题。

相关内容