1.概述 802.1X起源于无线网络标准802.11协议,802.11协议是标准的无线局域网协议,802.1X协议设计的最初的目的是为了解决无线局域网用户的接入认证问题,但由于其原理对于所有符合IEEE802标准的局域网具有普适性,因此在有线局域网中也得到了广泛的应用。 802.1X,全称为Port-BasedNetworks AccessControl,即基于端口的网络访问控制。“基于端口的网络接入控制”是指在局域网接入设备的端口这一级对所接入的用户设备进行认证和控制(这里的端口可以是一个实实在在的物理端口,也可以是一个类似VLAN的逻辑端口,而对于无线局域网来说一个“端口”就是一条信道)。连接在端口上的用户设备如果能通过认证,就可以访问局域网中的资源;如果不能通过认证,则无法访问局域网中的资源。 2.体系结构 IEEE802.1X协议采用典型的客户端/服务器体系结构,包括三个主要的部分:客户端(SupplicantSystem)、认证系统(AuthenticatorSystem)以及认证服务器(AuthenticationServer System)。图1描述了三者之间的关系以及互相之间的通信。 图1.802.1X协议的体系结构 客户端:是需要接入LAN/WLAN,享受switch提供服务的终端设备(比如PC、网络打印机),该终端设备通常需要安装一个客户端软件,用户通过启动这个客户端软件发起802.1X认证,同时客户端必须支持EAPOL协议。 认证系统:通常为支持802.1X协议的网络设备,它为客户端提供接入局域网的端口。认证系统在客户端和认证服务器之间充当代理角色,它跟客户端之间通过EAPOL协议进行通信,跟认证服务器之间通过EAPOver Radius报文或者标准的Radius报文进行通信。 认证服务器:通常为Radius服务器,用于实现对用户进行认证、授权和计费。认证服务器通过检验客户端发送来的身份标识,来判断该用户是否有权使用认证系统所提供的网络服务。当用户通过认证后,认证服务器会把用户的相关信息传递给认证系统,由认证系统构建动态的访问控制列表,用户的后续流量就将接受上述参数的监管。 以上三个部分,除客户端系统外,认证系统和认证服务器之间既可以分布在两个不同的物理实体上,也可以是集中在一个物理实体上,后者指的是由认证系统独立完成用户的认证授权,即本地认证。 3.涉及协议 3.1EAPOL协议 EAPOL(EAPoverLANs)是802.1X协议定义的一种报文封装格式,主要用于在客户端和设备端之间传送EAP协议报文,以允许EAP协议报文在LAN上传送。EAPOL数据包的格式如图2所示: 图3.EAPOL的帧结构 PAEEthernet Type:2字节,该值表示以太网协议类型,802.1X为其分配的协议类型为0x888E。 ProtocolVersion:1字节,表示EAPOL帧的发送方所使用的协议版本号,表1为目前存在的版本号 版本号 含义 0x01 支持IEEEStd 802.1X-2001 0x02 支持IEEEStd 802.1X-2004 0x03 支持IEEEStd 802.1X-2010 表1. EAPOL帧使用的版本号 PacketType:1字节,表示EAPOL数据帧类型,目前支持的数据类型见表2 类型 说明 EAP-Packet(值为0x00):认证信息帧 表示该EAPOL帧承载了一个EAP数据包 EAPOL-Start(值为0x01):认证发起帧 这两种类型的帧仅在客户端和设备端之间存在 EAPOL-Logoff(值为0x02):退出请求帧 EAPOL-Key(值为0x03):密钥信息帧 支持对EAP报文的加密(无线接入专用) EAPOL-Encapsulated-ASF-Alert(值为0x04) 用于支持ASF(AlertingStandards Forum)的Alerting消息 表2.EAPOL帧类型 PacketBody Length:2字节,表示数据域的长度,也就是PacketBody字段的长度,单位为字节。当EAPOL数据帧的类型为EAPOL-Start或EAPOL-Logoff时,该字段值为0,表示后面没有PacketBody字段。 PacketBody:表示数据内容,该部分内容由PacketType决定,长度有PacketBody Length决定。 3.2EAP协议 802.1X协议采用EAP(ExtensibleAuthenticationProtocol,可扩展认证协议)来实现客户端、认证系统和认证服务器之间认证信息的交互。通过支持EAP协议,可以使用认证服务器来实现各种认证机制,认证系统仅仅需要传送认证信息,并根据认证返回的结果控制受控端口的状态。EAP数据包的格式如图4所示: 图4.EAP的帧结构 Code:1字节,该值表示EAP帧类型,共有4种:Request、Response、Success、Failure。 Identifier:1字节,该值用于匹配Request消息和Response消息。 Length:2字节,该值表示EAP帧的总长度,包含Code、Identifier、Length和Data域,单位为字节。 Data:EAP包的内容,由Code类型决定: Success和Failure类型的包没有Data域,相应的Length域的值为4; Request和Response类型数据包的Data域的格式如图5所示 图5.Request和Response类型数据包的Data域的格式 Type字段目前支持的类型见表3,前3种表示特殊含义,其余的值表示EAP支持的认证方式 Type值 含义 1 Identity(用户名信息) 2 Notification(警告信息) 3 Nak(客户端对Request中的认证方式不支持时回复用) 4 MD5-Challenge 5 OneTime Password (OTP) 6 GenericToken Card (GTC) 13 EAP-TLS 17 EAP-LEAP 18 EAP-SIM 21 EAP-TTLS 23 EAP-AKA 25 EAP-PEAP 26 EAP-MSCHAPV2 33 EAP-TLV 38 EAP-TNC 43 EAP-FAST 46 EAP-PAX 47 EAP-PSK 48 EAP-SAKE 49 EAP-IKEV2 50 EAP-AKA-PRIME 51 EAP-GPSK 254 ExpandedTypes 255 Experimentaluse 表3.EAP数据包中Type字段含义 Typedata的内容由Type决定。 与其说EAP是一个认证协议不如说EAP是一个认证框架,因为EAP本身不是认证协议,它自己不支持认证功能,它是为了承载多种认证协议而生的,EAP为扩展和协商认证协议提供了一个标准,让客户端和RADIUS服务器之间直接协商认证数据,将NAS(网络介入系统)网络设备从中解脱出来。 3.3RADIUS协议 RADIUS(RemoteAuthentication Dial In UserService用户远程拨入认证服务)是一种AAA的应用协议,意思就是同时兼顾验证(authentication)、授权(authorization)及计费(accounting)三种服务的一种网络传输协议。RADIUS数据包的格式如图6所示: 图6.RADIUS的帧结构 Code:1字节,指示RADIUS包的类型,支持的类型见表4 Code 报文类型 报文说明 1 Access-Request 方向Client->Server,Client将用户信息传输到Server以判断是否接入该用户。该报文中必须包含User-Name属性,可选包含NAS-IP-Address、User-Password、NAS-Port等属性。 2 Access-Accept 方向Server->Client,如果Access-Request报文中所有Attribute值都是可以接受(即认证通过),则传输该类型报文。 3 Access-Reject 方向Server->Client,如果Access-Request报文中存在任何Attribute值无法被接受(即认证失败),则传输该类型报文。 4 Accounting-Request 方向Client->Server,Client将用户信息传输到Server,请求Server开始计费,由该报文中的Acct-Status-Type属性区分计费开始请求和计费结束请求。该报文包含属性和Access-Request报文大致相同。 5 Accounting-Response 方向Server->Client,Server通知Client侧已经收到Accounting-Request报文并且已经正确记录计费信息。该报文包含端口上输入/输出字节数、输入/输出包数、会话时长等信息。 11 Access-Challenge 方向Server->Client,Server收到Client上报上来的用户信息后,如果通过,就发送访问质询给Client,让用户提供更多的附加信息以完成认证。 表4.RADIUS数据包中Code字段含义 Identifier:1字节,取值范围为0~255,用于匹配请求包和响应包。 Length:2字节,表示整个报文的有效长度。长度域范围之外的字节被认为是附加的,并在接受的时候超长部分将被忽略。如果包长比长度域给出的短,也必须丢弃,最小长度为20,最大长度为4096。 Authenticator:16字节认证字域,在不同报文中用法不一样。 a).在Access-Request包中的认证字称为请求认证字,是16字节随机数,认证字的值要不能被预测,并且在一个共享密钥的生命期内唯一。 b).在Access-Accept、Access-Reject和Access-Challenge包中的认证字称为访问回应认证字,访问回应认证字的值定义为MD5(Code+ID+Length+请求认证字+Attributes+Secret) Attributes:属性域,用来在请求和响应报文中携带详细的认证、授权、信息和配置细节,来实现认证、授权、计费等功能,一条RADIUS报文中可以携带多条属性域。每条属性域采用(Type、length、Value)三元组的形式提供。属性域的格式见图7 图7.Attributes格式 Type:属性号,用来标识本条属性的类型,取值范围1~255,其中26号属性表示厂商私有属性。标准的属性号定义见表5 属性号 属性名 属性号 属性名 1 User-Name 30 Called-Station-ID 2 User-Password 31 Calling-Station-ID 3 CHAP-Password 32 NAS-Identifier 4 NAS-IP-Address 40 Acct-Status-Type 5 NAS-Port 41 Acct-Delay-Time 6 Service-Type 43 Acct-Output-Octets 7 Framed-Protocol 44 Acct-Session-ID 8 Framed-IP-Address 45 Acct-Authentic 9 Framed-IP-Netmask 46 Acct-Session-Time 10 Framed-Routing 48 Acct-Output-Packets 11 Filter-ID 49 Acct-Terminate-Cause 12 Framed-MTU 53 Acct-Output-Gigaword 13 Framed-Compression 55 Event-Timestamp 14 login-IP-Host 60 CHAP-Challenge 15 login-Service 61 NAS-Port-Type 16 login-TCP-Port 64 Tunnel-Type 18 Reply_Message 65 Tunnel-Medium-Type 19 Callback-Number 79 EAP-Message 20 Callback-ID 80 Message-Authenticator 24 State 81 Tunnel-Private-Group-ID 25 Class 87 NAS-Port-ID 26 Vendor-Specific 95 NAS-IPV6-Address 27 Session-Timeout 96 Framed-Interface-ID 28 Idle-Timeout 97 Framed-IPV6-Prefix 29 Termination-Action 表5.Attributes中的Type字段含义 Length:表示整条属性域的长度,最小值为3 Value:记录了这条属性的具体特性,有6中属性值:整数(INT);枚举(ENUM);IP地址(IPADDR);文本(STRING);日期(DATE);二进制字符串(BINARY)。 表5中,属性号79和80是RADIUS为支持EAP认证增加的两个属性: a). EAP-Message 这个属性用来封装EAP数据包,属性号为79,如果EAP数据包长度大于253字节,可以对其进行分片,依次封装在多个EAP-Message属性中。 b).Message-Authenticator 属性号为80,主要用于在EAP认证过程中验证携带了EAP-Message属性的Radius报文的完整性,避免接入请求包被窜改。在含有EAP-Message属性的数据包中,必须同时也包含 Message-Authenticator,否则该数据包会被认为无效而被丢弃。此外,若接收端对接收到的Radius报文计算出的完整性校验值与报文中携带的Message-Authenticator属性的Value值不一致,该数据包也会被认为无效而丢弃。 4.认证的基本过程 802.1X系统支持EAP中继方式和EAP终结方式与远端RADIUS服务器交互完成认证。以下关于两种认证方式的过程描述,都以客户端主动发起认证为例。 4.1EAP中继方式 这种方式是IEEE802.1X标准规定的,将EAP(可扩展认证协议)承载在其它高层协议中,如EAPover RADIUS,以便扩展认证协议报文穿越复杂的网络到达认证服务器。一般来说,EAP中继方式需要RADIUS服务器支持EAP属性:EAP-Message和Message-Authenticator,分别用来封装EAP报文及对携带EAP-Message的RADIUS报文进行保护。下面以EAP-MD5方式为例介绍基本认证流程,如图8所示 图8.IEEE 802.1X认证系统的EAP中继方式交互流程 a).当用户有网络连接需求时打开802.1X客户端程序,输入已经申请、登记过的用户名和密码,发起连接请求(EAPOL-Start报文)。此时,客户端程序将发出请求认证的报文给NAS,开始启动一次认证过程。 b).认证系统收到开始认证的请求后,将发出一个请求帧(EAP-Request/Identity报文)要求用户的客户端程序发送输入的用户名。 c).客户端程序响应认证系统发出的请求,将用户名信息通过应答帧(EAP-Response/Identity报文)发送给认证系统。 d).认证系统则将客户端送上来的数据帧经过封包处理后(RADIUSAccess-Request报文)转发给认证服务器进行处理。 e).认证服务器收到认证系统转发上来的用户名信息后,将该信息与数据库中的用户名表相比对,找到该用户名对应的密码信息,用随机生成的一个加密字对它进行加密处理,同时也将此加密字通过RADIUSAccess-Challenge报文传送给认证系统,再由认证系统解封包处理后(EAP-Request/MD5Challenge报文)传给客户端程序。 f).客户端程序收到由认证系统传来的加密字后,用该加密字对口令部分进行加密处理,生成 EAP-Response/MD5Challenge报文,并通过认证系统封装为RADIUSAccess-Request报文传给认证服务器。 g).认证服务器将收到的已加密的密码信息(RADIUSAccess-Request报文)和本地经过加密运算后的密码信息进行对比,如果相同,则认为该用户为合法用户,反馈认证通过的消息(RADIUSAccess-Accept报文和EAP-Success报文),并向认证系统发出打开端口的指令,允许用户的业务流通过端口访问网络。否则,反馈认证失败的消息(EAP-Failure报文),并保持认证系统端口的关闭状态,只允许认证信息数据通过而不允许业务数据通过。 h).客户端也可以发送EAPOL-Logoff报文给认证系统,主动要求下线。设备端把端口状态从授权状态改变成未授权状态,并向客户端发送EAP-Failure报文。 4.2EAP终结方式 EAP终结方式将EAP报文在认证系统上终结,并转换成标准的Radius协议完成认证、授权和计费。设备端与Radius服务器之间可以采用PAP(PasswordAuthentication Protocol,密码验证协议)或者CHAP(ChallengeHandshake AuthenticationProtocol,质询握手验证协议)认证方法。以下以CHAP认证方式为例介绍认证流程,如图9所示 图9.IEEE 802.1X认证系统的EAP终结方式交互流程 a~c).认证过程的前3步与EAP中继方式完全相同。 d).认证系统收到客户端送上来的数据帧(EAP-Response/Identity报文)后,没有上传至认证服务器,而是本地随机生成一个加密字,并将将此加密字的通过数据帧(EAP-Request/MD5Challenge报文)交给客户端程序。 e).客户端程序收到加密字(EAP-Request/MD5Challenge报文)后,用该加密字对口令部分进行加密处理,生成EAP-Response/MD5Challenge报文发送给认证系统。 f).认证系统收到加密密码(EAP-Response/MD5Challenge)后,用CHAP协议对用户名、加密口令、加密字等认证信息重新封装成标准的Radius报文(RADIUSAccess-Requeset报文),送给认证服务器进行处理。 g).认证服务器收到的认证信息(RADIUSAccess-Requeset报文)后,根据收到的用户名信息在数据库中查找对应的密码信息,用收到的加密字对密码信息进行加密处理得到自己的加密密码。然后和收到的加密密码信息进行对比,如果相同,则认为该用户为合法用户,反馈认证通过的消息(RADIUSAccess-Accept报文)给认证系统。 h).认证系统向客户端程序反馈认证通过消息(EAP-Success报文),将端口状态改为授权状态,允许用户通过该端口访问网络。 i).客户端也可以发送EAPOL-Logoff报文给认证系统,主动要求下线。设备端把端口状态从授权状态改变成未授权状态,并向客户端发送EAP-Failure报文。 4.3两种方式的对比 EAP中继方式与EAP终结方式的认证流程十分类似,不同之处主要在于加密字的生成处理及传递方式。在EAP中继方式中,用来对用户口令信息进行加密处理的随机加密字由认证服务器生成,认证系统只是负责将EAP报文透传认证服务器,整个认证处理都由认证服务器来完成。而在EAP终结方式中,用来对用户密码信息进行加密处理的随机加密字由认证系统生成,认证系统会把用户名、随机加密字和客户端加密后的密码信息一起送给认证服务器,进行相关的认证处理。 从上面可以看出,由于认证流程中对于加密字的生成处理及传递方式不同,因此EAP中继与EAP终结两种认证方式其优缺点也很明显: EAP中继方式优点是认证系统处理更简单,EAP上面承载的认证协议对认证系统是透明的,NAS设备不需要了解,也不需要支持,它只需要支持EAP即可,所以可以支持更多的认证方式,缺点则是认证服务器必须支持EAP;而EAP终结方式的优点是认证服务器无需升级,现有的Radius服务器可以继续使用,缺点是NAS设备处理更复杂。 5.具体实现原理 图10就是采用分层的方法为802.1X的实现划分出来的总框架图,交换机作为认证者角色,要实现的就是右边半张,很明显它被划分为上下两层:HigherLayer和LowerLayer。 LowerLayer层就是图中的802.1X模块,我们更习惯称为EAPOL层;相对应的,HigherLayer层我们通常也统称为EAP层。这样,实现802.1X认证者,实际上就变成了实现EAP层和EAPOL层,以及两者的交互。 图10.基于EAPOL层和EAP层的802.1X实现框架 802.1X认证EAPOL层的实现被定义在IEEE802.1X文档里(该标准到目前一共经历了3版,IEEE802.1X-2001、IEEE802.1X-2004、IEEE802.1X-2010,这里准备基于2004版本进行开发),而EAP层的实现被定义在RFC4137里(StateMachines for EAP Peer and Authenticator)。 IEEE802.1X-2004标准为EAPOL层总共定义了10个状态机,见表6 是否需要支持(Y–需要;N–不需要;O-可选) 状态机名 认证者 请求者 PortTimers Y Y AuthenticatorPAE Y N TheAuthenticator Key Transmit O N TheSupplicant Key Transmit N O ReauthenticationTimer Y N BackendAuthentication Y N ControlledDirections Y N SupplicantPAE N Y SupplicantBackend N Y TheKey Receive O O 表6.EAPOL层状态机汇总 对于交换机来说,就是认证者角色,上表中标记了“O”的状态机一般不用于LAN环境下也不用考虑,所以作为认证者,实际需要实现的状态机一共5个。 5.1Port Timers state machine(Port定时器状态机,以下都简称PTSM) 图11. Authenticator Port Timers state machine PTSM功能比较简单,就是每秒钟触发一次以从ONE_SECOND状态进入TICK状态。TICK状态的EA中,它将递减定时器变量的值,这些变量都是被其他状态机初始化和使用的。这些定时器变量的定义见表7 定时器变量名 含义 aWhile 和BEAUTH SM直接相关,用于计时EAPOL层传递eap-resp报文给EAP层,然后等待EAP层回复的时间,超时值为serverTimeout quietWhile 和AUTHPAE SM直接相关,在quietWhile时间里,认证者不接受任何来自请求者的认证消息,超时值为reAuthPeriod reAuthWhen 和RTSM直接相关,定义了认证者发起重认证的间隔,超时值为reAuthPeriod 表7.Authenticator PT SM定时器变量 5.2Authenticator PAE state machine(认证者PAE状态机,以下都简称AUTHPAE SM) 图 12.Authenticator PAE state machine AUTHPAESM是802.1X在EAPOL层最核心的状态机之一,它主要负责处理接收到的EAPOL报文,这其实也表示它的工作是面向请求者的;同时它又负责执行认证的结果,归根到底也就是对PORT的管理。AUTHPAE SM整个运转过程基本如下: a).首先受控端口被触发802.1X认证进入INITIALIZE,这里的主要EA是:portMode设置为Auto b).从INITIALIZE无条件进入DISCONNECTED状态,这里的主要EA是: authPortStatus设置为Unauthorized; reAuthCount清0; 清除eapolLogoff标志 c).从DISCONNECTED会继续无条件进入RESTART状态,这里的主要EA是: eapRestart设置为TRUE,用于通知EAP层状态机进入INITIALIZE d).AUTH PAESM会一直处于RESTART状态,直到EAP层清除了eapRestart标志,这时候就会进入CONNECTING状态,主要的EA是: 清除reAuthenticate标志; 累加reAuthCount计数器 e).AUTH PAESM会一直处于CONNECTING状态,直到EAP层设置了eapReq标志,意味着需要发送一个eapol-request-identifier,这时候就会进入AUTHENTICATING状态,主要的EA是: authStart设置为TRUE,用于通知BEAUTH SM f).