ttls/gtc + perl
Alexander Clouter
alex at digriz.org.uk
Sun Jan 3 03:09:03 CET 2010
Hi,
I'm slapping together a OTP system to use with FreeRADIUS and for the
EAP side of things I am using GTC to get the challenge to the user and
the response back.
I first of all implemented everything nicely with just a straight
forward non-EAP Access-Challenge approach; using rlm_perl to dish out a
State attribute[1], the Reply-Message and of course to check the
User-Password returned. This works great for pam_radius_auth.
Then I moved onto the EAP side of things. The state of play is:
TTLS -> GTC -> Perl
The relevant bits of my config looks like:
----
eap gtc-trial.eap {
....
gtc {
challenge = "%{reply:Reply-Message}"
auth_type = rfc2289
}
ttls {
default_eap_type = md5
copy_request_to_tunnel = no
use_tunneled_reply = yes
}
....
}
--
authorize {
....
gtc-trial.perl
gtc-trial.eap
}
authenticate {
Auth-Type gtc-trial.eap {
gtc-trial.eap
}
Auth-Type rfc2289 {
gtc-trial.perl
}
}
--
----
As you can see nothing exciting. Now in the authorize section of the
Perl module I wrote, when I send the Reply-Message challenge I return
RLM_MODULE_HANDLED as the return code. The problem is when I do this I
get:
----
++[gtc-trial.perl] returns handled
} # server gtc-trial
[ttls] Got tunneled reply code 0
Reply-Message = "otp-md5 489 ch4230"
[ttls] No tunneled reply was found for request 6 , and the request was
not proxied: rejecting the user.
[gtc-trial.eap] Handler failed in EAP/ttls
rlm_eap_ttls: Freeing handler for user ac56 at soas.ac.uk
[gtc-trial.eap] Failed in EAP select
++[gtc-trial.eap] returns invalid
Failed to authenticate the user.
} # server gtc-trial
Using Post-Auth-Type Reject
----
Changing it to RLM_MODULE_OK lets it pass through and everything starts
to work, but it feels wrong; also as I would have to add difficult code
paths for EAP and non-EAP connections.
----
++[gtc-trial.perl] returns ok
[gtc-trial.eap] EAP packet type response id 1 length 6
[gtc-trial.eap] No EAP Start, assuming it's an on-going EAP conversation
++[gtc-trial.eap] returns updated
Found Auth-Type = gtc-trial.eap
+- entering group gtc-trial.eap {...}
[gtc-trial.eap] Request found, released from the list
[gtc-trial.eap] EAP NAK
[gtc-trial.eap] EAP-NAK asked for EAP-Type/gtc
[gtc-trial.eap] processing type gtc
[gtc] expand: %{reply:Reply-Message} -> otp-md5 489 ch4230
++[gtc-trial.eap] returns handled
} # server gtc-trial
[ttls] Got tunneled reply code 11
Reply-Message = "otp-md5 489 ch4230"
EAP-Message = 0x01020017066f74702d6d64352034383920636834323330
Message-Authenticator = 0x00000000000000000000000000000000
State = 0x2ab1156b2bb3138a6ec7c66d7216040d
[ttls] Got tunneled Access-Challenge
++[gtc-trial.eap] returns handled
} # server gtc-trial
Sending Access-Challenge of id 57 to 77.75.106.34 port 1645
EAP-Message = 0x010a003f158000000035170301003060c61e58df7bb793b8bb0ff121a83f4c2e6709089d2806be79ba5b38f1188e918e1a23a26a5361cd919357ebf957b3b6
Message-Authenticator = 0x00000000000000000000000000000000
State = 0x799072d07e9a671e00b9e884d1d4d75c
----
It's as if the fake-request stuff does not support RLM_MODULE_HANDLED?
Of course I could be mis-understanding things completely and I should
just stick with RLM_MODULE_OK...even for the non-EAP requests (however
that *does* feel wrong).
On a separate note I found out the hard way then passing 'State' back as
a Reply attribute causes the EAP state machine to find two State
attributes flying around rather than just the one it generates (am I
understanding this correctly?).
----
[gtc-trial.eap] processing type ttls
[ttls] Authenticate
[ttls] processing EAP-TLS
[ttls] eaptls_verify returned 7
[ttls] Done initial handshake
[ttls] eaptls_process returned 7
[ttls] Session established. Proceeding to decode tunneled attributes.
[ttls] Got tunneled request
EAP-Message = 0x020100060306
FreeRADIUS-Proxied-To = 127.0.0.1
[ttls] Sending tunneled request
EAP-Message = 0x020100060306
FreeRADIUS-Proxied-To = 127.0.0.1
User-Name = "ac56 at soas.ac.uk"
State = 0x72666332323839
State = 0xa044d18fa045d5754a1bb165bbc5857d
[snipped]
[gtc-trial.eap] EAP packet type response id 1 length 6
[gtc-trial.eap] No EAP Start, assuming it's an on-going EAP conversation
++[gtc-trial.eap] returns updated
Found Auth-Type = gtc-trial.eap
+- entering group gtc-trial.eap {...}
[gtc-trial.eap] Either EAP-request timed out OR EAP-response to an unknown EAP-request
[gtc-trial.eap] Failed in handler
++[gtc-trial.eap] returns invalid
Failed to authenticate the user.
} # server gtc-trial
[ttls] Got tunneled reply code 3
[ttls] Got tunneled Access-Reject
[gtc-trial.eap] Handler failed in EAP/ttls
rlm_eap_ttls: Freeing handler for user ac56 at soas.ac.uk
[gtc-trial.eap] Failed in EAP select
++[gtc-trial.eap] returns invalid
Failed to authenticate the user.
} # server gtc-trial
Using Post-Auth-Type Reject
----
If I am having to opt for a slightly different code path for my Perl
module's authorize section (OK for EAP and HANDLED for non-EAP) is it
safe to assume EAP is keeping everything in order? I am just using the
State attribute to indicate that the challenge has been issued to the
user and to avoid validating 'trash'; for example in the case of when
using the Challenge-Response functionality found in mod_auth_radius. I
see in ttls.c:process_reply() there are a number of probably relevant
FIXME's on something that could be applicable?
If you need any more information or the actual code, then do ask.
Cheers
[1] similarly to how Harry J Walsh was doing things:
http://www.mail-archive.com/freeradius-users@lists.freeradius.org/msg47425.html
--
Alexander Clouter
.sigmonster says: No line available at 300 baud.
More information about the Freeradius-Devel
mailing list