简介
本文档介绍如何配置身份服务引擎(ISE)2.2中引入的最大会话功能。
先决条件
要求
Cisco 建议您了解以下主题:
- RADIUS协议
- 无线局域网控制器(WLC)上的802.1x配置
- ISE及其角色(角色)
使用的组件
本文档中的信息基于以下软件和硬件版本:
- 思科身份服务引擎版本2.2
- 无线LAN控制器8.0.100.0
- 思科Catalyst交换机3750 15.2(3)E2
- Windows 7计算机
- 运行6.0.1的Android电话
- 运行5.0的Android电话
- Apple iPad iOS 9.1
本文档中的信息都是基于特定实验室环境中的设备编写的。本文档中使用的所有设备最初均采用原始(默认)配置。如果您的网络处于活动状态,请确保您了解所有命令的潜在影响。
背景信息
“最大会话数”功能提供了一种按用户或按身份组控制和强制执行实时会话的方法。本文档适用于RADIUS会话,但也可以用于TACACS会话。
ISE版本2.2可以根据以下并发会话检测和构建实施策略:
- User Identity — 限制每个特定用户的会话数
- 身份组 — 限制每个特定组的会话数量
- User in a Group — 限制每个用户属于特定组的会话数
并发会话的实施和计数是唯一的,由每个策略服务节点(PSN)管理。PSN之间没有会话计数方面的同步。并发会话功能在运行时进程中实现,数据仅存储在内存中。如果PSN重新启动,MaxSessions计数器将重置。
用户会话计数对用户名不区分大小写,并且独立于使用的网络访问设备(只要使用相同的PSN节点)。
网络图

场景
每个用户的最大会话数
配置
导航到管理>System >设置>最大会话,如图所示:

要启用此功能,请取消选中Unlimited session per user复选框(默认情况下已选中)。在Maximum per user Sessions字段中,配置特定用户在每个PSN上可以拥有的会话数。在本例中,它设置为2。
来自外部身份源(例如,Active Directory)的用户也受此配置的影响。
示例
Bob是来自Active Directory域的帐户的用户名,该帐户已连接并加入ISE服务器。User Maximum Sessions配置为值2,这意味着对于超过此数量的同一用户,不允许任何会话(每个PSN)。
如图所示,用户Bob使用相同的凭证连接Android Phone和Windows计算机:

由于未超出最大会话限制,因此允许两个会话。查看详细的Radius Live日志,如图所示:


22081 Max sessions policy passed step提供最大并发会话检查成功的信息。
启动与另一设备的第三个连接和相同的凭证后,Bob会收到PermitAccess,但Access-Reject会发送到身份验证器:




不允许会话,即使在Radius实时日志中,您可以看到它达到了正确的授权配置文件。要检查实时会话,请导航到操作> Radius >实时会话:

在这种情况下,两个会话的状态都是Started,这表示会话的Accounting Start到达ISE。必须接收Radius Accounting for Max Session才能正常工作,会话计数期间不会考虑已验证状态(允许会话,但不计费):

组的最大会话数
配置
导航到管理>System>设置>最大会话数>组:

此配置最多为内部身份组GroupTest2实施2个会话:您只能为内部组为每个组配置实施。
示例
Alice、Pablo和Peter是内部ISE用户库的用户。它们都是名为GroupTest2的组的成员。根据本示例中的配置,根据组成员资格将会话的最大值设置为2。

Pablo和Peter使用来自名为GroupTest2的内部组的凭证连接到网络:

一旦Alice尝试连接,将强制每个组的MaxSessions限制:


由于Peter和Pablo用尽了最大会话组限制,因此Alice不允许连接到网络:

转角案例
如果配置了User Maximum Sessions,则两个功能独立工作。在本示例中,User Max Sessions设置为1,Maximum Session for Group设置为2。

根据组的最大会话数(2个会话)允许Peter,但由于用户最大会话数配置(一个会话)导致他无法连接到网络:

如果用户同时是一个以上组的成员,并且为其配置了组的最大会话数,则连接后,ISE会针对用户所属的每个组增加组缓存的最大会话数的计数器。
在本示例中,Alice和Pablo都是GroupTest1和GroupTest2的成员。Veronica仅属于GroupTest1,Peter属于GroupTest2

GroupTest1和GroupTest2的Max Session设置为2:

当Alice和Pablo连接到网络时,它们超出了两个组的会话限制。Veronica(仅属于GroupTest1和Peter),GroupTest2的成员无法连接,因为组的最大会话数已达到配置的最大值:


组中用户的最大会话数
配置
导航到管理>System >设置>最大会话数>组。

此配置最多为内部身份组GroupTest2实施2个会话。
示例
Alice是GroupTest2的成员:

此功能的工作方式类似于用户最大会话 — ISE限制指定内部组内用户可拥有的并发会话数。此配置仅影响属于已配置组的用户。
Alice作为GroupTest2的成员,可以有2个同步会话。连接到第三台设备后,ISE根据组中用户的最大会话数超出,返回PermitAccess和Access-Reject:

详细的Radius实时日志:


如果同时启用User Maximum Sessions,则两个功能独立工作。如果用户Alice是组GroupTest2的成员,且组Maximum Session for User in Group配置为2,同时将User Max Sessions配置为每个用户只允许一个会话,则User Max Sessions优先:

当Alice尝试连接第二个设备时,ISE根据超过最大会话用户限制返回访问拒绝:

拒绝原因可以在详细的Radius Live-Log下检查。最大会话用户限制是失败的原因:


组的最大会话数以及该组用户的最大会话数
配置
导航到管理>System >设置>最大会话数>组。

此配置在内部身份组GroupTest2中实施最多3个会话,为该组中的用户实施最多2个会话。
示例
Alice和Pablo是GroupTest2的成员。根据本示例中的配置,GroupTest2中最多允许3个会话。ISE确保单个用户在此组内最多可以有2个会话。

Alice通过两个设备连接。两个终端均连接到网络:

当Alice尝试通过第三台设备连接时,访问被拒绝,超过组内用户的最大会话数限制:


如果Pablo尝试访问网络,则由于GroupTest2的Max Session尚未满,他能够执行此操作:

当Pablo尝试从第二台设备访问网络时,他因超过组的最大会话限制而失败(即使他只有1个会话):


如前面的示例所示,如果启用User Maximum Sessions,它将独立工作。
计数器时间限制
配置
导航到管理>System >设置>最大会话>计数器时间限制。

Counter Time Limit是指定会话在最大会话缓存中计数的时间间隔的功能。此功能允许您指定PSN从计数器删除会话的时间以及允许新会话的时间。
要启用此功能,您需要取消选中Unlimited - no time limits复选框(默认情况下已选中)。在可编辑的字段中,您可以设置在MaxSession的计数器考虑会话的时间长度。
请记住,配置时间后的会话不会断开连接,也不会从会话数据库中删除。在配置的时间之后没有终止授权链(CoA)。
示例
User Max Session设置为仅允许用户一个会话:

Alice在11:00:34使用IPad连接到网络,第二次身份验证在11:07进行,即使超过用户最大会话值,仍允许访问。由于计数器时间限制,两个身份验证均成功。

Alice尝试在上次成功连接通过5分钟之前连接到其他设备,ISE拒绝身份验证:

在上次身份验证后5分钟后,Alice可以使用其他设备连接到网络。

在实时会话中,您可以看到所有三个会话处于Started:

最大会话功能和访客访问权限
集中Web身份验证
在User Maximum Session feature下配置一个会话后,您仍然能够使用两个会话的Guest1帐户进行连接:

为了限制访客访问,您可以在访客类型配置中指定Maximum simultaneous logins。
导航到工作中心(Work Centers)>访客接入(Guest Access)>门户和组件(Portal & Components)>访客类型(Guest Types)并更改最大同时登录(Maximum simultaneous logins)选项,如图所示:

本地Web身份验证
在User Maximum Session下配置了一个会话,您将无法连接:

根据Radius Live-logs,Guest1始终根据门户身份验证进行正确身份验证。一旦WLC通过第二个会话发送Guest1的RADIUS请求,ISE会拒绝访问,因为超过用户限制:

故障排除
Radius实时日志
详细的Radius报告是排除MaxSession功能故障的第一个位置。

此故障原因表示此会话/用户已超过全局最大用户会话限制,如图所示:

此故障原因表示此会话/用户超出组最大会话数限制,如图所示:

此失败原因表示此会话/用户超出了“组用户最大会话数”限制。
MaxSession缓存的检查在选择授权配置文件后发生:
成功:

故障:

ISE调试
最大会话日志位于prrt-server.log中。要收集这些信息,请将runtime-AAA组件设置为DEBUG级别(导航到Administration > System > Logging > Debug Log Configuration > PSN),如图所示:

要获取文件prrt-server.log,请导航到操作>故障排除>下载日志> PSN >调试日志。最大会话日志也收集在终端调试中(Operations > Troubleshoot > Diagnostic Tools > General Tools > EndPoint Debug)。
用户最大会话检查已正确通过:
2017-01-29 08:33:11,310 INFO [Thread-83][] cisco.cpm.prrt.impl.PrRTLoggerImpl -:::::- SessionCache,INFO ,0x7fe858867700,cntx=0000001335,sesn=pgruszczise22/275051099/8,CPMSessionID=0a3e944f00000e7d588da8a0,user=Bob,CallingStationID=c0-4a-00-14-56-f4,SessionCache::onMaxSessionsAznEvent: current global configuration data: auditSessionTtl=[3600], maxUserSessions=[2],SessionCache.cpp:283
2017-01-29 08:33:11,311 INFO [Thread-83][] cisco.cpm.prrt.impl.PrRTLoggerImpl -:::::- SessionCache,INFO ,0x7fe858867700,cntx=0000001335,sesn=pgruszczise22/275051099/8,CPMSessionID=0a3e944f00000e7d588da8a0,user=Bob,CallingStationID=c0-4a-00-14-56-f4,SessionCache::checkMaxSessions: user=[Bob] not found in cache due to first time authorization,SessionCache.cpp:1025
2017-01-29 08:33:11,311 DEBUG [Thread-83][] cisco.cpm.prrt.impl.PrRTLoggerImpl -:::::- SessionCache,DEBUG,0x7fe858867700,cntx=0000001335,sesn=pgruszczise22/275051099/8,CPMSessionID=0a3e944f00000e7d588da8a0,user=Bob,CallingStationID=c0-4a-00-14-56-f4,SessionCache::onMaxSessionsAznEvent: sessionID=[0a3e944f00000e7d588da8a0]; user=[Bob] - checkMaxSessions passed,SessionCache.cpp:360
2017-01-29 08:33:11,311 INFO [Thread-83][] cisco.cpm.prrt.impl.PrRTLoggerImpl -:::::- SessionCache,INFO ,0x7fe858867700,cntx=0000001335,sesn=pgruszczise22/275051099/8,CPMSessionID=0a3e944f00000e7d588da8a0,user=Bob,CallingStationID=c0-4a-00-14-56-f4,SessionCache::onMaxSessionsAznEvent: create a new session object sessionID=[0a3e944f00000e7d588da8a0]; user=[Bob],SessionCache.cpp:375
ISE仅在收到SessionCounter会话的Accounting Start后增加SessionCounter:
2017-01-29 08:33:11,619 DEBUG [Thread-90][] cisco.cpm.prrt.impl.PrRTLoggerImpl -:::::- Radius,DEBUG,0x7fe858766700,cntx=0000001503,sesn=pgruszczise22/275051099/9,CPMSessionID=0a3e944f00000e7d588da8a0,CallingStationID=c0-4a-00-14-56-f4,FramedIPAddress=10.62.148.141,RADIUS PACKET:: Code=4(AccountingRequest) Identifier=0 Length=279
[1] User-Name - value: [Bob]
[4] NAS-IP-Address - value: [10.62.148.79]
[5] NAS-Port - value: [1]
[8] Framed-IP-Address - value: [10.62.148.141]
[25] Class - value: [****]
[30] Called-Station-ID - value: [80-e0-1d-8b-72-00]
[31] Calling-Station-ID - value: [c0-4a-00-14-56-f4]
[32] NAS-Identifier - value: [WLC7]
[40] Acct-Status-Type - value: [Start]
[44] Acct-Session-Id - value: [588da8a0/c0:4a:00:14:56:f4/3789]
[45] Acct-Authentic - value: [RADIUS]
[55] Event-Timestamp - value: [1485678753]
[61] NAS-Port-Type - value: [Wireless - IEEE 802.11]
[64] Tunnel-Type - value: [(tag=0) VLAN]
[65] Tunnel-Medium-Type - value: [(tag=0) 802]
[81] Tunnel-Private-Group-ID - value: [(tag=0) 481]
[26] cisco-av-pair - value: [audit-session-id=0a3e944f00000e7d588da8a0]
[26] Airespace-Wlan-Id - value: [4] ,RADIUSHandler.cpp:2003
(...)
2017-01-29 08:33:11,654 DEBUG [Thread-83][] cisco.cpm.prrt.impl.PrRTLoggerImpl -:::::- SessionCache,DEBUG,0x7fe858867700,cntx=0000001503,sesn=pgruszczise22/275051099/9,CPMSessionID=0a3e944f00000e7d588da8a0,user=Bob,CallingStationID=c0-4a-00-14-56-f4,FramedIPAddress=10.62.148.141,SessionCache::onAccountingStart: user=[Bob]; sessionID=[0a3e944f00000e7d588da8a0],SessionCache.cpp:537
2017-01-29 08:33:11,655 DEBUG [Thread-83][] cisco.cpm.prrt.impl.PrRTLoggerImpl -:::::- SessionCache,DEBUG,0x7fe858867700,cntx=0000001503,sesn=pgruszczise22/275051099/9,CPMSessionID=0a3e944f00000e7d588da8a0,user=Bob,CallingStationID=c0-4a-00-14-56-f4,FramedIPAddress=10.62.148.141,SessionCache::incrementSessionCounters: user=[Bob] current user session count=[1],SessionCache.cpp:862
用户最大会话检查失败:
2017-01-29 08:37:00,534 INFO [Thread-75][] cisco.cpm.prrt.impl.PrRTLoggerImpl -:::::- SessionCache,INFO ,0x7fe858a69700,cntx=0000005011,sesn=pgruszczise22/275051099/15,CPMSessionID=0a3e944f00000e7f588da966,user=Bob,CallingStationID=34-ab-37-60-63-88,SessionCache::onMaxSessionsAznEvent: current global configuration data: auditSessionTtl=[3600], maxUserSessions=[2],SessionCache.cpp:283
2017-01-29 08:37:00,535 INFO [Thread-75][] cisco.cpm.prrt.impl.PrRTLoggerImpl -:::::- SessionCache,INFO ,0x7fe858a69700,cntx=0000005011,sesn=pgruszczise22/275051099/15,CPMSessionID=0a3e944f00000e7f588da966,user=Bob,CallingStationID=34-ab-37-60-63-88,SessionCache::checkMaxSessions: user=[Bob] is not authorized because current active user sessions=[2] >= max-user-sessions=[2],SessionCache.cpp:1010
2017-01-29 08:37:00,535 DEBUG [Thread-75][] cisco.cpm.prrt.impl.PrRTLoggerImpl -:::::- SessionCache,DEBUG,0x7fe858a69700,cntx=0000005011,sesn=pgruszczise22/275051099/15,CPMSessionID=0a3e944f00000e7f588da966,user=Bob,CallingStationID=34-ab-37-60-63-88,SessionCache::onMaxSessionsAznEvent: sessionID=[0a3e944f00000e7f588da966]; user=[Bob] - checkMaxSessions failed,SessionCache.cpp:341
2017-01-29 08:37:00,535 DEBUG [Thread-75][] cisco.cpm.prrt.impl.PrRTLoggerImpl -:::::- RadiusAuthorization,DEBUG,0x7fe858a69700,cntx=0000005011,sesn=pgruszczise22/275051099/15,CPMSessionID=0a3e944f00000e7f588da966,user=Bob,CallingStationID=34-ab-37-60-63-88,RadiusAuthorization::onResponseMaxSessionsAznEvent return from SessionCache,RadiusAuthorization.cpp:371