Topics で読み物として読む
この HLD は実装詳細を含みます。機能の概念・設定・運用を読み物として読みたい場合は Topics 06 章: L2 / VLAN / LAG を参照。
裏取りステータス: Code-verified
現行 master の sonic-swss/orchagent/macsecpost.cpp (STATE_FIPS_MACSEC_POST_TABLE_NAME を読み書き)、sonic-swss-common/common/schema.h:471 の STATE_FIPS_MACSEC_POST_TABLE_NAME = "FIPS_MACSEC_POST_TABLE"、sonic-buildimage/build_image.sh:214 の sonic_fips=1 カーネルコマンドライン、build_debian.sh:691-692 の /etc/fips/fips_enable 初期化、dockers/docker-macsec/cli/show/plugins/show_macsec.py:351-389 の FIPS_MACSEC_POST_TABLE 読み出し CLI を確認済み(verified at: 2026-05-09)。
FIPS 向け MACsec SAI POST(FIPS_MACSEC_POST_TABLE)¶
概要¶
FIPS 140-3 準拠を維持するには、暗号機構(MACsec ハードウェアエンジンを含む)が 動作開始前に Pre-Operational Self-Test (POST) を通っていなければならない。本 HLD は SONiC で MACsec の POST を SAI 経由でトリガし、その結果を STATE_DB.FIPS_MACSEC_POST_TABLE に公開、MACSecMgr が POST pass を確認してから MACsec 設定を流す設計を定義する1。
設計上の要件は次の 4 点1:
- ASIC / SAI 実装の差異を吸収するため、POST は SAI switch init 段 または SAI MACsec init 段 のいずれでも有効化できること
- POST 通過まで MACsec 設定を流さないこと
- POST 失敗が 非 MACsec ポートの動作に影響しない こと
- 失敗時に syslog で詳細(失敗ポートの SAI OID と MACsec エンジン)を出すこと
動作仕様¶
全体構成¶
flowchart LR
OA[Orchagent] -->|SAI switch create\nPOST 有効化| SAI[SAI / syncd]
SAI -.->|POST 完了 callback| OA
OA --> SDB[(STATE_DB\nFIPS_MACSEC_POST_TABLE)]
MO[MACSecOrch] -->|MACsec init 段で POST| SAI
MO --> SDB
MM[MACSecMgr in macsec docker] --> SDB
MM -->|POST=pass のときだけ\nMACsec 設定処理| OA
要点:
- POST 結果は
STATE_DB.FIPS_MACSEC_POST_TABLE1 つに集約 Orchagentは SAI switch 作成時に POST capability を問い合わせ、対応箇所で POST を有効化MACSecMgrは STATE_DB を見て POST pass を確認するまで MACsec 設定を処理しない(FIPS 準拠の核)
STATE_DB スキーマ¶
FIPS_MACSEC_POST_TABLE
key = FIPS_MACSEC_POST_TABLE|sai
status = switch-level-post-in-progress | macsec-level-post-in-progress |
pass | fail | disabled
status の意味1:
| 値 | 意味 |
|---|---|
switch-level-post-in-progress |
SAI switch 段の POST 実行中 |
macsec-level-post-in-progress |
SAI MACsec 段の POST がトリガ済み or 実行中 |
pass |
POST 通過 |
fail |
POST 失敗 |
disabled |
POST 無効(FIPS 無効など) |
FIPS 有効化の判定経路¶
FIPS は次の 2 経路で有効化できる1:
sonic-installer set-fips→/proc/cmdlineにsonic_fips=1/etc/sonic/fips.json経由 →/etc/fips/fips_enableに反映
STATE_DB.FIPS_STATS も最終的には更新されるが、Orchagent は startup タイミングで STATE_DB が未更新なケースに備え、/proc/cmdline または /etc/fips/fips_enable を直接読む1。どちらかで FIPS 有効なら POST をトリガする。
POST 有効化フロー(switch init)¶
flowchart TB
A[Orchagent 起動] --> B[FIPS 有効?\n/proc/cmdline or /etc/fips/fips_enable]
B -->|No| Z[POST 無関係 / status=disabled 相当]
B -->|Yes| C[SAI switch create with POST 有効]
C --> D[POST capability クエリ]
D -->|switch init で POST 可| E[STATE_DB status=switch-level-post-in-progress]
E --> F[POST 完了 callback]
F --> G{結果}
G -->|pass| H[STATE_DB status=pass]
G -->|fail| I[STATE_DB status=fail\nsyslog 出力]
D -->|MACsec init のみ可| J[STATE_DB status=not-started]
J --> K[MACSecOrch が MACsec init で POST]
D -->|どちらも未対応| L{FIPS 有効?}
L -->|Yes| M[STATE_DB status=fail]
L -->|No| Z
「SAI switch 作成時に POST を有効化することで、後から MACsec を有効化するシナリオでも POST 直後に進む」のがポイント1。
POST 有効化フロー(MACsec init)¶
POST が SAI MACsec init 段でしかサポートされない実装向け1:
MACSecOrchの初期化で SAI MACsec object を proactively に作成 し、POST を起動- POST 完了 callback で STATE_DB を更新
そのため、MACsec ポートが 1 つも設定されていなくても SAI MACsec object が先に作られ得る。
POST 失敗時の挙動と syslog¶
MACSecOrch は POST 失敗時、各 MACsec ポートの POST 状態を読み、失敗ポートを特定して syslog に書く1。
| 失敗種別 | syslog メッセージ |
|---|---|
| Switch 段失敗 | Switch MACSec POST failed |
| MACsec 段失敗 | MACSec POST failed: oid <macsec-oid>, direction ingress\|egress |
要件「非 MACsec ポートに影響を出さない」を満たすため、POST 失敗が switch まるごと down にすることは避ける設計である1。
MACSecMgr の POST ガード¶
sequenceDiagram
participant CFG as CONFIG_DB MACSec 設定
participant MM as MACSecMgr
participant ST as STATE_DB.FIPS_MACSEC_POST_TABLE
CFG-->>MM: SET 通知
MM->>ST: status を読む
alt status=pass
MM->>MM: MACsec 設定を MACSecOrch 系へ流す
else status=fail / in-progress / disabled
MM->>MM: 設定を保留 or drop
end
MACSecMgr は macsec コンテナで動作し、CONFIG_DB を購読する従来のロールに POST 状態の事前チェック を足す形で拡張される1。これが FIPS 準拠の最終ガード。
📋 検証エビデンス: sonic-net/SONiC/doc/fips/SONiC-SAI-POST.md#L97-L102 (sha: 49bab5b5ff0e924f1ea52b3d9db0dfa4191a7c06)
出典:
sonic-net/SONiC/doc/fips/SONiC-SAI-POST.md#L97-L102 (sha: 49bab5b5ff0e924f1ea52b3d9db0dfa4191a7c06)
抜粋:
In order to be compliant to FIPS, SONiC should process MACSec configuration only after POST passes.
This is achieved by enhancing MACSecMgr, running in MACSec container, to check POST status published
in State DB before processing any MACSec configuration
判断根拠: MACSecMgr が POST 完了確認を担当し、POST=pass までは MACsec 設定を処理しないという中核ルールの根拠。
設定¶
関連する CONFIG_DB¶
専用 CONFIG_DB スキーマは本 HLD では新設しない。FIPS 自体の有効化は sonic-installer または /etc/sonic/fips.json で行う1。
関連する CLI¶
専用 CLI は HLD で言及されていない(FIPS 有効化に既存の sonic-installer set-fips を使う)。MACsec POST 状態は redis-cli 等で STATE_DB.FIPS_MACSEC_POST_TABLE|sai を直接読む形になる。
関連する YANG¶
該当 YANG モジュールは HLD で言及されていない。
制限事項¶
- POST 機能は SAI 実装が POST capability を持っていることが前提。POST capability が switch / MACsec のどちらにも無い ASIC では FIPS 有効時に
status=fail固定になる1 - FIPS 有効化後は switch reboot が必要1
- POST 通過前に投入された MACsec 設定は MACSecMgr がガードする。POST 失敗のままだと該当ポートの MACsec は永久に上がらない
干渉する機能¶
- MACSecMgr / MACSecOrch: 通常の MACsec 設定経路に POST 状態確認が割り込む
- FIPS の他の暗号モジュール: FIPS 有効化は MACsec 以外(OpenSSL / kernel 等)にも作用する。本 HLD では MACsec のみ扱う
config save/config reload: FIPS 設定(fips.json)の永続化と整合する- STATE_DB.FIPS_STATS: ブート完了後に FIPS 状態を保持。Orchagent はタイミング上これに依存できないため、
/proc/cmdline等を見る
トラブルシューティング¶
- MACsec ポートが上がらない場合、まず
redis-cli -n 6 hgetall "FIPS_MACSEC_POST_TABLE|sai"でstatusを確認 failの場合 syslog のSwitch MACSec POST failed/MACSec POST failed: oid ...を grep して詳細を取得in-progressで進まない場合、SAI から完了 callback が来ていない可能性。syncdログで POST API 呼び出しと callback を確認- FIPS 有効化したのに POST が走らない場合、
/proc/cmdlineのsonic_fips=1または/etc/fips/fips_enableを確認
コマンド例¶
MACsec FIPS POST の進捗と結果を確認する。
redis-cli -n 6 hgetall 'FIPS_MACSEC_POST_TABLE|sai'
docker logs syncd 2>&1 | grep -i 'macsec post'
grep -E 'Switch MACSec POST' /var/log/syslog
cat /proc/cmdline | tr ' ' '\n' | grep fips
関連 reference¶
引用元¶
関連 Topics¶
参考リンク¶
本ページに関連する参照ドキュメント: