New build path variable
[freeradius.git] / doc / rlm_eap
1
2
3             Extensible Authentication Protocol (EAP)
4
5
6 INTRODUCTION
7
8   Extensible Authentication Protocol(EAP), rfc2284, is a general protocol 
9   that allows network access points to support multiple authentication 
10   methods. Each EAP-Type indicates a specific authentication mechanism. 
11   802.1x standard authenticates wireless LAN users trying to access
12   enterprise networks.
13
14   RADIUS attribute used for EAP is EAP-Message, 79(rfc2869). RADIUS 
15   communicates all EAP messages by embedding them in this attribute.
16
17   General Terminology
18   Supplicant/EAP Client - is the software on the end-user/client machine
19                           (machine with the wireless card).
20   Authenticator/NAS/Access Point(AP) -  A network device providing users 
21                                     with a point of entry into the network.
22   EAPOL - EAP over LAN as defined in 802.1x standard.
23   EAPOW - EAP over Wireless.
24
25
26    +----------+        +----------+        +----------+
27    |          |  EAPOL |          | RADIUS |          |
28    |  EAP     |<------>|  Access  |<------>|  RADIUS  |
29    |  Client  |  EAPOW |  Point   |  (EAP) |  Server  |
30    |          |        |          |        |          |
31    +----------+        +----------+        +----------+
32
33
34    The sequence of events, for EAP-MD5, runs as follows:
35     1. The end-user associates with the Access Point(AP).
36     2. The supplicant specifies AP to use EAP by sending EAP-Start.
37     3. AP requests the supplicant to Identify itself (EAP-Identity).
38     4. Supplicant then sends its Identity (username) to the AP.
39     5. AP forwards this EAP-response AS-IS to the RADIUS server.
40        (The supplicant and the RADIUS server mutually authenticate via AP.
41        AP just acts as a passthru till authentication is finished.)
42     6. The server sends a challenge to the supplicant.
43     7. The supplicant carries out a hash on the password and sends 
44        this hashed password to the RADIUS server as its response.
45     8. The RADIUS server performs a hash on the password for that supplicant 
46        in its user database and compares the two hashed values and 
47        authenticates the client if the two values match(EAP-Success/EAP-Failure)
48     9. AP now opens a port to accept data from the end-user.
49
50   Currently, EAP is widely used in wireless networks than in wired networks.
51   In 802.11/wireless based networking, following sequence of events happen in 
52   addition to the above EAP events.
53
54    10. RADIUS server and the supplicant agree to a specific WEP key.
55    11. The supplicant loads the key ready for logging on.
56    12. The RADIUS server sends the key for this session (Session key) to the AP.
57    13. The AP encrypts its Broadcast key with the Session key
58    14. The AP sends the encypted key to the supplicant
59    15. The supplicant decrypts the Broadcast key with the Session key and 
60        the session continues using the Broadcast and Session keys until 
61        the session ends.
62
63   References:
64         The Implementation of EAP over RADIUS is based on the following RFCs
65         rfc2869 -- RADIUS Extensions
66         rfc2284 -- PPP Extensible Authentication Protocol (EAP)
67         rfc2716 -- PPP EAP TLS Authentication Protocol
68
69   Following links help to understand HOW EAP works
70         www.ieee802.org/1/mirror/8021/docs2000/ieee_plenary.PDF 
71
72
73 EAP CODE ORGANIZATION
74
75   EAP is implemented as a module in freeradius 
76   and the code is placed in src/modules/rlm_eap. 
77   All EAP-Types are organized as subdirectories in rlm_eap/types/.
78   Currently Freeradius supports only 2 EAP-Types (EAP-MD5, EAP-TLS).
79
80   Each EAP-Type, like types/rlm_eap_md5, contains a chunk of code that 
81   knows how to deal with a particular kind of authentication mechanism. 
82
83   To add a new EAP-Type then a new directory should be created as 
84   rlm_eap/types/rlm_eap_XXXX, where XXXX is EAP-Type name 
85   ie for EAP-Type like ONE TIME PASSWORD (OTP) it would be rlm_eap_otp 
86
87   src/modules/rlm_eap -- contains the basic EAP and generalized interfaces 
88     to all the EAP-Types.
89   rlm_eap/types -- contains all the supported EAP-Types
90   rlm_eap/types/rlm_eap_md5  -- EAP-MD5 authentication.
91   rlm_eap/types/rlm_eap_tls  -- EAP-TLS based authentication.
92   rlm_eap/types/rlm_eap_ttls -- TTLS based authentication.
93   rlm_eap/types/rlm_eap_peap -- Windows PEAP based authentication.
94   rlm_eap/types/rlm_eap_leap -- Cisco LEAP authentication.
95   rlm_eap/types/rlm_eap_sim  -- EAP-SIM (GSM) based authentication
96    
97 CONFIGURATION
98
99   Add the eap configuration stanza to the modules section in radiusd.conf
100   to load and control rlm_eap and all the supported EAP-Types:
101
102   For example:
103         modules {
104                 ...
105                 eap {
106                         default_eap_type = md5
107
108                         md5 {
109                         }
110                     ...
111                 }
112                 ...
113         }
114
115   NOTE: You cannot have empty eap stanza. At least one EAP-Type sub-stanza  
116   should be defined as above, otherwise the server will not know what type
117   of eap authentication mechanism to be used and the server will exit 
118   with error.
119
120   All the various options and their associated default values for each
121   EAP-Type are documented in the sample radiusd.conf that is provided 
122   with the distribution.
123
124   Since the EAP requests may not contain a requested EAP type, the
125   'default_eap_type' configuration options is used by the EAP module
126   to determine which EAP type to choose for authentication.
127
128   NOTE: EAP cannot authorize a user. It can only authenticate.
129   Other Freeradius modules authorize the user.
130
131
132 EAP SIM server
133
134   To configure EAP-SIM authentication, the following attributes must be
135   set in the server. This can be done in the users file, but in many cases
136   will be taken from a database server, via one of the SQL interface.
137
138   If one has SIM cards that one controls (i.e. whose share secret you know), 
139   one should be able to write a module to generate these attributes
140   (the triplets) in the server. 
141
142   If one has access to the SS7 based settlement network, then a module to
143   fetch appropriate triplets could be written. This module would act as
144   an authorization only module.
145
146   The attributes are:
147         EAP-Sim-Rand1           16 bytes
148         EAP-Sim-SRES1            4 bytes
149         EAP-Sim-KC1              8 bytes
150         EAP-Sim-Rand2           16 bytes
151         EAP-Sim-SRES2            4 bytes
152         EAP-Sim-KC2              8 bytes
153         EAP-Sim-Rand3           16 bytes
154         EAP-Sim-SRES3            4 bytes
155         EAP-Sim-KC3              8 bytes
156
157   EAP-SIM will send WEP attributes to the resquestor.
158
159 EAP CLIENTS
160
161   1. XSupplicant - freeradius (EAP/TLS) notes may be found at:
162
163    http://www.eax.com/802/
164    or http://www.missl.cs.umd.edu/wireless/eaptls/
165
166    XSupplicant is hosted by:
167
168    http://www.open1x.org/
169
170   2. XP - freeradius (EAP/TLS) notes may be found at: 
171
172    http://www.denobula.com/EAPTLS.pdf
173
174   3. Freeradius has an "radeapclient" that can do EAP-MD5 (passwords),
175      as well as EAP-SIM. It is in modules/rlm_eap/radeapclient.
176
177 TESTING
178
179   You will find several test cases in src/tests/ for the EAP-SIM code.
180
181
182 HOW DO I USE IT (FAQ/Examples)
183
184   1. How can I enable EAP-MD5 authentication ?
185
186   In radiusd.conf
187
188         modules {
189                 ...
190                 eap {
191                         default_eap_type = md5
192                         md5 {
193                         }
194                     ...
195                 }
196                 ...
197         }
198  
199         # eap sets the authenticate type as EAP
200         authorize {
201                 ...
202                 eap
203         }
204
205         # eap authentication takes place.
206         authenticate {
207                 eap
208         }
209
210         # If you are proxying EAP-LEAP requests
211         # This is required to make LEAP work.
212         post-proxy {
213                 eap
214         }
215   
216   2. My Userbase is in LDAP and I want to use EAP-MD5 authentication 
217
218   In radiusd.conf
219
220         modules {
221                 ...
222                 eap {
223                         default_eap_type = md5
224                         md5 {
225                         }
226                     ...
227                 }
228                 ...
229         }
230  
231         # ldap gets the Configured password.
232         # eap sets the authenticate type as EAP
233         authorize {
234                 ...
235                 ldap
236                 eap
237                 ...
238         }
239
240         # eap authentication takes place.
241         authenticate {
242                 ...
243                 eap
244                 ...
245         }
246
247   3. How can I Proxy EAP messages, with/without User-Name attribute
248       in the Access-Request packets 
249
250    With User-Name attribute in Access-Request packet,
251    EAP-proxying is just same as RADIUS-proxying.
252
253    If User-Name attribute is not present in Access-Request packet,
254    Freeradius can proxy the request with the following configuration
255    in radiusd.conf
256
257    # eap module should be configured as the First module in 
258    # the authorize stanza
259
260         authorize {
261                 eap
262                 ...  other modules.
263         }
264
265    With this configuration, eap_authorize creates User-Name attribute
266    from EAP-Identity response, if it is not present.
267    Once User-Name attribute is created, RADIUS proxying takes care
268    of EAP proxying.
269
270   4. How Freeradius can handle EAP-START messages ?
271
272    In most of the cases this is handled by the Authenticator.
273
274    Only if it is required then, in radiusd.conf
275
276         authorize {
277                 eap
278                 ...  other modules.
279         }
280
281    With the above configuration, RADIUS server immediately responds with
282    EAP-Identity request.
283         
284    NOTE: EAP does not check for any Identity or maintains any state in case
285    of EAP-START. It blindly responds with EAP-Identity request.
286    Proxying is handled only after EAP-Identity response is received.
287
288   5. I want to enable multiple EAP-Types, how can I configure ?
289   
290   In radiusd.conf
291
292         modules {
293                 ...
294                 eap {
295                         default_eap_type = tls
296                         md5 {
297                         }
298                         tls {
299                                 ...
300                         }
301                     ...
302                 }
303                 ...
304         }
305
306    The above configuration will let the server load all the EAP-Types,
307    but the server can have only one default EAP-Type, as above.
308
309    Once EAP-Identity response is received by the server, based on the
310    default_eap_type, the server will send a new request (MD5-Challenge 
311    request incase of md5, TLS-START request incase of tls) to the supplicant.
312    If the supplicant is rfc2284 compliant and doesnot support the
313    EAP-Type sent by the server then it sends EAP-Acknowledge with the
314    supported EAP-Type. If this EAP-Type is supported by the server then it 
315    will send the respective EAP-request.
316   
317    Example: If the supplicant supports only EAP-MD5 but the server
318    default_eap_type is configured as EAP-TLS, as above, then the server
319    will send TLS-START after EAP-Identity is received. Supplicant will
320    respond with EAP-Acknowledge(EAP-MD5). Server now responds with
321    MD5-Challenge.
322
323
324 INSTALLATION
325   EAP, EAP-MD5, and Cisco LEAP do not require any additional packages.
326   Freeradius contains all the required packages.
327
328   For EAP-TLS, EAP-TTLS, and PEAP, OPENSSL, <http://www.openssl.org/>,
329   is required to be installed.
330   Any version from 0.9.7, should fairly work with this module.
331
332   EAP-SIM should not require any additional packages.
333
334
335 IMPLEMENTATION (For Developers)
336
337   The rlm_eap module only deals with EAP specific authentication mechanism
338   and the generic interface to interact with all the EAP-Types. 
339
340   Currently, these are the existing interfaces,
341         int     attach(CONF_SECTION *conf, void **type_arg);
342         int     initiate(void *type_arg, EAP_HANDLER *handler);
343         int     authenticate(void *type_arg, EAP_HANDLER *handler);
344         int     detach(void **type_arg);
345
346   attach() and detach() functions allocate and deallocate all the 
347   required resources.
348
349   initiate() function begins the conversation when EAP-Identity response 
350   is received. Incase of EAP-MD5, initiate() function sends the challenge.
351
352   authenticate() function uses specific EAP-Type authentication mechanism
353   to authenticate the user. During authentication many EAP-Requests and
354   EAP-Responses takes place for each authentication. Hence authenticate()
355   function may be called many times. EAP_HANDLER contains the complete 
356   state information required.
357
358
359 HOW EAP WORKS
360   as posted to the list, by John Lindsay <jlindsay@internode.com.au>
361
362   To make it clear for everyone, the supplicant is the software on the
363   client (machine with the wireless card).
364
365   The EAP process doesn't start until the client has associated with
366   the Access Point using Open authentication.  If this process isn't
367   crystal clear you need to go away and gain understanding.
368
369   Once the association is made the AP blocks all traffic that is not
370   802.1x so although associated the connection only has value for EAP.
371   Any EAP traffic is passed to the radius server and any radius traffic
372   is passed back to the client.
373
374   So, after the client has associated to the Access Point, the
375   supplicant starts the process for using EAP over LAN by asking the
376   user for their logon and password.
377
378   Using 802.1x and EAP the supplicant sends the username and a one-way
379   hash of the password to the AP.
380
381   The AP encapsulates the request and sends it to the RADIUS server.
382
383   The radius server needs a plaintext password so that it can perform
384   the same one-way hash to determine that the password is correct.  If
385   it is, the radius server issues an access challenge which goes back
386   via to the AP to the client. (my study guide says client but my
387   brain says 'supplicant')
388
389   The client sends the EAP response to the challenge via the AP to the
390   RADIUS server.
391
392   If the response is valid the RADIUS server sends a success message
393   and the session WEP key (EAP over wireless) to the client via the
394   AP.  The same session WEP key is also sent to the AP in the success
395   packet.
396
397   The client and the AP then begin using session WEP keys. The WEP key
398   used for multicasts is then sent from the AP to the client.  It is
399   encrypted using the session WEP key.
400
401 ACKNOWLEDGEMENTS
402    Primary author - Raghu <raghud@mail.com>
403
404    EAP-SIM       - Michael Richardson <mcr@sandelman.ottawa.on.ca>
405                     The development of the EAP/SIM support was funded by
406                     Internet Foundation Austria (http://www.nic.at/ipa).
407
408