Авторизация пользователя через FREERADIUS с использованием внешних скриптов.
Возникла задача производить авторизацию пользователя на BRAS в зависимости от имени пользователя, пароля и IP адреса BRAS (NAS-IP-Address). Задача может быть решена с использованием внешних скриптов, подключаемых в FREERADIUS с помощью команды Exec-Program-Wait и принимающих решение о авторизации.
1. Устанавливаем пакет FREERADIUS
#yum install freeradius freeradius-utils –y
2. Запускаем демон
#service radiusd start
3. Добавляем в автозагрузку демон radiusd
#chkconfig --level 35 radiusd on
4. Для проверки работы FREERADIUS в файле /etc/raddb/users создаем пользователя:
#nano /etc/raddb/users
Добавляем в конец файла:
testuser Cleartext-Password := "12345"
Service-Type = Framed-User,
Framed-Protocol = PPP,
Framed-IP-Address = 172.16.3.33,
Framed-IP-Netmask = 255.255.255.0
Здесь создаем пользователя testuser c паролем 12345, которому будет разрешена авторизация и будет выдан IP адрес 172.16.3.33
Затем перезапускаем службу freeradius (radiusd)
#service radiusd restart
Теперь проверяем, что авторизация работает. Используем отладочную команду:
[root@roslin ~]# radtest testuser 12345 localhost 1812 testing123
Sending Access-Request of id 37 to 127.0.0.1 port 1812
User-Name = "testuser"
User-Password = "12345"
NAS-IP-Address = 127.0.0.1
NAS-Port = 1812
Message-Authenticator = 0x00000000000000000000000000000000
rad_recv: Access-Accept packet from host 127.0.0.1 port 1812, id=37, length=44
Service-Type = Framed-User
Framed-Protocol = PPP
Framed-IP-Address = 172.16.3.33
Framed-IP-Netmask = 255.255.255.0
Здесь:
testuser - логин
12345 - пароль
testing123 – секрет (по умолчанию в FREERADIUS он именно такой)
Проверка закончена. FREERADIUS в принципе работает.
ПРИМЕЧАНИЕ:
Иногда авторизация не проходит и выдается ошибка:
[root@test ~]# radtest testuser 12345 localhost 1812 testing123
radclient:: Failed to find IP address for test
radclient: Nothing to send.
Это значит, что имя тестового сервера test, на котором запускается команда не удалось определить. Исправляется это добавлением имени test в файл hosts
[root@test ~]# echo "127.0.0.1 test" >> /etc/hosts
[root@test ~]# radtest testuser 12345 localhost 1812 testing123
Sending Access-Request of id 195 to 127.0.0.1 port 1812
User-Name = "testuser"
User-Password = "12345"
NAS-IP-Address = 127.0.0.1
NAS-Port = 1812
Message-Authenticator = 0x00000000000000000000000000000000
rad_recv: Access-Accept packet from host 127.0.0.1 port 1812, id=195, length=44
Service-Type = Framed-User
Framed-Protocol = PPP
Framed-IP-Address = 172.16.3.33
Framed-IP-Netmask = 255.255.255.0
[root@test ~]#
5. Создаем скрипт, который будет принимать решение о авторизации на основе входных данных:
- Логина
- Пароля
-IP адреса BRAS (NAS-IP-Address)
# touch script1.sh
# chmod +x script1.sh
Пример простого скрипта, который разрешает авторизацию, если IP адрес NAS порта равен 127.0.0.1, логин начинается на “s”, а пароль начинается на «pass».
#!/bin/bash
if [ ${1:0:1} == "s" ]
then
if [ $3 == "127.0.0.1" ]
then
if [ ${2:0:4} == "pass" ]
then
echo "Framed-IP-Address = 172.16.3.33, Reply-Message = 'OK'"
exit 0
else
echo "Reply-Message = 'NO'"
exit 1
fi
else
echo "Reply-Message = 'NO'"
exit 1
fi
else
echo "Reply-Message = 'NO'"
exit 1
fi
В случае положительного решения скрипт должен выдавать код завершения программы – «0», в случае отрицательного решения – код «1».
Проверка работы скрипта:
[root@roslin raddb]# ./script1.sh samara password 127.0.0.1
Framed-IP-Address = 172.16.3.33, Reply-Message = 'OK'
[root@roslin raddb]# ./script1.sh penza password 127.0.0.1
Reply-Message = 'NO'
[root@roslin raddb]# ./script1.sh samara paswd 127.0.0.1
Reply-Message = 'NO'
[root@roslin raddb]# ./script1.sh samara password 127.0.0.4
Reply-Message = 'NO'
Естественно в скрипт можно накрутить любую логику работы ( в том числе со сложными запросами в базу данных MySQL и пр).
6. Используем команду Exec-Program-Wait и вносим изменения в файл /etc/raddb/users
#nano /etc/raddb/users
Добавляем следующий блок:
DEFAULT Auth-Type := Accept
Service-Type = Framed-User,
Framed-Protocol = PPP,
Exec-Program-Wait = "/etc/raddb/script1.sh %u %{User-Password} %{NAS-IP-Address}"
Здесь командой Exec-Program-Wait скрипту /etc/raddb/script1.sh передаются переменные – логин (%u), пароль (%{User-Password}) и IP адрес NAS (%{NAS-IP-Address}). Если скрипт выдает 0 – авторизация разрешается, если 1 – запрещается.
7. Проверяем авторизацию:
Успешная авторизация:
[root@roslin raddb]# radtest samara password localhost 1812 testing123
Sending Access-Request of id 87 to 127.0.0.1 port 1812
User-Name = "samara"
User-Password = "password"
NAS-IP-Address = 127.0.0.1
NAS-Port = 1812
Message-Authenticator = 0x00000000000000000000000000000000
rad_recv: Access-Accept packet from host 127.0.0.1 port 1812, id=87, length=42
Service-Type = Framed-User
Framed-Protocol = PPP
Framed-IP-Address = 172.16.3.33
Reply-Message = "OK"
Неуспешная авторизация при неверном пароле:
[root@roslin raddb]# radtest samara sdf87dfg localhost 1812 testing123
Sending Access-Request of id 212 to 127.0.0.1 port 1812
User-Name = "samara"
User-Password = "sdf87dfg"
NAS-IP-Address = 127.0.0.1
NAS-Port = 1812
Message-Authenticator = 0x00000000000000000000000000000000
rad_recv: Access-Reject packet from host 127.0.0.1 port 1812, id=212, length=24
Reply-Message = "NO"
Неуспешная авторизация при неверном пароле:
[root@roslin raddb]# radtest samara pas2sword localhost 1812 testing123
Sending Access-Request of id 218 to 127.0.0.1 port 1812
User-Name = "samara"
User-Password = "pas2sword"
NAS-IP-Address = 127.0.0.1
NAS-Port = 1812
Message-Authenticator = 0x00000000000000000000000000000000
rad_recv: Access-Reject packet from host 127.0.0.1 port 1812, id=218, length=24
Reply-Message = "NO"
Неуспешная авторизация при неверном IP адресе NAS:
[root@roslin raddb]# radtest samara password localhost 1812 testing123 0 127.0.0.2
Sending Access-Request of id 113 to 127.0.0.1 port 1812
User-Name = "samara"
User-Password = "password"
NAS-IP-Address = 127.0.0.2
NAS-Port = 1812
Message-Authenticator = 0x00000000000000000000000000000000
rad_recv: Access-Reject packet from host 127.0.0.1 port 1812, id=113, length=24
Reply-Message = "NO"
8. Результат достигнут, FREERADIUS проверяет возможность авторизации через внешний скрипт. Далее необходимо настраивать работу системы с реальным оборудованием.