获取crypto/fips/fips.c:153:OpenSSL 内部错误:FATAL FIPS SELFTEST FAILURE什么时候
德拉库特-菲普斯软件包已安装和 sysctl -a节目crypto.fips_enabled = 1
限制: 能不是在我的情况下禁用dracut-fips
包或crypto.fips_enable
设置。
问题:
我怎样才能cmake --version
在容器内部工作?
此主机的问题出在容器内部,而不是主机操作系统。
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”失败并出现错误。
笔记:如果您拥有任何主机操作系统,相同的 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/"
在主机操作系统(RH 7.9)上 --/-- 在 Docker 容器(OpenSuse 15.2)内运行:
[someLinuxUser@jenkins-project_team_rh ~]$ sysctl -a | grep fips_enabled
crypto.fips_enabled = 1
即它显示,此主机上已启用 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 镜像/容器还不错。
在不同的机器、相同的 HOST OS 上使用相同的 Docker 镜像。
这是我拥有的另一台 RH 7.9 OS 主机,具有相同的 docker 镜像,当我启动与 docker 容器相同的 OpenSuse 15.2 镜像并运行cmake——版本,一切运行正常,我没有看到这个错误。
跑步:
[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
运行 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
主机上的 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
正如你在上面看到的,不包命名德拉库特-菲普斯安装在这台机器上,假设这就是为什么crypto.fips_enabled = 0并且“cmake --version”在此主机和容器内都可以工作!!
问题:
我怎样才能cmake --version
在容器内部工作?当我无法卸载dracut-fips
软件包并禁用 FIPS 时crypto.fips_enabled = 0在第一个主机操作系统上。
答案1
找到解决方案
为什么问题来了:Docker build(用于创建映像)在一台机器上运行(另一台机器,其中 cmake 在 docker 容器内工作)...即未安装 FIPS。在构建步骤中,Docker file 正在运行
zypper install cmake
(或yum install cmake
)。
由于在构建 docker 镜像的机器上禁用了 FIPS,构建安装在 docker 镜像中,但不了解是否启用了 FIPS / 是否安装了 dracut-fips。
然后,当您复制此图像并在实际启用了 FIPS 的机器上使用它时,cmake 会失败并显示以下错误消息:crypto/fips/fips.c:153: OpenSSL internal error: FATAL FIPS SELFTEST FAILURE
实际上有两个解决方案。
--
解决方案 #1:适当地标记你的docker镜像。
概括:
附言: 如果您确实使用上述方法安装 cmake,那么它将仅在运行容器的目标机器上工作,如果该机器的 FIPS 在构建时被禁用或启用。即,如果启用了 FIPS,则安装 cmake 并在与构建图像的主机的 FIPS 设置不同的机器上运行它,那么您将阅读这篇文章寻求帮助。
如果您想使用上述包管理器安装 cmake,更好的方法是在创建镜像时适当地标记您的 docker 镜像,即:
docker build -t <image-name>-fips-enabled ...
如果启用了 FIPS
和
docker build -t <image-name>-fips-disabled ...
如果该机器上的 FIPS 被禁用。
这样,你就可以选择正确的docker镜像映像名称-fips-enabled对比图像名称-fips-已禁用根据您的目标机器的 FIPS 设置(您将实际docker run ...
使用此图像执行的操作)。
--
解决方案 #2:如果您有 RedHat 容器,请不要使用 zypper(OpenSuse)或 yum。并且该解决方案非常灵活从某种意义上来说独立于 FIPS 设置 = 0 / 1在构建图像的主机上。
我没有使用zypper
/yum
来安装cmake
里面Dockerfile
,只是抓取cmake-3.18.2-Linux-x86_64.tar.gz捆绑文件。
在 Dockerfile 中,我只是将此 .tar.gz 文件提取到某个目录中。我还在export PATH:/path/where/I/installed/cmake-3.18.2../bin:/..some_other_paths:/...:/....
Dockerfile 中的 RUN 语句中进行了设置。
即
RUN export PATH=/path/where/I/installed/cmake-3.18.2../bin:/...... && <more cmds here> && <some other cmds here> && ... etc
,它可以找到任何构建时(cmake 操作)提取的 cmake 3.18.2,并设置相同的路径=/…变量,因此ENV PATH=/.... same value used during RUN for PATH
在运行时,当容器运行时,$PATH 全部设置为查找cmake
(3.18.2 版本)而不是使用任何现有的/usr/bin/cmake or some other shit
)。
Dockerfile 快照:
# 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操作:
# echo -e "\n-- Installing CMake ...\n" && \
# tar -xvzpf /tmp/cmake.tar.gz -C /home/docker_nonroot_user/tools/ && \
在 docker 容器内部,正如ENV PATH=/...
在 Dockerfile 中为此目标路径设置的那样,cmake
在 docker 容器运行时操作中使用了正确的 3.18.2。
构建我安装的位置是:
/home/docker_nonroot_user/tools/cmake-3.18.2-Linux-x86_64/bin/cmake
Docker 容器内的 PATH 为:
/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 镜像解决方案 #2以上,即在一台机器上构建的docker镜像其中 FIPS = 0 又称为已禁用和然后使用同一图像创建容器在完全不同的目标主机上其中 FIPS = 1 又称已启用, 我懂了:
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。