The "right" way to limit a user to one EAP Type

Artur Hecker hecker at wave-storm.com
Mon Jul 23 13:14:00 CEST 2007


Hi


On 23 Jul 2007, at 11:21, Phil Mayers wrote:

> On Mon, 2007-07-23 at 10:20 +0200, Artur Hecker wrote:
>> Hello
>>
>>
>> In the default configuration, if a User-Password is defined for a
>> user, the user can be authenticated by all applicable authentication
>> types. That is the sense and the beauty of the default  
>> configuration :-)
>>
>> However, in a practical deployment, a serious security policy is
>> likely to state the contrary: every user (or usergroup) should be
>> authenticated by exactly one authentication method.
>
> Why?
>
> Surely a method is either secure (in which case you'd let people  
> use it)
> or insecure (in which case you'd let no-one use it)?
>
> I would consider our deployment "practical" (>20k users, almost 400  
> APs)
> and we don't care what method they use, as long as it's secure and
> generates keys.

As I said, it is the matter of security policy, I cannot discuss it,  
for it is not an opinion :-)

What you say does make sense to me, but on the other hand I still do  
not see why it should be possible to authenticate a user by more than  
one method. From what you are saying, one would conclude that only  
one method should be used for all users. But very often it depends on  
the security level of the user group and the trust you have in user  
capabilities (-> security policy...)

I can give you real-world examples, which will certainly lead to  
further discussions.

Case 1: To accelerate deployment, company A considers that PEAP- 
MSCHAPv2 should be used by all users not having a certificate. It had  
the advantage to work immediately (say against internal AD with NTLM  
or SQL, etc). However, user certificates are being issued over the  
time period - for the same user identity. The point thus is to  
prevent users who have obtained the certificates from keeping on  
using old style password auth.

Case 2: some "important users" still use TTLS-PAP but everybody  
should use PEAP-MSCHAP-v2. You cannot deactivate TTLS-PAP even if you  
consider it not good enough. You don't want others to use it though.

Case 3: different backends are available, each storing a part of  
users with password in clear and in hash forms. Needless to say, some  
users are stored in both... Wireless admins have no power on these.  
Thus, TTLS-PAP and PEAP-MSCHAPv2 are used interchangeably, in some  
times by the same user, even if you feel like TTLS-PAP is less secure.

And it goes on and on, even with EAP-MD5 in wired... Just don't take  
the examples literally. What I am saying is that, very often, such  
situations are linked to internal company processes, to compatibility  
concerns, etc., sometimes you cannot deactivate an authentication  
method for administrative reasons but you would like to restrain its  
use as far as possible, etc.


>> What is the "right" (recommended) way to do it? Could not find
>> anything on that in Wiki. (Would be glad to add it, when finished).
>
> Do you want to restrict everyone to a single EAP type, or different
> people/groups to different EAP types?

an EAP type per group and/or user.


>> Background: I used to restrict users by explicitly setting for them
>> (their group) EAP-Type := something, according to the user profile.
>> However, as of 1.1.6, my wireless PEAP(-MSCHAPv2) user authentication
>> does not work anymore as before: the inner PEAP authentication fails
>> with "cannot tunnel TLS in TLS", most probably since the authorize
>> module (sql) sets EAP-Type := PEAP. It *may* be just me though.
>
> Yeah, don't do that. Have something like:
>
> authorize {
>   preprocess
>   eap
>   files
> }
>
> in "users":
>
> # group "foo" must use PEAP
> DEFAULT	My-Group == "foo", EAP-Type != PEAP, Auth-Type := Reject
>
> # group "bar" must use TTLS
> DEFAULT My-Group == "bar", EAP-Type != TTLS, Auth-Type := Reject

That's my problem - I think this cannot work with tunneled methods.

I think that with this config the user will be rejected whenever the  
inner method has to check the password (the type is not PEAP -> Reject).

I'm not sure since this explicit reject does not work with an SQL  
backend. But I already tried the inverse logics "EAP-Type == PEAP"  
instead. SQL starts by saying "no matching entry in the database  
[...]", I guess since it does not find EAP-Type set to PEAP in the  
first request. In the given situation (PEAP by default), that's fine  
for the tunnel to start. It even finds the matching rows during the  
requests in between. But, as I said, it fails when it comes to the  
inner MSCHAPv2 check of the received response: it repeats "no  
matching entry in the database" and concludes "no User-Password" -  
because the type in the inner method is set to EAP-MSCHAPv2. I have  
no idea how to OR these two (EAP-Type == PEAP OR EAP-MSCHAPv2), but  
even that would not be satisfactory since it would allow to use brute  
EAP-MSCHAPv2 without a tunnel.

If I'm not mistaken, it would be nice to have two different  
attributes like EAP-Type and EAP-Inner-Type or something OR we need  
different SQL queries for the inner and the outer methods  
configurable... Am I wrong?


artur



>
>
> My-Group might be populated using rlm_passwd, or you might use SQL- 
> Group
> or LDAP-Group or whatever.
>
> However, this only restricts the outer EAP type, *AND* relies on the
> outer ID being the same as the inner ID i.e. you get no anonymous  
> outer
> ID.
>
> -
> List info/subscribe/unsubscribe? See http://www.freeradius.org/list/ 
> users.html




More information about the Freeradius-Users mailing list