Помогите понять как устроен и работает FreeRADIUS…

    Помогите понять как устроен и работает FreeRADIUS…
    Под катом мои наблюдения и соображения.

    Когда-то давно успешно настроил freeradius + freenibs по мануалам, особо не вникая что он делает, и как работает.
    Теперь стоит обратная задача :)

    Разбирая конфиг радиуса, и копаясь в его структуре понял следующее:
    (поправьте меня в тех местах, где я заблуждаюсь)
    1) радиус почти на каждый чих имеет по модулю, который выполняет одну или несколько следующих вещей сразу: аутентификацию, авторизацию, аккаунтинг, и еще несколько редких действий.

    2) модули, хоть и имеют одинаковый интерфейс к программе, служат разным целям

    3) конфиг радиуса состоит из нескольких частей, как то:
    modules {} — настройка параметов модулей
    authorize {}
    authenticate {}
    accounting {}
    и нескольких менее важных.

    4) в зависимости от того, в какой части (authorize, authenticate, accounting) стоит имя модуля — вызывается соответствующая его функция… Т.е. модуль может выступать и в роли аутентификатора, и авторизатора, и еще и заниматься учетом.


    Так вот возникает ряд вопросов:
    1) чем отличаются authorize и authenticate. какое действие делают модули, описанные соответственно, в каждом из них.

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

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


    Буду благодарен за любые комментарии и разъяснения относительно того, как работает фрирадиус.
    Может быть по результатам понимания всего этого в своей голове напишу статью.
    Ads
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More

    Comments 17

      +1
      Аутентификация – процедура определения подлинности абонента.
      Авторизация – процедура определения прав доступа абонента.
        0
        Так… а по поводу остальных вопросов есть идеи?
        Я уже в Сишные исходники залез… но я там ниче не понимаю… код написан ужасно… да и вообще любой сишный код в unix-style ужасен
          0
          а по поводу остального я не бум-бум :)
          но начал бы с wiki.freeradius.org
            +1
            Я там уже ковырялся. Общей архитектуры и логики работы нигде не описано. До всего, что я написал выше — допер сам, при разборе конфига
            Даже в исходниках уже покопался… но зря.
        +1
        pap, chap и mschap служат для поддержки одноименных протоколов аутентификации. Ни больше ни меньше.
          +1
          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
          Там же есть можно посмотреть примеры обращений к базе данных.
            0
            Спасибо, данный конфиг уже изучал. Он мне очень помог, в понимании устройства фрирадиуса.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

                    Где? Или вы имеете в виду, подключенный модуль для работы с 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 очень сложно.
                      0
                      Где? Или вы имеете в виду, подключенный модуль для работы с SQL?

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

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

                      files ldap perl и т.п.

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

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

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

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

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

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

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

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

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

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

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

              Only users with full accounts can post comments. Log in, please.