保留一个本地应急账户,并不会让它成为每次被拒绝登录的第二次机会。在 Cisco IOS 和 IOS XE 的 AAA 模型中,只有当前一个方法以特定方式失败时才会查询该数据库,而返回拒绝的 RADIUS 服务器并不是以那种方式失败的。本地账户覆盖的是无法联系的方法,而不是被拒绝的方法。相信相反的情况,就会把一项策略决定变成对不存在的服务器故障的追查。

为什么方法列表看起来像一架梯子

像 aaa authentication login default group radius local 这样的一行按从左到右的顺序读,多数人把它读成先试 RADIUS,再试本地数据库。这种语法会诱导这种读法,因为列表是一个序列。语义要窄得多:列表列出的是认证方法,而从一种方法前进到下一个方法的规则取决于前一个方法的结果,而不是再给用户一次尝试。

返回错误的方法和返回失败的方法在这里会导致不同的结果。拒绝是一种回答,因为服务器处理了凭据并说了不,列表就停在那里。无法联系的服务器、过期的请求或无法校验的响应,才是让下一个方法继续运行的情况,而且只在平台按这种方式配置失败处理时才成立。这就是为什么追加 local 的经典建议对中断有效,对错误密码却毫无作用。不妨把列表读成两个问题:哪个方法在回答,以及平台把什么算作回答。

把方法列表与服务器组分开

方法列表是一个层面,服务器组是另一个层面。关键字 group radius 命名的是一个组,其内部顺序、重试、超时和死服务器检测都属于该组,而本地方法是它之上的层面。因此调整组内任何设置都无法把拒绝变成回退。在改动这两个层面中的任何一个之前,先确认服务实际引用的是哪个列表。

打印 AAA 配置,读取服务所指向的列表,而不是你记得自己写过的默认值。要在服务实际终止的那台设备上执行。

show running-config | section aaa
show radius server-group RAD-GRP
show aaa servers

服务器表会报告每一项的状态和计数器,这能告诉你网关在尝试期间是否到达了服务器。一个标记为运行中且请求计数持续上升的服务器一直在应答,所以登录失败是一个决定,而不是连接问题。

先读响应,再看日志

响应代码命名了结果,并暗示了它自己的下一步。Access-Reject 意味着后端做出了决定,因此有用的证据是匹配的策略及其背后的账户状态。Access-Challenge 则意味着这次交换需要另一个受支持的步骤,例如第二因素,而本地回退会悄悄跳过策略所要求的东西。

用指定的测试账户复现一次尝试,让响应和后端记录可以在同一时间戳上对比。使用允许你将其失败的凭据。

test aaa group RAD-GRP svc-ops 'LabPass!24' legacy
debug radius authentication

缺少或无法识别的 RADIUS 客户端条目是静默超时的常见原因,因为服务器收到请求,找不到匹配的客户端定义,就把它丢弃而不作回应。共享密钥不匹配通常也表现为超时,因为响应无法通过校验而被丢弃。这两种情况都不像 Access-Reject,也都不能通过添加本地账户来修复。在动方法列表之前,先检查两端的客户端定义和密钥。

为什么本地账户从未证明过任何事

排在组之后的账户只能证明有人为中断做了规划。它不能说明计划是否有效,因为检验它的情况恰恰是没人演练的情况:服务器停止了应答。正常运行时永远到不了的本地登录,可能带着过期密码或锁定状态存在数月而无人察觉。

应急访问是一项设计决定,而不是配置的副作用。给它一个独立的受限账户、一名独立的负责人和一份书面的恢复流程,并把共享密钥轮换纳入该流程。为每个中心用户保留同名的本地密码,正是那种会悄悄重新引入你以为已经移除的访问权的模式。

真正重要的测试是刻意安排的,它在运行期间会中断登录。正因如此,它属于事先写好回滚步骤的计划窗口。

在维护窗口检查回退路径

安排测试时绝不要移除最后一条进入路径。先确认一条独立的管理路径,再确认正常的允许访问,然后是一次刻意的拒绝,最后是已批准的故障行为。这四种情况的预期结果各不相同,把它们合并成一次测试,正是人们把自己锁在仍需要的设备之外的方式。

每一项检查都从控制台会话或带外路径执行,这样错误就无法关闭你正在工作的会话。控制台是唯一不依赖被测组件的路径。

show aaa servers
show running-config | include aaa authentication
test aaa group RAD-GRP svc-ops 'LabPass!24' legacy

之后,恢复先前的配置,并确认下一次真实登录时计数再次变化。如果刻意拒绝产生的是本地登录而不是拒绝,那么列表或失败处理就不是你所相信的那样,这一发现比最初的中断更重要。把结果写进变更记录,附上账户名和测试日期。

相关文章