Jump to content
Local
Roman Pogosyan

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

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites

просто не удобно было отслеживать все зависимости и править столько h файлов .. а таки бысто и надежно :)

Share this post


Link to post
Share on other sites

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

Share this post


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 :)

Share this post


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.

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


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

Share this post


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;

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Долапаченые файлы проверка а выставленный IP у пользователя , если есть выдает пользователю конкретный IP если нет то читает IP который даст VPN Сервер

(сори опять рар)

projects.rar

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Добрый день!

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

Share this post


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 это демон-сервер авторизации

Share this post


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

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

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

 

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

Share this post


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

Share this post


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 допилим до вменяемого состояния...

Share this post


Link to post
Share on other sites
Может вместе и rlm_stg допилим до вменяемого состояния...

все дружно скорбят по mod_radius :)

Share this post


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.

×