Using rlm_caching: rejects on cached requests

Jeroen Scheerder Jeroen.Scheerder at on2it.net
Thu Apr 26 09:43:59 CEST 2012


On 23 Apr 2012(Q2, W17), at 12:09, Jeroen Scheerder wrote:

> What I'd like to acomplish is:
> 
> 	- Cache authentication requests
> 	- Uncached or expired requests are passed on to the proxy
> 	- Cached authentication requests are handled (within the specified TTL)
> 
> I've set up caching, and I see some of it working.

With a little more work, I've narrowed my problem down to the caching_postauth function in rlm_caching.c.

It reads:

""
        if ((auth_type = pairfind(request->config_items, PW_AUTH_TYPE)) != NULL){
                DEBUG("rlm_caching: Found Auth-Type, value: '%s'",auth_type->vp_strvalue);
                if (strcmp(auth_type->vp_strvalue,"Reject") == 0 && data->cache_rejects == 0){
                        DEBUG("rlm_caching: No caching of Rejects. Returning NOOP");
                        return RLM_MODULE_NOOP;
                }
                if (strlen(auth_type->vp_strvalue) > MAX_AUTH_TYPE - 1){
                        DEBUG("rlm_caching: Auth-Type value too large");
                        return RLM_MODULE_NOOP;
                }
        }
""

When ran, this results in:

	rlm_caching: Found Auth-Type, value: ''

… when caching an already accepted authentication request.  Subsequent requests are actually found in the cache and handled:

rlm_caching: Searching the database for key 'on2it-js at rsa.on2it.net:480378:172.17.202.55'
rlm_caching: Key Found.
rlm_caching: VP='Class',VALUE='default_group',lenth='14',cache record length='39'
rlm_caching: Adding Auth-Type ''
rlm_caching: Cache Queries:       5, Cache Hits:       1, Hit Ratio: 20.00%
++[caching] returns ok

However, the cached Auth-Type of '' poses a problem:

Found Auth-Type = Local
WARNING: Please update your configuration, and remove 'Auth-Type = Local'
WARNING: Use the PAP or CHAP modules instead.
No "known good" password was configured for the user.
As a result, we cannot authenticate the user.
Failed to authenticate the user.
Using Post-Auth-Type Reject

I've modified rlm_caching.c thusly:

        if ((auth_type = pairfind(request->config_items, PW_AUTH_TYPE)) != NULL){
                DEBUG("rlm_caching: Found Auth-Type, value: '%s'",auth_type->vp_strvalue);
                /* JS - set Auth-Type to 'Accept' if unset */
                if (strcmp(auth_type->vp_strvalue,"") == 0){
                        DEBUG("rlm_caching: Auth-Type unset, assigning value: '%s'", "Accept");
                        strcpy(auth_type->vp_strvalue, "Accept");
                }
                if (strcmp(auth_type->vp_strvalue,"Reject") == 0 && data->cache_rejects == 0){
                        DEBUG("rlm_caching: No caching of Rejects. Returning NOOP");
                        return RLM_MODULE_NOOP;
                }
                if (strlen(auth_type->vp_strvalue) > MAX_AUTH_TYPE - 1){
                        DEBUG("rlm_caching: Auth-Type value too large");
                        return RLM_MODULE_NOOP;
                }
        }

This has the following effect:

rlm_caching: Found Auth-Type, value: ''
rlm_caching: Auth-Type unset, assigning value: 'Accept'
[…]
rlm_caching: New value stored successfully.
++[caching] returns ok
Sending Access-Accept of id 72 to 127.0.0.1 port 56586
	User-Name = "testing"
	NAS-IP-Address = 172.17.202.55
Finished request 0.
Going to the next request
Waking up in 4.9 seconds.
rad_recv: Access-Request packet from host 127.0.0.1 port 63643, id=178, length=77
	User-Name = "testing"
	User-Password = "password"
	NAS-IP-Address = 172.17.202.55
	NAS-Port = 0
	Message-Authenticator = 0x22ec5564c881d6ba20af882fa2369b31
# Executing section authorize from file /root/etc/raddb/sites-enabled/default
[…]
[caching] 	expand: %{User-Name}:%{User-Password}:%{NAS-IP-Address} -> testing:password:172.17.202.55
rlm_caching: Searching the database for key 'testing:password:172.17.202.55'
rlm_caching: Key Found.
rlm_caching: VP='User-Name',VALUE='testing',lenth='7',cache record length='22'
rlm_caching: VP='NAS-IP-Address',VALUE='172.17.202.55',lenth='4',cache record length='53'
rlm_caching: Adding Auth-Type 'Accept'
rlm_caching: Cache Queries:       2, Cache Hits:       2, Hit Ratio: 100.00%
++[caching] returns ok
Found Auth-Type = Accept
Auth-Type = Accept, accepting the user

Note that actual rejects don't seem to make the caching_postauth function, for whatever reason.

This seems to be working.  No doubt somebody'll step in and tell me how utterly wrong this is. :-)

Still, I'm content so far.  But I have one more thing to take care of: I'd like to enable caching only for specific clients.  How could I acomplish that?


Regards, Jeroen.
-- 
Jeroen Scheerder
ON2IT B.V.
Steenweg 17 B
4181 AJ WAARDENBURG
T: +31 418-653818 | F: +31 418-653716
W: www.on2it.net  | E: Jeroen.Scheerder at on2it.net

Premier Business Partner - IBM  |  Reseller of the Year 2011 - Palo Alto Networks



More information about the Freeradius-Users mailing list