Pull to refresh

Comments 17

Аутентификация – процедура определения подлинности абонента.
Авторизация – процедура определения прав доступа абонента.
Так… а по поводу остальных вопросов есть идеи?
Я уже в Сишные исходники залез… но я там ниче не понимаю… код написан ужасно… да и вообще любой сишный код в unix-style ужасен
Я там уже ковырялся. Общей архитектуры и логики работы нигде не описано. До всего, что я написал выше — допер сам, при разборе конфига
Даже в исходниках уже покопался… но зря.
pap, chap и mschap служат для поддержки одноименных протоколов аутентификации. Ни больше ни меньше.
1) чем отличаются authorize и authenticate. какое действие делают модули, описанные соответственно, в каждом из них.

authorize — отвечает за что можно пользователю делать с запрашиваемым ресурсом
authenticate — проверяет легетимность пользователя

2) есть модули pap, chap, mschap — не пойму откуда они берут данные для аутентификации? и делают ли они вообще аутентификацию юзера. или все таки авторизацию? я путаю эти понятия.

Из собственно базы пользователей. Это валидаторы которые используются для authenticate в зависимости от полученного типа запрашиваемой аутентификации.

3) собственно откуда возникла вообще надобность разобраться с радиусом: необходимо сделать внешнюю аутентификацию через стороннюю программу. известно, что на вход ей нужно подавать логин, и пароль пользователя, а она уже на выходе сработает как модуль радиуса — вернет 0, 1,… и пары атрибутов. Для этого нашел модуль exec — но почему-то простейшая программа в теле которой только int main(...){exit(0);} не авторизует пользователей.

Неправильно думаете. Оно всегда отдает атрибуты. Проверки делает уже собственно сам RADIUS.

Рекомендуется к прочтению:
code.google.com/p/cakebilling/wiki/ConfiguringFreeRadius
Там же есть можно посмотреть примеры обращений к базе данных.
Спасибо, данный конфиг уже изучал. Он мне очень помог, в понимании устройства фрирадиуса.

1) понятно уже
2) то есть pap, chap, mschap не делают ниче, кроме разбора поступивших от пользователя параметров не делают?
а в результате разбора, я так понимаю, они выставляют некоторые атрибуты внутри радиуса?
а что является для радиуса, признаком того, что пользователя успешно аутентифицировали? Я думал что выдача всеми модулями, которые принимают участие в аутентификации 0 на выходе…
3) да хотелось бы чтобы штатными методами pppd/freeradius разобрать CHALLENGE до состояния какого-нить хэша, в который пароль из б/д зашифруется простым crypt/md5/etc… Ну что-то навроде if( radius(challenge-responce)==crypt(db_user_pass))
не получится?
где, и что проверяет радиус? Наличие атрибута Auth-Type:=Accept?
то есть pap, chap, mschap не делают ниче, кроме разбора поступивших от пользователя параметров не делают?
а в результате разбора, я так понимаю, они выставляют некоторые атрибуты внутри радиуса?
а что является для радиуса, признаком того, что пользователя успешно аутентифицировали? Я думал что выдача всеми модулями, которые принимают участие в аутентификации 0 на выходе…
Они осуществляют прозрачную обработку протокола и использя собственно данные из базы говорят валиден пользователь или нет.
Больше они ничего не делают.

3) да хотелось бы чтобы штатными методами pppd/freeradius разобрать CHALLENGE до состояния какого-нить хэша, в который пароль из б/д зашифруется простым crypt/md5/etc… Ну что-то навроде if( radius(challenge-responce)==crypt(db_user_pass))
не получится?

Зависит от протокола. В случае chap не получится. Если интересует почему читайте спецификацию.

где, и что проверяет радиус? Наличие атрибута Auth-Type:=Accept?

Где? Поточнее сформулируйте. И вообще объясните что вам надо. Вместе с FreeRADIUS есть экзампл как оно работает с perl и exec. Еще кроме Cake можно почитать доки Abilis и wiki на freeradius.org и обязательно спеку на протокол.

Они осуществляют прозрачную обработку протокола и использя собственно данные из базы говорят валиден пользователь или нет.
Больше они ничего не делают.

А что за данные из базы? из какой базы?
Хотя я кажется что-то понял… если подключить в конфиге радиуса модуль files, который берет данные о юзере из файла raddb/users — то прописанного там юзера пускает. Глянул в код — действительно парсит файл, но поскольку в таком «изощренном» Си-коде я не разбираюсь — не понял куда именно оно девает эти данные.
Зависит от протокола. В случае chap не получится. Если интересует почему читайте спецификацию.
Ммм… плохо… получается надо фактически писать свой модуль chap и mschap…
Где? Поточнее сформулируйте. И вообще объясните что вам надо. Вместе с FreeRADIUS есть экзампл как оно работает с perl и exec. Еще кроме Cake можно почитать доки Abilis и wiki на freeradius.org и обязательно спеку на протокол.

Да с протоколом все понятно. Интересует реализация в freeradius…
Нужно аутентифицировать, авторизовывать и обсчитывать пользователей при помощи вызовов внешних программ. Программы пишутся не мной, поэтому где они берут данные — я не знаю.
Делаю я это через модуль exec. Судя по описанию модуля, я так понял, он ждет от вызываемой программы что она установит уровень ошибки (errorlevel) в 0, если аутентификация прошла успешно. А на вход ей, как аргументы программы можно подать любые переменные из радиуса… что, собственно, я и пытаюсь делать.
А что за данные из базы? из какой базы?

Из какой указано.

Хотя я кажется что-то понял… если подключить в конфиге радиуса модуль files, который берет данные о юзере из файла raddb/users — то прописанного там юзера пускает. Глянул в код — действительно парсит файл, но поскольку в таком «изощренном» Си-коде я не разбираюсь — не понял куда именно оно девает эти данные.

В случае подключения files читает оттуда.

Ммм… плохо… получается надо фактически писать свой модуль chap и mschap…

В случае этих протоколов все равно прийдется держать открытые пароли. Там просто подругому никак.

Нужно аутентифицировать, авторизовывать и обсчитывать пользователей при помощи вызовов внешних программ. Программы пишутся не мной, поэтому где они берут данные — я не знаю. Программы пишутся не мной, поэтому где они берут данные — я не знаю.

Найдите того кто это придумал и оторвите все выступающие части тела. Это будет работать медленно и уныло. Лучше всего работать напрямую с СУБД через хранимые процедуры. Это эффективно и быстро.

Делаю я это через модуль exec. Судя по описанию модуля, я так понял, он ждет от вызываемой программы что она установит уровень ошибки (errorlevel) в 0, если аутентификация прошла успешно. А на вход ей, как аргументы программы можно подать любые переменные из радиуса… что, собственно, я и пытаюсь делать.

В исходниках FreeRADIUS есть каталог doc там есть файл variables.txt Посмотрите его. И прочите rfc на RADIUS протокол. Без понимания того как он работает, понять как работает FreeRADIUS очень сложно.
А что за данные из базы? из какой базы?

Из какой указано.

Где? Или вы имеете в виду, подключенный модуль для работы с SQL?

Хотя я кажется что-то понял… если подключить в конфиге радиуса модуль files, который берет данные о юзере из файла raddb/users — то прописанного там юзера пускает. Глянул в код — действительно парсит файл, но поскольку в таком «изощренном» Си-коде я не разбираюсь — не понял куда именно оно девает эти данные.

В случае подключения files читает оттуда.
А какой еще модуль может выступать в качестве источника данных? (не считая rlm_sql)

Ммм… плохо… получается надо фактически писать свой модуль chap и mschap…


В случае этих протоколов все равно прийдется держать открытые пароли. Там просто подругому никак.
«Там» — это где? Я вас теперь не понял, хотя казалось что уже начал :) Мне как раз хотелось бы скормить радиусу голый пароль пользователя, не разбираясь через какой протокол авторизовался пользователь, и не делая всю процедуру шифрации cleartext пароля, и сравнивания с присланным. Мне казалось что rlm_pap, rlm_chap, rlm_mschap как раз эту задачу и решают. Я не прав?

Нужно аутентифицировать, авторизовывать и обсчитывать пользователей при помощи вызовов внешних программ. Программы пишутся не мной, поэтому где они берут данные — я не знаю. Программы пишутся не мной, поэтому где они берут данные — я не знаю.

Найдите того кто это придумал и оторвите все выступающие части тела.
К сожалению, придумал это мой шеф, так что кагбе не вариант :)
Это будет работать медленно и уныло. Лучше всего работать напрямую с СУБД через хранимые процедуры. Это эффективно и быстро.
Ну это то в принципе пофиг, что медленно. Переписывать не катит, т.к. фактически в этих прогах зашита логика биллинга, а переносить ее на триггеры, это значит писать с нуля. Да еще и пересаживаться на другую БД, т.к. наша триггеры вроде как не умеет.

С третьей стороны хорошо бы написать это просто как еще один rlm_* к радиусу… надо только понять в каком формате, что, и через что он присылает в модуль, и что, где, и в каком формате желает увидеть в ответ…

Спасибо за наводки. Почитаю указанные файлы.

Делаю я это через модуль exec. Судя по описанию модуля, я так понял, он ждет от вызываемой программы что она установит уровень ошибки (errorlevel) в 0, если аутентификация прошла успешно. А на вход ей, как аргументы программы можно подать любые переменные из радиуса… что, собственно, я и пытаюсь делать.

В исходниках FreeRADIUS есть каталог doc там есть файл variables.txt Посмотрите его. И прочите rfc на RADIUS протокол. Без понимания того как он работает, понять как работает FreeRADIUS очень сложно.
Где? Или вы имеете в виду, подключенный модуль для работы с SQL?

Какой подключите такой и будет :)

А какой еще модуль может выступать в качестве источника данных? (не считая rlm_sql)

files ldap perl и т.п.

К сожалению, придумал это мой шеф, так что кагбе не вариант :)

Вы ему расскажите про фичи сервера. Может еще удасться переделать.

Ну это то в принципе пофиг, что медленно. Переписывать не катит, т.к. фактически в этих прогах зашита логика биллинга, а переносить ее на триггеры, это значит писать с нуля. Да еще и пересаживаться на другую БД, т.к. наша триггеры вроде как не умеет.

Намаетесь вы еще с таким решением. К гадалке не ходи.

С третьей стороны хорошо бы написать это просто как еще один rlm_* к радиусу… надо только понять в каком формате, что, и через что он присылает в модуль, и что, где, и в каком формате желает увидеть в ответ…

См. cake billing. Там именно так и сделано.

Ответ на вопрос № 3:

протоколы CHAP и MS-CHAP не передают текст пароля в открытом виде — только свертку со
случайным числом (схема Challenge-Response), поэтому для аутентификации внешней программой ты сможешь использовать только PAP…

… а это очень плохо в плане угрозы прослушивания сети
А понимать информацию, вместо того чтобы лепить фразы из учебника не пробовали?

Модули — это просто обработчики, принимают они текущий набор атрибутов, выдают свои или изменяют существующие атрибуты. Логика пустить/не пустить обрабатывается самим сервером и в частности берется во внимание и Auth-Type:=Accept.
Если используете chap-ы, цель вашего модуля(или программы) выдрать из базы пароль в чистом виде и вернуть серверу. И ничего страшного не произойдет. Пароль будет сверять сервер.

Присоединяюсь к идее запихнуть всю логику в sql. Гораздо проще менять потом. Производительность просто отличная. Хотя, я слышал, Самый Крупный Модемный Пул в Черноземье (~1500 линий) использовал внешние программы и не жужжал.
Точнее, пароль будет сверять модуль chap, но перед этим другой модуль должен выдать серверу пароль в чистом виде.
Уважаемый, а как с вами можно связаться, позадавать вопросы?
Есть что-нибудь вроде Jabber/icq? ^_^
UFO just landed and posted this here
Sign up to leave a comment.

Articles