Я пытаюсь настроить EAP-PWD с помощью FreeRADIUS 3.
Однако я не могу заставить его работать, а документации практически не существует. Таким образом, я не знаю, является ли проблема, с которой я столкнулся, неправильной конфигурацией или реальной ошибкой.
Это моя конфигурация (по крайней мере, актуальные части):
с включенными модами / eap:
eap {
pwd {
#group = 19
server_id = example@example.com
# This has the same meaning as for TLS.
fragment_size = 1020
# The virtual server which determines the "known good" password for the user.
# Note that unlike TLS, only the "authorize" section is processed.
# EAP-PWD requests can be distinguished by having a User-Name, but no User-Password, CHAP-Password, EAP-Message, etc.
#virtual_server = "inner-tunnel"
}
Я не знаю что group = 19
должно означать. (Это нигде не объясняется)
сайты включены / по умолчанию:
authorize {
filter_username
preprocess
# Look in an SQL database.
sql
#permit_only_eap
eap {
ok = return
}
logintime
}
authenticate {
# Allow EAP authentication.
eap
}
сайты с поддержкой / внутренний туннель:
authorize {
eap {
ok = return
}
# Look in an SQL database.
sql
expiration
}
authenticate {
mschap
# Allow EAP authentication.
eap
}
Честно говоря, я не понимаю, зачем EAP-PWD туннелированный запрос. У меня он был настроен, потому что я также использую PEAPv0 / MS-CHAPv2. Я пробовал оба виртуальных сервера (по умолчанию и внутренний туннель)
Что ж, проблема. Я получаю ошибки аутентификации на соискателе. Вот что я вижу в журналах:
(2) eap: Peer sent method PWD (52)
(2) eap: EAP PWD (52)
(2) eap: Calling eap_pwd to process EAP data
(2) eap_pwd: Sending tunneled request
(2) eap_pwd: server default {
(2) # Executing section authorize from file /etc/freeradius/sites-enabled/default
(2) authorize {
(2) policy filter_username {
(2) if (!&User-Name) {
(2) if (!&User-Name) -> TRUE
(2) if (!&User-Name) {
(2) [noop] = noop
(2) } # if (!&User-Name) = noop
(2) if (&User-Name =~ / /) {
(2) ERROR: Failed retrieving values required to evaluate condition
(2) if (&User-Name =~ /@.*@/ ) {
(2) ERROR: Failed retrieving values required to evaluate condition
(2) if (&User-Name =~ /\.\./ ) {
(2) ERROR: Failed retrieving values required to evaluate condition
(2) if ((&User-Name =~ /@/) && (&User-Name !~ /@(.+)\.(.+)$/)) {
(2) ERROR: Failed retrieving values required to evaluate condition
(2) if (&User-Name =~ /\.$/) {
(2) ERROR: Failed retrieving values required to evaluate condition
(2) if (&User-Name =~ /@\./) {
(2) ERROR: Failed retrieving values required to evaluate condition
(2) } # policy filter_username = noop
(2) [preprocess] = ok
(2) sql: EXPAND %{User-Name}
(2) sql: -->
(2) sql: SQL-User-Name set to ''
rlm_sql (sql): Reserved connection (4)
(2) sql: EXPAND SELECT id, username, attribute, value, op FROM radcheck WHERE username = '%{SQL-User-Name}' ORDER BY id
(2) sql: --> SELECT id, username, attribute, value, op FROM radcheck WHERE username = '' ORDER BY id
(2) sql: Executing select query: SELECT id, username, attribute, value, op FROM radcheck WHERE username = '' ORDER BY id
(2) sql: EXPAND SELECT groupname FROM radusergroup WHERE username = '%{SQL-User-Name}' ORDER BY priority
(2) sql: --> SELECT groupname FROM radusergroup WHERE username = '' ORDER BY priority
(2) sql: Executing select query: SELECT groupname FROM radusergroup WHERE username = '' ORDER BY priority
(2) sql: User not found in any groups
rlm_sql (sql): Released connection (4)
(2) [sql] = notfound
(2) eap: No EAP-Message, not doing EAP
(2) [eap] = noop
(2) [logintime] = noop
(2) } # authorize = ok
(2) eap_pwd: } # server default
(2) eap_pwd: Got tunneled reply code 0
failed to find password for lars to do pwd authentication
(2) eap: ERROR: Failed continuing EAP PWD (52) session. EAP sub-module failed
(2) eap: Failed in EAP select
(2) [eap] = invalid
(2) } # authenticate = invalid
(2) Failed to authenticate the user
(2) Login incorrect (eap: Failed continuing EAP PWD (52) session. EAP sub-module failed): [lars] (from client LARS-RANNOCH port 4 cli 48-59-29-F6-BA-89)
Первый раздел авторизации (не показанный в журнале выше) прошел нормально, но после этого EAP-PWD, похоже, выполняет еще один туннелированный запрос. (почему? Я думал, что это необходимо только для PEAP и EAP-TTLS). В этом случае я закомментировал строку «virtual-server» в конфигурации EAP, поэтому запрос был обработан виртуальным сервером по умолчанию.
Как видно, Имя пользователя атрибут пуст (SQL-User-Name set to ''
), что приводит к тому, что модуль sql не может получить правильную запись: failed to find password for lars to do pwd authentication
.
Правильная ли моя конфигурация для EAP-PWD? Что вызывает эту ошибку?
Это была ошибка. Человек, который разработал исходный код PWD, только добавил имя пользователя VALUE_PAIR в указатель кэширования имени пользователя запроса, а не в фактический список запроса.
Некоторые модули игнорируют указатель, давным-давно это была дрянная оптимизация.
Добавление пары в список запросов устраняет проблему. Вот совершить.
Спасибо за помощь в отслеживании этой проблемы. Исправление будет выпущено как часть v3.0.8. А пока вы можете скачать v3.0.x ГОЛОВА и попробуйте это.
После установки control:Cleartext-Password
во внутреннем туннеле я получил несколько успешных аутентификаций. Надеюсь, это сработает для вас.