コンテンツにスキップ

PASSW_HARDENING テーブル

概要

パスワード複雑度・有効期限・履歴ポリシーを CONFIG_DB に保持するテーブル1hostcfgdPasswHardening クラスが購読し、Linux PAM 設定ファイル (/etc/pam.d/common-password) と /etc/login.defs を書き換える。state=enabled のときのみポリシーが有効化される。

データフロー (自動生成)

flowchart LR
  CDB[("CONFIG_DB<br/>PASSW_HARDENING")]
  DM["hostcfgd<br/>PasswHardening"]
  PAM["/etc/pam.d/common-password"]
  LOGIN["/etc/login.defs"]
  CDB --> DM
  DM --> PAM
  DM --> LOGIN

凡例

CONFIG_DB から SAI までの典型経路を docs/reference/config-db-orch-map.md から機械生成したミニ図。詳細・例外は本ページ本文と対応表を参照。

key 構造

PASSW_HARDENING|POLICIES

シングルトン (POLICIES の 1 行のみ)。

フィールド

フィールド 既定 説明
state enabled/disabled disabled パスワードポリシー強制の有効化フラグ
expiration int (-1..365) 180 パスワード有効期限 (日)。-1 で無効
expiration_warning int (-1..30) 15 期限切れ前警告日数。-1 で無効
history_cnt uint (1..100) 10 再利用禁止する過去パスワード数
len_min uint (1..32) 8 パスワード最短文字数
reject_user_passw_match boolean true ユーザ名と一致するパスワードを拒否
lower_class boolean true 小文字 (a-z) 1 文字以上を要求
upper_class boolean true 大文字 (A-Z) 1 文字以上を要求
digits_class boolean true 数字 (0-9) 1 文字以上を要求
special_class boolean true 特殊文字 1 文字以上を要求

フィールド暗黙デフォルト (Phase A — コード由来)

YANG default 文はプロビジョニング時 (init_cfg.json.j2 展開 → DB 書き込み) に適用される。 以下は DB エントリ自体がない場合 のランタイム fallback を per-field で示す。

フィールド YANG default init_cfg.json.j2 コード fallback (DB なし / state=disabled)
state "disabled" "disabled" passw_policies={} → PAM hardening 無効 (Linux OS デフォルト)
expiration なし "180" passw_policies.get('expiration', -1)-1; state=disabled 時は LINUX_DEFAULT_PASS_MAX_DAYS=99999
expiration_warning なし "15" passw_policies.get('expiration_warning', -1)-1; state=disabled 時は LINUX_DEFAULT_PASS_WARN_AGE=7
history_cnt なし "10" policies={} → PAM pam_pwhistory 設定なし (履歴制限なし)
len_min なし "8" policies={} → PAM pam_pwquality 設定なし (OS デフォルト)
reject_user_passw_match なし "true" policies={} → PAM に渡されない (チェックなし)
lower_class なし "true" policies={} → クラス要件なし
upper_class なし "true" policies={} → クラス要件なし
digits_class なし "true" policies={} → クラス要件なし
special_class なし "true" policies={} → クラス要件なし

コード根拠: - PasswHardening.__init__(): sonic-host-services/scripts/hostcfgd:873-879passw_policies_default = {} / passw_policies = {} - set_passw_hardening_policies(): sonic-host-services/scripts/hostcfgd:934-944LINUX_DEFAULT_PASS_MAX_DAYS=99999, LINUX_DEFAULT_PASS_WARN_AGE=7, fallback -1 - init_cfg.json.j2 初期値: sonic-buildimage/files/build_templates/init_cfg.json.j2 (PASSW_HARDENING セクション) - YANG スキーマ: sonic-buildimage/src/sonic-yang-models/yang-models/sonic-passwh.yang:25-73 - テストベクタ確認: sonic-host-services/tests/hostcfgd/test_passwh_vectors.py:8-23

購読者

  • hostcfgd (host-services パッケージ)。PasswHardening.load()PASSW_HARDENING テーブルを読み込み、Jinja2 テンプレート (common-password.j2) を展開して /etc/pam.d/common-password を書き換え、/etc/login.defsPASS_MAX_DAYS / PASS_WARN_AGEsed で更新する

関連 CONFIG_DB / YANG / CLI

  • 関連 CLI: config passw-hardening policies state / config passw-hardening policies expiration
  • 関連 YANG: sonic-passwh

例外条件・特殊挙動

条件 挙動
data == {} passw_policies = {} にリセット → PAM hardening 無効化
state=disabled PAM テンプレートは hardening なしで生成; /etc/login.defsLINUX_DEFAULT_* 値にリセット
expiration=0 パスワード即時失効 (chage -M 0 を全ユーザに適用)
expiration=-1 パスワード有効期限なし
expiration_warning=-1 警告なし
POLICIES キー以外 passw_policies_update() で key != 'POLICIES' のため passw_policies は更新されない
chage コマンド失敗 syslog ERR のみ; 次回変更時に再試行はしない

値依存挙動マトリクス

state (enum enabled/disabled)

効果 evidence
enabled Jinja2 テンプレートが passw_policies を参照して PAM 設定を生成; /etc/login.defsexpiration/expiration_warning を書き込む hostcfgd:937-958
disabled PAM テンプレートは hardening なし (Linux OS デフォルト) で生成; /etc/login.defsLINUX_DEFAULT_PASS_MAX_DAYS=99999 / LINUX_DEFAULT_PASS_WARN_AGE=7 にリセット hostcfgd:934-936

boolean フィールド (lower_class / upper_class / digits_class / special_class / reject_user_passw_match)

  • "True" / "true" / "1"is_true() で Python True に正規化 → PAM pam_pwquality.so / pam_cracklib.so に対応オプションを渡す
  • "False" / "false" / "0"False → 当該クラス要件をスキップ

複合条件

  • state=disabled のときは lower_class/upper_class 等の値に関わらず PAM hardening は適用されない
  • state=enabled でも passw_policies{} の場合は PAM ファイルが hardening なしで生成される (DB に POLICIES 行がない場合)

関連リファレンス

  • YANG: sonic-passwh

引用元

関連ページ

運用ヒント

典型値

  • key 形式: PASSW_HARDENING|POLICIES
  • state=enabled で全ポリシーを init_cfg デフォルト値のまま適用

よくある誤設定

  • state=disabled のまま他フィールドを設定しても PAM には反映されない
  • expiration=0 はパスワード即時失効を意味するため注意

確認コマンド

sonic-db-cli CONFIG_DB hgetall 'PASSW_HARDENING|POLICIES'
show passw-hardening policies

実コンテナ動作トレース

段階 1 — Consumer 登録

hostcfgdPasswHardening が CONFIG_DB の PASSW_HARDENING テーブルを購読する。

PASSW_HARDENING テーブルの key は POLICIES のみ (シングルトン)。

段階 2 — CFG→PAM 翻訳

passw_policies_update()POLICIES エントリを受け取り、boolean フィールドを is_true() で正規化して self.passw_policies に格納。 modify_passw_conf_file()passw_policies_default (空 dict) に passw_policies をマージし、Jinja2 テンプレート common-password.j2 を展開して /etc/pam.d/common-password を上書きする。

段階 3 — login.defs 更新

set_passw_hardening_policies()state=enabled 時に sed コマンドで /etc/login.defsPASS_MAX_DAYS / PASS_WARN_AGE を更新し、chage コマンドで既存ユーザのパスワード有効期限を変更する。

段階 4 — タイミングと副作用

適用タイミング: CONFIG_DB 変化を検知次第即時にファイル書き換え。次回ログイン / パスワード変更時から新ポリシーが適用される。

副作用: 既存パスワードへの即時強制適用なし。state=enabled に変更すると全ユーザの chage が実行される。

書き込み入り口 (Direction A)

対象テーブル: PASSW_HARDENING

CLI

  • config passw-hardening policies state <state>
  • config passw-hardening policies expiration <days>
  • config passw-hardening policies expiration-warning <days>
  • config passw-hardening policies history-cnt <count>
  • config passw-hardening policies len-min <length>
  • config passw-hardening policies reject-user-passw-match <true|false>
  • config passw-hardening policies lower-class <true|false>
  • config passw-hardening policies upper-class <true|false>
  • config passw-hardening policies digits-class <true|false>
  • config passw-hardening policies special-class <true|false>
  • ソース: sonic-utilities/config/plugins/sonic-passwh_yang.py

minigraph / sonic-cfggen

  • なし

ビルド時デフォルト (init_cfg / j2 テンプレート)

  • init_cfg.json.j2PASSW_HARDENING|POLICIES の全フィールドが定義済み

ハードコードデフォルト

  • LINUX_DEFAULT_PASS_MAX_DAYS = 99999 (hostcfgd:57)
  • LINUX_DEFAULT_PASS_WARN_AGE = 7 (hostcfgd:58)

ランタイム注入 (デーモン自動書き込み)

  • なし