Вопрос или проблема
Контейнер ubi9, построенный с включенным FIPS и криптополитикой FIPS:NO-ENFORCE-EMS (или любой другой), не пройдет проверку как fips-mode-setup --check
, так и update-crypto-policy --check
.
FROM redhat/ubi9:9.5
RUN fips-mode-setup --enable
# RUN fips-mode-setup --check ЭТА ПРОВЕРКА ПРОВАЛИТСЯ, ЕСЛИ СОБРАНО НА НЕ-FIPS СИСТЕМЕ
RUN update-crypto-policies --set FIPS:NO-ENFORCE-EMS && update-crypto-policies
RUN update-crypto-policies --check
Теперь запустите это на RHEL9 с включенным FIPS и криптополитикой FIPS:NO-ENFORCE-EMS, и кластером Kubernetes, установленным с помощью kubespray, Kubernetes 1.31.1.
По всей видимости, реализация на RHEL9 предпринимает шаги для выражения политик хоста в контейнере. Запустите контейнер следующим образом:
$ kubectl run -it --rm '--restart=Never' ubi9fips-9-5 '--image=myrepohost.com/myrepo/ubi9fips:9.5' '--overrides={"spec": {"imagePullSecrets": [{"name": "my-pull-secret"}]}}' -- bash
[root@ubi9fips-9-5 /]# fips-mode-setup --check
Installation of FIPS modules is not completed.
FIPS mode is enabled.
Inconsistent state detected.
[root@ubi9fips-9-5 /]# cat /proc/sys/crypto-policies/fips_mode
1
[root@ubi9fips-9-5 /]# update-crypto-policies --check
The configured policy does NOT match the generated policy
[root@ubi9fips-9-5 /]# cat /etc/crypto-policies/config
FIPS
[root@ubi9fips-9-5 /]# cat /etc/crypto-policies/state/current
FIPS:NO-ENFORCE-EMS
[root@ubi9fips-9-5 /]# echo 'FIPS:NO-ENFORCE-EMS' > /etc/crypto-policies/config
[root@ubi9fips-9-5 /]# update-crypto-policies --check
The configured policy does NOT match the generated policy
[root@ubi9fips-9-5 /]# update-crypto-policies
Setting system policy to FIPS:NO-ENFORCE-EMS
Note: System-wide crypto policies are applied on application start-up.
It is recommended to restart the system for the change of policies
to fully take place.
[root@ubi9fips-9-5 /]# update-crypto-policies --check
The configured policy matches the generated policy
Обратите внимание, что на системе RHEL9 с включенным FIPS и криптополитикой FIPS:NO-ENFORCE-EMS, построенное изображение должно быть согласовано. На системе RHEL9 что-то монтирует криптополитики и состояние FIPS (/etc/crypto-policies/config, /etc/crypto-policies/back-ends и /proc/sys) в контейнер, но таким образом, что процессы в userland могут неправильно понимать состояние FIPS и криптополитик.
Какие изменения необходимо внести, чтобы состояние FIPS корректно отображалось для приложений userland. Это все возникает, потому что Java-приложения, похоже, не предлагают EMS, И, похоже, терпят неудачу, когда EMS не согласуется (даже если узел хоста находится в состоянии FIPS:NO-ENFORCE-EMS). (См. https://stackoverflow.com/q/79465049/500902)
Ответ или решение
Вопрос о том, почему Kubernetes на RHEL9 приводит к неконсистентным FIPS-политикам в работающих контейнерах, требует детального изучения как теоретических аспектов, так и предоставленного примера.
Теория
FIPS (Federal Information Processing Standards) — это стандарты информационной безопасности, разработанные правительством США, которые определяют криптографические модули. Выполнение этих стандартов является обязательным для компьютерных систем, обрабатывающих конфиденциальную информацию. RHEL9 предлагает полную поддержку FIPS, и когда включен FIPS-режим, любые отклонения от него могут привести к неожиданному поведению приложений, что очевидно в приведённой вами ситуации с UBI9-контейнером.
Криптополитики, такие как FIPS:NO-ENFORCE-EMS, позволяют гибкость в настройке криптографической среды, обеспечивая повышенную безопасность без полного ограничения возможностей. Как показано в примере, несмотря на установку этих политик, возникает проблема с неконсистентностью между конфигурацией хоста и контейнера, что приводит к сбоям.
Пример
В предоставленном вами сценарии UBI9-контейнер строится на основе образа RHEL9 с включенным FIPS и установленной криптополитикой FIPS:NO-ENFORCE-EMS. Однако при использовании команды в Kubernetes контейнер оказывается в состоянии, где результаты проверок FIPS и криптополитик указывают на несоответствие между ожидаемой и фактической конфигурацией:
- После запуска
fips-mode-setup --check
система выявляет некорректную интеграцию с FIPS-модулями. - Аналогично,
update-crypto-policies --check
указывает на несоответствие между текуще установленной и сгенерированной политикой.
Такая ситуация, скорее всего, связана с тем, что контейнер наследует FIPS-состояние и политики с хоста, но изоляция контейнера, характерная для Kubernetes, приводит к проблемам в пользовательских приложениях, которые неправильно интерпретируют эти настройки.
Применение
Для обеспечения корректного состояния FIPS и криптополитик в контейнерах, работающих на Kubernetes в среде RHEL9, необходимо предпринять следующие шаги:
-
Явное Управление Политиками: Убедитесь, что криптополитики и FIPS-состояние правильно управляются в момент создания контейнера. Это значит, что нужно сознательно применять и проверять политики непосредственно в Dockerfile или через скрипты, запускаемые при старте контейнера.
-
Изучение Механизма Наследования: Поскольку контейнеры могут наследовать состояние хоста (как в случае с
/etc/crypto-policies/config
и/proc/sys
), целесообразно явно указывать необходимые маппинги для предотвращения конфликтов. Это может требовать использования ConfigMaps и других средств Kubernetes для управления конфигурацией. -
Тестирование и Отладка: Проводите тщательное тестирование и отладку, обеспечивая, что контейнеры запускаются со строго фиксированными политиками, которые соответствуют требованиям FIPS, не полагаясь на состояние хоста.
-
Продвинутые Настройки Kubernetes: Используйте Kubernetes Secrets и другиe средства управления конфигурацией для безопасного и согласованного распределения необходимых учётных данных и политик по всем узлам и контейнерам.
-
Понимание Ограничений Java: Если ваши приложения на Java не предлагают EMS, проанализируйте требования используемых библиотек и обновите их до версий, поддерживающих необходимые криптографические методы, в сети FIPS:NO-ENFORCE-EMS.
Таким образом, эффективное управление состоянием FIPS и криптополитиками в контейнерах Kubernetes на RHEL9 требует не только понимания наследуемых хостовых настроек, но и активных мер по обеспечению их согласованности на уровне контейнеров.