Trouble configuring SQL data store for users (second attempt)

Phil Mayers p.mayers at imperial.ac.uk
Tue Sep 18 11:19:35 CEST 2007


On Mon, 2007-09-17 at 20:30 -0700, Bill Shaver wrote:
> Please forgive the duplicate post. I posted this a few days back and
> didn't see any response; thought I would give it just one more try.
> Thanks for any response.
> 	--Bill
> 
> 
> 
> I have started to experiment with using mysql as the datastore for users
> and clients instead of the default file method for my relatively small
> installation. Right now my work is on a test system and all is working
> well, with one exception: a user that is a member of two or more groups. 
> Based on all I have read, this last thing should be very basic.
> 
> If I put the user in only groupA (in the usergroup table), the test
> works great. If I put user1 in only groupB, the test works great. When
> I put user1 in both groupA and groupB in the usergroup table it will
> only work against the first record of the two, the second record always
> returns a failure.

Versions of FreeRadius prior to 2.0pre/CVS handle multiple groups a
little bit oddly. The SQL code merges the check items for the user (from
radcheck) and all their groups (from radgroupcheck) into one check list,
compares them all, then if they all match, merges the reply items for
the user (from radreply) and all their groups (from radgroupreply) into
one set of reply items, which are added to the reply.

So having a user in two groups with conflicting check or reply items
doesn't work.

This is annoying, since it's usually what you want to do!

In FreeRadius 2.x the SQL groups work as expected. The user check/reply
items are processed, then the groups are processed in order of
precedence, processing stopping the first time Fall-Through==no (the
default).

The easiest way to get around this is in 1.x to modify the group
membership SQL query to include more than just the username as the
"key". I like to refer to this as "netgroup-like". For example, you
might set:

group_membership_query = "
 select groupname from netgroup where \
 username='%{SQL-User-Name}' and \
 realm='%{Realm}'"

In SQL:

create table netgroup (username varchar(253), realm varchar(253),
groupname varchar(253), primary key (username,realm));

insert into netgroup values ('kpass','cisi','CiscoAdm');
insert into netgroup values ('kpass','syst','LdapHpReho');

This is a very simple example, and can in fact be accomplished without
changing anything; just change the SQL-User-Name to be User-Name as
opposed to Stripped-User-Name and put the user at realm in the user column.

However, there are endless variations on this scheme, including putting
things such as:
 * Service-Type
 * Calling-Station-Id
 * Called-Station-Id
 * Huntgroup-Name
 * etc.
...in the "key" to the group table.

> 
> I am sure this is probably something really stupid, but I just cannot
> see it. Any help would be appreciated.
> 
> I have attatched table dumps, sample commands, and a debug trace. I hope
> it is helpful
> 
> Thanks,
> 	--Bill
> 
> 
> FreeRadius version 1.0.1

This is ancient. Upgrade to 1.1.7

> MySQL      version 4.1.20
> 
> 
> vm # /usr/bin/radtest -d /etc/raddb kparr at cisi  password \
> 	localhost:1645 10 naspass
> will sucseed, while
> vm # /usr/bin/radtest -d /etc/raddb kparr at syst  password \
> 	localhost:1645 10 naspass
> fails, but should sucseed 
> 
> 
> The following is a test data set to validate a variety of cases that we
> need to support in our environment.
> 
> select * from radcheck          into outfile '/tmp/f1';
> --------------------------------------------------------
> id	username	attribute	op	value
> --	--------	---------	--	-----
> 1	bill		Password	==	userpass
> 5	guest01		Auth-Type	:=	Local

Once you've upgraded to 1.1.7, you can stop setting Auth-Type to Local,
and stop using password comparison. Instead, do:

Cleartext-Password := value

...and ensure the PAP module is at the bottom of the authorize section.
Then it'll a) magically work and b) be the recommended way of doing it.

> 6	guest01		Password	==	password
> 
> select * from radreply          into outfile '/tmp/f4';
> --------------------------------------------------------
> id	username	attribute	op	value
> --	--------	---------	--	-----
> 7	guest01		Class		:=	OU=Wireless;
> 8	guest01		Fall-Through	:=	No
> 

As above, Fall-Through is irrelevant on SQL groups in FreeRadius 1.x.

> select * from radgroupcheck     into outfile '/tmp/f2';
> --------------------------------------------------------
> id	groupname	attribute	op	value
> --	--------	---------	--	-----
> 6	LocalUnix	Auth-Type	==	System
> 7	LocalUnix	Realm		==	Test
> 9	LdapCiscoAdm	Password	==	password
> 10	LdapCiscoAdm	Auth-Type	==	Local
> 11	LdapCiscoAdm	Realm		==	cisi
> 12	LdapHpReho	Realm		==	syst
> 13	LdapHpReho	Auth-Type	==	Local
> 14	LdapHpReho	Password	==	password
> 15	Rejected	Auth-Type	:=	Reject
> 
> select * from radgroupreply     into outfile '/tmp/f3';
> --------------------------------------------------------
> id	groupname	attribute	op	value
> --	--------	---------	--	-----
> 8	LocalUnix	Service-Type	=	Login		0
> 9	LdapCiscoAdm	Cisco-AVPair	=	shell:priv-lvl=15	0
> 10	LdapCiscoAdm	Class		:=	OU=cis;		0
> 11	LdapCiscoAdm	Fall-Through	:=	Yes		0
> 12	LdapCiscoAdm	Service-Type	=	6		0
> 13	LdapHpReho	Class		:=	OU=Proj;	0
> 14	LdapHpReho	Fall-Through	:=	Yes		0
> 15	Rejected	Fall-Through	:=	No		0
> 17	Rejected	Reply-Message	:=	Account is locked out.	0
> 
> select * from usergroup         into outfile '/tmp/f5';
> --------------------------------------------------------
> id	username groupname
> --	-------- ---------
> 9	root	LocalUnix	
> 10	kparr	LdapCiscoAdm	
> 11	kchow	LdapHpReho	
> 12	jpage	Rejected	
> 13	kparr	LdapHpReho	
> 14	bshaver	LdapCiscoAdm	
> 
> 
> --------------------------------------------------------
> vm # radiusd -x

The generally recommended command to show output for is "radiusd -X" (upper case).

HTH




More information about the Freeradius-Users mailing list