InSpec测试报告中端口5432未被监听的问题

87次阅读
没有评论

问题描述

在使用InSpec 2.1.10测试一个基于PostgreSQL容器时,遇到了一个问题:尽管Docker、netstat和psql都报告端口正确映射,但简单的端口检查却无法返回true。虽然这可能是InSpec的一个bug,但更有可能是用户自己遗漏了什么步骤。用户想要知道自己漏掉了什么。

重复测试

我的规范 (port_test.rb)

describe port(5432) do
  it { should be_listening }
end

我的测试命令

container=$(docker run -d -P --rm postgres:alpine)
inspec exec port_test.rb -t docker://$container

我的输出

Profile: tests from test.rb (tests from test.rb)
Version: (not specified)
Target:  docker://8caceaa7e2eefa4a2bf50a58ea1ddf9c927c08d3397e3d9ad5b60d3519971380
Port 5432     ×  should be listening
expected `Port 5432.listening?` to return true, got false
Test Summary: 0 successful, 1 failure, 0 skipped

但它应该正常工作!

除了InSpec之外,其他工具都报告事情正在按预期工作。

$ docker port $container
5432/tcp -> 0.0.0.0:32770

# 在容器内部使用netstat
$ docker exec $container netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:5432            0.0.0.0:*               LISTEN      -

# 在macOS Docker宿主机上执行,flags等同于在Linux上执行的`-lntp`
$ netstat -anv | fgrep $(docker port $container | cut -d: -f2)
tcp6       0      0  ::1.32770              *.*                    LISTEN      131072 131072    709      0
tcp4       0      0  *.32770                *.*                    LISTEN      131072 131072    709      0

# 从主机连接到容器内的数据库
$ psql -h localhost -p $(docker port $container | cut -d: -f2)
psql (PostgreSQL) 10.3

解决方案

以下解决方案考虑版本和操作系统的差异,若遇到问题请参考相关文档或寻求支持。
在这个情况下,问题似乎出现在InSpec的netstat输出解析与Alpine容器的netstat输出组合上。以下是解决方案:

方案

在Alpine容器内安装iproute2包,这可以通过以下命令完成:

apk add iproute2

然后,重新运行InSpec测试,这应该可以解决netstat输出解析的问题。

结论

问题是InSpec与Alpine的netstat输出之间的不兼容性。通过安装iproute2包,你可以确保InSpec能够解析正确的netstat输出,从而在测试中正确检测端口是否被监听。
如果问题仍然存在,建议向InSpec团队报告此问题,以便他们进一步解决并修复这个bug。

正文完