Базовая установка и настройка FreeRADIUS 3 в CentOS7 с поддержкой PostgreSQL.
Отключаем Firewall
# service firewalld stop
# chkconfig firewalld off
Установка пакетов, требующихся в дальнейшем:
# yum install libtalloc-devel –y
# yum install wget nano
# yum install gcc
# yum install tcpdump
# yum install openssl-devel
# yum install python-devel
Отключаем SELinux
# nano /etc/sysconfig/selinux
Комментируем все, вставляем строку
SELINUX=disabled
Перезагружаемся:
# reboot
Устанавливаем сервер PostgreSQL
# yum install postgresql-server
# yum install postgresql-devel
Устанавливаем расширения
# yum install postgresql-contrib
Производим инициализацию базы данных по умолчанию:
# service postgresql initdb
В дальнейшем с базой PostgreSQL можно работать при необходимости.
Переходим в папку установки:
# cd /usr/src/
Скачиваем архив с исходными кодами FreeRADIUS:
# wget ftp://ftp.freeradius.org/pub/freeradius/freeradius-server-3.0.13.tar.gz
Распаковываем архив:
# tar -xvzf freeradius-server-3.0.13.tar.gz
Переходим в распакованную папку:
# cd freeradius-server-3.0.13
Устанавливаем:
# ./configure
# make
# make install
Конфигурация FreeRADIUS, послу естановки находиться в директории /usr/local/etc/raddb/
Делаем первый запуск
# radiusd -X
Получаем ошибку:
Debugger not attached
Refusing to start with libssl version OpenSSL 1.0.1e-fips 11 Feb 2013 0x1000105f (1.0.1e release) (in range 1.0.1 release - 1.0.1t rele)
Security advisory CVE-2016-6304 (OCSP status request extension)
For more information see https://www.openssl.org/news/secadv/20160922.txt
Once you have verified libssl has been correctly patched, set security.allow_vulnerable_openssl = 'CVE-2016-6304'
Refusing to start with libssl version OpenSSL 1.0.1e-fips 11 Feb 2013 0x1000105f (1.0.1e release) (in range 1.0.1 dev - 1.0.1f release)
Security advisory CVE-2014-0160 (Heartbleed)
For more information see http://heartbleed.com
Исправление ошибки выполняется установкой параметра allow_vulnerable_openssl в настройках
# nano /usr/local/etc/raddb/radiusd.conf
По умолчанию:
allow_vulnerable_openssl = no
Меняем на
allow_vulnerable_openssl = 'CVE-2016-6304'
Теперь после тестового запуска radius сервера старт завершается успешно:
# radiusd -X
FreeRADIUS Version 3.0.13
Copyright (C) 1999-2017 The FreeRADIUS server project and contributors
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
…
Listening on auth address * port 1812 bound to server default
Listening on acct address * port 1813 bound to server default
Listening on auth address :: port 1812 bound to server default
Listening on acct address :: port 1813 bound to server default
Listening on auth address 127.0.0.1 port 18120 bound to server inner-tunnel
Listening on proxy address * port 35712
Listening on proxy address :: port 37586
Ready to process requests
Остановка запущенного в тесте сервера:
CTRL +C
Удаляем шаблоны, работающие по умолчанию default и inner-tunnel
# rm –f /usr/local/etc/raddb/sites-enabled/inner-tunnel
# rm -f /usr/local/etc/raddb/sites-enabled/default
Отключаем проксирование
# nano /usr/local/etc/raddb/radiusd.conf
Строки
proxy_requests = yes
$INCLUDE proxy.conf
Меняем на
proxy_requests = no
#$INCLUDE proxy.conf
Отключаем логирование модуля unix
# nano /usr/local/etc/raddb/mods-enabled/unix
Комментируем строку
# radwtmp = ${logdir}/radwtmp
Это указание не вести логирование в файле /usr/local/var/log/radius/radwtmp
Учим FREERADIUS работать с атрибутами Cisco AV-Pair
# nano /usr/local/etc/raddb/mods-enabled/preprocess
Устанавливаем директиву with_cisco_vsa_hack в yes (по умолчанию no)
with_cisco_vsa_hack = yes
# systemctl restart radiusd.service
Словари лежат здесь /usr/local/share/freeradius/dictionary
Для успешного приема атрибутов, передаваемых в Cisco AV Pair необходимо явно прописать их в настройках словарей FreeRADIUS.
# nano /usr/local/share/freeradius/dictionary.cisco
После блока SIP атрибутов (# SIP Attributes) пишем новые атрибуты
# Новые атрибуты
ATTRIBUTE client-mac-address 171 string
ATTRIBUTE connect-progress 172 string
ATTRIBUTE ppp-disconnect-cause 173 string
ATTRIBUTE disc-cause-ext 174 string
ATTRIBUTE circuit-id-tag 175 string
Теперь в логах вместо атрибута
Cisco-AVPair = "client-mac-address=107b.ef5c.2579"
Будет две строки
Cisco-AVPair = "client-mac-address=2cb0.5d81.b453"
client-mac-address = "2cb0.5d81.b453"
То же для атрибутов connect-progress, ppp-disconnect-cause, disc-cause-ext, circuit-id-tag
И названия атрибутов client-mac-address, connect-progress и пр. можно будет использовать напрямую.
Меняем название файла логов аккаутинга, для того что бы можно было его успешно ротировать
# nano /usr/local/etc/raddb/mods-enabled/detail
Меняем строку
filename = ${radacctdir}/%{%{Packet-Src-IP-Address}:-%{Packet-Src-IPv6-Address}}/detail-%Y%m%d
на
filename = ${radacctdir}/%{%{Packet-Src-IP-Address}:-%{Packet-Src-IPv6-Address}}/detail
Логи сервера находятся в файле: /usr/local/var/log/radius/radius.log
Логи аккаутинга складываются в папку: /usr/local/var/log/radius/radacct/<ip-адрес-клиента>/
Организовываем ротацию файлов логов
# cp /usr/src/freeradius-server-3.0.13/redhat/freeradius-logrotate /etc/logrotate.d/
# nano /etc/logrotate.d/freeradius-logrotate
Содержимое файла может быть таким:
/usr/local/var/log/radius/radius.log {
rotate 2
copytruncate
missingok
daily
size=500k
nomail
}
/usr/local/var/log/radius/radacct/*/detail {
rotate 2
noolddir
nocopy
create
nocopytruncate
missingok
daily
size=10M
nomail
postrotate
/usr/bin/systemctl restart radiusd.service
endscript
}
В заключении выполняем проверку правил ротации логов:
# logrotate -d /etc/logrotate.d/freeradius-logrotate
Принудительный запуск ротации:
# logrotate -f /etc/logrotate.d/freeradius-logrotate
Посмотреть что и когда ротировалось можно в файле /var/lib/logrotate.status
Создаем и подключаем свой модуль sql, которым будем пользоваться.
# cp /usr/local/etc/raddb/mods-available/sql /usr/local/etc/raddb/mods-available/sql_my
# ln -s /usr/local/etc/raddb/mods-available/sql_my /usr/local/etc/raddb/mods-enabled/sql_my
Редактируем модуль:
# nano /usr/local/etc/raddb/mods-enabled/sql_my
Здесь пока можно все закомментировать или удалить.
Для удаления всего содержимого выполняем:
# echo "" > /usr/local/etc/raddb/mods-enabled/sql_my
Создаем свой тестовый шаблон на основе имеющегося:
# cp /usr/local/etc/raddb/sites-available/default /usr/local/etc/raddb/sites-available/test
# ln -s /usr/local/etc/raddb/sites-available/test /usr/local/etc/raddb/sites-enabled/test
Теперь после запуска сервера мы имеем корректно запущенный сервер FreeRADIUS, прослушивающий порты 1812 и 1813.
# radiusd -X
…
Listening on auth address * port 1812 bound to server default
Listening on acct address * port 1813 bound to server default
Listening on auth address :: port 1812 bound to server default
Listening on acct address :: port 1813 bound to server default
Ready to process requests
Для проверки, в другой консоли набираем команду проверки открытых портов службами:
# netstat -ltupn | grep radius
udp 0 0 0.0.0.0:1812 0.0.0.0:* 1898/radiusd
udp 2176 0 0.0.0.0:1813 0.0.0.0:* 1898/radiusd
udp6 0 0 :::1812 :::* 1898/radiusd
udp6 0 0 :::1813 :::* 1898/radiusd
Внедряем unit FreeRADIUS в службу systemd
Копируем имеющийся в скаченном архиве готовый файл юнита:
# cp /usr/src/freeradius-server-3.0.13/redhat/radiusd.service /etc/systemd/system/multi-user.target.wants/
# chmod +x /etc/systemd/system/multi-user.target.wants/radiusd.service
Редактируем файл
# nano /etc/systemd/system/multi-user.target.wants/radiusd.service
и приводим его к виду:
[Unit]
Description=FreeRADIUS multi-protocol policy server
After=network.target
Documentation=man:radiusd(8) man:radiusd.conf(5) http://wiki.freeradius.org/ http://networkradius.com/doc/
[Service]
Type=forking
EnvironmentFile=-/etc/sysconfig/radiusd
ExecStartPre=/usr/local/sbin/radiusd $FREERADIUS_OPTIONS -Cxm -lstdout
ExecStart=/usr/local/sbin/radiusd $FREERADIUS_OPTIONS -m
Restart=on-failure
RestartSec=5
ExecReload=/usr/local/sbin/radiusd $FREERADIUS_OPTIONS -Cxm -lstdout
ExecReload=/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target
Рестартуем демон systemd:
# systemctl daemon-reload
Теперь запуск сервера выполняем так:
# systemctl start radiusd.service
Статус:
# systemctl status radiusd.service
Остановка сервера:
# systemctl stop radiusd.service