Jump to content

rlm_stg freeradius 2.10


Recommended Posts

Рабочий модуль для 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

Link to post
Share on other sites

О боже, почему RAR?!

Если меняются файлы FreeRADIUS то их лучше добавить в поставку Stargazer'а и не использовать системные. Тем более у FreeRADIUS давняя болезнь - проблемы со сборкой out-of-the-box.

Так что такие вещи лучше предоставлять в виде патчей к stg.

Ладно, сейчас сделаю диффы, посмотрю что там и как...

Link to post
Share on other sites

надо думать как сделать авторизацию пользователя с * вместо IP ... поковыряю авторизатор старгазера на предмет добавления в поле .. может смогу портировать ... покраймней мер емне очень нужно это (клиент должен атворизироватся вне зависимсти от типа подключения и типа авторизации)

Link to post
Share on other sites

Начну с короткого ликбеза по тому как работает 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 файлов .. а таки бысто и надежно :blink:

 

Нужно просто использовать git :)

Link to post
Share on other sites

По заголовочным файлам. Если отбросить правку секций 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.

Link to post
Share on other sites

в коде существенных переделок , по сути не стыковка была как раз из за заголовков , в приведенных данных я изменений не делал

были измемениня типа параметр * option я изменил на парамерт *_option

Link to post
Share on other sites

нужно менять либо секцию пост-аутентификации

.. просто как сделать чтоб он полученный IP вписал пользователю .. вот в чем вопрос :blink:

Очень просто. В том месте где передается Framed-IP из FreeRADIUS отправлять его в пакете на сервер. А на сервере проверять: если ip == 0 то он не установлен и надо будет брать его из базы, а иначе делать дополнительную проверку на то, разрешено ли абоненту авторизоваться с этого IP и использовать его в последствии для вызова Authorize при аккаунтинге.

Link to post
Share on other sites

принцип понятен ... неизвестна только функция которая добавляет айпи в базу

Его не нужно никуда добавлять. Его нужно передать в функцию Authorize.

Link to post
Share on other sites

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;                                                                      
}

Link to post
Share on other sites

довел IP до этой функции а как назначить его этому пользователю ?

у меня сейчас packet->ip IP выданный впн сервером а в поле у юзера * и следовательноif (ui->Authorize(ips[0].ip, 0xffFFffFF, this)) происходит удачно и packet->packetType = RAD_REJECT_PACKET; return -1;

Акаунтинг клиенту не ведется

Link to post
Share on other sites

сори за флуд .. перелопатил сорцы user_*.cpp разобрался :) спасибо теперь есть почти все что нужно .. буду проверять срабативают ли сктипры он коннет и он дискконект

Link to post
Share on other sites

все замечателно .. но есть одно НО ... если подключился по VPN можно подключится и по pppoe , хотя интернета не получить так как скрипт не on connect не срабатывает сробарывает но всетаки досадно :lol:

Link to post
Share on other sites
  • 6 months later...

Добрый день!

Есть вопрос. Хочу сделать авторизацию абонентов через радиус. Поставил фрирадиус 2.1.8 и убиллинг на убунту32 и в обоих завел абонентов. Фрирадиусные абоненты авторизуются. Хочу чтобы радиус лез в старгейзер и у него спрашивал, можно ли абоненту доступ давать. Почитал инструкции и тему - больше вопросов возникло, чем ответов. Типа фрирадиус же 2.1.12 последний, 2.10 - это 2.1.10 или 2.1.0? "компилим модль" - какой модуль имеется ввиду(фрирадиус или rlm_stg)? и т.п... У кого-нибудь/где-нибудь есть инструкция для тупых как связать старгейзер с фрирадиусом? Или как старгейзер с любым радиусом связать(не обязательно фрирадиус). Ну или хотя бы что почитать, чтобы мне тоже в теме быть и понимать что здесь пишут?

Link to post
Share on other sites

нестыковочки ... задавай вопрос по конкретнее. ты написал "Поставил фрирадиус 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 это демон-сервер авторизации

Link to post
Share on other sites
Фрирадиусные абоненты авторизуются. Хочу чтобы радиус лез в старгейзер и у него спрашивал, можно ли абоненту доступ давать
У кого-нибудь/где-нибудь есть инструкция для тупых как связать старгейзер с фрирадиусом? Или как старгейзер с любым радиусом

Установка и настройка GNU-Radius в связке с stargazer - не?

Фрирадиус аналогично привинчивается мускульным бекендом.

 

Аттрибуты можно пресовать view-ами либо скажем хранить в custom profile fields. Особо этим вопросом пока не заморачивался.

Link to post
Share on other sites

нестыковочки ... задавай вопрос по конкретнее. ты написал "Поставил фрирадиус 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 старгейзер работает искаропки. А фрирадиус настраивать надо или нет? Это наверно должно быть где-то описано - ткните меня туда плз, не могу найти.

Link to post
Share on other sites

Есть два подхода к взаимодействию 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 допилим до вменяемого состояния...

Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...