Basic syntax checking can be done with the 'filter_username' policy. From the FreeRADIUS documents: # Filter the username # # Force some sanity on User-Name. This helps to avoid issues # issues where the back-end database is "forgiving" about # what constitutes a user name. Example usage: authorize { filter_username loop_prevent operator-name suffix } To filter out unwanted realms, such as 'hotmail.com' can be done simply by using the 'realm' command: ## Filter out NULL realms e.g. Username = fred realm NULL { } ## Filter out realms that aren't every going to be valid Govroam realms e.g. Username = fred@hotmail.com realm "~hotmail\\.com$" { } realm "~hotmail\\.co\\.uk$" { } realm "~.*\\.3gppnetworks\\.org$" { } realm "~.*\\.3gppnetwork\\.org$" { } realm "~gmail\\.com" { } realm "~googlemail\\.com" { } realm "~live\\.com" { } realm "~outlook\\.com" { } realm "~yahoo\\.com" { } realm "~yahoo\\.cn" { } realm "~unimail\\.com" { } realm "~yahoo\\.co\\.uk" { } realm "~myabc\\.com" { } alternatively check_bad_realms { if (&User-Name) { ## reject usernames that end with realms that are never going to be govroam/eduroam realms ## is there a way to automate this??! ## stuff here will be matched for just eduroam if (&control:Proxy-To-Realm =~ /^PROXY-JANET-EDUROAM$/) if (&User-Name =~ /test\.net$/) { update request { &Module-Failure-Message += 'Rejected: Bad Realm' } reject } if (&User-Name =~ /@.*bathnes/) { update request { &Module-Failure-Message += 'Rejected: Bad Realm' } reject } } ## stuff here will be matched for just govroam if (&control:Proxy-To-Realm =~ /^PROXY-JANET-GOVROAM$/) if (&User-Name =~ /that\.host$/) { update request { &Module-Failure-Message += 'Rejected: Bad Realm' } reject } } ## stuff here will be matched for both govroam and eduroam ## Common realm provided by phone manufacturers by default if (&User-Name =~ /3gppnetwork\.org$/) { update request { &Module-Failure-Message += 'Rejected: Bad Realm' } reject } ## Username is not an email address. if (&User-Name =~ /gmail\.com$/) { update request { &Module-Failure-Message += 'Rejected: Bad Realm' } reject } ## Ends in '.' if (&User-Name =~ /bath\.ac\.uk.+$/) { update request { &Module-Failure-Message += 'Rejected: Bad Realm' } reject } ## Ends in a single character - all TLDs are 2+ characters. if (&User-Name =~ /\.[a-z0-9]$/) { update request { &Module-Failure-Message += 'Rejected: Bad Realm' } reject } ## All subrealms should have more than one character if (&User-Name =~ /\.[a-z0-9]\.uk$/) { update request { &Module-Failure-Message += 'Rejected: Bad Realm' } reject } ## Misspellings and misunderstandings if (&User-Name =~ /ac\.uk\.com$/) { update request { &Module-Failure-Message += 'Rejected: Bad Realm' } reject } if (&User-Name =~ /\.acuk$/) { update request { &Module-Failure-Message += 'Rejected: Bad Realm' } reject } if (&User-Name =~ /@ac\.uk$/) { update request { &Module-Failure-Message += 'Rejected: Bad Realm' } reject } ## Starts with a '.' if (&User-Name =~ /\.bath\.ac\.uk$/) { update request { &Module-Failure-Message += 'Rejected: Bad Realm' } reject } ## Some typical inappropriate realms. if (&User-Name =~ /@myabc\.com$/) { update request { &Module-Failure-Message += 'Rejected: Bad Realm' } reject } if (&User-Name =~ /@.*hotmail\.co/) { update request { &Module-Failure-Message += 'Rejected: Bad Realm' } reject } if (&User-Name =~ /@.*live\.co$/) { update request { &Module-Failure-Message += 'Rejected: Bad Realm' } reject } if (&User-Name =~ /\.local$/) { update request { &Module-Failure-Message += 'Rejected: Bad Realm' } reject } if (&User-Name =~ /\.guest$/) { update request { &Module-Failure-Message += 'Rejected: Bad Realm' } reject } if (&User-Name =~ /@.*gmail\.co/) { update request { &Module-Failure-Message += 'Rejected: Bad Realm' } reject } if (&User-Name =~ /googlemail\.com$/) { update request { &Module-Failure-Message += 'Rejected: Bad Realm' } reject } if (&User-Name =~ /outlook\.com$/) { update request { &Module-Failure-Message += 'Rejected: Bad Realm' } reject } if (&User-Name =~ /@.*yahoo\.c/) { update request { &Module-Failure-Message += 'Rejected: Bad Realm' } reject } if (&User-Name =~ /unimail\.com$/) { update request { &Module-Failure-Message += 'Rejected: Bad Realm' } reject } if (&User-Name =~ /blueyonder\.co\.uk$/) { update request { &Module-Failure-Message += 'Rejected: Bad Realm' } reject } } else { update request { &Module-Failure-Message += 'Rejected: erm... WTF?!' } reject } } Many thanks to Matt Richards from Bath University for this code.