Никаких велосипедов здесь не будет, просто записка для себя
Вводные данные
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
}
# Имя пользователя и группа от которых запускается FreeRADIUS
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/