Авторизация через FreeRADIUS в Gentoo и логирование в MySQL

Автор | 11.07.2012

Никаких велосипедов здесь не будет, просто записка для себя
Вводные данные
FreeRADIUSRADIUS сервер с открытым исходным кодом.

Это альтернатива других коммерческих 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/

Залишити відповідь