面向 VPN 组策略的 ASA LDAP 组映射与 DAP 对比
LDAP 属性映射和 DAP 策略都会选定组策略,但二者的执行位置不同。查清你的 ASA 会话实际用的是哪一个。
决定一个 AnyConnect 会话获得哪条组策略的记录有两条,它们位于配置的不同位置,失效方式也各不相同。LDAP 属性映射在认证阶段把目录中的某个值转换成 ASA 的授权属性;DAP 记录则在此之后评估条件,可以添加或覆盖属性。两者都可能落在同一个策略名上,所以一次能登录成功并不能说明是哪套机制起了作用。比较二者的意义在于有意识地选择其中一个,而不是让后一个悄悄压过前一个。
两套机制,两个决策点
选择归结为三个问题:决策是否只依赖目录中的某一个属性值,是否需要该值之外的更多信息,以及两者都命中时允许谁取胜?
如果唯一的输入是组成员身份,属性映射就是更小的工具,也更容易审计:一张映射,挂在一个 AAA 服务器上,每个组一行。如果选择必须考虑设备状态、终端身份、第二个属性或时间窗口,映射的输入就不够用了,能表达这条规则的是 DAP。如果两者都在用,先弄清你自己版本上的优先级再动手写其中任何一个,因为命中 DAP 记录的会话未必保留映射返回的策略。其余都只是记账。
属性映射的路径,按配置顺序
映射的路径从 AAA 服务器定义开始。属性映射必须挂在连接配置文件实际使用的那条 LDAP 服务器条目上;只存在于运行配置里、却没有被该服务器引用的映射不会改变任何东西。正是那行挂接让其余配置活了起来。ASA LDAP 映射指南 是 9.x 版本中映射语法的参考。
在映射内部,一条语句指定目录属性以及它供给的 ASA 属性,后续语句翻译具体的值。map-name memberOf Group-Policy 后面紧跟的是 map-value memberOf CN=VPN-Support,OU=Groups,DC=corp,DC=example Support-ReadOnly 这种形式:左边是目录返回的内容,右边是一条必须已经存在的组策略名称。可分辨名称和策略显示名称不能互换,两者中任何一个几乎写对都不会在登录时报错。
这里有两个细节容易咬人:memberOf 会返回账户所属的每一个组,因此处在两个已映射组中的用户会给映射两个候选值,而指南里的字母顺序规则是你唯一能依靠的平局处理方式,而不是你自己的优先级顺序。未被映射的值什么都不会给出,于是会悄悄回落到配置文件的默认策略。
DAP 的路径,以及它增加了什么
DAP 评估条件,并在 AAA 结果之上应用属性。一条记录带有优先级、动作和一组条件;记录按优先级顺序评估,动作决定评估是继续还是停止。这与按值查找是不同的执行模型,也正因如此它才能表达映射表达不了的规则。
DAP 增加的是输入。条件可以引用目录属性、终端属性和设备状态,命中的记录还可以为该会话携带 ACL、URL 列表或过滤器。因此像“受管笔记本上的支持人员拿到只读策略,同一批人在非受管设备上拿到受限策略”这样的规则,在 DAP 里能表达,在属性映射里不能。映射只有恰好一个输入:目录为你指定的属性返回的那个值。
DAP 还多出一个查看位置,供会话落进错误策略时排查。以继续动作为匹配结果的记录并不会结束评估,后面的记录仍可能改变结果,所以你观察到的是一串序列的产物,而不是一次查找。按顺序读优先级编号,并记住真正干活的可能是那条兜底记录。相比之下,映射没有序列:一个属性,一个值,一个答案。
两者不一致的地方
优先级正是毁掉设计的那部分。当会话同时命中映射条目和 DAP 记录时,结果取决于版本和记录的动作,所以要拿你自己的 ASA 去验证,而不是假设某套机制一定拥有结果。
三种失效方式解释了大部分困惑。映射定义了却从未挂到配置文件所用的服务器标签上,会在任何地方都不报错地给出默认策略。DAP 条件字符串与目录值在大小写或空格上不一致就永远不会命中,兜底记录便悄悄生效。而尚不存在的组策略会被映射接受,因为映射只返回一个名字,于是会话拿不到任何预期权限,日志里也没有任何东西指向缺失的对象。在动组成员身份之前,先把这三项都查一遍。
从活动会话里读取证据
从新建会话而不是从配置里读答案。show vpn-sessiondb detail anyconnect filter name jdoe 会打印会话实际收到的组策略,show running-config ldap attribute-map 会确认映射本来可能返回哪些值。在目录一侧,test aaa-server authentication LDAP-AD username jdoe password <password> 显示 ASA 拿回来的属性,debug ldap 255 则在测试结果与预期不符时显示那次交互。
然后把四条记录书面核对一遍:目录值、已配置的映射或 DAP 条件、本地组策略,以及用户实际能访问到的资源。如果前三条对得上而第四条对不上,问题就在策略主体里,而不在选择上。如果会话显示的策略名正确但 ACL 不对,那就完全别再看 LDAP 了。一次只改一条记录,再重新检查一个新会话,因为只有重新连接的会话才是反映你刚写下的配置的证据。