Hi Alan I really appreciate your help - thank you I'm working though this - I may have some extra questions from this - a couple of initial questions if I may ? Currently for uses that we suspend I have a group defined and assign users to that group if they are disabled id GroupName Attribute op Value 219 disabledusers Filter-Id = T3 Which effectively puts the sessions into a known VRF - so that part is in place. The VRF works and traffic blackholed. This works if they enter the right username and password - the NAS and network does the rest ... In this case I ideally want: i) Users we know BUT the user has the wrong password - AND there's an '@' in the username or ii) Unknown users AND there's an '@' in the username The server should allow the users but.. have the same effect as being in the disabledusers group or add that attribute and set the user to get an IP from sqlippool (I already have that module setup for other users - it's just setting these users to be assigned to a specific (single) pool I mentioned above that this should only be the case if the username has an '@' the alternative is that this only happens when the request comes from certain NAS addresses - this is because I also have some wireless hotspots etc using the radius server and I don't want this behaviour to affect them. We also have a couple of realms we proxy for another home server - that's sort of in my control... Now I could copy this onto there server - but wondered if there's any way to implement this so it covers both uers authenticated locally - OR after a proxy has taken place I probably wasn't clear on logging - which was my fault - we have a portal that I created that feeds from the SQL database - radpostauth and radacct. In the ideal world I'd like there to be something I can add to radpostauith query that flags this user has connected - BUT with the 'disabled' flag - I assume I could set a variable somewhere in the auth part and access this in the post-auth section to add to the SQL query ? My aim is to test this on a clone of one of the current servers but not *yet* used by any of the NAS's so I can send requests to it - and test until I have this correct IF I have got the wrong end of the stick .... please feel free to point me to the correct end .... Thanks again Richard
--- Original message --- Subject: Re: A question - User Auth etc From: Alan DeKok <aland@deployingradius.com> To: FreeRadius users mailing list <freeradius-users@lists.freeradius.org> Date: Wednesday, 24/06/2020 2:37 PM
On Jun 24, 2020, at 9:27 AM, Richard J Palmer <richard@merula.net> wrote:
I have 'possibly' a slightly odd request - I am sure this can be solved with FreeRadius but I'd really appreciate some pointers.
FreeRADIUS can do almost anything. v4 will be able to do more. :)
We are using FreeRadius to authenticate broadband connections reaching us via L2TP over a number of providers. So far it works really well and I've had a few questions and help from here in the past which I really appriciate
Good to hear.
Obviously we get some connections reach us with invalid username's or wrong passwords.
The problem (and which we don't have any control over) is that in the case of a wrong username - the customers router etc can simply try constantly to log on. Obviously it never connects (as the current design) but this obviously causes extra records in postauth and so on.
What I'd like to do is
1) user logs on and works (as now) 2) user with wrong login (wrong password / unknown username) - we allow this to log on - send a specific reply back that pushes them into a VRF which has a walled garden. it should also make the user ad being in an IP Pool so it gets an IP from there)
Sure. That's relatively common. Let them on, but push them to a blocked VLAN, etc.
3) BUT ideally logs this connection as 'failed' OR adds a flag so we can see easily that the login was accepted by the above rule - so it's not a 'working' session
You can use the "linelog" module to selectively log bad authentications. i.e.
if (!known user) { linelog_bad_user }
Where you can create a "linelog" module:"
linelog linelog_bad_user { ... stuff to log ... }
And that logs what you want, where you want.
How to check for an unknown user is up to you. It depends on a number of things. And no, you can't just do "if (!known_user)". That's just an example.
The change to radreply - I know and have something we already use for a disabled or suspended user,
i.e. add a custom reply attribute which says "bad user". This doesn't have to be an attribute which is sent to the NAS. It can just be in raddb/dictionary
I am however after some guidance on how I can allow the user to get an 'accept' packet back with the extra reply attribute - and the logging information. There's some extra complexity which is this should only be the case where I am authenticating on a username with a '@' (realm). Any login being authenticated via Calling Station ID or with no realm (just a username) should perform as now.
You can write whatever complex rules you want in "unlang". :)
if (User-Name =~ /@/) { ... check database for known users...
if (!known_user) { linelog_bad_user put them in a VRF / VLAN / whatever accept } } }
Alan DeKok.
- List info/subscribe/unsubscribe? See http://www.freeradius.org/list/users.html