裏取りステータス: code-verified
sonic-buildimage/rules/config L370-373 で INCLUDE_FIPS ?= y / ENABLE_FIPS ?= n (amd64/arm64 のみ) を確認。rules/sonic-fips.mk で FIPS_VERSION / FIPS_OPENSSL_VERSION / FIPS_OPENSSH_VERSION / FIPS_PYTHON_VERSION / FIPS_GOLANG_VERSION / FIPS_KRB5_VERSION を BLDENV (trixie / bookworm) ごとに定義(trixie 例: openssl 3.5.4-1+fips、openssh 10.0p1-7+fips、golang 1.24.4-1+fips)。src/sonic-fips/Makefile で Azure/sonic-fips リポを git clone -b $(FIPS_VERSION) する SymCrypt-OpenSSL ビルド経路を確認、files/build/versions-public/host-image/versions-deb-trixie に symcrypt-openssl==0.1 を pin。sonic-utilities/sonic_installer/main.py L688-721 で @sonic_installer.command('set-fips') / 'get-fips' および bootloader.set_fips/get_fips の呼び出しを確認。src/openssh/(patch 同梱)も存在。
OpenSSL FIPS 140-3(SymCrypt engine + sonic_fips=1)¶
概要¶
FIPS 140-3 認定済みの cryptographic module だけを使うよう SONiC を組み立てるための HLD1。SONiC が依存する暗号モジュールは OpenSSL / Kerberos / Golang / Libgcrypt / Linux Kernel crypto だが、本 HLD で扱うのは OpenSSL / Kerberos / Golang の 3 つ(Kernel と Libgcrypt は scope 外)。OpenSSL 1.1.1 自体には FIPS 認定 module が無いため、Microsoft が提供する SymCrypt OpenSSL Engine (SCOSSL) を engine として読み込ませ、Microsoft が CMVP に出している SymCrypt を実体として使う構成。Kerberos は内蔵 crypto をやめ OpenSSL 経由、Golang は RedHat の dev.boringcrypto ベースの patch で OpenSSL に流すパスを利用する。
動作仕様¶
コンポーネント関係¶
flowchart LR
APP["OpenSSL を使う app<br/>OpenSSH / Python / etc"] --> OSSL[OpenSSL libcrypto]
OSSL -- engine load --> SCOSSL[SymCrypt OpenSSL Engine]
SCOSSL --> SCRY["SymCrypt<br/>(FIPS 140-3 module)"]
KRB[Kerberos] --> OSSL
GO[Golang dev.boringcrypto + RedHat patch] --> OSSL
OpenSSL の engine 機構 を使い、/usr/lib/ssl/openssl-fips.cnf で engine_id = symcrypt / dynamic_path = /usr/lib/x86_64-linux-gnu/libsymcryptengine.so を指定する1。
Kernel cmdline と config 切替¶
sonic_fips=1を/proc/cmdlineに入れると、SONiC は default OpenSSL config を/usr/lib/ssl/openssl-fips.cnfに切替える1- 別途
fips=1は Linux kernel FIPS モード を要求するパラメタで、SONiC kernel が FIPS をサポートしないため scope 外 - 設定方法は bootloader で異なる:
- GRUB:
/etc/grub.d/99-fips.cfgでGRUB_CMDLINE_LINUX_DEFAULTに追記 - uboot:
fw_setenv linuxargs ... - Aboot:
/host/image-<ver>/kernel-cmdlineに追記
Application 単位 enable¶
export ENABLE_FIPS=1
# Golang only:
export GOLANG_FIPS=1
# OpenSSL only:
export OPENSSL_CONFIG=/usr/lib/ssl/openssl-fips.cnf
ENABLE_FIPS=1 はビルド時 enable に対応する runtime envvar の役割。
SymCrypt OpenSSL Debian パッケージ¶
パッケージ名: symcrypt-openssl (例: symcrypt-openssl_0.1_amd64.deb)
収録ファイル:
/usr/lib/ssl/openssl.cnf (デフォルト)
/usr/lib/ssl/openssl-fips.cnf (FIPS 用)
/usr/lib/x86_64-linux-gnu/libsymcrypt.so
/usr/lib/x86_64-linux-gnu/libsymcryptengine.so
Kerberos¶
ビルドオプションを builtin crypto から OpenSSL 経由 に切り替える。OpenSSL を使う場合、Kerberos の builtin に戻す runtime オプションは 無い1。
Golang¶
Golang stdlib crypto/* は FIPS に未対応。Google の dev.boringcrypto branch は BoringSSL に切り替えるが BoringSSL は Google 内利用前提 で一般公開されない。RedHat が dev.boringcrypto ベースで OpenSSL に向ける patch を公開しているため、SONiC ではこれを再利用し、OpenSSL 経由で SymCrypt engine が effective になるようにする1。FIPS enable 時は BoringSSL Enable + SymCrypt Enable の両 build option が立つ。
Build flag¶
rules/config:
INCLUDE_FIPS ?= y # FIPS 機構を image に同梱(default ON)
ENABLE_FIPS ?= n # default で FIPS を有効化(default OFF)
INCLUDE_FIPS=nだとENABLE_FIPSは無視される
CLI¶
sonic-installer set-fips <image> [--enable-fips | --disable-fips]
sonic-installer get-fips <image> # FIPS is enabled / disabled
<image> 省略時は next boot image が対象1。
Application Impact¶
非 FIPS algorithm を使っている部分は壊れる可能性がある。OpenSSH は CentOS の FIPS 140-2 patch を流用して FIPS テストを通す方針1。app ごとに test で確認するという立て付け。
📋 検証エビデンス: sonic-net/SONiC/doc/fips/SONiC-OpenSSL-FIPS-140-3.md#L93-L108 (sha: 49bab5b5ff0e924f1ea52b3d9db0dfa4191a7c06)
出典:
sonic-net/SONiC/doc/fips/SONiC-OpenSSL-FIPS-140-3.md#L93-L108 (sha: 49bab5b5ff0e924f1ea52b3d9db0dfa4191a7c06)
抜粋:
When fips=1 is set in /proc/cmdline, the OpenSSL default config file is changed to "/usr/lib/ssl/openssl-fips.cnf",
otherwise, the config file "/usr/lib/ssl/openssl.cnf" is used.
... Provide SymCrypt OpenSSL debian package. Package name: symcrypt-openssl
判断根拠: kernel cmdline 切替と debian 同梱パッケージの根拠。
制限事項¶
- Linux Kernel crypto / Libgcrypt は scope 外(FIPS 140-3 認定対象外)
- BoringSSL は一般用途想定外のため使えない(RedHat patch + OpenSSL 経由を採用)
- 各 application の non-FIPS algorithm 利用箇所はテストで掘り出して個別対応
- Kerberos が OpenSSL 経由になるため build オプションが固定化される
干渉する機能¶
- OpenSSH / Python / sonic-restapi: 大半の TLS / SSH を扱う app が影響
- secure-boot / secure-upgrade: 証明書検証経路を共有
- container hardening: 暗号方針の整合
- build system (
INCLUDE_FIPS/ENABLE_FIPS): image 構成全体に波及
関連 reference¶
- YANG: sonic-fips
- Topics: Security / AAA
- Topics: Build / Packaging
- CONFIG_DB: FIPS
- CLI: sonic-installer
- Topics: Reboot / Warm / Fast
- Glossary
- Reference 索引
確認コマンド¶
sonic-installer get-fips— 現在の FIPS モード(enabled/disabled)を確認openssl version -a/openssl list -providers— FIPS provider が active かを確認cat /proc/sys/crypto/fips_enabled— kernel 側の FIPS モード(参考値)ssh -vvv ...で SSH の crypto algorithm を観測し、disabled algo が出ていないか確認
コマンド例¶
OpenSSL FIPS 140-3 provider の有効化を確認する。
openssl list -providers
openssl fipsinstall -in /etc/ssl/fipsmodule.cnf -module /usr/lib/ssl/fips.so
cat /proc/sys/crypto/fips_enabled
show fips status