Кратко (TL;DR): Altinity предоставляет сборку ClickHouse 25.3 с поддержкой FIPS для сред, где действуют требования FIPS. В этой сборке используется AWS-LC FIPS и обновлены такие зависимости, как Azure SDK, krb5 и драйвер MongoDB, для работы с библиотекой FIPS, в то время как функции, которые невозможно использовать в сборке FIPS, отключены. Сборка протестирована и проверена на соответствие требованиям FIPS.
В апреле 2026 года мы выпустили сборку ClickHouse 25.3.8 с поддержкой FIPS. В этой статье мы расскажем о трудностях, с которыми столкнулись в процессе ее создания.
Что такое FIPS?
FIPS 140 — это стандарт криптографических модулей правительства США. Организации в регулируемых отраслях (госсектор, финансы, здравоохранение) часто требуют, чтобы все криптографические операции выполнялись через модуль, прошедший валидацию FIPS. Сборка ClickHouse с поддержкой FIPS означает, что все TLS-соединения, шифрование данных на диске и хеширование для аутентификации используют сертифицированную криптографическую библиотеку вместо стандартной.
Altinity поддерживает сборки ClickHouse с поддержкой FIPS для клиентов, которые работают в условиях этих требований соответствия. Обычная сборка ClickHouse уже шифрует данные при передаче и в состоянии покоя, но поставляемая с ней криптографическая библиотека не проходила процесс валидации FIPS. Сборка FIPS заменяет ее на прошедшую такую валидацию.
Выбор криптографической библиотеки
Нашей предыдущей сборкой с поддержкой FIPS была версия 24.3.5.48, выпущенная в сентябре 2024 года. В ней в качестве криптографического модуля использовался BoringSSL, прошедший валидацию по стандарту FIPS 140-2 (Security Policy #4407). Эта сборка была доступна только для платформы AMD64.
Начиная с базовой версии ClickHouse 24.4, BoringSSL was replaced with OpenSSL 3.2. Это означало, что мы больше не могли просто переносить BoringSSL в новые версии ClickHouse без поддержки постоянно растущего набора патчей. Это также привело к измеримому регрессу производительности SSL в базовых сборках.
Для сборки FIPS 25.3 у нас было три требования: перейти с FIPS 140-2 на 140-3 (новую редакцию стандарта), восстановить производительность SSL, потерянную при переходе на OpenSSL, и добавить поддержку ARM (Aarch64). AWS-LC FIPS 2.0.0, универсальная криптографическая библиотека, поддерживаемая командой AWS Cryptography, удовлетворяла всем трем требованиям. Она происходит от BoringSSL, включает оптимизированный под производительность ассемблерный код как для x86-64, так и для ARM, и была validated under FIPS 140-3 в октябре 2024 года.
Мы провели бенчмаркинг операций шифрования ClickHouse по всем поддерживаемым режимам шифрования, сравнив три сборки: 24.3 stable (BoringSSL), 25.3 stable (OpenSSL 3.2) и 25.3 FIPS (AWS-LC). Ниже приведены результаты для нескольких репрезентативных режимов:
Множители указаны относительно стабильной версии 24.3. Базовая сборка 25.3 работает в 5–13 раз медленнее старой версии 24.3, в зависимости от режима шифрования. Сборка FIPS с AWS-LC сокращает этот разрыв, оставаясь в пределах примерно 2× от исходной производительности BoringSSL и будучи при этом в 3–6 раз быстрее текущей базовой сборки на базе OpenSSL.
Сборка сервера FIPS
После выбора библиотеки следующим шагом была интеграция AWS-LC в систему сборки ClickHouse и обеспечение их совместной работы.
Сборка
Добавив AWS-LC в систему сборки ClickHouse, нам пришлось исправить все места, где код полагался на API OpenSSL 3, которые AWS-LC не предоставляет. ClickHouse и его зависимости теперь ориентированы на API OpenSSL 3, в то время как AWS-LC предоставляет старый API в стиле 1.1.1. Здесь были некоторые критические изменения, поэтому мы не рассчитывали на легкую прогулку.
Чтобы упростить процесс, сначала мы отключили все сторонние библиотеки (используя флаг конфигурации ‑DENABLE_LIBRARIES=0), чтобы посмотреть, где произойдет сбой. Сбой действительно произошел в нескольких местах из-за отсутствующих или несовместимых сигнатур функций. Чтобы исправить это, мы добавили evp_API_shim.h и внедрили его в каждый компонент, который зависел от целевой библиотеки OpenSSL.
Включение функций
Выполнив базовые настройки, мы начали осторожно включать зависимости одну за другой и проверять следующее:
- Сборка завершается успешно.
- ClickHouse работает без сбоев.
- Функции, соответствующие библиотеке, работают должным образом.
Многие зависимости оказались простыми и работали так же, как в оригинальной версии 25.3.8, включая полную поддержку:
- Хранилища Azure Blob Storage (через форк azure-sdk-for-cpp от Altinity, см. ниже);
- gRPC;
- Parquet;
- Kafka, NATS, MySQL, MongoDB;
- Cassandra, AMQP.
Некоторые из них потребовали изменений в evp_API_shim.h или в конфигурационных файлах соответствующих библиотек. Для двух потребовалось создать форки с прямым изменением исходного кода, а еще одна потребовала нетривиальных исправлений.
azure-sdk-for-cpp
Мы создали форк azure-sdk-for-cpp, чтобы исправить сборку. Изначально сборка завершалась ошибкой из-за отсутствия заголовочного файла <openssl/ocsp.h> в AWS-LC. Этот заголовок использовался Azure SDK для C++ для реализации проверки отзыва сертификатов. Он включается только тогда, когда EnableCertificateRevocationListCheck явно установлен в значение true в CurlTransportSslOptions (по умолчанию false), чего ClickHouse никогда не делает.
krb5
Для krb5 также был сделан форк, чтобы выполнить сборку с AWS-LC и отключить шифры, не одобренные FIPS (Camellia, DES/3DES). В результате аутентификация Kerberos в сборке FIPS требует, чтобы KDC поддерживал типы шифрования AES (aes256-cts-hmac-sha1-96 или aes128-cts-hmac-sha1-96). KDC, настроенный только на DES или 3DES, работать не будет.
Драйвер MongoDB
Драйвер MongoDB для C не потребовал создания форка, но его интеграция с TLS нуждалась в трех нетривиальных исправлениях в evp_API_shim.h. Все они проистекали из тонких различий в поведении между OpenSSL и AWS-LC, которые незаметны на уровне API: BIO_get_ssl молча возвращал неинициализированный указатель, поскольку обработчик контроллеров BIO в AWS-LC не поддерживает ожидаемый управляющий код; BIO_do_handshake ничего не делал, так как ни диспетчеризация конечного автомата, ни транспортное соединение BIO не работали так же, как в OpenSSL; а X509_VERIFY_PARAM_set1_host с именем нулевой длины полностью портил проверку сертификатов. Без этих исправлений любое TLS-соединение с MongoDB завершалось бы сбоем или аварийным завершением.
Имея эти форки и исправления, мы в конце концов смогли выполнить сборку с параметром ‑DENABLE_LIBRARIES=1, но оставили ‑DENABLE_RUST=0. В результате в сборке FIPS недоступны три функции ClickHouse:
- Табличный движок DeltaLake и табличная функция deltaLake();
- Язык запросов PRQL;
- Интерактивный поиск Skim в clickhouse-client.
Компоненты на языке Rust, используемые этими функциями, в настоящее время не поддерживаются в данной сборке FIPS.
Тестирование
В какой-то момент мы заметили, что тест для кодека шифрования MergeTree завершается неудачно. Оказалось, что AES_128_GCM_SIV и AES_256_GCM_SIV не одобрены FIPS. Мы заменили их на одобренные FIPS аналоги: AES_128_GCM и AES_256_GCM.
Это критическое изменение для всех, кто использует столбцы с этими кодеками шифрования. Сборка FIPS намеренно использует другие байт-коды на диске, поэтому попытка прочитать данные, зашифрованные с помощью SIV, в сборке FIPS приводит к немедленной ошибке, а не к скрытому повреждению данных. Имена кодеков в DDL и разделы конфигурации также изменяются:
Если вы выполняете миграцию с несборочной версии FIPS и используете зашифрованные столбцы, вам необходимо расшифровать данные перед обновлением, обновить конфигурацию и зашифровать их заново после переключения на бинарный файл FIPS.
Валидация FIPS
Мы встроили тестовые наборы соответствия SSL и валидации ACVP для AWS-LC прямо в бинарный файл FIPS (clickhouse ssl-shim, clickhouse ssl-handshaker, clickhouse acvp-server). Это позволяет нам запускать полный набор из 8037 тестов соответствия TLS и 31 криптографического алгоритма ACVP против того самого бинарного файла, который поставляется клиентам, а не просто отдельной эталонной сборки криптографической библиотеки.
Обслуживание кода
Мы также провели значительную работу по обслуживанию кода, включая, помимо прочего:
- Добавление нового конфигурационного элемента <cipherSuites> для управления шифрами TLS 1.3 — существующий элемент <cipherList> управляет только TLS 1.2 и ниже. Значение по умолчанию ограничивает TLS 1.3 набором TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256, исключая TLS_CHACHA20_POLY1305_SHA256, который не одобрен стандартом FIPS.
- Исправление ClickHouse Keeper, чтобы он учитывал параметры <cipherList>, <cipherSuites>, <dhParamsFile> и <ecdhCurve> из конфигурации — ранее настройка TLS в Keeper молча игнорировала эти параметры.
- Исправление параметра disableProtocols для корректной обработки tlsv1_3, который раньше молча игнорировался, из-за чего было невозможно отключить TLS 1.3 через конфигурацию.
- Добавление проверок при запуске, которые выводят информацию о режиме FIPS, результатах тестов с известными ответами и результатах проверки целостности.
- Добавление FIPS_CLICKHOUSE в таблицу system.build_options и исправление OPENSSL_VERSION и OPENSSL_IS_BORING_SSL, которые отображались пустыми в сборках FIPS.
- Переключение внутреннего хэш-бэкенда PostgreSQL на делегирование через AWS-LC, чтобы хэширование аутентификации (SCRAM-SHA-256, MD5) проходило через проверенный модуль FIPS вместо собственной программной реализации PostgreSQL.
- Удаление конечной точки Sentry вышестоящего репозитория по умолчанию и удаление запасных вариантов сборки Docker, которые устанавливают пакеты ClickHouse из вышестоящего репозитория.
Вы можете прочитать полный список изменений, чтобы узнать подробности.
Заключение
Сборки altinityfips предоставляют пользователям ClickHouse в государственном секторе, финансах, здравоохранении и других отраслях вариант, совместимый с FIPS. Наши усилия по изменению процесса сборки ClickHouse, а также форку или исправлению необходимых библиотек и инструментов являются еще одним примером приверженности Altinity созданию решений, необходимых нашим клиентам.
Присоединяйтесь к нашему Slack
ClickHouse является зарегистрированным товарным знаком ClickHouse, Inc.; Altinity не связана и не аффилирована с ClickHouse, Inc.
Получайте последние новости ClickHouse прямо на свой электронный ящик каждый месяц.












