Авторизация через FreeRADIUS в Gentoo и логирование в MySQL
Никаких велосипедов здесь не будет, просто записка для себя
Вводные данные
FreeRADIUS — RADIUS сервер с открытым исходным кодом.
Это альтернатива других коммерческих RADIUS серверов, он имеет модульную структуру и хорошую функциональность. Кроме того, он входит в пятёрку RADIUS серверов мира по количеству пользователей, которых этот сервер авторизует ежедневно.
Может работать на встраиваемых системах с небольшим количеством памяти или обслуживать несколько миллионов пользователей на более серьезном уровне. FreeRADIUS быстрый, гибкий, настраиваемый, а также поддерживает больше протоколов аутентификации, чем многие коммерческие серверы. В настоящее время FreeRADIUS используется как основа для разработки коммерческих RADIUS серверов.
Устанавливаем FreeRadius
emerge freeradius |
После этого перемещаем оригинальные конфиги в папку origin, чтоб в будущем подглядывать на синтаксис
mkdir -p /etc/raddb/orig mv /etc/raddb/* /etc/raddb/orig |
Первым делом мы создадим основной конфиг radiusd.conf
prefix = /usr exec_prefix = ${prefix} sbindir = ${exec_prefix}/sbin libdir = /usr/lib/freeradius localstatedir = /var run_dir = ${localstatedir}/run/radiusd sysconfdir = /etc logdir = /var/log/radius log_file = ${logdir}/radius.log raddbdir = ${sysconfdir}/raddb radacctdir = ${logdir}/radacct confdir = ${raddbdir} pidfile = ${run_dir}/radiusd.pid # настройка ip адресов и портов, на которых будет слушать сервер. # рекомендуется не использовать стандартные порты listen { ipaddr = 10.0.0.1 port = 11111 type = auth } listen { ipaddr = 127.0.0.1 port = 11111 type = auth } listen { ipaddr = 10.0.0.1 port = 22222 type = acct } # Имя пользователя и группа от которых запускается <strong>FreeRADIUS</strong> user = radiusd group = radiusd max_request_time = 30 delete_blocked_requests = no cleanup_delay = 5 max_requests = 1024 #hostname_lookups = yes hostname_lookups = no allow_core_dumps = no regular_expressions = yes extended_expressions = yes log_destination = files log_stripped_names = no # Записывать в лог попытки авторизации. # log_auth_badpass - не корректные пароли # log_auth_goodpass - корректные пароли log_auth = yes log_auth_badpass = yes log_auth_goodpass = yes usercollide = no lower_user = no lower_pass = no nospace_user = no nospace_pass = no checkrad = ${sbindir}/checkrad proxy_requests = no snmp = no security { # Максимальное допустимое количество аттрибутов в RADIUS пакете. max_attributes = 200 # Задержка (в секундах) перед отправкой Access-Reject пакета. reject_delay = 1 # Не отвечать на запросы Status-Server status_server = no } thread pool { # количество первоначально запущенных процессов. start_servers = 5 # Максимально возможное количество процессов. max_servers = 32 min_spare_servers = 3 max_spare_servers = 10 max_requests_per_server = 0 } # Конфигрурация клиентов RADIUS сервера. # Описывается в отдельном файле. $INCLUDE ${confdir}/clients.conf modules { #Конфиг в котором описано логирование в Mysql $INCLUDE ${confdir}/origin/sql.conf preprocess { huntgroups = ${confdir}/huntgroups hints = ${confdir}/empty_file } files { usersfile = ${confdir}/users acctusersfile = ${confdir}/acct_users preproxy_usersfile = ${confdir}/empty_file compat = no } always fail { rcode = fail } always reject { rcode = reject } always ok { rcode = ok } # Запись детального лога аккаунтинговых пакетов. detail { detailfile = ${logdir}/%{Client-IP-Address}/detail-%Y%m%d # detailperm = 0600 } # Запись детального лога пакетов авторизации. detail auth_log { detailfile = ${logdir}/%{Calling-Station-Id}/auth-detail-%Y%m%d # detailfile = ${logdir}/%{Client-IP-Address}/auth-detail-%Y%m%d detailperm = 0600 } # Запись детального лога reply пакетов. detail reply_log { detailfile = ${logdir}/%{Client-IP-Address}/reply-detail-%Y%m%d detailperm = 0600 } # Создать уникальный ключ для аккаунтинг сессии. # Многие NAS повторно используют Acct-Session-ID. # key перечисление аттрибутов для генерации Acct-Session-ID acct_unique { key = "User-Name, Acct-Session-Id, NAS-IP-Address, Client-IP-Address, NAS-Port-Id" } } authorize { preprocess files auth_log } instantiate { } authenticate { } preacct { } accounting { detail ok sql } session { } post-auth { } pre-proxy { reply_log } post-proxy { } |
Вкратце о этом безобразии.
В секции detail auth_log есть закоментированая строка, вот ее нужно использовать если вы авторизируете пользователей которые приходят из сети. В моем случае я логирую пользователей на основании номера мобильного телефона.
В секции authorize мы выставили авторизацию через файлы files . А вот в секции accounting выставлено вести логирование через sql
Все остальное вродь должно быть понятно по коментариям.
Еще нужно сменить владельца каталога /var/log/radius на radiusd:radiusd
Теперь создадим пустой hint-файл
touch empty_file |
Без него не хотит работать )
Переходим к настройкам клиентов(устройств) которым разрешено к нам обращаться.
Описывается это в файле clients.conf
cat /etc/raddb/clients.conf client 127.0.0.1 { shortname = localhost secret = megapass } client 10.0.0.2 { shortname = servak secret = passOfServak } |
Просто и безидейно
А теперь опишем учетные записи которые могут авторизироваться у нас
Описывается это в файле users
cat /etc/raddb/users testuser Cleartext-Password := "testtest", Auth-Type = Local, NAS-Port-Type += Virtual Service-Type += Administrative-User, Framed-IP-Address := 192.168.1.5 admin Cleartext-Password := "admin" mobilka.mts.ua Calling-Station-Id == "38050XXXYYZZ", Cleartext-Password := "" Framed-IP-Address := 10.0.99.1, MS-Primary-DNS-Server := 10.0.99.151, MS-Secondary-DNS-Server := 10.0.98.151 # тестовый пользователь. Если будете тестировать с pppd и mschap авторизацией пропишите # Auth-Type:=MS-CHAP вместо Auth-Type:=Local, иначе RADIUS сервер не авторизует клиента. test Auth-Type:=Local, User-Password == "test" #test Auth-Type:=MS-CHAP, User-Password == "test" Service-Type = Framed-User, Framed-Protocol = PPP, Framed-IP-Address = 192.168.0.200, Framed-IP-Netmask = 255.255.255.0, Framed-Route = "192.168.1.0/24 192.168.200.204/32 1", Reply-Message = "Just Test", Acct-Interim-Interval = 60, # Session-Timeout = 120, Framed-Routing = Broadcast-Listen, Framed-Compression = None |
Тут для примера описано 3 пользователя, testuser – админ, admin – псевдо-админ с нулевыми правами, mobilka.mts.ua – мобильный пользователь, который авторизируется по номеру телефона
Переходим к настройке MySQL
cat /etc/raddb/origin/sql.conf sql { # Set the database to one of: # # mysql, mssql, oracle, postgresql # database = "mysql" #Работаем с MySQL driver = "rlm_sql_${database}" #Сервер MySQL на локалхосте server = "localhost" #Имя пользователя для доступа к MySQL login = "freeradiu" #Пароль для доступа к MySQL password = "123" #База MySQL в которой хранятся данные для авторизации radius_db = "freeradius" authcheck_table = "radcheck" authreply_table = "radreply" acct_table1 = "radacct" acct_table2 = "radacct" postauth_table = "radpostauth" authcheck_table = "radcheck" authreply_table = "radreply" groupcheck_table = "radgroupcheck" groupreply_table = "radgroupreply" usergroup_table = "radusergroup" nas_table = "nas" deletestalesessions = yes sqltrace = yes sqltracefile = ${logdir}/sqltrace.sql num_sql_socks = 5 connect_failure_retry_delay = 60 readclients = yes $INCLUDE origin/sql/${database}/dialup.conf } |
Внутри файла dialup.conf находятся правила по которым FreeRadius пишет данные в БД. Я ничего не менял и использовал дефоултный файл
cat /etc/raddb/origin/sql/mysql/dialup.conf # -*- text -*- ## ## dialup.conf -- MySQL configuration for default schema (schema.sql) .......................... И много текста ....... |
Теперь создадим базу и пользователя:
Подключимся к MySQL:
mysql -uroot -p |
И в командной строке mysql выполним команды по созданию базы и пользователя
CREATE DATABASE freeradius; GRANT ALL ON freeradius.* TO freeradiu@localhost IDENTIFIED BY "123"; |
А теперь создадим структуру таблиц:
mysql -u root -p freeradius < /etc/raddb/origin/sql/mysql/schema.sql |
Я авторизацию у себя не использовал, но пользователя добавил
Администратор с логином admin и паролем 123
use freeradius; insert into radcheck set UserName='admin', Attribute='Password', op='==', Value='-123'; insert into radreply set UserName='admin', Attribute='Service-Type', op='=', Value='Administrative-User'; |
И read only пользователь(он добавляется одним запросом) с логином guest и паролем guest:
use freeradius; insert into radcheck set UserName='guest', Attribute='Password', op='==', Value='guest'; |
Перед запуском в эксплуатацию, желательно провести пробный запуск, с дебагом на консоль:
/etc/raddb /usr/sbin/radiusd -X -d |
Если все прошло удачно можно запускать в штатном режиме
/etc/init.d/radiusd start rc-update add radiusd default |
Спижжено из инета.
Вот урлы :
http://code.google.com/p/cakebilling/wiki/ConfiguringFreeRadius
http://ru.gentoo-wiki.com/wiki/Минимальный_RADIUS_сервер_на_freeradius
http://www.hilik.org.ua/freeradius/