コンテンツにスキップ

RADIUS_SERVER テーブル

概要

サーバごとの RADIUS クライアント設定を保持するリストテーブル1hostcfgdAAA ハンドラが読み、/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 構造

RADIUS_SERVER|<ip_or_hostname>

<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..60
  • retransmit 範囲: 0..10 (YANG) — CLI は 1..10 のみ許容 (YANG-CLI discrepancy は下記「コード由来の暗黙デフォルト」セクション参照)
  • エントリ上限: 8 台 (max-elements 8 in YANG / RADIUS_MAXSERVERS = 8 in CLI)

購読者

  • hostcfgd (sonic-host-services の AAA ハンドラ): CONFIG_DB/etc/pam_radius_auth.d/<ip>_<port>.conf を生成し PAM に反映
  • AAA.authentication.loginradius を含むとき、PAM 経由でログイン認証時に参照される

関連 CONFIG_DB / YANG / CLI

  • 関連 CONFIG_DB: RADIUS (グローバル設定), AAA
  • 関連 CLI: config radius add/del ...
  • 関連 YANG: sonic-system-radius (list RADIUS_SERVER_LIST)

関連リファレンス

引用元

関連ページ

運用ヒント

典型値

  • key 形式: RADIUS_SERVER|<ip_or_hostname>
  • 例: RADIUS_SERVER|192.168.1.10auth_port: 1812, priority: 1, auth_type: pap, timeout: 5, retransmit: 3
  • 最大 8 台まで登録可能。priority 降順で PAM に渡される

よくある誤設定

  • passkey 未設定のまま登録 → hostcfgd が空文字列で pam_radius_auth.conf を生成 → 認証は常に失敗
  • src_intfsrc_ip を同時指定 → src_intf が優先され src_ip は無視される (syslog に警告)
  • retransmit: 0 を直接 CONFIG_DB に書き込むと YANG は valid (0..10) だが CLI 経由では設定不可能

確認コマンド

sonic-db-cli CONFIG_DB keys 'RADIUS_SERVER*'
show radius

値依存挙動マトリクス

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_updatedata == {} の場合は対象サーバエントリを 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_chgmodify_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_ipRADIUS|global 未設定の場合: get_interface_ip("eth0") で管理インタフェース IP を自動補完し NAS-IP-Address に使用
  • nas_idRADIUS|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 未設定 → 1812auth_type 未設定 → paptimeout 未設定 → 5retransmit 未設定 → 3priority 未設定 → 0。さらに RADIUS|global の値が各サーバにコピーされ、サーバ固有設定で上書きされる (server merge)。

Phase 7: 条件付き登録 (add_manager 条件)

hostcfgd は常時起動し RADIUS_SERVER テーブルを無条件購読する。ただし AAA.authentication.loginradius が含まれない場合、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 テーブルは hostcfgdRADIUS|global と merged して各サーバの pam_radius_auth.conf を生成する。CLI は auth_portpriority を必ず書き込むが 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 書き込みのみで設定可能なフィールド