RADIUS_SERVER テーブル¶
概要¶
サーバごとの RADIUS クライアント設定を保持するリストテーブル1。hostcfgd の AAA ハンドラが読み、/etc/pam_radius_auth.d/<ip>_<port>.conf を生成する。グローバル設定は RADIUS|global 側にある。
データフロー (自動生成)¶
flowchart LR
CDB[("CONFIG_DB<br/>RADIUS_SERVER")]
DM["hostcfgd"]
PAM["/etc/pam_radius_auth.d/<br/><ip>_<port>.conf"]
CDB --> DM --> PAM
凡例
CONFIG_DB から SAI までの典型経路を docs/reference/config-db-orch-map.md から機械生成したミニ図。詳細・例外は本ページ本文と対応表を参照。
key 構造¶
<ip_or_hostname> は YANG の inet:host 型。IPv4 / IPv6 アドレスまたはドメイン名。
フィールド¶
| フィールド | 型 | デフォルト | 説明 |
|---|---|---|---|
auth_port |
inet:port-number (1..65535) |
1812 |
RADIUS 認証 UDP ポート番号 |
passkey |
string (1..65 chars、SPACE/#/, 不可) |
なし (空文字列フォールバック) | サーバ固有の共有秘密鍵 |
auth_type |
enum pap/chap/mschapv2 |
pap |
サーバ固有の認証プロトコル |
priority |
uint8 (1..64) | 1 (CLI 経由) |
サーバ選択優先度。降順でソートされる |
timeout |
uint16 (1..60 秒) | 5 |
サーバ固有の応答待ちタイムアウト |
retransmit |
uint8 (0..10) | 3 |
サーバ固有の再送回数 |
vrf |
enum mgmt/default |
なし (デフォルト VRF) | 接続に使用する VRF |
src_intf |
union leafref | なし | 送信元インタフェース |
制約¶
passkeyは印字可能 ASCII から SPACE/#/,を除外 (pattern '[^ #,]*')priority範囲外は YANG 制約違反でロード拒否timeout範囲: 1..60retransmit範囲: 0..10 (YANG) — CLI は 1..10 のみ許容 (YANG-CLI discrepancy は下記「コード由来の暗黙デフォルト」セクション参照)- エントリ上限: 8 台 (
max-elements 8in YANG /RADIUS_MAXSERVERS = 8in CLI)
購読者¶
hostcfgd(sonic-host-servicesの AAA ハンドラ): CONFIG_DB →/etc/pam_radius_auth.d/<ip>_<port>.confを生成し PAM に反映AAA.authentication.loginがradiusを含むとき、PAM 経由でログイン認証時に参照される
関連 CONFIG_DB / YANG / CLI¶
- 関連 CONFIG_DB:
RADIUS(グローバル設定),AAA - 関連 CLI:
config radius add/del ... - 関連 YANG:
sonic-system-radius(listRADIUS_SERVER_LIST)
関連リファレンス¶
- YANG:
sonic-system-radius - CLI:
config radius add - CONFIG_DB: RADIUS
引用元¶
関連ページ¶
運用ヒント¶
典型値¶
- key 形式:
RADIUS_SERVER|<ip_or_hostname> - 例:
RADIUS_SERVER|192.168.1.10—auth_port: 1812,priority: 1,auth_type: pap,timeout: 5,retransmit: 3 - 最大 8 台まで登録可能。
priority降順で PAM に渡される
よくある誤設定¶
passkey未設定のまま登録 → hostcfgd が空文字列で pam_radius_auth.conf を生成 → 認証は常に失敗src_intfとsrc_ipを同時指定 →src_intfが優先されsrc_ipは無視される (syslog に警告)retransmit: 0を直接 CONFIG_DB に書き込むと YANG は valid (0..10) だが CLI 経由では設定不可能
確認コマンド¶
値依存挙動マトリクス¶
auth_type 値別挙動¶
| 値 | 挙動 |
|---|---|
pap |
PAP 平文パスワード認証(デフォルト)。グローバル auth_type を per-server で上書き可能。 |
chap |
CHAP チャレンジ認証。 |
mschapv2 |
MS-CHAPv2 認証。Active Directory 連携で主に使用。 |
priority 値別挙動¶
| 値 | 挙動 |
|---|---|
| 1..64 | YANG 有効範囲。hostcfgd は降順ソート (reverse=True) でサーバリストを並べる。 |
| 0 | YANG 違反だが hostcfgd の radius_global_default['priority'] は 0 を持つ。直接 DB 書き込みで設定された場合、最低優先度として動作。 |
vrf 値別挙動¶
| 値 | 挙動 |
|---|---|
mgmt |
pam_radius_auth.conf に vrf=mgmt 行を追記。 |
default |
pam_radius_auth.conf に vrf=default 行を追記。 |
| 未設定 | vrf 行なし → OS デフォルト VRF で接続。 |
src_intf 値別挙動¶
| 値 | 挙動 |
|---|---|
| 有効インタフェース名 | get_interface_ip(src_intf, addr) で IP を解決し src_ip に上書き。src_ip が既に設定されていても無視 (syslog INFO)。 |
| IP 未解決のインタフェース | src_ip を削除 (del server['src_ip'])。pam_radius_auth.conf の source_ip 行が省略される。 |
| 未設定 | グローバル src_ip を継承 (radius_global_default 経由)。 |
例外条件・特殊挙動¶
- data={} で削除:
radius_server_updateでdata == {}の場合は対象サーバエントリをradius_serversから削除し設定ファイルを再生成する。2 - pam_radius_auth.conf の残留ファイル:
auth_portが変更されると旧ポートのファイル (<ip>_<old_port>.conf) は自動削除されない。2 - passkey 空文字フォールバック:
passkey未設定時はRADIUS_SERVER_PASSKEY_DEFAULT = ""が使われ空文字列で PAM 設定が生成される → 認証失敗するが silent drop はなく設定ファイルは生成される。2 - src_intf 変更時の再設定: インタフェース IP が変わると
handle_radius_source_intf_ip_chgがmodify_conf_file()を再呼び出し。インタフェースが存在しない場合は pam_radius_auth.conf のsrc_ip行が省略される。2 - modify_conf_file 失敗は syslog のみ: テンプレート展開やサービス SIGHUP 送信に失敗しても例外はキャッチされ
LOG_ERR/LOG_WARNINGに記録されるだけ。設定ファイルとメモリ内 radius_servers とのずれが生じる可能性がある。2 - skip_msg_auth は CLI から設定不能: YANG に未定義、CLI にオプションなし。直接 CONFIG_DB 書き込みのみで設定可能。2
コード由来の暗黙デフォルト¶
本セクションは YANG default 文以外のコード実装から検出した暗黙デフォルト・フォールバックをまとめる。
フィールド別デフォルト源泉¶
| フィールド | YANG default | hostcfgd fallback 定数 | CLI add default |
備考 |
|---|---|---|---|---|
auth_port |
1812 |
RADIUS_SERVER_AUTH_PORT_DEFAULT = "1812" (L.92) |
default=1812 |
三箇所一致 |
auth_type |
pap |
RADIUS_SERVER_AUTH_TYPE_DEFAULT = "pap" (L.96) |
なし (未設定なら未書き込み) | CLI 省略時は DB に書かれず hostcfgd が補完 |
timeout |
5 |
RADIUS_SERVER_TIMEOUT_DEFAULT = "5" (L.95) |
なし | CLI -t 省略時は未書き込み → hostcfgd が補完 |
retransmit |
3 |
RADIUS_SERVER_RETRANSMIT_DEFAULT = "3" (L.94) |
なし | CLI -r 省略時は未書き込み → hostcfgd が補完 |
passkey |
なし | RADIUS_SERVER_PASSKEY_DEFAULT = "" (L.93) |
なし | 空文字列フォールバック — PAM が認証失敗する |
priority |
なし (1..64) | radius_global_default['priority'] = 0 (L.375) |
default=1 |
YANG-実装 discrepancy: hostcfgd の内部 default は YANG 範囲外の 0 |
skip_msg_auth |
YANG 未定義 | RADIUS_SERVER_SKIP_MSG_AUTH = False (L.98) |
なし | dead field from YANG/CLI perspective — direct DB 書き込みのみ |
vrf |
なし | なし | なし (フラグ --use-mgmt-vrf) |
未設定 → vrf 行なし → デフォルト VRF |
src_intf |
なし | なし | なし | 未設定 → src_ip 行なし |
YANG-CLI Discrepancy: retransmit¶
- YANG:
range "0..10"— 0 は有効値 - CLI (
config/aaa.py):type=click.IntRange(1, 10)— 0 は設定不能 - 影響:
retransmit: 0(再送なし) を設定するにはsonic-db-cli CONFIG_DB hset 'RADIUS_SERVER|<ip>' retransmit 0で直接書き込む必要がある
Priority の YANG-実装 Discrepancy¶
- YANG:
range "1..64"(0 は無効) - hostcfgd
radius_global_default:'priority': 0を内部デフォルトとして保持 radius_global_defaultは各サーバにコピーされる基底オブジェクト。直接 DB 書き込みでpriority未設定の場合、ランタイムで 0 が使われ降順ソートで最低優先度になる。YANG ロード時は 0 を拒否するが hostcfgd はランタイムで 0 を許容する
NAS 情報の自動補完¶
nas_ipがRADIUS|global未設定の場合:get_interface_ip("eth0")で管理インタフェース IP を自動補完しNAS-IP-Addressに使用nas_idがRADIUS|global未設定の場合:get_hostname()でホスト名を自動補完しNAS-Identifierに使用- これらは
radius_global_defaultベースのコピーを通じて各サーバエントリに継承される
pam_radius_auth.conf ファイル名の暗黙規則¶
- 生成パス:
RADIUS_PAM_AUTH_CONF_DIR + srv['ip'] + "_" + srv['auth_port'] + ".conf" - 定数:
RADIUS_PAM_AUTH_CONF_DIR = "/etc/pam_radius_auth.d/"(L.97) - 例:
RADIUS_SERVER|192.0.2.10/auth_port: 1812→/etc/pam_radius_auth.d/192.0.2.10_1812.conf - 暗黙の副作用:
auth_portを変更すると旧ファイルが残留する。hostcfgd は古いファイルを削除しない
派生・条件付き登録 (Phase 6/7)¶
Phase 6: 自動派生¶
hostcfgd が RADIUS_SERVER テーブルを読み、未設定フィールドに radius_global_default のデフォルト値を補完する。auth_port 未設定 → 1812、auth_type 未設定 → pap、timeout 未設定 → 5、retransmit 未設定 → 3、priority 未設定 → 0。さらに RADIUS|global の値が各サーバにコピーされ、サーバ固有設定で上書きされる (server merge)。
Phase 7: 条件付き登録 (add_manager 条件)¶
hostcfgd は常時起動し RADIUS_SERVER テーブルを無条件購読する。ただし AAA.authentication.login に radius が含まれない場合、RADIUS_SERVER エントリがあっても PAM に反映されない (NSS の radius プラグインは無効化される)。
Phase 8: Handler メソッド内分岐¶
| Handler | 分岐条件 | 効果 | evidence |
|---|---|---|---|
hostcfgd radius_server_update |
data == {} |
サーバエントリを radius_servers から削除して設定ファイル再生成 | hostcfgd L.536 |
hostcfgd modify_conf_file |
src_intf あり |
get_interface_ip(src_intf) で IP 解決し src_ip を上書き。解決失敗時は src_ip 削除 |
hostcfgd L.687-700 |
hostcfgd modify_conf_file |
vrf あり |
pam_radius_auth.conf に vrf=<vrf> 行を追記 |
pam_radius_auth.conf.j2 |
hostcfgd modify_conf_file |
src_ip あり |
pam_radius_auth.conf に <src_ip> を追記 |
pam_radius_auth.conf.j2 |
hostcfgd radius_server_update |
skip_msg_auth あり |
is_true() で bool 変換 |
hostcfgd L.541 |
hostcfgd modify_conf_file |
radsrvs_conf 空 |
統計サービス (aaastatsd) を stop |
hostcfgd L.839-844 |
スキャン証跡:
RADIUS_SERVERテーブルはhostcfgdがRADIUS|globalと merged して各サーバの pam_radius_auth.conf を生成する。CLI はauth_portとpriorityを必ず書き込むがauth_type/timeout/retransmitは省略時に未書き込みとなり hostcfgd の fallback 定数が使われる。
CDB → 実コンテナ動作トレース¶
段階 1: Consumer 登録¶
- hostcfgd:
RADIUS_SERVERテーブルをConfigDBConnectorで購読。radius_server_update()がコールバック。
段階 2: CFG → APPL 翻訳¶
- hostcfgd の
modify_conf_file()が各 RADIUS_SERVER エントリと RADIUS|global をマージし/etc/pam_radius_auth.d/<ip>_<port>.confを生成。 - NSS 設定 (
/etc/sonic/radius_nss.conf) も更新。 - APP_DB への書き込みなし。
段階 3: APPL → SAI¶
- SAI 経由なし。RADIUS は SSH/コンソール認証のコントロールプレーン処理。
段階 4: タイミング + 副作用¶
- 設定反映は hostcfgd が pam_radius_auth.conf を書き換えた直後から有効。既存 SSH セッションは影響なし (新規ログインから適用)。
auth_port変更時は旧ポート番号のファイルが/etc/pam_radius_auth.d/に残留する。
書き込み入り口 (Direction A)¶
RADIUS_SERVER テーブルへの書き込みが発生するコード経路を調査した結果。
CLI¶
config radius add <addr> [--auth-port PORT] [--pri PRI] [--auth_type TYPE] [--timeout SEC] [--retransmit COUNT] [--key SECRET] [--use-mgmt-vrf] [--source-interface INTF]—config/aaa.pyが RADIUS_SERVER を書き込む
minigraph / sonic-cfggen¶
minigraph.py に RADIUS_SERVER テーブル生成なし
REST / gNMI¶
REST/gNMI 書き込み経路なし
db_migrator¶
db_migrator.py での RADIUS_SERVER マイグレーションなし
ビルド時デフォルト (build-time default)¶
なし
ハードコードデフォルト / ランタイム注入¶
sonic-host-services data/templates/pam_radius_auth.conf.j2 が RADIUS_SERVER エントリを読み pam_radius_auth を生成 (読み取り側)
死活・デッドコード¶
skip_msg_auth: YANG 未定義・CLI 未実装だが hostcfgd が参照。直接 DB 書き込みのみで設定可能なフィールド
-
src/sonic-yang-models/yang-models/sonic-system-radius.yang(listRADIUS_SERVER_LIST). https://github.com/sonic-net/sonic-buildimage/blob/9ea932ec2e18f35e58268ec2e4456b1d4afd65cd/src/sonic-yang-models/yang-models/sonic-system-radius.yang ↩ -
hostcfgd 実装:
sonic-host-services/scripts/hostcfgd. https://github.com/sonic-net/sonic-host-services/blob/master/scripts/hostcfgd ↩↩↩↩↩↩