Docker container CMAKE gives crypto/fips/fips.c:153: OpenSSL internal error: FATAL FIPS SELFTEST FAILURE - dracut-fips crypto.fips_enabled = 1

Docker container CMAKE gives crypto/fips/fips.c:153: OpenSSL internal error: FATAL FIPS SELFTEST FAILURE - dracut-fips crypto.fips_enabled = 1

获取 crypto/fips/fips.c:153:OpenSSL 内部错误:FATAL FIPS SELFTEST FAILURE when

dracut-fips 软件包已安装 and sysctl -a 显示 crypto.fips_enabled = 1

限制:在我的案例中,不能禁用dracut-fips包或crypto.fips_enable设置。

问题:

如何让 cmake --version 在容器内工作?

此主机是容器内部出现问题的地方,而不是 HOST OS.

someLinuxUser@jenkins-project_team_rh ~]$ hostname -f; hostname -i
jenkins-project_team_rh.lewisville.us.company.com
10.20.20.10[someLinuxUser@jenkins-project_team_rh ~]$ cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.9 (Maipo)
[someLinuxUser@jenkins-project_team_rh ~]$
[someLinuxUser@jenkins-project_team_rh ~]$ cmake --version
cmake version 3.18.2

CMake suite maintained and supported by Kitware (kitware.com/cmake).

列出并启动 OpenSuse 15.2 容器

[someLinuxUser@jenkins-project_team_rh ~]$ sudo docker image ls
REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
opensuse-image                15.2                618840498a55        3 hours ago         2.59GB

运行 Docker 容器

现在我在容器里了。 运行在此处使用“cmake --version”失败并出现错误。

注意: 如果您有任何主机 OS,相同的 docker 图像将正常工作,其中“sysctl -a | grep fips”将显示“crypto.fips_enabled = 0”在它的输出中。因此,我们可能需要将此值设置为 0。

[someLinuxUser@jenkins-project_team_rh ~]$ sudo docker run -it opensuse-image:15.2 bash
Active Directory Password:
WARNING: IPv4 forwarding is disabled. Networking will not work.
docker_nonroot_user@eaa40032f4d3:~/git>


docker_nonroot_user@eaa40032f4d3:~/git> which cmake; cmake --version
/usr/bin/cmake
crypto/fips/fips.c:153: OpenSSL internal error: FATAL FIPS SELFTEST FAILURE
Aborted (core dumped)
docker_nonroot_user@eaa40032f4d3:~/git>

docker_nonroot_user@3e63938cf7e7:~/git> cat /etc/os-release
NAME="openSUSE Leap"
VERSION="15.2"
ID="opensuse-leap"
ID_LIKE="suse opensuse"
VERSION_ID="15.2"
PRETTY_NAME="openSUSE Leap 15.2"
ANSI_COLOR="0;32"
CPE_NAME="cpe:/o:opensuse:leap:15.2"
BUG_REPORT_URL="https://bugs.opensuse.org"
HOME_URL="https://www.opensuse.org/"

在 HOST OS (RH 7.9) --/-- 在 Docker 容器内 (OpenSuse 15.2) 运行ning:

[someLinuxUser@jenkins-project_team_rh ~]$ sysctl -a | grep fips_enabled
crypto.fips_enabled = 1

即它显示,此 HOST 机器上启用了 fips。我想如果这个(crypto.fips_enabled 被设置为 = 0)那么我们可能看不到 cmake 的这个问题,但在我的情况下,我不能禁用这个设置。

在主机上,一些相关的包是:

[someLinuxUser@jenkins-project_team_rh ~]$ sudo yum list installed | egrep "fips|openssl|dracut"
dracut-fips.x86_64                  033-572.el7           @rhel-x86_64-server-7
fipscheck.x86_64                    1.4.1-6.el7           @anaconda/7.6
fipscheck-lib.x86_64                1.4.1-6.el7           @anaconda/7.6
CentrifyDC-openssl.x86_64           5.7.1-347             installed
openssl.x86_64                      1:1.0.2k-22.el7_9     @q1_rhel-x86_64-server-7
openssl-devel.x86_64                1:1.0.2k-22.el7_9     @q1_rhel-x86_64-server-7
openssl-libs.x86_64                 1:1.0.2k-22.el7_9     @q1_rhel-x86_64-server-7
openssl098e.x86_64                  0.9.8e-29.el7_2.3     @anaconda/7.6
xmlsec1-openssl.x86_64              1.2.20-7.el7_4        @anaconda/7.6
dracut.x86_64                       033-572.el7           @rhel-x86_64-server-7
dracut-config-rescue.x86_64         033-572.el7           @rhel-x86_64-server-7
dracut-network.x86_64               033-572.el7           @rhel-x86_64-server-7
[someLinuxUser@jenkins-project_team_rh ~]$

现在,证明上面使用的 DOCKER image/container 不错。

在不同的机器上使用相同的 Docker 图像,相同的 HOST OS.

在我拥有的另一台 RH 7.9 OS 主机上,当我启动与 docker 容器相同的 OpenSuse 15.2 图像时,我有相同的 docker 图像 SCP'ed 运行 cmake --version,一切正常,我没有看到这个错误。

运行宁:

[gigauser@rh_7_9_os_machine opensuse-x-project_team_-mse]$ hostname -f; hostname -i
rh_7_9_os_machine.company.local
10.100.100.10
[gigauser@rh_7_9_os_machine opensuse-x-project_team_-mse]$ cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.9 (Maipo)

[gigauser@rh_7_9_os_machine opensuse-x-project_team_-mse]$ sudo docker image ls
REPOSITORY                     TAG                IMAGE ID            CREATED             SIZE
opensuse-image                 15.2               618840498a55        3 hours ago         2.59GB

这个HOST显示:

[gigauser@rh_7_9_os_machine opensuse-x-project_team_-mse]$ sysctl -a 2>/dev/null | grep fips_enabled
crypto.fips_enabled = 0

运行ning Docker 图像 --> 容器和其中的 cmake --version,有效!

[gigauser@rh_7_9_os_machine opensuse-x-project_team_-mse]$ sudo docker run -it opensuse-image:15.2 bash
docker_nonroot_user@fb751d198066:~/git>
docker_nonroot_user@fb751d198066:~/git> sysctl -a 2>/dev/null | grep fips
crypto.fips_enabled = 0
docker_nonroot_user@fb751d198066:~/git>
docker_nonroot_user@fb751d198066:~/git> cmake --version
cmake version 3.17.0

CMake suite maintained and supported by Kitware (kitware.com/cmake).
docker_nonroot_user@fb751d198066:~/git> exit

HOST 机器上的 YUM 包是:

[gigauser@rh_7_9_os_machine opensuse-x-project_team_-mse]$ sudo yum list installed |grep fips
fipscheck.x86_64             1.4.1-6.el7        @anaconda/7.4
fipscheck-lib.x86_64         1.4.1-6.el7        @anaconda/7.4
[gigauser@rh_7_9_os_machine opensuse-x-project_team_-mse]$

[gigauser@rh_7_9_os_machine opensuse-x-project_team_-mse]$ sudo yum list installed |grep openssl
openssl.x86_64               1:1.0.2k-22.el7_9   @rhel-7-server-rhui-rpms
openssl-devel.x86_64         1:1.0.2k-22.el7_9   @rhel-7-server-rhui-rpms
openssl-libs.x86_64          1:1.0.2k-22.el7_9   @rhel-7-server-rhui-rpms
openssl11-libs.x86_64        1:1.1.1g-2.el7      @epel
xmlsec1-openssl.x86_64       1.2.20-7.el7_4      @rhui-REGION-rhel-server-releases
[gigauser@rh_7_9_os_machine opensuse-x-project_team_-mse]$

[gigauser@rh_7_9_os_machine opensuse-x-project_team_-mse]$ sudo yum list installed |grep dracut\-fips
[gigauser@rh_7_9_os_machine opensuse-x-project_team_-mse]$
[gigauser@rh_7_9_os_machine opensuse-x-project_team_-mse]$ sudo yum list installed |grep dracut
dracut.x86_64                033-572.el7       @rhel-7-server-rhui-rpms
dracut-config-generic.x86_64 033-572.el7       @rhel-7-server-rhui-rpms
dracut-config-rescue.x86_64  033-572.el7       @rhel-7-server-rhui-rpms
dracut-network.x86_64        033-572.el7       @rhel-7-server-rhui-rpms

正如您在上面看到的,安装了名为 dracut-fipsNO 包这台机器,假设这就是 crypto.fips_enabled = 0 和“cmake --version”在这个 HOST 和容器内工作的原因!

问题:

如何让 cmake --version 在容器内工作? 当我无法卸载 dracut-fips 包并通过 [=76= 禁用 FIPS ]crypto.fips_enabled = 0 第一个HOST OS.

找到解决方案

为什么 这个问题来了: Docker 构建(创建图像)在一台机器上 运行(另一台机器,cmake 在 docker 容器内工作)...即 FIPS没有安装。 在构建步骤中,Docker 文件是 运行ning zypper install cmake(或yum install cmake)。

由于在构建docker镜像的机器上禁用了FIPS,在docker镜像中安装了cmake,不理解FIPS 正在启用/dracut-fips 正在安装。

然后,当您复制此图像并在实际启用 FIPS 的机器上使用它时,cmake 失败并显示错误消息:crypto/fips/fips.c:153: OpenSSL internal error: FATAL FIPS SELFTEST FAILURE

其实有2种解法

--

解决方案 #1:适当地标记您的 docker 图片。

总结:

PS: 如果你使用上面的方法安装 cmake,那么它只会在你 运行 容器,如果该机器的 FIPS 在构建时被禁用或启用。即,如果启用了 FIPS,您将 cmake 和 运行 安装在与主机不同的 FIPS 设置的机器上,在主机上构建图像,然后您将阅读这个post寻求帮助。

如果您想使用上述包管理器安装 cmake,更好的方法是在映像创建期间适当地标记您的 docker 映像,即:

docker build -t <image-name>-fips-enabled ... 如果启用 FIPS

docker build -t <image-name>-fips-disabled ... 如果那台机器上的 FIPS 被禁用。

这样,您可以选择正确的 docker 图片 imagename-fips-enabled vs imagename-fips-disabled符合。到你的目标机器 FIPS 设置是什么(你将使用这个图像实际执行 docker run ...)。

--

解决方案 #2:如果您有 RedHat 容器,请不要使用 zypper (OpenSuse) 或 yum。 这个解决方案在某种意义上是灵活的,它独立于主机上的 FIPS 设置 = 0 / 1,其中图像建成。

我没有使用zypper/yumDockerfile里面安装cmake,只是抓取了cmake-3.18.2-Linux-x86_64.tar.gz 捆绑文件。

在 Docker 文件中,我只是将这个 .tar.gz 文件提取到某个目录中。 我还在 运行 语句中的 Docker 文件中设置了 export PATH:/path/where/I/installed/cmake-3.18.2../bin:/..some_other_paths:/...:/....

RUN export PATH=/path/where/I/installed/cmake-3.18.2../bin:/...... && <more cmds here> && <some other cmds here> && ... etc,因此它可以为任何 buil-time(cmake 操作)找到提取的 cmake 3.18.2,并且还可以设置相同的 PATH=/... 变量作为ENV PATH=/.... same value used during RUN for PATH 所以在 运行 时间,当容器 运行s 时,$PATH 全部设置为查找 cmake(3.18.2 版本)而不是使用任何现有的 /usr/bin/cmake or some other shit).

Docker文件快照:

#    curl -k -sSf -H "X-JFrog-Art-Api:dslfhjlieurqwihlj233lk2l4j6p9usdkajdfasddl809842iijhlkhflhafOHIHFLyeaGoodLuck" \
#    -o /tmp/cmake.tar.gz https://artifactory.company.com/artifactory/some-Local/cmake/cmake-3.18.2-Linux-x86_64.tar.gz && \

因为我的 umask 设置被设置为 022,我不需要做任何 chicken chmod 操作 post解压:

#    echo -e "\n-- Installing CMake ...\n" && \
#    tar -xvzpf /tmp/cmake.tar.gz -C /home/docker_nonroot_user/tools/ && \

在 docker 容器内,由于 ENV PATH=/... 也在 Docker 文件中为此目标路径设置,正确的 cmake 3.18.2 用于 docker容器运行时间动作。

cmake 我的安装位置是:

/home/docker_nonroot_user/tools/cmake-3.18.2-Linux-x86_64/bin/cmake

docker 容器内的路径是:

/home/docker_nonroot_user/tools/cov-analysis/bin:/home/docker_nonroot_user/tools/cmake-3.18.2-Linux-x86_64/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

结果:

使用 Docker 使用上面的 SOLUTION #2 构建的图像,即 docker 在 机器上构建的图像,其中 FIPS = 0 又名 DISABLED 然后稍后,使用相同的图像在完全不同的目标主机 上创建容器 ,其中 FIPS = 1 又名 ENABLED,我看到:

87d8104d8c41:/home/docker_nonroot_user # sysctl -a|grep fips_en
crypto.fips_enabled = 1
87d8104d8c41:/home/docker_nonroot_user #
87d8104d8c41:/home/docker_nonroot_user # which cmake
/usr/bin/cmake
87d8104d8c41:/home/docker_nonroot_user #
87d8104d8c41:/home/docker_nonroot_user # cmake --version
crypto/fips/fips.c:153: OpenSSL internal error: FATAL FIPS SELFTEST FAILURE
Aborted (core dumped)
87d8104d8c41:/home/docker_nonroot_user #

87d8104d8c41:/home/docker_nonroot_user #
87d8104d8c41:/home/docker_nonroot_user # ls -l /home/docker_nonroot_user/tools/cmake-3.18.2-Linux-x86_64/bin
total 75504
-rwxr-xr-x 1 root root 11908568 Aug 20  2020 ccmake
-rwxr-xr-x 1 root root 12096216 Aug 20  2020 cmake
-rwxr-xr-x 1 root root 27476480 Aug 20  2020 cmake-gui
-rwxr-xr-x 1 root root 12398808 Aug 20  2020 cpack
-rwxr-xr-x 1 root root 13318712 Aug 20  2020 ctest
87d8104d8c41:/home/docker_nonroot_user #
87d8104d8c41:/home/docker_nonroot_user # ls -l /home/docker_nonroot_user/tools/cmake-3.18.2-Linux-x86_64/bin/cmake
-rwxr-xr-x 1 root root 12096216 Aug 20  2020 /home/docker_nonroot_user/tools/cmake-3.18.2-Linux-x86_64/bin/cmake
87d8104d8c41:/home/docker_nonroot_user #
87d8104d8c41:/home/docker_nonroot_user # /home/docker_nonroot_user/tools/cmake-3.18.2-Linux-x86_64/bin/cmake --version
cmake version 3.18.2

CMake suite maintained and supported by Kitware (kitware.com/cmake).
87d8104d8c41:/home/docker_nonroot_user # : Merry X-mas Baaaaeeebyyy! - no more FIPS shit error now. Next I'll fix some chown on ~<user> and close my story.

解决方案 #3:您可以禁用 FIPS 但前提是您被允许这样做,然后您不需要解决方案 #1 或解决方案 #2。

关于 OpenSSL 错误的 MISC 信息:

模块中 self-test 失败的影响因失败的 self-test 类型而异。

FIPS_mode_set() 函数使用 HMAC SHA-256 摘要验证 运行time 可执行文件的完整性, 这是在构建时计算的。如果此计算出的 HMAC SHA-256 摘要与存储的已知摘要匹配,则 power-up self-test(由 algorithm-specific 成对一致性和已知答案测试组成)是 执行。

Non-fatal self-test 错误将模块转换为错误状态。必须重新启动应用程序才能恢复 从这些错误。 non-fatal self-test 错误是:

FIPS_R_FINGERPRINT_DOES_NOT_MATCH - 完整性验证检查失败

FIPS_R_FIPS_SELFTEST_FAILED - 已知答案测试失败

FIPS_R_SELFTEST_FAILED - 已知答案测试失败

FIPS_R_TEST_FAILURE – 已知答案测试失败 (RSA);成对一致性测试失败 (DSA)

FIPS_R_PAIRWISE_TEST_FAILED – DSA 或 RSA 密钥生成期间的成对一致性测试失败

FIPS_R_FIPS_MODE_ALREADY_SET - 应用程序在已经初始化时初始化 FIPS 模式

这些错误是通过共享库的常规ERR接口报告的,可以通过 ERR_get_error() 等函数。有关功能说明,请参阅 OpenSSL 模块手册页。

仅当模块处于错误状态(self-test 失败)且应用程序调用 在正常情况下不能 return 错误的模块的加密函数(void return 函数)。这 错误消息:'FATAL FIPS SELFTEST FAILURE' 打印到 stderr,应用程序终止 中止()调用。

从致命错误中恢复的唯一方法是重新启动应用程序。如果故障仍然存在,您必须重新安装模块。如果您下载了该软件,请验证包哈希以确认下载正确。

重要提示:

如果您安装了较新版本的 OpenSSL x.y.z (rpm/etc) 而没有 reboot/restart 您的机器,一些使用 openssl 的库将容易受到攻击/出错也有类似的错误。

你可以通过 运行ning 测试这个:

  1. uptime命令查看你的server/machine已经UP n 运行ning了多长时间。
  2. sudo lsof | grep libssl.so 或查找进程 运行 已删除 OpenSSL 库,运行:

sudo lsof | grep DEL.*libssl

因此,请尝试重新启动您的机器并查看错误是否消失并检查上述命令的输出。

有关详细信息,请参阅此 link:https://raymii.org/s/snippets/Find_all_services_using_libssl_to_restart_after_an_OpenSSL_update.html