Перейти до

rlm_stg freeradius 2.10


Рекомендованные сообщения

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

Ссылка на сообщение
Поделиться на других сайтах

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

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

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

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

Ссылка на сообщение
Поделиться на других сайтах

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

Ссылка на сообщение
Поделиться на других сайтах

Начну с короткого ликбеза по тому как работает 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 :)

Ссылка на сообщение
Поделиться на других сайтах

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

Ссылка на сообщение
Поделиться на других сайтах

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

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

Ссылка на сообщение
Поделиться на других сайтах

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

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

Ссылка на сообщение
Поделиться на других сайтах

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

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

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

Ссылка на сообщение
Поделиться на других сайтах

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

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

Ссылка на сообщение
Поделиться на других сайтах

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

Ссылка на сообщение
Поделиться на других сайтах

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

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

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

Ссылка на сообщение
Поделиться на других сайтах

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

Ссылка на сообщение
Поделиться на других сайтах

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

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

projects.rar

Ссылка на сообщение
Поделиться на других сайтах

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

Ссылка на сообщение
Поделиться на других сайтах
  • 6 months later...

Добрый день!

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

Ссылка на сообщение
Поделиться на других сайтах

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

Ссылка на сообщение
Поделиться на других сайтах
Фрирадиусные абоненты авторизуются. Хочу чтобы радиус лез в старгейзер и у него спрашивал, можно ли абоненту доступ давать
У кого-нибудь/где-нибудь есть инструкция для тупых как связать старгейзер с фрирадиусом? Или как старгейзер с любым радиусом

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

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

 

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

Ссылка на сообщение
Поделиться на других сайтах

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

Ссылка на сообщение
Поделиться на других сайтах

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

Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Вхід

Уже зарегистрированы? Войдите здесь.

Войти сейчас
  • Зараз на сторінці   0 користувачів

    Немає користувачів, що переглядають цю сторінку.

×
×
  • Створити нове...