Topics で読み物として読む
この HLD は実装詳細を含みます。機能の概念・設定・運用を読み物として読みたい場合は Topics 15 章: Security / AAA を参照。
裏取りステータス: Code-verified / 古い HLD
本 HLD は 2019-2020 年(Rev 0.12)の RADIUS authentication 設計。後発の AAA Improvements HLD で多重 role・remote_user 共有・nsswitch.conf 動的変更などの根本問題が指摘されている。priority=high。
RADIUS 管理 user 認証(PAM / NSS / nss-mapper / 多サーバ priority)¶
概要¶
SONiC 管理ユーザの SSH / console ログインを RADIUS で認証する仕組み1。RFC 2865(RADIUS 基本)、RFC 5607(NAS 管理権限)、pam_radius を組み合わせ、Linux PAM / NSS 層で動かす。
要件抜粋1:
- SSH / console ログインの RADIUS 認証
- RADIUS パケットの source IP 設定 が可能(NAS-IP-Address)
- 多サーバ + priority + 自動 failover。passphrase 不一致は "unreachable" 扱いで次サーバへ
- 最大 8 サーバ
source-interface/NAS-IP-Address/ Management VRF 対応many_to_oneフラグ(同一 RADIUS user → 単一 local アカウントへ多対一マッピング)
動作仕様¶
コンポーネント¶
flowchart LR
USER[("CONFIG_DB\nAAA / RADIUS / RADIUS_SERVER")] --> PAMC["pam-radius config\n/etc/pam.d/sshd, login"]
USER --> NSS["NSS module config\n/etc/nsswitch.conf"]
SSH["sshd / login"] --> PAMC
SSH --> NSS
PAMC -->|"UDP/RADIUS"| RAD["RADIUS server (priority 1..8)"]
NSS -->|user lookup| MAPPER["nss-mapper / passwd"]
RAD -->|"VLAN / Privilege / FilterID"| PAMC
PAMC -->|"local account / role 反映"| LOCAL[("/etc/passwd など")]
Mapping Users¶
3 つの mapping モード1:
- 個別 local account: 各 RADIUS user に local UID を作成(HLD 既定)
many_to_one: RADIUS user を単一 local account に集約(共有アカウントの簡易運用)- Unconfirmed Users: 認証は通ったが local account がまだないユーザの暫定状態(priority lookup 中など)
many_to_one=y のときは AAA Improvements HLD が指摘する remote_user 共有問題と同等の副作用がある(ホームディレクトリ共有・auditd 不能)。
User Privilege Table¶
RADIUS Accept に含まれる privilege(admin / operator / user 等)を Linux group / role にマッピングする table を持つ1。SONiC が認識する複数 privilege 値は別表で定義。
CONFIG_DB¶
AAA|authentication:
login = local | radius | radius,local | tacacs | ...
failthrough = true | false
fallback = true | false
RADIUS|global:
auth_type = pap | chap | mschapv2
retransmit = 3
timeout = 5
passkey = <secret>
src_ip = <ip> # NAS-IP-Address
src_intf = <iface> # source-interface
nas_ip = <ip>
many_to_one = y | n # v0.11 で追加
RADIUS_SERVER|<addr>:
auth_port = 1812
passkey = <secret> # global を上書き
priority = 1..N # 数字大きいほど高 priority
vrf = <vrf-name>
timeout = <s>
server には DNS 名も指定可(v0.9 work-in-progress)1。
認証フロー¶
sequenceDiagram
participant U as user
participant SD as sshd
participant P as pam_radius
participant R1 as RADIUS srv #1 (priority high)
participant R2 as RADIUS srv #2 (priority lower)
U->>SD: SSH login
SD->>P: pam_authenticate
P->>R1: Access-Request (NAS-IP, src-intf)
alt 到達 + Accept
R1-->>P: Access-Accept (privilege/VLAN/...)
else timeout / 不一致 / Reject
P->>R2: Access-Request
R2-->>P: Accept / Reject
end
P-->>SD: success/fail
passphrase 不一致時に "unreachable" として次に進むのは、運用ミスでも認証停止しないための仕様1。
Warm boot¶
CONFIG_DB が persist しているので RADIUS 設定は warm boot 越しに継続。ただしランタイムで nsswitch.conf を書き換える方式に伴う問題(AAA Improvements HLD が指摘)を内包する1。
📋 検証エビデンス: sonic-net/SONiC/doc/aaa/radius_authentication.md#L92-L102 (sha: 49bab5b5ff0e924f1ea52b3d9db0dfa4191a7c06)
出典:
sonic-net/SONiC/doc/aaa/radius_authentication.md#L92-L102 (sha: 49bab5b5ff0e924f1ea52b3d9db0dfa4191a7c06)
抜粋:
Support multiple RADIUS servers, with server priority configuration.
... if an incorrect RADIUS passphrase ... has been configured ... is treated as an "unreachable" RADIUS server,
... Support configuring a maximum of 8 servers
判断根拠: 多サーバ priority + 8 上限 + passphrase 不一致を unreachable 扱いの根拠。
設定¶
CLI¶
| Command | 用途 |
|---|---|
config aaa authentication login radius |
RADIUS のみ |
config aaa authentication login radius local |
RADIUS → fallback local |
config aaa authentication failthrough enable |
failthrough 有効化 |
config radius nasip <ip> |
NAS-IP-Address |
config radius sourceinterface <iface> |
source-interface |
config radius add <addr> --auth-port 1812 --priority N --key <secret> --vrf mgmt |
server 追加 |
config radius delete <addr> |
server 削除 |
show aaa / show radius |
状態表示 |
制限事項¶
- TACACS+ より後発のため互換性表記が多い
many_to_one=yは AAA Improvements 指摘の副作用を伴う- 8 サーバ上限
- nsswitch.conf 動的変更の問題(process が古い設定を caching する)
干渉する機能¶
- AAA Improvements: 同 area の根本見直し HLD
- Port Access Control(PAC): 同じ
RADIUS_SERVERを共有 - Mgmt VRF:
vrfフィールドと連動
トラブルシューティング¶
- 認証失敗が続く →
passkey確認、priority 順番確認、unreachable扱いになっていないかログ確認 - privilege が変わらない →
User Privilege Tableで RADIUS 値→Linux role マッピングを確認
確認コマンド例:
# RADIUS 認証設定確認
show radius
show aaa
redis-cli -n 4 hgetall 'RADIUS|global'
cat /etc/pam.d/common-auth | head
引用元¶
裏取りメモ(Verifier batch 29)¶
RADIUS authentication の PAM/NSS 実装の現行 master 取り込みを hostcfgd で確認した。
PAM_RADIUS_AUTH_CONF_TEMPLATE = "/usr/share/sonic/templates/pam_radius_auth.conf.j2"、RADIUS_PAM_AUTH_CONF_DIR = "/etc/pam_radius_auth.d/"、NSS_RADIUS_CONF = "/etc/radius_nss.conf":.cache/sonic-sources/sonic-host-services/scripts/hostcfgdL38-L97AaaCfg.pick_src_intf_ipaddrs()でsrc_intf指定時の RADIUS server bind 元 IP を解決 (L444 以降)、src_intfを RADIUS グローバル / per-server から拾う処理 (L497-L501)- multi server priority / passkey / auth_type / timeout は AaaCfg の RADIUS 部に存在
HLD が記述する pam_radius + nsswitch RADIUS NSS の二段構成(ssh login → PAM → RADIUS、user lookup → NSS → radius_nss)は実装と一致。後発 AAA Improvements HLD で指摘された多重 role 共有問題は別途残課題で、本ページ自体の主張は実装に追随しているため code-verified に昇格。
関連 Topics¶
運用入口¶
この HLD に対応する運用面の入口(CLI / CONFIG_DB / YANG / Runbook)を以下にまとめる。
関連 CLI¶
config aaaconfig radius