此产品的文档集力求使用非歧视性语言。在本文档集中,非歧视性语言是指不隐含针对年龄、残障、性别、种族身份、族群身份、性取向、社会经济地位和交叉性的歧视的语言。由于产品软件的用户界面中使用的硬编码语言、基于 RFP 文档使用的语言或引用的第三方产品使用的语言,文档中可能无法确保完全使用非歧视性语言。 深入了解思科如何使用包容性语言。
思科采用人工翻译与机器翻译相结合的方式将此文档翻译成不同语言,希望全球的用户都能通过各自的语言得到支持性的内容。 请注意:即使是最好的机器翻译,其准确度也不及专业翻译人员的水平。 Cisco Systems, Inc. 对于翻译的准确性不承担任何责任,并建议您总是参考英文原始文档(已提供链接)。
本文档介绍常见身份服务引擎(ISE)终端安全评估服务问题:“AnyConnect ISE终端安全评估模块显示合规性……”
本文档介绍常见身份服务引擎(ISE)终端安全评估服务问题 — AnyConnect ISE终端安全评估模块在ISE上的会话状态为挂起时显示合规性。
虽然症状始终相同,但此问题可能有多个根本原因。
通常,对此类问题进行故障排除会非常耗时,从而造成严重影响。
本文档解释以下内容:
有关后面介绍的概念的更详细说明,请参阅:
通常,在没有网络访问或持续重定向到浏览器中的ISE客户端调配门户时,会出现此问题,同时,AnyConnect ISE终端安全评估模块将终端安全评估状态显示为Compliant。
典型的最终用户体验:
通常,在此问题的初始分类中,ISE管理员执行Radius Live日志调查以确保存在实际身份验证到达ISE。
在此阶段发现的第一个症状表示终端与ISE之间的状态不匹配,如在实时日志或RADIUS身份验证报告终端的最后成功身份验证显示Pending状态状态。
典型的ISE管理员体验:
注意:当上述问题出现时,c.和d.并不总是出现在实时日志中。状态状态为Compliant的会话事件更常见于由过期或幻像会话引起的场景,本文档稍后将对此进行介绍。
此问题通常表现在两个有问题的场景中,并且每个场景都有多个根本原因。场景:
为了更好地了解问题,请调查所需的ISE会话管理逻辑和AnyConnect发现过程。
在ISE部署中,有两个人员负责会话管理流程:PSN和监控节点(MNT)。
要正确排除故障并确定此问题,请务必了解两个角色上的会话管理理论。
如本图所述,MNT节点根据来自PSN的已通过的身份验证系统日志消息创建季节。
系统日志可以更新后续会话状态以进行记帐。
MNT上的会话删除在以下三种情况下发生:
来自PSN的系统日志消息示例。当在DEBUG中启用runtime-aaa组件时,这些消息将登录到prrt-server.log。 粗体部分可用于构建搜索正则表达式。
通过身份验证:
AcsLogs,2020-04-07 10:07:29,202,DEBUG,0x7fa0ada91700,cntx=0000629480,sesn=skuchere-ise26-1/375283310/10872,CPMSessionID=0A3E946C00000073559C0123,user=bob@example.com,CallingStationID=00-50-56-B6-0B-C6,FramedIPAddress=192.168.255.205,Log_Message=[2020-04-07 22:53:24.288 +02:00 0000423024 5200 NOTICE Passed-Authentication: Authentication succeeded, ConfigVersionId=87, Device IP Address=10.62.148.108, DestinationIPAddress=192.168.43.26, DestinationPort=1812, UserName=bob@example.com, Protocol=Radius, RequestLatency=45, NetworkDeviceName=3850-1-BB, User-Name=bob@example.com, NAS-IP-Address=10.62.148.108, NAS-Port=50105, Service-Type=Framed, Framed-IP-Address=192.168.255.205, Framed-MTU=1472, State=37CPMSessionID=0A3E946C00000073559C0123\;42SessionID=skuchere-ise26-1/375283310/10872\;, Calling-Station-ID=00-50-56-B6-0B-C6, NAS-Port-Type=Ethernet, NAS-Port-Id=GigabitEthernet1/0/5, EAP-Key-Name=, cisco-av-pair=service-type=Framed, cisco-av-pair=audit-session-id=0A3E946C00000073559C0123, cisco-av-pair=method=dot1x, cisco-av-pair=client-iif-id=526638260, NetworkDeviceProfileName=Cisco, NetworkDeviceProfileId=b0699505-3150-4215-a80e-6753d45bf56c, IsThirdPartyDeviceFlow=false, RadiusFlowType=Wired802_1x, AcsSessionID=skuchere-ise26-1/375283310/10872, AuthenticationIdentityStore=EXAMPLE, AuthenticationMethod=MSCHAPV2, SelectedAccessService=Default Network Access, SelectedAuthorizationProfiles=PermitAccess, IsMachineAuthentication=false, IdentityGroup=Endpoint Identity Groups:Profiled:Workstation, Step=11001, Step=11017, Step=15049, Step=15008, Step=15048, Step=15048, Step=15048, Step=11507, Step=12500, Step=12625, Step=11006, Step=11001, Step=11018, Step=12301, Step=12300, Step=12625, Step=11006, Step=11001, Step=11018, Step=12302, Step=12318, Step=12800, Step=12805, Step=12806, Step=12807, Step=12808, Step=12810, Step=12811, Step=12305, Step=11006, Step=11001, Step=11018, Step=12304, Step=12305, Step=11006, Step=11001, Step=11018, Step=12304, Step=12305, Step=11006, Step=11001, Step=11018, Step=12304, Step=12305, Step=11006, Step=11001, Step=11018, Step=12304, Step=12318, Step=12812, Step=12813, Step=12804, Step=12801, Step=12802, Step=12816, Step=12310, Step=12305, Step=11006, Step=11001, Step=11018, Step=12304, Step=12313, Step=11521, Step=12305, Step=11006, Step=11001, Step=11018, Step=12304, Step=11522, Step=11806, Step=12305, Step=11006, Step=11001, Step=11018, Step=12304, Step=11808, Step=15041, Step=22072, Step=15013, Step=24210, Step=24216, Step=15013, Step=24430, Step=24325, Step=24313, Step=24319, Step=24323, Step=24343, Step=24402, Step=22037, Step=11824, Step=12305, Step=11006, Step=11001, Step=11018, Step=12304, Step=11810, Step=11814, Step=11519, Step=12314, Step=12305, Step=11006, Step=11001, Step=11018, Step=12304, Step=24715, Step=15036, Step=24209, Step=24211, Step=24432, Step=24325, Step=24313, Step=24319, Step=24323, Step=24355, Step=24416, Step=15048, Step=15016, Step=22081, Step=22080, Step=12306, Step=11503, Step=11002, SelectedAuthenticationIdentityStores=Internal Users, SelectedAuthenticationIdentityStores=All_AD_Join_Points, SelectedAuthenticationIdentityStores=Guest Users, AuthenticationStatus=AuthenticationPassed, NetworkDeviceGroups=IPSEC#Is IPSEC Device#No, NetworkDeviceGroups=Location#All Locations, NetworkDeviceGroups=Device Type#All Device Types, IdentityPolicyMatchedRule=Dot1X, AuthorizationPolicyMatchedRule=Compliant-Wired, EapTunnel=PEAP, EapAuthentication=EAP-MSCHAPv2, CPMSessionID=0A3E946C00000073559C0123, EndPointMACAddress=00-50-56-B6-0B-C6, PostureAssessmentStatus=NotApplicable, EndPointMatchedProfile=Microsoft-Workstation, ISEPolicySetName=Default, IdentitySelectionMatchedRule=Dot1X, AD-User-Resolved-Identities=bob@example.com, AD-User-Candidate-Identities=bob@example.com, AD-User-Join-Point=EXAMPLE.COM, StepData=4= Radius.NAS-IP-Address, StepData=5= Cisco-VPN3000.CVPN3000/ASA/PIX7x-Tunnel-Group-Name, StepData=6= DEVICE.Device Type, StepData=77=All_User_ID_Stores, StepData=78=Internal Users, StepData=81=All_AD_Join_Points, StepData=82=All_AD_Join_Points, StepData=83=bob@example.com, StepData=84=example.com, StepData=85=example.com, StepData=87=bob@example.com, StepData=88=All_AD_Join_Points, StepData=109=EXAMPLE, StepData=110=bob@example.com, StepData=111=example.com, StepData=112=example.com, StepData=114=example.com, StepData=115=EXAMPLE, StepData=116= EXAMPLE.ExternalGroups, AD-User-Resolved-DNs=CN=bob\,CN=Users\,DC=example\,DC=com, AD-User-DNS-Domain=example.com, AD-Groups-Names=example.com/Users/Domain Users, AD-User-NetBios-Name=EXAMPLE, IsMachineIdentity=false, UserAccountControl=66048, AD-User-SamAccount-Name=bob, AD-User-Qualified-Name=bob@example.com, allowEasyWiredSession=false, TLSCipher=ECDHE-RSA-AES256-GCM-SHA384, TLSVersion=TLSv1.2, DTLSSupport=Unknown, HostIdentityGroup=Endpoint Identity Groups:Profiled:Workstation, Network Device Profile=Cisco, Location=Location#All Locations, Device Type=Device Type#All Device Types, IPSEC=IPSEC#Is IPSEC Device#No, ExternalGroups=S-1-5-21-875452798-754861120-3039794717-513, IdentityAccessRestricted=false, PostureStatus=Compliant, Response={Class=CACS:0A3E946C00000073559C0123:skuchere-ise26-1/375283310/10872; EAP-Key-Name=19:5e:8c:e9:13:0c:89:23:78:49:ad:2b:d4:31:63:51:27:81:db:e2:61:b1:51:36:6d:11:10:41:ce:3b:aa:cc:c6:66:4e:7c:92:f8:83:c5:06:84:ac:95:4c:5b:f1:b2:37:a2:f5:04:4e:9e:4d:08:79:55:b7:4d:9a:41:f5:b2:0a; MS-MPPE-Send-Key=****; MS-MPPE-Recv-Key=****; LicenseTypes=65541; },],MessageFormatter.cpp:107
记帐开始:
AcsLogs,2020-04-07 10:07:30,202,DEBUG,0x7fa0ad68d700,cntx=0000561096,sesn=skuchere-ise26-1/375283310/10211,CPMSessionID=0A3E946C00000073559C0123,user=bob@example.com,CallingStationID=00-50-56-B6-0B-C6,FramedIPAddress=192.168.255.205,Log_Message=[2020-04-07 10:07:30.857 +02:00 0000382874 3000 NOTICE Radius-Accounting: RADIUS Accounting start request, ConfigVersionId=87, Device IP Address=10.62.148.108, UserName=bob@example.com, RequestLatency=7, NetworkDeviceName=3850-1-BB, User-Name=bob@example.com, NAS-IP-Address=10.62.148.108, NAS-Port=50105, Framed-IP-Address=192.168.255.205, Class=CACS:0A3E946C00000073559C0123:skuchere-ise26-1/375283310/10210, Called-Station-ID=00-E1-6D-D1-4F-05, Calling-Station-ID=00-50-56-B6-0B-C6, Acct-Status-Type=Start, Acct-Delay-Time=0, Acct-Session-Id=00000041, Acct-Authentic=Remote, Event-Timestamp=1586279242, NAS-Port-Type=Ethernet, NAS-Port-Id=GigabitEthernet1/0/5, cisco-av-pair=audit-session-id=0A3E946C00000073559C0123, cisco-av-pair=method=dot1x, AcsSessionID=skuchere-ise26-1/375283310/10211, SelectedAccessService=Default Network Access, Step=11004, Step=11017, Step=15049, Step=15008, Step=15048, Step=22083, Step=11005, NetworkDeviceGroups=IPSEC#Is IPSEC Device#No, NetworkDeviceGroups=Location#All Locations, NetworkDeviceGroups=Device Type#All Device Types, CPMSessionID=0A3E946C00000073559C0123, Network Device Profile=Cisco, Location=Location#All Locations, Device Type=Device Type#All Device Types, IPSEC=IPSEC#Is IPSEC Device#No, ],MessageFormatter.cpp:107
中期会计更新:
AcsLogs,2020-04-07 22:57:48,642,DEBUG,0x7fa0adb92700,cntx=0000629843,sesn=skuchere-ise26-1/375283310/10877,CPMSessionID=0A3E946C00000073559C0123,user=bob@example.com,CallingStationID=00-50-56-B6-0B-C6,FramedIPAddress=192.168.255.205,Log_Message=[2020-04-07 22:57:48.650 +02:00 0000423268 3002 NOTICE Radius-Accounting: RADIUS Accounting watchdog update, ConfigVersionId=87, Device IP Address=10.62.148.108, UserName=bob@example.com, RequestLatency=8, NetworkDeviceName=3850-1-BB, User-Name=bob@example.com, NAS-IP-Address=10.62.148.108, NAS-Port=50105, Framed-IP-Address=192.168.255.205, Class=CACS:0A3E946C00000073559C0123:skuchere-ise26-1/375283310/10872, Called-Station-ID=00-E1-6D-D1-4F-05, Calling-Station-ID=00-50-56-B6-0B-C6, Acct-Status-Type=Interim-Update, Acct-Delay-Time=0, Acct-Input-Octets=2293926, Acct-Output-Octets=0, Acct-Session-Id=00000041, Acct-Authentic=Remote, Acct-Input-Packets=15785, Acct-Output-Packets=0, Event-Timestamp=1586325462, NAS-Port-Type=Ethernet, NAS-Port-Id=GigabitEthernet1/0/5, cisco-av-pair=audit-session-id=0A3E946C00000073559C0123, cisco-av-pair=method=dot1x, AcsSessionID=skuchere-ise26-1/375283310/10877, SelectedAccessService=Default Network Access, Step=11004, Step=11017, Step=15049, Step=15008, Step=22085, Step=11005, NetworkDeviceGroups=IPSEC#Is IPSEC Device#No, NetworkDeviceGroups=Location#All Locations, NetworkDeviceGroups=Device Type#All Device Types, CPMSessionID=0A3E946C00000073559C0123, Network Device Profile=Cisco, Location=Location#All Locations, Device Type=Device Type#All Device Types, IPSEC=IPSEC#Is IPSEC Device#No, ],MessageFormatter.cpp:107
记帐停止:
AcsLogs,2020-04-08 11:43:22,356,DEBUG,0x7fa0ad68d700,cntx=0000696242,sesn=skuchere-ise26-1/375283310/11515,CPMSessionID=0A3E946C00000073559C0123,user=bob@example.com,CallingStationID=00-50-56-B6-0B-C6,FramedIPAddress=192.168.255.205,Log_Message=[2020-04-08 11:43:22.368 +02:00 0000463071 3001 NOTICE Radius-Accounting: RADIUS Accounting stop request, ConfigVersionId=88, Device IP Address=10.62.148.108, UserName=bob@example.com, RequestLatency=12, NetworkDeviceName=3850-1-BB, User-Name=bob@example.com, NAS-IP-Address=10.62.148.108, NAS-Port=50105, Framed-IP-Address=192.168.255.205, Class=CACS:0A3E946C00000073559C0123:skuchere-ise26-1/375283310/11503, Called-Station-ID=00-E1-6D-D1-4F-05, Calling-Station-ID=00-50-56-B6-0B-C6, Acct-Status-Type=Stop, Acct-Delay-Time=0, Acct-Input-Octets=4147916, Acct-Output-Octets=0, Acct-Session-Id=00000041, Acct-Authentic=Remote, Acct-Session-Time=92157, Acct-Input-Packets=29120, Acct-Output-Packets=0, Acct-Terminate-Cause=Lost Carrier, Event-Timestamp=1586371399, NAS-Port-Type=Ethernet, NAS-Port-Id=GigabitEthernet1/0/5, Framed-IPv6-Address=2001:10::100, Framed-IPv6-Address=2001:10::101, cisco-av-pair=audit-session-id=0A3E946C00000073559C0123, cisco-av-pair=method=dot1x, AcsSessionID=skuchere-ise26-1/375283310/11515, SelectedAccessService=Default Network Access, Step=11004, Step=11017, Step=15049, Step=15008, Step=22084, Step=11005, NetworkDeviceGroups=IPSEC#Is IPSEC Device#No, NetworkDeviceGroups=Location#All Locations, NetworkDeviceGroups=Device Type#All Device Types, CPMSessionID=0A3E946C00000073559C0123, Network Device Profile=Cisco, Location=Location#All Locations, Device Type=Device Type#All Device Types, IPSEC=IPSEC#Is IPSEC Device#No, ],MessageFormatter.cpp:107
什么是PSN会话缓存?
存储特定PSN的所有活动会话的内存数据库。会话缓存始终是节点本地的,而且ISE中没有可以执行从一个节点到另一个节点的FULL会话状态复制的机制。
对于每个活动会话ID,PSN存储身份验证/授权阶段收集的所有属性,例如内部/外部用户组、网络接入设备(NAD)属性、证书属性等。这些属性由PSN用于选择不同的策略类型,如身份验证、授权、客户端调配、状态。
当节点或节点自身上的服务重新启动时,会话缓存被完全删除。
当前会话处理逻辑在两个场景中在会话缓存中创建一个新条目,现有会话的后续详细信息可以根据来自NAD的记帐消息进行更新:
当涉及会话删除时,PSN将实施以下逻辑:
在ISE部署中,未执行实际身份验证的PSN已处理现有会话的记帐停止:
过时的会话示例:
1.在PSN上为会话ABC成功进行身份验证。
2. PSN在会话缓存中创建条目。
3.进行状态评估。
4.标记为Compliant的会话。
5.状态更改触发的授权更改(COA)导致终端重新进行身份验证以应用下一个访问级别。
6.会话ABC的记帐停止到达PSN2。
在第6步会话后,ABC在PSN1上停滞在陈旧状态,因为此PSN上不会处理记帐停止消息以将其删除。如果部署未经历大量的身份验证尝试,则会长时间删除会话。
在以下情况下,过时的会话显示在PSN会话缓存中:
负载均衡器(LB)环境中过时的会话示例:
1.由PSN 1执行的会话ABC的初始身份验证。
2.此身份验证在负载均衡器上启动粘性计时器。
3. PSN 1在本地缓存中为会话ABC创建条目。
4.将已通过身份验证的系统日志消息传输到MNT节点。
5.在MNT会话目录中创建的会话ABC的条目,状态为Authenticated。
6.会话ABC的记帐开始消息到达PSN 1。
7.会话ABC的会话缓存条目已使用Accounting-Start中的信息更新。
8. Accounting-Start的系统日志消息已传输到MNT节点。
9.会话状态更新为Started。
10.负载均衡器上的粘性计时器过期。
11.负载平衡器转发到PSN 2的会话ABC的记帐停止。
12. PSN 2将记帐停止的系统日志消息转发到MNT。
13.在MNT上标记为终止的会话ABC。
幻像会话是会计临时更新到达未对此特定会话执行身份验证的PSN时的场景。在这种情况下,将在PSN会话缓存中创建一个新条目,如果PSN没有收到此会话的记帐停止消息,则不会删除该条目,除非PSN达到活动会话的限制。
幻像会话示例:
1.在会话ABC的PSN1上执行与旧会话示例中所述的相同步骤。
2.会话ABC在PSN1会话缓存中的状态为Compliant。
3.会话ABC的会计临时更新命中PSN2。
4.在PSN2上创建的会话ABC的会话条目。由于会话条目是从记帐消息创建的,因此其属性数量有限。例如,状况状态对于会话ABC不可用。用户组和其他授权特定属性也不存在。
在以下情况下,虚拟会话显示在PSN会话缓存中:
通向PSN1的网络路径上出现临时问题的场景幻像会话示例:
1.由PSN执行的会话ABC的初始身份验证。
2. PSN1在本地缓存中为会话ABC创建条目。
3.将已通过身份验证的系统日志消息传输到MNT节点。
4.在TimesTen DB中创建的会话ABC的条目,状态为Authenticated。
5.会话ABC的记帐开始消息到达PSN 1。
6.会话ABC的会话缓存条目已使用Accounting-Start中的信息更新。
7. Accounting-Start的系统日志消息已传输到MNT节点。
8.会话状态更新为Started。
9.会话ABC的临时记帐更新已转发到PSN2。
10. PSN2在本地缓存中为会话ABC创建一个条目。
11.将会话ABC转发到PSN1的记帐停止。
12.会话ABC的条目已从PSN1上的会话缓存中删除。
13. PSN 1将记帐停止的系统日志消息转发到MNT。
14.在MNT上标记为终止的会话ABC。
为长寿VPN连接创建的虚拟会话场景:
1. PSN1上的初始身份验证。
2.在会话缓存中创建的会话ABC。
3.记帐会启动PSN处理的消息。
4.分配给虚拟专用网络(VPN)适配器的新IP地址。
5.具有IP地址信息的临时会计更新位于PSN上。
6.添加到会话缓存的IP地址信息。
7.对PSN1进行状态评估。
8.会话中更新的状态状态。
9. ISE执行的COA推送,这将触发要分配的新访问级别。
10.网络路径中断,使PSN1无法访问。
11.在临时更新间隔到期后,ASA/FTD检测到PSN1无法访问。
12. PSN2将更新中期会计信息。
13.在PSN2会话缓存中创建的虚拟会话。
如果以后PSN1变得可访问(14),所有后续记帐消息都在该处转发(15,16),这会将会话ABC保留在PSN2会话缓存中一段未定义的时间。
要了解陈旧会话和虚拟会话如何中断安全评估,您可以查看AnyConnect ISE安全评估模块发现流程:
第1阶段发现:
在此阶段,ISE终端安全评估模块执行4个同时问题,以定位对终端执行身份验证的PSN。
首先,图中的3个探测基于重定向(默认GW IP)。发现主机IP(如果已定义)和enroll.cisco.com IP — 这些探测功能始终将代理指向正确的PSN,因为重定向URL是从NAD本身获取的。
第4号探测将发送到ConnectionData.xml文件中显示的所有主服务器。 如果客户端在PSN之间迁移,可在首次成功安全评估尝试后创建此文件,并在以后更新文件内容。在Windows系统上,文件位置为- C:\ProgramData\Cisco\Cisco AnyConnect Secure Mobility Client\ISE Posture\。
由于所有阶段1探测都同时执行,因此仅当所有其他3个探测失败或ISE终端安全评估模块无法在5秒内与重定向URL中返回的PSN建立正确通信时,才使用探测4的结果。
当探测器4到达PSN时,它包含在终端上发现的活动IP和MAC地址列表。PSN使用此数据在本地缓存中查找此终端的会话。如果PSN的终端存在陈旧或幻像会话,则可能导致在客户端稍后显示错误的终端安全评估状态。
当代理获得探测4的多个应答时(ConnectionData.xml可以包含多个主PSN),始终使用最快的应答。
第2阶段发现:
所有第2阶段发现探测都无重定向,这意味着每个探测都会触发目标PSN上的会话查找。如果PSN无法在本地会话缓存中找到会话,则必须执行MNT查找(仅基于MAC地址)以查找会话所有者并将所有者名称返回给代理。
由于所有探测都会触发会话查找,因此阶段2发现可能更容易受到由于陈旧或幻像会话而导致的问题。
如果PSN进入第2阶段,会话缓存中存在的发现探测功能会为同一终端创建陈旧或幻像条目。这会导致向最终用户返回错误的终端安全评估状态。
此示例显示了PSN保留过时会话或虚拟会话时如何进行终端安全评估:
注意:必须记住,仅当所有基于重定向的发现探测失败或实施非重定向状态时才会出现此问题。
1. ISE终端安全评估模块发出的任何Find my session probe。
2. PSN在会话缓存中执行会话查找。如果要找到会话,则会出现过时的会话或幻像会话问题。
3. PSN运行客户端调配策略选择。如果虚拟会话缺少身份验证/授权属性,且客户配置的所有策略都非常具体(例如,为特定Active Directory组创建策略),则PSN无法分配正确的客户端调配策略。这可能显示在错误消息“Bypassing AnyConnect scan your network is configured to use Cisco NAC Agent”(绕过AnyConnect扫描您的网络配置为使用思科NAC代理)中。
4.对于虚拟会话场景,ISE终端安全评估模块继续初始终端安全评估请求。此请求包含有关在终端上检测到的所有安全和补丁管理产品的信息。
5. PSN使用来自请求和会话属性的信息来匹配正确的终端安全评估策略。由于幻像会话此时缺少属性,因此没有要匹配的策略。在这种情况下,PSN会回复终端合规性,因为如果不匹配安全评估策略,这是默认ISE行为。
注意:当存在可从虚拟会话属性中选择的通用策略时,我们继续执行步骤6。
6. PSN将所选安全评估策略返回给代理。
注意:当无法选择任何策略时,PSN将返回合规状态。
7.代理会返回每个策略/需求的通过或失败状态。
8.报告对ISE进行评估,会话状态更改为合规。
注意:如果出现由虚拟会话引起的终端安全评估问题,ISE管理员可能会注意到一些失败的终端安全评估COA,因为在这种情况下,COA请求会从错误的PSN执行,并且会话ID错误。
ISE终端安全评估模块旨在监控终端上有限数量的事件以触发发现进程。触发发现的事件的列表:
ISE终端安全评估模块未检测到新的dot1x身份验证、PC解锁、IP地址更改。
在以下情况下,ISE终端安全评估模块无法检测新的身份验证或重新身份验证尝试:
由原始PSN中断导致的不同PSN上的重新身份验证示例。具有负载均衡器的场景看起来非常相似。在LB的情况下,由于粘性计时器过期,将重新身份验证定向到不同的PSN。
1. PSN1上的初始身份验证。
2.在PSN1会话缓存中创建的会话ABC。
3.使用PSN1执行状况评估。
4.会话ABS安全评估状态变为合规。
5.安全评估状态更改触发的COA导致重新验证终端以应用下一个访问级别。
6. PSN1变为不可用。
7.会话ABC的重新身份验证命中PSN2。
8.由于会话的PSN2状态是新会话,因此该会话的状态变为Pending。
PSN分配给会话的初始终端安全评估状态:
注意:状态机仅描述状态状态的初始选择。最初标记为Unknown的每个会话稍后会根据ISE终端安全评估模块收到的报告评估变为合规或不合规。
这种情况可能发生在两种最常见的情形中:
新的会话ID可以在其他一些转角案例场景中生成。例如,在某些情况下,无线漫游可能是导致这种情况的一个原因。这里的主要问题是,ISE PSN始终将新会话置于posture Pending状态,除非配置了终端安全评估租用。安全评估租赁将在本文档后面部分进行说明。
要确定AnyConnect在重定向状态时是否显示合规性是由过期/幻像会话引起的,我们需要在终端处于有问题的状态时访问终端。
1.按AnyConnect用户界面中的齿轮图标
2.在新窗口中,定位至“系统扫描”标签和“统计信息”子标签
在此,请注意以下两个要素:
在给定示例中,名称不匹配,表示名称为ciscolive-ise2的PSN保留此终端的陈旧或幻像会话。
此演示显示了问题识别所需步骤的记录:
上一个示例是将陈旧或幻像会话问题与未启动的发现进程问题区分开来。同时,我们需要确定触发了问题的实际会话,以便更好地了解它到底是如何变成陈旧或幻像会话问题的。
但在某些情况下,无法避免陈旧和幻像会话。我们需要确保环境中不会由于某些未实施的最佳做法而创建陈旧/幻像会话。
分析从重现问题的终端获取的DART捆绑包。
为此,DART捆绑工具需要以管理员身份启动并执行日志清除。
收集DART捆绑包后,我们需要将其取消存档,并重点关注位于Cisco AnyConnect ISE终端安全评估模块文件夹中的文件AnyConnect_ISEPosture.txt。此文件包含所有发现相关事件。
1.开始故障排除并确定发现重启的所有时刻。要搜索的关键字是Restarting Discovery或HTTP Discovery。 此处,导航至发现重启行,该操作在出现问题的时刻发生:
2.在发现重新启动后的几行中,您会看到一条包含 — 探测没有MNT阶段目标的行。这是第1阶段发现开始的一个指标:
建议突出显示所有具有相同颜色的基于重定向的探测器,而之前从ConnectionData.xml(身份验证状态目标)获取的PSN需要以不同颜色突出显示,因为通常PSN FQDN非常相似,并且很难发现差异。
3.读取日志文件,查看每个单个探测的结果。 前面已经说过,在由于过时/幻像会话导致的问题中,所有基于重定向的探测都必须失败。下面是失败探测的示例:
4.在文件的第1阶段或第2阶段的发现重新启动后,您会看到一个或多个PSN的成功应答:
5.几行后,有一行带有关键字MSG_NS_SWISS_NEW_SESSION。 此行包含PSN在会话查找过程中选择的实际会话ID。使用此会话ID进一步调查ISE,了解此会话如何变成陈旧/虚拟:
在clientwebapp组件启用到DEBUG的guest.log中,可以看到使用陈旧/幻像会话进行应答的PSN。
PSN从ISE终端安全评估代理获取请求。您可以看到这是来自AnyConnect的请求,因为User-Agent值:
cisco.cpm.client.posture.PostureStatusServlet -::- Got http request from 192.168.255.228 user agent is: Mozilla/4.0 (compatible; WINDOWS; 1.2.1.6.1.48; AnyConnect Posture Agent v.4.6.03049)
cisco.cpm.client.posture.PostureStatusServlet -::- mac_list from http request ==> C0:4A:00:1F:6B:39
cisco.cpm.client.posture.PostureStatusServlet -::- iplist from http request ==> 192.168.255.228
cisco.cpm.client.posture.PostureStatusServlet -::- Session id from http request - req.getParameter(sessionId) ==> null
请求包含IP地址和MAC地址的数组。在此特定示例中,每个数组仅包含一个值。此外,日志显示请求的会话ID为null,这表示这是来自非重定向探测功能的请求。
之后,您可以看到阵列中的值如何用于定位会话ID:
cpm.client.provisioning.utils.ProvisioningUtil -::- the input ipAddress from the list currently processed in the for loop ==> 192.168.255.228
cpm.client.provisioning.utils.ProvisioningUtil -::- the ipAddress that matched the http request remote address ==> 192.168.255.228
cpm.client.provisioning.utils.ProvisioningUtil -::- the clientMac from the macarray list for the for loop index matching the ipAddress list index ==> C0-4A-00-1F-6B-39
cisco.cpm.client.posture.PostureStatusServlet -::- Found Client IP matching the remote IP 192.168.255.228, corresponding mac address C0-4A-00-1F-6B-39
cpm.client.provisioning.utils.ProvisioningUtil -::- Session = 0a3e949c000000495c216240
在带有关键字Sent http response的行之后,您可以查看实际应答中的内容:
cisco.cpm.client.posture.PostureStatusServlet -::- Sent an http response to 192.168.255.228 with X-ISE-PDP=clemea19-ise1.demo.local.
cpm.client.provisioning.utils.ProvisioningUtil -::- header X-ISE-PDP value is clemea19-ise1.demo.local
cpm.client.provisioning.utils.ProvisioningUtil -::- header X-ISE-POSTURE value is /auth/perfigo_validate.jsp
cpm.client.provisioning.utils.ProvisioningUtil -::- header X-ISE-POSTURE_PORT value is 8443
cpm.client.provisioning.utils.ProvisioningUtil -::- header X-ISE-AC_PKG_PORT value is 8443
cpm.client.provisioning.utils.ProvisioningUtil -::- header X-ISE-GUESTFLOW value is false
cpm.client.provisioning.utils.ProvisioningUtil -::- header X-ISE-AC_CONFIG_URL value is https://clemea19-ise1.demo.local:8443/auth/anyconnect?uuid=f62337c2-7f2e-4b7f-a89a-3508d761173c
cpm.client.provisioning.utils.ProvisioningUtil -::- header X-ISE-AC_CONFIG_URI value is /auth/anyconnect?uuid=f62337c2-7f2e-4b7f-a89a-3508d761173c
cpm.client.provisioning.utils.ProvisioningUtil -::- header X-ISE-AC_PKG_URL value is https://clemea19-ise1.demo.local:8443/auth/provisioning/download/066ac0d6-2df9-4a2c-a129-fabf1ace36aa
cpm.client.provisioning.utils.ProvisioningUtil -::- header X-ISE-AC_PKG_URI value is /auth/provisioning/download/066ac0d6-2df9-4a2c-a129-fabf1ace36aa
cpm.client.provisioning.utils.ProvisioningUtil -::- header X-ISE-AC_PKG_VER value is 4.6.3049.0
cpm.client.provisioning.utils.ProvisioningUtil -::- header X-ISE-STATUS_PATH value is /auth/status
cpm.client.provisioning.utils.ProvisioningUtil -::- header X-ISE-BACKUP_SERVERS value is clemea19-ise2.demo.local
cpm.client.provisioning.utils.ProvisioningUtil -::- header X-ISE-SessionId value is 0a3e949c000000495c216240
cpm.client.provisioning.utils.ProvisioningUtil -::- header X-ISE-PostureDomain value is posture_domain
cpm.client.provisioning.utils.ProvisioningUtil -::- header X-ISE-POSTURE_STATUS value is Unknown
了解过期/幻像会话的ID后,您可以调查Radius记帐报告,以便更好地了解导致此会话过期/幻像的原因:
显示如何在ciscolive-ise2上保留过时会话的报告的示例:
此处适用的逻辑与上一期相同。唯一的区别是您需要关注最新的扫描开始时间。对于此类问题,上次扫描的时间戳位于过去某个位置。
通常,当最终用户发现问题时,会看到一段时间之前发生的扫描。在ISE Radius Live日志中,发现有问题的终端最近的身份验证尝试。
此演示显示了问题识别所需步骤的记录:
此方法与“高级故障排除陈旧/幻像会话”部分非常相似。 主要故障排除要素是DART捆绑调查。在DART捆绑包中,您可以像先前问题所示一样搜索发现重新启动,并确认报告问题时没有发现重新启动。
在ISE端,重点关注Radius实时日志/ Radius身份验证报告,以确认PSN之间发生故障转移或NAD已生成新的会话ID。
过去,ISE上没有能够解决本文档中描述问题的功能,因此唯一的方法是依靠在网络和ISE端实施的一组最佳实践将风险降至最低。
尽可能始终实施基于重定向的终端安全评估
此建议的一个常见反驳是,在操作系统或浏览器中看到指示重定向的弹出窗口,而后台的AnyConnect ISE终端安全评估模块执行评估流程,从而造成不良的用户体验。
作为解决方案,可以仅重定向ISE终端安全评估模块发现探针并选择性地允许所有其他流量。
示例显示旨在仅将HTTP请求重定向到发现主机(本示例中为10.1.1.1)和enroll.cisco.com(172.16.1.80)的重定向ACL:
ip access-list extended REDIRECT-DH-ENROLL
permit tcp any host 10.1.1.1 eq www
permit tcp any host 172.16.1.80
deny ip any any
为了保持可接受的安全级别,此类重定向ACL可与从ISE分配的DACL结合使用。
挂起状态仅允许连接到终端经过身份验证的PSN
此方法适用于不支持url重定向的环境(例如,使用第三方NAD实施)。
作为解决方案,您需要实施多个PosturePending授权策略(每个PSN一个)。每个策略需要包含进行身份验证的PSN名称作为条件之一。在分配给每个策略的授权配置文件中,必须阻止对所有PSN的访问(进行身份验证的节点除外)。
为2节点部署创建授权策略:
1. PSN1的状态挂起策略。
2.用作策略条件的PSN1名称。
3.具有ACL的授权配置文件,阻止对除PSN1外的所有PSN的访问。
4. PSN2的状态挂起策略。
5.用作策略条件的PSN2名称。
6.具有ACL的授权配置文件,阻止对除PSN2外的所有PSN的访问。
7.状态“兼容”授权策略。
图中说明了此方法的运作方式:
1.身份验证命中PSN1。
2.由于配置了授权策略,PSN1会分配阻止访问除PSN1之外的所有其他节点的授权配置文件。
3. AnyConnect ISE终端安全评估模块重新启动发现过程。
4.探测被NAD阻止的PSN2(如之前分配的ACL)。
5.在NAD上分配的ACL允许探测到PSN1。
负载均衡器最佳实践
Posture Over VPN使用案例
此示例显示为20小时配置的临时记帐更新间隔。这不会阻止传输分配给终端的IP地址的初始临时更新。
aaa-server ISE protocol radius
interim-accounting-update periodic 20
group-policy SSL-VPN attributes
vpn-idle-timeout 1200
vpn-session-timeout 1200
启用状态租用
这是ISE上的一个功能,将终端标记为符合规定的时间段(1-365天)。终端安全评估租用值是终端属性,这意味着它存储为ISE数据库。包括终端安全评估租赁的所有终端属性在ISE部署中的所有节点上复制。
当PSN获得终端安全评估租赁的新会话时,可利用此会话立即标记为Compliant。
PSN使用3个值做出此决定。这些值为:
当打开其中一个状态终端时,您可以在情景可视性>终端中看到PostureExpiry:
此值可以转换为人类可读的时间戳,例如此处 — https://www.epochconverter.com/
当终端安全评估租用的身份验证到达PSN时,它使用PostureExpiry和系统日期获取上次成功的状态检查所经过的天数。如果结果值在设置中定义的安全评估租用间隔内,会话将获得Compliant状态。如果结果值大于租用值,则会话将获得Unknown状态。这将触发再次执行安全评估并保存新的PostureExpiry值。
图中说明了发生故障切换时的过程:
1.对PSN1执行初始身份验证。
2.在会话缓存中创建的会话ABC。
3.进行状态评估。
4.会话状态更改为“合规”
5.安全评估状态更改触发的COA导致重新验证终端以应用下一个访问级别。
6.终端中保存的PostureExpiry值。
7.跨部署复制的终端数据。
8.下一个身份验证命中PSN2。
9. PSN2检查终端是否处于有效的终端安全评估租约中。
11.会话已作为Compliant(兼容)添加到会话缓存中。
12.由于有效租用,创建的会话的状态为Compliant。
重新身份验证实施
在Maintain Connectivity During Reauthentication中选择RADIUS-Request时,始终从ISE推送重新身份验证计时器。 此设置可确保NAD在重新身份验证时保持相同的会话ID。
.
具有负载均衡器的环境
可以实施在过时/幻像会话部分中介绍的同一组最佳实践。
不同的子网可用于待处理和合规状态
当网络设计提供使用不同子网Pending和Compliant状态时,此方法可以保证每次状态更改都会导致默认网关更改。
与重新身份验证计时器相同的时间间隔内使用的状态评估
状态评估可以启用且间隔等于重新身份验证计时器。在这种情况下,当原始PSN变得不可用时,PRA故障会重新启动发现过程。
作为已实施的增强功能的一部分,ISE 2.6的Cisco Bug ID CSCvi35647补丁6中介绍了实现在ISE部署中的所有节点间共享会话状态的新功能。此增强功能已集成到未来版本:ISE 2.7补丁2和ISE 3.0。
此新功能基于ISE 2.6中引入的轻量级会话目录(LSD)机制。在较新的版本中,此功能已重命名为轻量数据分发(LDD)Radius会话目录。 默认情况下启用轻量级数据分发,并允许在ISE节点之间共享有限的会话情景。 PSN之间不存在完整会话上下文复制之类的情况,每个会话仅共享有限数量的属性。
轻量级会话目录的主要思想是,当部署中的一个节点必须确定当前会话的所有者时,无需执行对MNT的资源昂贵API调用。COA流启动时,通常需要查找所有者。使用LDD,每个PSN可以从本地Radius会话目录缓存找到会话的实际所有者。
此功能包含以下元素:
注意:通用RabbitMQ术语和体系结构不在本文档范围之内。
图中解释了COA流如何与RSD缓存配合工作:
1.对PSN1执行初始身份验证。
2.在会话缓存中创建的会话ABC。
3.必需属性保存到RSD中。
4.通过RabbitMQ与所有其他ISE节点共享会话。
5.在所有ISE节点的RSD缓存中创建会话。
6.新的配置文件数据到达PSN2。
7.重新分析端点,如果发生需要执行COA的更改,PSN2将继续执行下一步。
8.向RSD缓存提交内部API调用以执行COA。
9.来自RSD缓存的数据用于准备代理COA消息(从一个ISE节点到另一个ISE节点的COA,它包含目标节点可用于向NAD发回CAO请求的所有详细信息)。 COA消息首先在内部传输到PRRT运行时(ISE内的实际AAA服务器)。
10. PSN2向PSN1发送COA消息。
11. PSN1向NAD发送COA消息。
要在ISE上排除通过LDD的通信故障,可以将Light Session Director组件启用到DEBUG:
lsd.log文件中的调试消息示例,用于在原始PSN上创建和发布会话:
DEBUG [pool-45-thread-6][] cisco.cpm.lsd.service.LSDRedisClient -::::- Mapping Session ID 0a3e9498000008e05e071990 to session {"sessionID":"0a3e9498000008e05e071990","endpointMAC":"C0-4A-00-1F-6B-39","callingStationId":"c0-4a-00-1f-6b-39","ipv6AdressLst":[],"psnIP":"192.168.43.26","deviceIP":"192.168.255.102","destinationIP":"192.168.43.26","nasIP":"192.168.255.102","auditSessionID":"0a3e9498000008e05e071990","acctSessionID":"5e07197b/c0:4a:00:1f:6b:39/2299","timeStamp":1577523495,"status":"Started","id":"614f6c44-6c78-4289-b9fd-b352ff012ca4"}
DEBUG [PrRTEvents-Executor-2][] cisco.cpm.lsd.service.LSDNetAccessEventListener -::::- Publishing session update for session 0a3e9498000008e05e071990
DEBUG [PrRTEvents-Executor-2][] cisco.cpm.lsd.service.SessionPublisher -::::- Forwarding session 07a26b4b-ea13-438b-99b5-0bbadc9d8bac to batch manager
在所有其他ISE节点上,您可以看到会话是如何消耗的:
[pool-35-thread-38][] cisco.cpm.lsd.service.SessionConsumer -::::- Consumer is processing : sessionID:[0a3e9498000008e05e071990] status:[Started] id:[614f6c44-6c78-4289-b9fd-b352ff012ca4] auditSessionID:[0a3e9498000008e05e071990] accountingSessionID:[5e07197b/c0:4a:00:1f:6b:39/2299] endpointMAC:[C0-4A-00-1F-6B-39] callingStationId: [c0-4a-00-1f-6b-39] endpointIP:[null], IPv6 : [[]], psnIP:[192.168.43.26] deviceIP:[192.168.255.102] destinationIP:[192.168.43.26] nasIP:[192.168.255.102] nasIPv6:[null] timeStamp:[1577523495]
当根本原因为“过时/幻像会话”(Stale/Phantom session)或“使用原始会话ID(未触发发现重启)在不同的PSN上重新进行身份验证”(Re-authentication on a original session ID)时,节点之间的终端安全评估状态共享可解决出现以下症状的问题:“AnyConnect ISE终端安全评估模块显示合规性,而ISE上的会话状态为挂起”(AnyConnect ISE终端安全评估模块显示合规性)。当会话变为合规后,此信息会进入会话RSD,之后可由部署中的每个PSN使用。
还有一些其它角点情况是所述特征无法解决的。例如,当NAD在同一PSN上使用不同的会话ID运行重新身份验证的场景。此类场景可通过本文档中描述的最佳实践来处理。
图中演示了用于测试状态共享状态的拓扑:
要创建陈旧会话身份验证,首先在skuchere-ise26-1上执行,后来重新配置NAD以将记帐发送到skuchere-ise26-3。在一个记账消息被转发到错误的PSN NAD后,再次重新配置以将记账发送回skuchere-ise26-1。
图中显示一个记帐报告,证明在skuchere-ise26-3上存在幻像会话:
1. skuchere-ise26-1处理的Accounting-Start消息。
2. skuchere-ise26-3处理的同一会话的临时记帐更新。
3.会话稍后在skuchere-ise26-1上结束。
一段时间后,终端再次连接到网络,但重定向不再有效。在PSN - skuchere-ise26-3的guest.log中,您可以看到以下日志消息,其中在DEBUG中启用了client-webapp组件:
2020-04-08 13:30:48,217 DEBUG [https-jsse-nio-192.168.43.226-8443-exec-4][] cisco.cpm.client.posture.Util -::- Local session 0A3E946C0000007D5B679296 is stale. Newer session for 00-50-56-B6-0B-C6 is 0A3E946C000000805B7C43A3. Owned by skuchere-ise26-1.example.com
当PSN检测到它保留终端已过期/幻像会话时,它不会回复ISE终端安全评估模块,这允许我们从发生最新身份验证的PSN获取正确答案。
作为当前会话查找时过期/幻像会话问题的解决方案,PSN会检查RSD中是否存在终端的任何新会话。如果RSD包含的会话ID与本地会话缓存中的PSN不同,则假定会话缓存中显示的会话已过期。
要重现此场景,已在分配给合规状态的终端的授权配置文件中启用一个短重新身份验证计时器。后来重新配置NAD以将身份验证和记帐发送到另一个PSN(skuchere-ise26-3)。重新身份验证计时器到期后,同一会话未在不同的PSN上进行身份验证。
图中显示身份验证报告,其中显示从skuchere-ise26-1到skuchere-ise26-3的正常会话的故障切换:
1.在skuchere-ise26-1上执行身份验证,分配具有重定向的授权配置文件。
2.状态评估成功后的COA。
3.分配合规状态的授权配置文件后进行下一次身份验证。
4.身份验证命中不同的PSN,但它仍然获取合规状态的授权配置文件。
在ise-psc.log中故障切换后,会话在新PSN上获得合规状态,并且在DEBUG中启用了epm-pip和nsf-session组件:
2020-04-09 11:06:42,176 DEBUG [Thread-7979][] cpm.nsf.session.impl.SessionCache -::::- Looking up session 0A3E946C000000896011D045 for attribute Session Session.PostureStatus
2020-04-09 11:06:42,176 DEBUG [Thread-7979][] cpm.nsf.session.api.ExecutionContext -::::- Execution context has session id 0A3E946C000000896011D045
2020-04-09 11:06:42,176 DEBUG [Thread-7979][] cpm.nsf.session.impl.PIPManager -::::- Returning a PIP com.cisco.cpm.nsf.session.impl.SessionPIP for type SESSION and flow null
2020-04-09 11:06:42,176 DEBUG [Thread-7979][] cpm.nsf.session.api.ExecutionContext -::::- Execution context has session id 0A3E946C000000896011D045
2020-04-09 11:06:42,176 DEBUG [Thread-7979][] cpm.nsf.session.impl.SessionCache -::::- Looking up session 0A3E946C000000896011D045
2020-04-09 11:06:42,176 DEBUG [SessionLifecycleNotifier][] cpm.nsf.session.internal.LRUAgingAlogrithm -::::- Accessed session 0A3E946C000000896011D045
2020-04-09 11:06:42,176 DEBUG [Thread-7979][] cpm.nsf.session.impl.SessionCache -::::- Returning for session 0A3E946C000000896011D045 data Attrs: {SavedUserNames=[bob@example.com], Acs.LastStepTime=1586423202174, Acs.AD-User-Qualified-Name=bob@example.com, Acs.AD-User-Resolved-DNs=CN=bob,CN=Users,DC=example,DC=com, Acs.StepData=[110=EXAMPLE, 111=bob@example.com, 112=example.com, 113=example.com, 115=example.com, 116=EXAMPLE], Acs.AD-Log-Id=[1585911138/4778, 1585911138/4779], __IntIdGrps__=[Ljava.lang.String;@6d3c29b5, IdentityGroup.Description=[Ljava.lang.String;@3fca88fb, EXAMPLE.ExternalGroups=S-1-5-21-875452798-754861120-3039794717-513, Acs.AD-Groups-Names=example.com/Users/Domain Users, Acs.AuthenCPMSessionID=0A3E946C000000896011D045, Acs.IsMachineAuthentication=false, InternalEndpoint.IdentityGroup=[Ljava.lang.String;@6daf4c5, IDStoreUserQueryCache=[EXAMPLE#bob@example.com], Acs.CurrentIDStoreName=EXAMPLE, Acs.AD-User-Join-Point=EXAMPLE.COM, Acs.Step=[24432, 24325, 24313, 24319, 24323, 24355, 24416], Acs.CustomerMessageDuplicator=, Network Access.WasMachineAuthenticated=false, IdentityGroup.Name=[Ljava.lang.String;@570ab37a, Acs.StepDataStart=110, Acs.AD-User-DNS-Domain=example.com, Network Access.AuthenticationMethod=4, Acs.AD-User-Resolved-Identities=bob@example.com, InternalUser.IdentityGroup=[Ljava.lang.String;@51a6caed, Acs.AuthenticationMethod=4, Acs.AD-User-NetBios-Name=EXAMPLE, Normalised Radius.RadiusFlowType=0, Network Access.AuthenticationIdentityStore=EXAMPLE, EXAMPLE.IdentityAccessRestricted=false, Acs.AD-User-SamAccount-Name=bob}
IndexValues: {}
2020-04-09 11:06:42,177 DEBUG [Thread-7979][] cisco.cpm.posture.pip.PostureStatusPIP -::::- set postureStatus based on posture LSD dictionary: Compliant
2020-04-09 11:06:42,177 DEBUG [Thread-7979][] cisco.cpm.posture.pip.PostureStatusPIP -::::- PostureStatusPIP for mac 00-50-56-B6-0B-C6 - Attribute Session.PostureStatus value is Compliant
通过在状态选择过程中添加额外的逻辑,解决了原始问题。图中显示了已更改的内容(更改以红色突出显示):
版本 | 发布日期 | 备注 |
---|---|---|
2.0 |
31-May-2023 |
重新认证 |
1.0 |
22-Apr-2020 |
初始版本 |