Topics で読み物として読む
この HLD は実装詳細を含みます。機能の概念・設定・運用を読み物として読みたい場合は Topics 15 章: Security / AAA を参照。
裏取りステータス: code-verified
sonic-buildimage/rules/config に CHANGE_DEFAULT_PASSWORD ?= n のオプション、build_debian.sh に [[ "$CHANGE_DEFAULT_PASSWORD" == "y" ]] 分岐と password_expire="$( ... && echo true || echo false )" の export 処理を確認。Makefile.work / slave.mk でも flag を伝搬。HLD で要求された build flag の sonic-buildimage 取り込みは master で確認できた。
既定パスワードの初回ログイン強制変更(California SB-327 準拠)¶
概要¶
California SB-327 は IoT 機器の既定パスワード使用を制限する州法であり、初回ログイン時にユーザに強制でパスワード変更させる ことが代表的な準拠手段である1。本 HLD はこれを SONiC OS で実装する設計を定める。
要件1:
- 初回ログイン時に既定パスワードの変更を強制
- 複数の既定ユーザに対応
- イメージ更新後 にも再度強制
- Password Hardening 機能と独立に動作(aging を干渉させない)
- 対象は login shell が
/bin/bashまたは/bin/shのユーザ のみ
動作仕様¶
利用する Linux 標準ツール¶
DB / CLI / SAI 変更なし。Linux 既存機構 で実装する1:
| ツール | 役割 |
|---|---|
chage |
パスワード aging。-d 0 で last password change を 0 化 = 強制 expired |
pam_unix_account.so |
login 時に password / account の expire を検査し change を要求 |
Build flag¶
ビルド時 flag で機能 on/off1:
default は disable1。runtime にこの flag を見て動作分岐する。
1st boot フロー¶
sequenceDiagram
participant Inst as ONIE / sonic-installer
participant Boot as 1st boot
participant RC as /etc/rc.local
participant CHA as chage
participant U as user via SSH
participant PAM as pam_unix_account.so
Inst->>Boot: image install / upgrade
Boot->>RC: 起動
RC->>RC: grep /etc/passwd で対象ユーザ列挙<br/>(login shell = /bin/bash or /bin/sh)
loop each default user
RC->>CHA: chage -d 0 <user>
end
U->>PAM: ssh login
PAM-->>U: "Your password has expired"<br/>パスワード変更を要求
U->>U: 新パスワード入力
PAM->>PAM: 更新成功 → 強制 logout
U->>U: 新パスワードで再 login
実装ポイント1:
- 1st boot 検知は
/etc/rc.local上で行う(specific marker file 等で判定する想定) - 対象ユーザは
/etc/passwdを grep して login shell が/bin/bash//bin/shのもの のみ - 各ユーザに
chage -d 0 <user>を発行 - 次回 SSH login 時に
pam_unix_account.soが expired を検知し change を要求 - 変更後はユーザが 強制 logout され、新パスワードで再 login
password hardening との独立性¶
password hardening (passw_hardening 機能) には aging 期間 があるが、本機能はそれに 干渉しない1。chage の -d 0 は last_change を 0 化して即時 expire を起こすだけで、最大 age(-M)を変えないため。
upgrade フロー¶
sonic-installer で新イメージをインストールすると 1st boot 扱い になり、再度パスワード変更が強制される1。
warm / fast boot¶
機能は トラフィックに影響を与えず 、warm/fast boot 後にも triggered され得る1。
設定¶
CONFIG_DB / CLI / YANG / SAI¶
いずれも変更なし1。DB との対話を持たない設計。
設定例¶
通常運用は不要。SSH login 時にプロンプトで操作する例1:
$ ssh admin@sonic-switch
admin@sonic-switch's password:
You are required to change your password immediately (administrator enforced).
WARNING: Your password has expired.
You must change your password now and login again!
Changing password for admin.
Current password: ****
New password: ****
Retype new password: ****
passwd: password updated successfully
Connection to sonic-switch closed.
$ ssh admin@sonic-switch # 新パスワードで再 login
ビルド時に有効化:
制限事項¶
- Remote AAA (LDAP / RADIUS / TACACS+) では動作しない1。リモート認証はカスタマー責務
- build flag が必須。runtime に有効化する CLI / DB は無い
- 機能は Linux native ツール (
chage+pam_unix_account.so) に依拠。これらの挙動が変わると同期が必要 /etc/rc.localの 1st boot 検知ロジックの堅牢性は HLD では明示されていない- ユーザ unit test は login と 1st boot を直接カバーしない(system test に依存)1
- パスワード変更後に 強制 logout されるユーザ体験上の制約1
干渉する機能¶
- 既存の
passw_hardening機能: aging とは独立。両機能を併用しても干渉しない設計 /etc/rc.local: 1st boot 処理の置き場- PAM stack:
pam_unix_account.soの挙動に依存 - SSH / login shell: ログイン経路に依存
sonic-installer(image upgrade): 1st boot 再 trigger に関与
トラブルシューティング¶
- 初回 login で expire が起きない →
CHANGE_DEFAULT_PASSWORD=trueでビルドされたか確認、chage -l <user>でLast password change: never等になっているか確認 - LDAP user で動かない → 仕様通り(remote AAA 非対応)
- 強制 logout 後ループ → password hardening 側の policy(最低長 / 複雑度)にひっかかっているか syslog を確認
- upgrade 後に再強制されない → 1st boot marker (e.g.
/host/.first_boot相当) の有無、/etc/rc.localの処理ロジックを確認
コマンド例: デフォルト認証情報強制変更確認¶
下記コマンドで関連する CONFIG_DB / APP_DB / STATE_DB と CLI 出力・syslog を 突き合わせ、HLD 記載の挙動と現在の挙動が一致しているか確認できる。
コマンド例: デフォルト認証情報強制変更確認¶
下記コマンドで関連する CONFIG_DB / APP_DB / STATE_DB と CLI 出力・syslog を 突き合わせ、HLD 記載の挙動と現在の挙動が一致しているか確認できる。