Roman Pogosyan Posted August 23, 2011 Posted August 23, 2011 Рабочий модуль для freeradius 2.10 протестен на debian 6 32 битной установка aptitude install freeradius aptitude install libfreeradius-dev заменяем файлы в папке /usr/lib/freeradius на те что в папке компилим модль в конфиге радиуса отностиельно authenticate { # # PAP authentication, when a back-end database listed # in the 'authorize' section supplies a password. The # password can be clear-text, or encrypted. Auth-Type PAP { pap stg } # # Most people want CHAP authentication # A back-end database listed in the 'authorize' section # MUST supply a CLEAR TEXT password. Encrypted passwords # won't work. Auth-Type CHAP { chap stg } # # MSCHAP authentication. Auth-Type MS-CHAP { mschap stg } иначе никак rlm_stg.rar
madf Posted August 23, 2011 Posted August 23, 2011 О боже, почему RAR?! Если меняются файлы FreeRADIUS то их лучше добавить в поставку Stargazer'а и не использовать системные. Тем более у FreeRADIUS давняя болезнь - проблемы со сборкой out-of-the-box. Так что такие вещи лучше предоставлять в виде патчей к stg. Ладно, сейчас сделаю диффы, посмотрю что там и как...
Roman Pogosyan Posted August 23, 2011 Author Posted August 23, 2011 просто не удобно было отслеживать все зависимости и править столько h файлов .. а таки бысто и надежно
Roman Pogosyan Posted August 23, 2011 Author Posted August 23, 2011 надо думать как сделать авторизацию пользователя с * вместо IP ... поковыряю авторизатор старгазера на предмет добавления в поле .. может смогу портировать ... покраймней мер емне очень нужно это (клиент должен атворизироватся вне зависимсти от типа подключения и типа авторизации)
madf Posted August 23, 2011 Posted August 23, 2011 Начну с короткого ликбеза по тому как работает rlm_stg. Авторизация. rlm_stg (если он прописан в конфиге в секции авторизации) получает от FreeRADIUS логин абонента и Framed-Protocol. Второй нужен для фильтрации ненужных сервисов, на него внимания не обращаем. С логином, условно говоря, лезем в базу и получаем оттуда пароль в открытом виде. Этот пароль упаковываем в Cleartext-Password и возвращаем FreeRADIUS'у, о чем сообщаем посредством кода возврата RLM_MODULE_UPDATED. На этом этапе мы можем отклонить авторизацию если: логин в базе не найден; Framed-Protocol в конфиге запрещен. Аутентификация. На этом этапе rlm_stg ничего не делает, только проверяет нужно ли для этого типа сервиса в последствии выполнять аккаунтинг. Это тоже настраивается в конфиге. А раз мы ничего не делаем то и возвращаем RLM_MODULE_NOOP (хотя, в этом случае, он может быть эквивалентен RLM_MODULE_OK, надо посмотреть докумнетацию). Тут мы можем отклонить аутентификацию только если неправильный логин. Пост-аутентификация. На этом этапе мы уже уверены в том что предоставлен правильный логин и пароль (на этапе аутентификации сам FreeRADIUS это проверил используя предоставленный Cleartext-Password). По этому для тех сервисов, для которых это нужно, предосатвляем IP-адрес из БД. Тут мы можем отклонить пост-аутентификацию в случае если, например, у абонента недостаточно средств. Ну и остальные варианты. Аккаунтинг. Его есть аж три варианта. В случае начала аккаунтинга (Start) выполняется проверка логина и в случае если сервис требует аккаунтинга то выполняется авторизация с указанием ранее полученного Framed-IP. В случае промежуточного апдейта (Interim-Update) ничего не делаем, хотя тут можно собирать информацию о трафике, например. В случае окончания аккаунтинга (Stop) проверяем наличие сессии и разавторизовываемся. Аккаунтинг может быть отклонен если: логин в базе не найден; сессия уже открыта; авторизация отклонена Stargazer'ом. В предоставленном коде есть ошибка - явное указание типа аутентификации. Тип указывается RADIUS-клиентом. Например, pppd может запросить MS-CHAP. При описании секции аутентификации в конфиге FreeRADIUS мы можем использовать этот тип как селектор для выбора правильного плагина аутентификации. FreeRADIUS использует Cleartext-Password, полученный на этапе авторизации, для проверки корректности предоставленных credentials (не знаю как это правильно перевести, короче - аутентификационная информация). Остальные правки непосредственно модуля несущественны. Правки заголовочных файлов еще не смотрел. Для работы со * нужно менять либо секцию пост-аутентификации либо секцию аккаунтинга. Передавать на сторону Stargazer'а полученный IP. просто не удобно было отслеживать все зависимости и править столько h файлов .. а таки бысто и надежно Нужно просто использовать git
madf Posted August 23, 2011 Posted August 23, 2011 По заголовочным файлам. Если отбросить правку секций include то существенно поменялись две вещи. В conffile.h: < extern int cf_pair2xml(FILE *fp, CONF_PAIR *cp); < extern int cf_section2xml(FILE *fp, CONF_SECTION *cs); < extern int cf_pair2file(FILE *fp, CONF_PAIR *cp); < extern int cf_section2file(FILE *fp, CONF_SECTION *cs); --- > extern int cf_pair2xml(FILE *fp, const CONF_PAIR *cp); > extern int cf_section2xml(FILE *fp, const CONF_SECTION *cs); > extern int cf_pair2file(FILE *fp, const CONF_PAIR *cp); > extern int cf_section2file(FILE *fp, const CONF_SECTION *cs); и в radiusd.h: 136a139,145 > int rate_limit; > #endif > > #ifdef WITH_COA > char *coa_name; > home_server *coa_server; > home_pool_t *coa_pool; 172,174d180 < #if defined(FREE_BSD) || defined(FREE_BSD5) < #include <sys/time.h> < #endif 209c215 < int number; /* internal server number */ --- > unsigned int number; /* internal server number */ 239a246,256 > #ifdef WITH_PROXY > int in_proxy_hash; > > home_server *_home_server; > home_pool_t *home_pool; /* for dynamic failover */ > > struct timeval proxy_when; > > int num_proxied_requests; > int num_proxied_responses; > #endif 287c304 < typedef int (*rad_listen_print_t)(rad_listen_t *, char *, size_t); --- > typedef int (*rad_listen_print_t)(const rad_listen_t *, char *, size_t); Эти изменения на столько существенны что их игнорирование вполне может вызвать сегфолты и нарушения памяти. Хотелось бы узнать, что из этих изменений сделано "вручную", а что - просто следствие версии FreeRADIUS.
Roman Pogosyan Posted August 23, 2011 Author Posted August 23, 2011 в коде существенных переделок , по сути не стыковка была как раз из за заголовков , в приведенных данных я изменений не делал были измемениня типа параметр * option я изменил на парамерт *_option
Roman Pogosyan Posted August 23, 2011 Author Posted August 23, 2011 нужно менять либо секцию пост-аутентификации .. просто как сделать чтоб он полученный IP вписал пользователю .. вот в чем вопрос
madf Posted August 23, 2011 Posted August 23, 2011 нужно менять либо секцию пост-аутентификации .. просто как сделать чтоб он полученный IP вписал пользователю .. вот в чем вопрос Очень просто. В том месте где передается Framed-IP из FreeRADIUS отправлять его в пакете на сервер. А на сервере проверять: если ip == 0 то он не установлен и надо будет брать его из базы, а иначе делать дополнительную проверку на то, разрешено ли абоненту авторизоваться с этого IP и использовать его в последствии для вызова Authorize при аккаунтинге.
Roman Pogosyan Posted August 23, 2011 Author Posted August 23, 2011 принцип понятен ... неизвестна только функция которая добавляет айпи в базу
madf Posted August 23, 2011 Posted August 23, 2011 принцип понятен ... неизвестна только функция которая добавляет айпи в базу Его не нужно никуда добавлять. Его нужно передать в функцию Authorize.
madf Posted August 23, 2011 Posted August 23, 2011 project/stargazer/plugins/other/radius/radius.cpp:479 int RADIUS::ProcessAcctStartPacket(RAD_PACKET * packet) { USER_PTR ui; if (!FindUser(&ui, (char *)packet->login)) { packet->packetType = RAD_REJECT_PACKET; printfd(__FILE__, "RADIUS::ProcessAcctStartPacket user '%s' not found\n", (char *)packet->login); return 0; } // At this point we have to unauthorize user only if it is an accountable service if (CanAcctService((char *)packet->service)) { if (sessions.find((const char *)packet->sessid) != sessions.end()) { printfd(__FILE__, "RADIUS::ProcessAcctStartPacket session already started!\n"); packet->packetType = RAD_REJECT_PACKET; return -1; } USER_IPS ips = ui->GetProperty().ips; if (ui->Authorize(ips[0].ip, 0xffFFffFF, this)) { printfd(__FILE__, "RADIUS::ProcessAcctStartPacket cannot authorize user '%s'\n", packet->login); packet->packetType = RAD_REJECT_PACKET; return -1; } sessions[(const char *)packet->sessid].userName = (const char *)packet->login; sessions[(const char *)packet->sessid].serviceType = (const char *)packet->service; for_each(sessions.begin(), sessions.end(), SPrinter()); } else { printfd(__FILE__, "RADIUS::ProcessAcctStartPacket service '%s' can not be accounted\n", (char *)packet->service); } packet->packetType = RAD_ACCEPT_PACKET; return 0; }
Roman Pogosyan Posted August 23, 2011 Author Posted August 23, 2011 довел IP до этой функции а как назначить его этому пользователю ? у меня сейчас packet->ip IP выданный впн сервером а в поле у юзера * и следовательноif (ui->Authorize(ips[0].ip, 0xffFFffFF, this)) происходит удачно и packet->packetType = RAD_REJECT_PACKET; return -1; Акаунтинг клиенту не ведется
Roman Pogosyan Posted August 23, 2011 Author Posted August 23, 2011 сори за флуд .. перелопатил сорцы user_*.cpp разобрался спасибо теперь есть почти все что нужно .. буду проверять срабативают ли сктипры он коннет и он дискконект
Roman Pogosyan Posted August 23, 2011 Author Posted August 23, 2011 Долапаченые файлы проверка а выставленный IP у пользователя , если есть выдает пользователю конкретный IP если нет то читает IP который даст VPN Сервер (сори опять рар) projects.rar
Roman Pogosyan Posted August 24, 2011 Author Posted August 24, 2011 все замечателно .. но есть одно НО ... если подключился по VPN можно подключится и по pppoe , хотя интернета не получить так как скрипт не on connect не срабатывает сробарывает но всетаки досадно
cynepnaxa Posted February 28, 2012 Posted February 28, 2012 Добрый день! Есть вопрос. Хочу сделать авторизацию абонентов через радиус. Поставил фрирадиус 2.1.8 и убиллинг на убунту32 и в обоих завел абонентов. Фрирадиусные абоненты авторизуются. Хочу чтобы радиус лез в старгейзер и у него спрашивал, можно ли абоненту доступ давать. Почитал инструкции и тему - больше вопросов возникло, чем ответов. Типа фрирадиус же 2.1.12 последний, 2.10 - это 2.1.10 или 2.1.0? "компилим модль" - какой модуль имеется ввиду(фрирадиус или rlm_stg)? и т.п... У кого-нибудь/где-нибудь есть инструкция для тупых как связать старгейзер с фрирадиусом? Или как старгейзер с любым радиусом связать(не обязательно фрирадиус). Ну или хотя бы что почитать, чтобы мне тоже в теме быть и понимать что здесь пишут?
Roman Pogosyan Posted February 28, 2012 Author Posted February 28, 2012 нестыковочки ... задавай вопрос по конкретнее. ты написал "Поставил фрирадиус 2.1.8 и убиллинг на убунту32" а потом "Типа фрирадиус же 2.1.12 последний, 2.10 - это 2.1.10 или 2.1.0?" так тебе под какой фрирадиус модуль то ? .. если 2.1.8 то заводской который идет с стж будет работать коректно(за исключением выдачи IP из пула vpn), если версия 2.1.10 то надо доделывать, если выше .. то самому ковырятся так как далее не было эксперементов. п.с. rlm_stg это модуль , freeradius это демон-сервер авторизации
nightfly Posted February 28, 2012 Posted February 28, 2012 Фрирадиусные абоненты авторизуются. Хочу чтобы радиус лез в старгейзер и у него спрашивал, можно ли абоненту доступ давать У кого-нибудь/где-нибудь есть инструкция для тупых как связать старгейзер с фрирадиусом? Или как старгейзер с любым радиусом Установка и настройка GNU-Radius в связке с stargazer - не? Фрирадиус аналогично привинчивается мускульным бекендом. Аттрибуты можно пресовать view-ами либо скажем хранить в custom profile fields. Особо этим вопросом пока не заморачивался.
cynepnaxa Posted February 29, 2012 Posted February 29, 2012 нестыковочки ... задавай вопрос по конкретнее. ты написал "Поставил фрирадиус 2.1.8 и убиллинг на убунту32" а потом "Типа фрирадиус же 2.1.12 последний, 2.10 - это 2.1.10 или 2.1.0?" так тебе под какой фрирадиус модуль то ? .. если 2.1.8 то заводской который идет с стж будет работать коректно(за исключением выдачи IP из пула vpn), если версия 2.1.10 то надо доделывать, если выше .. то самому ковырятся так как далее не было эксперементов. п.с. rlm_stg это модуль , freeradius это демон-сервер авторизации Спасибо за оперативный ответ! Я имею ввиду, что не понял какая версия фрирадиуса обсуждается в этой статье. Насколько я понимаю 2.10 - такой версии фрирадиуса нет. Из похожих есть 2.1.0 и 2.1.10. Видимо имелась ввиду какая-то из них? У меня требований к версии фрирадиуса нет - какой надо, чтобы точно работало, такой и поставлю. Смысл моего поста в том, что очень много подобных вопросов возникло - ищу пошаговую инструкцию без слэнга. Очень заинтересовало что с 2.1.8 старгейзер работает искаропки. А фрирадиус настраивать надо или нет? Это наверно должно быть где-то описано - ткните меня туда плз, не могу найти.
Roman Pogosyan Posted February 29, 2012 Author Posted February 29, 2012 freeradius настраивать надо смотри в установочном пакете есть примеры
madf Posted February 29, 2012 Posted February 29, 2012 Есть два подхода к взаимодействию Stargazer и RADIUS-серверов. Один, самый простой, - это когда RADIUS-сервер черпает информацию для авторизации из БД Stargazer'а. При этом с самим Stargazer'ом он не взаимодействует. Второй вариант подходит только для FreeRADIUS. FreeRADIUS имеет систему плагинов которые можно использовать в процессе авторизации, аутентификации и аккаунтинга. Взаимодействие при этом происходит на уровне плагинов: rlm_stg со стороны FreeRADIUS и mod_radius со стороны Stargazer. В этом случае информация для FreeRADIUS поступает непосредственно из Stargazer'а, но этот метод пока очень нестабилен. Можно еще реализовать взаимодействие на уровне скриптов с использованием консольного конфигуратора (sgconf/sgconf_xml) или XML RPC - третий вариант. Документации по второму и третьему варианту толком нет (та что есть - относится к FreeRADIUS 1.x, но он больше не поддерживается). Какой из вариантов требуется? Будем обсуждать более подробно. Может вместе и rlm_stg допилим до вменяемого состояния...
nightfly Posted February 29, 2012 Posted February 29, 2012 Может вместе и rlm_stg допилим до вменяемого состояния... все дружно скорбят по mod_radius
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now