На предприятии XXX возникла проблема с авторизацией через freeradius GSM модемов. Проблема заключалась в том, что 500 модемов были настроены с именем пользователя modem и паролем secret и еще 500 модемов без имени пользователя и без пароля. Необходимо каждому выдать статический IP. От оператора приходит в запросе атрибут - Calling-Station-Id. Решение задачи написать политики позволяющие использовать в качестве аттрибута User-Name - Calling-Station-Id. В случае, когда указан пароль, в качестве имени пользователя будет использован Calling-Station-Id. А в случае когда нет имени пользователя и пароля, будет происходить запрос к нестандартной таблице callingstationid в базе данных, в которой перечислены имя и пароль для определенных Calling-Station-Id.
Создадим таблицу callingstationid, для хранения связок User-Name, Password для определенных Calling-Station-Id.
# mysql -hhostname -uradius -psecret
> use radius;
> CREATE TABLE callingstationid (
id int(11) NOT NULL auto_increment,
username varchar(64) NOT NULL default '',
password varchar(64) NOT NULL default '',
callingstationid varchar(64) NOT NULL default '',
PRIMARY KEY (id)
);
> exit
Переходим в каталог с freeRadius: # cd /usr/local/etc/raddb/
Создаем политику в файле policy.conf в блоке policy определяем новые политики modem_with_callingstationid_without_username и modem_with_callingstationid_with_username
#!lineos='inline' hl_lines='1 3 10'
# ee policy.conf
policy {
...
modem_with_callingstationid_with_username{
if((Calling-Station-Id) && User-Name=="modem" && (Password=="secret" || (CHAP-Password))){
update request {
Password := "modem_secret"
User-Name := "%{Calling-Station-Id}"
}
}
}
modem_with_callingstationid_without_username{
if((Calling-Station-Id) && !User-Name && !User-Password){
update request {
Password := "%{sql: SELECT password FROM callingstationid WHERE callingstationid = '%{Calling-Station-Id}'}"
User-Name := "%{sql: SELECT username FROM callingstationid WHERE callingstationid = '%{Calling-Station-Id}'}"
}
}
}
}
Меняем файл текущей конфигурации /sites-enabled/default для запуска политик, для этого добавляем в блок authorize назваение наших политик в начало блока.
# ee /sites-enabled/default
authorize {
...
modem_with_callingstationid_with_username
modem_with_callingstationid_without_username
sql
...
}
Сохраняем файлы и проверяем конфигурацию radiusd -C
Перезагружаем freeRadius service radiusd restart