UPN, NTLM_AUTH, Freeradius: It shouldn't work ... but it does (sometimes).

Sam Fakhreddine Sam.Fakhreddine at ledcor.com
Fri Jan 16 18:37:36 CET 2015


Hello Esteemed Colleagues,

I know that using samba and NTLM_auth UPN authentication is not meant to work.
However, much to my embarrassment with management, it does. Sometimes. I am able to login to our WiFi with my UPN login   instead of my windows login (these 2 addresses differ significantly for everyone).

I cannot determine when and where it works. Sometimes it lets us through, other times denies us.

Any help is appreciated.

Here is the output of radiusd -X

radiusd: #### Instantiating modules ####
instantiate {
}
modules {
  # Loaded module rlm_always
  # Instantiating module "fail" from file /usr/local/etc/raddb/mods-enabled/always
  always fail {
                rcode = "fail"
                simulcount = 0
                mpp = no
  }
  # Instantiating module "reject" from file /usr/local/etc/raddb/mods-enabled/always
  always reject {
                rcode = "reject"
                simulcount = 0
                mpp = no
  }
  # Instantiating module "noop" from file /usr/local/etc/raddb/mods-enabled/always
  always noop {
                rcode = "noop"
                simulcount = 0
                mpp = no
  }
  # Instantiating module "handled" from file /usr/local/etc/raddb/mods-enabled/always
  always handled {
                rcode = "handled"
                simulcount = 0
                mpp = no
  }
  # Instantiating module "updated" from file /usr/local/etc/raddb/mods-enabled/always
  always updated {
                rcode = "updated"
                simulcount = 0
                mpp = no
  }
  # Instantiating module "notfound" from file /usr/local/etc/raddb/mods-enabled/always
  always notfound {
                rcode = "notfound"
                simulcount = 0
                mpp = no
  }
  # Instantiating module "ok" from file /usr/local/etc/raddb/mods-enabled/always
  always ok {
                rcode = "ok"
                simulcount = 0
                mpp = no
  }
  # Loaded module rlm_pap
  # Instantiating module "pap" from file /usr/local/etc/raddb/mods-enabled/pap
  pap {
                auto_header = no
                normalise = yes
  }
  # Loaded module rlm_radutmp
  # Instantiating module "radutmp" from file /usr/local/etc/raddb/mods-enabled/radutmp
  radutmp {
                filename = "/usr/local/var/log/radius/radutmp"
                username = "%{User-Name}"
                case_sensitive = yes
                check_with_nas = yes
                permissions = 384
                caller_id = yes
  }
  # Loaded module rlm_exec
  # Instantiating module "ntlm_auth" from file /usr/local/etc/raddb/mods-enabled/ntlm_auth
  exec ntlm_auth {
                wait = yes
                program = "/usr/bin/ntlm_auth --request-nt-key --domain=company.net --username=%{mschap:User-Name} --password=%{User-Password}"
                shell_escape = yes
  }
  # Loaded module rlm_preprocess
  # Instantiating module "preprocess" from file /usr/local/etc/raddb/mods-enabled/preprocess
  preprocess {
                huntgroups = "/usr/local/etc/raddb/mods-config/preprocess/huntgroups"
                hints = "/usr/local/etc/raddb/mods-config/preprocess/hints"
                with_ascend_hack = no
                ascend_channels_per_line = 23
                with_ntdomain_hack = no
                with_specialix_jetstream_hack = no
                with_cisco_vsa_hack = no
                with_alvarion_vsa_hack = no
  }
reading pairlist file /usr/local/etc/raddb/mods-config/preprocess/huntgroups
reading pairlist file /usr/local/etc/raddb/mods-config/preprocess/hints
  # Instantiating module "echo" from file /usr/local/etc/raddb/mods-enabled/echo
 exec echo {
                wait = yes
                program = "/bin/echo %{User-Name}"
                input_pairs = "request"
                output_pairs = "reply"
                shell_escape = yes
  }
  # Instantiating module "sradutmp" from file /usr/local/etc/raddb/mods-enabled/sradutmp
  radutmp sradutmp {
                filename = "/usr/local/var/log/radius/sradutmp"
                username = "%{User-Name}"
                case_sensitive = yes
                check_with_nas = yes
                permissions = 420
                caller_id = no
  }
  # Loaded module rlm_detail
  # Instantiating module "detail" from file /usr/local/etc/raddb/mods-enabled/detail
  detail {
                filename = "/usr/local/var/log/radius/radacct/%{%{Packet-Src-IP-Address}:-%{Packet-Src-IPv6-Address}}/detail-%Y%m%d"
                header = "%t"
                permissions = 384
                dir_permissions = 493
                locking = no
                log_packet_header = no
  }
  # Loaded module rlm_mschap
  # Instantiating module "mschap" from file /usr/local/etc/raddb/mods-enabled/mschap
  mschap {
                use_mppe = yes
                require_encryption = no
                require_strong = no
                with_ntdomain_hack = yes
                ntlm_auth = "/usr/bin/ntlm_auth --request-nt-key --username=%{%{Stripped-User-Name}:-%{%{User-Name}:-None}} --domain=%{mschap:NT-Domain} --challenge=%{%{mschap:Challenge}:-00} --nt-response=%{%{mschap:NT-Response}:-00}"
   passchange {
   }
                allow_retry = yes
  }
  # Loaded module rlm_realm
  # Instantiating module "IPASS" from file /usr/local/etc/raddb/mods-enabled/realm
  realm IPASS {
                format = "prefix"
                delimiter = "/"
                ignore_default = no
                ignore_null = no
  }
  # Instantiating module "suffix" from file /usr/local/etc/raddb/mods-enabled/realm
  realm suffix {
                format = "suffix"
                delimiter = "@"
                ignore_default = no
                ignore_null = no
  }
  # Instantiating module "realmpercent" from file /usr/local/etc/raddb/mods-enabled/realm
  realm realmpercent {
                format = "suffix"
                delimiter = "%"
                ignore_default = no
                ignore_null = no
  }
  # Instantiating module "ntdomain" from file /usr/local/etc/raddb/mods-enabled/realm
  realm ntdomain {
                format = "prefix"
                delimiter = "\"
                ignore_default = no
                ignore_null = no
  }
  # Loaded module rlm_replicate
  # Instantiating module "replicate" from file /usr/local/etc/raddb/mods-enabled/replicate
  # Loaded module rlm_attr_filter
  # Instantiating module "attr_filter.post-proxy" from file /usr/local/etc/raddb/mods-enabled/attr_filter
  attr_filter attr_filter.post-proxy {
                filename = "/usr/local/etc/raddb/mods-config/attr_filter/post-proxy"
                key = "%{Realm}"
                relaxed = no
  }
reading pairlist file /usr/local/etc/raddb/mods-config/attr_filter/post-proxy
  # Instantiating module "attr_filter.pre-proxy" from file /usr/local/etc/raddb/mods-enabled/attr_filter
  attr_filter attr_filter.pre-proxy {
                filename = "/usr/local/etc/raddb/mods-config/attr_filter/pre-proxy"
                key = "%{Realm}"
                relaxed = no
  }
reading pairlist file /usr/local/etc/raddb/mods-config/attr_filter/pre-proxy
  # Instantiating module "attr_filter.access_reject" from file /usr/local/etc/raddb/mods-enabled/attr_filter
  attr_filter attr_filter.access_reject {
                filename = "/usr/local/etc/raddb/mods-config/attr_filter/access_reject"
                key = "%{User-Name}"
                relaxed = no
  }
reading pairlist file /usr/local/etc/raddb/mods-config/attr_filter/access_reject
  # Instantiating module "attr_filter.access_challenge" from file /usr/local/etc/raddb/mods-enabled/attr_filter
  attr_filter attr_filter.access_challenge {
                filename = "/usr/local/etc/raddb/mods-config/attr_filter/access_challenge"
                key = "%{User-Name}"
                relaxed = no
  }
reading pairlist file /usr/local/etc/raddb/mods-config/attr_filter/access_challenge
  # Instantiating module "attr_filter.accounting_response" from file /usr/local/etc/raddb/mods-enabled/attr_filter
  attr_filter attr_filter.accounting_response {
                filename = "/usr/local/etc/raddb/mods-config/attr_filter/accounting_response"
                key = "%{User-Name}"
                relaxed = no
  }
reading pairlist file /usr/local/etc/raddb/mods-config/attr_filter/accounting_response
  # Loaded module rlm_cache
  # Instantiating module "cache_eap" from file /usr/local/etc/raddb/mods-enabled/cache_eap
  cache cache_eap {
                key = "%{%{control:State}:-%{%{reply:State}:-%{State}}}"
                ttl = 15
                max_entries = 16384
                epoch = 0
                add_stats = no
  }
  # Loaded module rlm_logintime
  # Instantiating module "logintime" from file /usr/local/etc/raddb/mods-enabled/logintime
  logintime {
                minimum_timeout = 60
  }
  # Loaded module rlm_dynamic_clients
  # Instantiating module "dynamic_clients" from file /usr/local/etc/raddb/mods-enabled/dynamic_clients
  # Loaded module rlm_soh
  # Instantiating module "soh" from file /usr/local/etc/raddb/mods-enabled/soh
  soh {
                dhcp = yes
  }
  # Loaded module rlm_files
  # Instantiating module "files" from file /usr/local/etc/raddb/mods-enabled/files
  files {
                filename = "/usr/local/etc/raddb/mods-config/files/authorize"
                usersfile = "/usr/local/etc/raddb/mods-config/files/authorize"
                acctusersfile = "/usr/local/etc/raddb/mods-config/files/accounting"
                preproxy_usersfile = "/usr/local/etc/raddb/mods-config/files/pre-proxy"
                compat = "no"
  }
reading pairlist file /usr/local/etc/raddb/mods-config/files/authorize
reading pairlist file /usr/local/etc/raddb/mods-config/files/authorize
reading pairlist file /usr/local/etc/raddb/mods-config/files/accounting
reading pairlist file /usr/local/etc/raddb/mods-config/files/pre-proxy
  # Loaded module rlm_passwd
  # Instantiating module "etc_passwd" from file /usr/local/etc/raddb/mods-enabled/passwd
  passwd etc_passwd {
                filename = "/etc/passwd"
                format = "*User-Name:Crypt-Password:"
                delimiter = ":"
                ignore_nislike = no
                ignore_empty = yes
                allow_multiple_keys = no
                hash_size = 100
  }
rlm_passwd: nfields: 3 keyfield 0(User-Name) listable: no
  # Loaded module rlm_chap
  # Instantiating module "chap" from file /usr/local/etc/raddb/mods-enabled/chap
  # Instantiating module "exec" from file /usr/local/etc/raddb/mods-enabled/exec
  exec {
                wait = no
                input_pairs = "request"
                shell_escape = yes
                timeout = 10
  }
  # Loaded module rlm_expiration
  # Instantiating module "expiration" from file /usr/local/etc/raddb/mods-enabled/expiration
  # Loaded module rlm_utf8
  # Instantiating module "utf8" from file /usr/local/etc/raddb/mods-enabled/utf8
  # Loaded module rlm_dhcp
  # Instantiating module "dhcp" from file /usr/local/etc/raddb/mods-enabled/dhcp
  # Loaded module rlm_expr
  # Instantiating module "expr" from file /usr/local/etc/raddb/mods-enabled/expr
  expr {
                safe_characters = "@abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.-_: /"
  }
  # Loaded module rlm_eap
  # Instantiating module "eap" from file /usr/local/etc/raddb/mods-enabled/eap
  eap {
                default_eap_type = "peap"
                timer_expire = 60
                ignore_unknown_eap_types = no
                mod_accounting_username_bug = no
                max_sessions = 4096
  }
   # Linked to sub-module rlm_eap_md5
   # Linked to sub-module rlm_eap_leap
   # Linked to sub-module rlm_eap_gtc
   gtc {
                challenge = "Password: "
                auth_type = "PAP"
   }
   # Linked to sub-module rlm_eap_tls
   tls {
                tls = "tls-common"
   }
   tls-config tls-common {
                rsa_key_exchange = no
                dh_key_exchange = yes
                rsa_key_length = 512
                dh_key_length = 512
                verify_depth = 0
                ca_path = "/usr/local/etc/raddb/certs"
                pem_file_type = yes
                private_key_file = "/usr/local/etc/raddb/certs/radius.key"
                certificate_file = "/usr/local/etc/raddb/certs/radius.CompanyRadiusCA.pem"
                private_key_password = "corled"
                dh_file = "/usr/local/etc/raddb/certs/dh"
                random_file = "/dev/urandom"
                fragment_size = 1024
                include_length = yes
                check_crl = no
                cipher_list = "DEFAULT"
                ecdh_curve = "prime256v1"
    cache {
                enable = yes
                lifetime = 24
                max_entries = 255
    }
    verify {
    }
    ocsp {
                enable = no
                override_cert_url = yes
                url = "http://127.0.0.1/ocsp/"
                use_nonce = yes
                timeout = 0
                softfail = yes
    }
   }
   # Linked to sub-module rlm_eap_ttls
   ttls {
                tls = "tls-common"
                default_eap_type = "md5"
                copy_request_to_tunnel = no
                use_tunneled_reply = no
                virtual_server = "inner-tunnel"
                include_length = yes
                require_client_cert = no
   }
Using cached TLS configuration from previous invocation
   # Linked to sub-module rlm_eap_peap
   peap {
                tls = "tls-common"
                default_method = "mschapv2"
                copy_request_to_tunnel = no
                use_tunneled_reply = no
                proxy_tunneled_request_as_eap = yes
                virtual_server = "inner-tunnel"
                soh = no
                require_client_cert = no
   }
Using cached TLS configuration from previous invocation
   # Linked to sub-module rlm_eap_mschapv2
   mschapv2 {
                with_ntdomain_hack = no
                send_error = no
   }
  # Loaded module rlm_linelog
  # Instantiating module "linelog" from file /usr/local/etc/raddb/mods-enabled/linelog
  linelog {
                filename = "/usr/local/var/log/radius/linelog"
                permissions = 384
                format = "This is a log message for %{User-Name}"
                reference = "%{%{Packet-Type}:-format}"
  }
  # Loaded module rlm_unix
  # Instantiating module "unix" from file /usr/local/etc/raddb/mods-enabled/unix
  unix {
                radwtmp = "/usr/local/var/log/radius/radwtmp"
  }
  # Loaded module rlm_digest
  # Instantiating module "digest" from file /usr/local/etc/raddb/mods-enabled/digest
  # Instantiating module "auth_log" from file /usr/local/etc/raddb/mods-enabled/detail.log
  detail auth_log {
                filename = "/usr/local/var/log/radius/radacct/%{%{Packet-Src-IP-Address}:-%{Packet-Src-IPv6-Address}}/auth-detail-%Y%m%d"
                header = "%t"
                permissions = 384
                dir_permissions = 493
                locking = no
                log_packet_header = no
  }
rlm_detail (auth_log): 'User-Password' suppressed, will not appear in detail output
  # Instantiating module "reply_log" from file /usr/local/etc/raddb/mods-enabled/detail.log
  detail reply_log {
                filename = "/usr/local/var/log/radius/radacct/%{%{Packet-Src-IP-Address}:-%{Packet-Src-IPv6-Address}}/reply-detail-%Y%m%d"
                header = "%t"
                permissions = 384
                dir_permissions = 493
                locking = no
                log_packet_header = no
  }
  # Instantiating module "pre_proxy_log" from file /usr/local/etc/raddb/mods-enabled/detail.log
  detail pre_proxy_log {
                filename = "/usr/local/var/log/radius/radacct/%{%{Packet-Src-IP-Address}:-%{Packet-Src-IPv6-Address}}/pre-proxy-detail-%Y%m%d"
                header = "%t"
                permissions = 384
                dir_permissions = 493
                locking = no
                log_packet_header = no
  }
  # Instantiating module "post_proxy_log" from file /usr/local/etc/raddb/mods-enabled/detail.log
  detail post_proxy_log {
                filename = "/usr/local/var/log/radius/radacct/%{%{Packet-Src-IP-Address}:-%{Packet-Src-IPv6-Address}}/post-proxy-detail-%Y%m%d"
                header = "%t"
                permissions = 384
                dir_permissions = 493
                locking = no
                log_packet_header = no
  }
} # modules
radiusd: #### Loading Virtual Servers ####
server { # from file /usr/local/etc/raddb/radiusd.conf
} # server
server default { # from file /usr/local/etc/raddb/sites-enabled/default
# Creating Auth-Type = ntlm_auth
# Creating Auth-Type = digest
# Loading authenticate {...}
# Loading authorize {...}
# Loading virtual module ntlm_auth
# Loading virtual module filter_username
WARNING: Ignoring "sql" (see raddb/mods-available/README.rst)
WARNING: Ignoring "ldap" (see raddb/mods-available/README.rst)
# Loading preacct {...}
# Loading virtual module acct_unique
# Loading accounting {...}
WARNING: Ignoring "sql" (see raddb/mods-available/README.rst)
# Loading post-proxy {...}
# Loading post-auth {...}
WARNING: Ignoring "sql" (see raddb/mods-available/README.rst)
# Loading virtual module remove_reply_message_if_eap
# Loading virtual module remove_reply_message_if_eap
} # server default
server inner-tunnel { # from file /usr/local/etc/raddb/sites-enabled/inner-tunnel
# Loading authenticate {...}
# Loading authorize {...}
# Loading virtual module ntlm_auth
WARNING: Ignoring "sql" (see raddb/mods-available/README.rst)
WARNING: Ignoring "ldap" (see raddb/mods-available/README.rst)
# Loading session {...}
# Loading post-proxy {...}
# Loading post-auth {...}
WARNING: Ignoring "sql" (see raddb/mods-available/README.rst)
} # server inner-tunnel
thread pool {
               start_servers = 5
               max_servers = 32
               min_spare_servers = 3
               max_spare_servers = 10
               max_requests_per_server = 0
               cleanup_delay = 5
               max_queue_size = 65536
               auto_limit_acct = no
Thread spawned new child 1. Total threads in pool: 1
Thread spawned new child 2. Total threads in pool: 2
Thread 1 waiting to be assigned a request
Thread spawned new child 3. Total threads in pool: 3
Thread 2 waiting to be assigned a request
Thread 3 waiting to be assigned a request
Thread spawned new child 4. Total threads in pool: 4
Thread spawned new child 5. Total threads in pool: 5
Thread 4 waiting to be assigned a request
Thread pool initialized
radiusd: #### Opening IP addresses and Ports ####
Thread 5 waiting to be assigned a request
listen {
                type = "auth"
                ipaddr = *
                port = 0
   limit {
                max_connections = 16
                lifetime = 0
                idle_timeout = 30
   }
}
listen {
                type = "acct"
                ipaddr = *
                port = 0
   limit {
                max_connections = 16
                lifetime = 0
                idle_timeout = 30
   }
}
listen {
                type = "auth"
                ipaddr = 127.0.0.1
                port = 18120
}
Listening on auth address * port 1812 as server default
Listening on acct address * port 1813 as server default
Listening on auth address 127.0.0.1 port 18120 as server inner-tunnel
Opening new proxy address * port 1814
Listening on proxy address * port 1814
Ready to process requests.
Threads: total/active/spare threads = 5/0/5

And here is an example of freeradius allowing through my login with UPN:


Thread 4 waiting to be assigned a request
Waking up in 0.2 seconds.
Thread 3 got semaphore
Thread 3 handling request 16, (4 handled so far)
(16) # Executing section authorize from file /usr/local/etc/raddb/sites-enabled/default
(16)   authorize {
(16)   ntlm_auth.authorize ntlm_auth.authorize {
(16)    ? if (!control:Auth-Type && User-Password)
(16)    ? if (!control:Auth-Type && User-Password)  -> FALSE
(16)   } # ntlm_auth.authorize ntlm_auth.authorize = notfound
(16)   filter_username filter_username {
(16)    ? if (User-Name =~ / /)
(16)    ? if (User-Name =~ / /)  -> FALSE
(16)    ? if (User-Name =~ /@.*@/ )
(16)    ? if (User-Name =~ /@.*@/ )  -> FALSE
(16)    ? if (User-Name =~ /\\.\\./ )
(16)    ? if (User-Name =~ /\\.\\./ )  -> FALSE
(16)    ? if ((User-Name =~ /@/) && (User-Name !~ /@(.+)\\.(.+)$/))
(16)    ? if ((User-Name =~ /@/) && (User-Name !~ /@(.+)\\.(.+)$/))   -> FALSE
(16)    ? if (User-Name =~ /\\.$/)
(16)    ? if (User-Name =~ /\\.$/)   -> FALSE
(16)    ? if (User-Name =~ /@\\./)
(16)    ? if (User-Name =~ /@\\./)   -> FALSE
(16)   } # filter_username filter_username = notfound
(16)   [preprocess] = ok
(16)   [chap] = noop
(16)   [mschap] = noop
(16)   [digest] = noop
(16) suffix : Looking up realm "company.com" for User-Name = "sam.fakhreddine at company.com"
(16) suffix : No such realm "company.com"
(16)   [suffix] = noop
(16) eap : EAP packet type response id 226 length 96
(16) eap : Continuing tunnel setup.
(16)   [eap] = ok
(16)  } #  authorize = ok
(16) Found Auth-Type = EAP
(16) # Executing group from file /usr/local/etc/raddb/sites-enabled/default
(16)   authenticate {
(16) eap : Expiring EAP session with state 0xab50bbb0aeb2a2e9
(16) eap : Finished EAP session with state 0xab50bbb0aeb2a2e9
(16) eap : Previous EAP request found for state 0xab50bbb0aeb2a2e9, released from the list
(16) eap : Peer sent PEAP (25)
(16) eap : EAP PEAP (25)
(16) eap : Calling eap_peap to process EAP data
(16) eap_peap : processing EAP-TLS
(16) eap_peap : eaptls_verify returned 7
(16) eap_peap : Done initial handshake
(16) eap_peap : eaptls_process returned 7
(16) eap_peap : FR_TLS_OK
(16) eap_peap : Session established.  Decoding tunneled attributes.
(16) eap_peap : Peap state WAITING FOR INNER IDENTITY
(16) eap_peap : Identity - sam.fakhreddine at company.com
(16) eap_peap : Got inner identity 'sam.fakhreddine at company.com'
(16) eap_peap : Setting default EAP type for tunneled EAP session.
(16) eap_peap : Setting User-Name to sam.fakhreddine at company.com
(16) # Executing section authorize from file /usr/local/etc/raddb/sites-enabled/inner-tunnel
(16)   authorize {
(16)   ntlm_auth.authorize ntlm_auth.authorize {
(16)    ? if (!control:Auth-Type && User-Password)
(16)    ? if (!control:Auth-Type && User-Password)  -> FALSE
(16)   } # ntlm_auth.authorize ntlm_auth.authorize = notfound
(16)   [chap] = noop
(16)   [mschap] = noop
(16) suffix : Looking up realm "company.com" for User-Name = "sam.fakhreddine at company.com"
(16) suffix : No such realm "company.com"
(16)   [suffix] = noop
(16)   update control {
(16)                        Proxy-To-Realm := 'LOCAL'
(16)   } # update control = noop
(16) eap : EAP packet type response id 226 length 31
(16) eap : EAP-Identity reply, returning 'ok' so we can short-circuit the rest of authorize
(16)   [eap] = ok
(16)  } #  authorize = ok
(16) Found Auth-Type = EAP
(16) # Executing group from file /usr/local/etc/raddb/sites-enabled/inner-tunnel
(16)   authenticate {
(16) eap : Peer sent Identity (1)
(16) eap : Calling eap_mschapv2 to process EAP data
(16) eap_mschapv2 : Issuing Challenge
(16) eap : New EAP session, adding 'State' attribute to reply 0x78c6265278253c43
(16)   [eap] = handled
(16)  } #  authenticate = handled
(16) eap_peap : Got tunneled Access-Challenge
(16) eap : New EAP session, adding 'State' attribute to reply 0xab50bbb0adb3a2e9
(16)   [eap] = handled
(16)  } #  authenticate = handled
(16) Finished request 16.
Thread 3 waiting to be assigned a request


Sam Fakhreddine
Site System Administrator
Ledcor Industries Inc., Information Services
7008 Roper Road NW, Edmonton, AB T6B 3H2
p 780-395-5455 | c 780-996-0763
www.ledcor.com<http://www.ledcor.com/>
FORWARD. TOGETHER.



More information about the Freeradius-Users mailing list