From: Олег Малых <malykh@krls.ru>
Subject: Установка и настройка gnu-radius + postgresql
Решил я поставить radius с возможностью хранения паролей
и настроек пользователей в SQL сервере. Так как зверинец из множества видов
SQL серверов держать не хотелось, то необходима была поддержка именно
PostgreSQL. Выбор пал на gnu-radius, как поддерживающий несколько видов SQL,
в том числе и PostgreSQL.
Данный документ не претендует на полную документацию по установке
gnu-radius+postgresql, это просто последовательность действий, которая
привела меня к работающей системе. В документе приведены ряд решений и
трудности с которыми мне пришлось столкнуться при реализации данного
проекта. Все это ставилось на linux версии RedHat 7.1. PostgreSQL был
собран из исходников для другой задачи и успешно работал на момент
установки.
Установку PostgreSQL здесь разбирать не будем, а
остановимся именно на установке gnu-radius и связки его с SQL.
Сама установка ничего сложного в себя не включает:
Если PostgreSQL собран в другом месте, то, соответственно, измените путь.
5) Собираем
$make
6) Инсталлируем
$make install
Если возникли ошибки, то где-то Вы ошиблись, либо не находится нормальная
сборка PostgreSQL. По умолчанию radius собирается в /usr/local, вы можете
его собрать и в другой каталог, указав при конфигурировании --prefix=PREFIX,
где PREFIX это каталог, относительно которого будет установлен radius.
Первичная настройка
1) Я подправил себе файл /usr/local/etc/raddb/config
port 1645;
В секции auth и
port 1646;
В секции acct.
Мне это нужно было, чтобы киску свою не перенастраивать, Вы
можете оставить себе порты по умолчанию, не это влияет на работу ;)
2) В файл /usr/local/etc/raddb/clients занесите информацию о клиентах,
которые будут запрашивать аутентификацию у radius
#Client Name Key
#---------------- -------------------
localhost localtest
cisco ciscokey
Ключи лучше придумать самим ;)
3) Для теста нашего radius есть клиентские утилиты, вот для них
нужно прописать конфигурацию в /usr/local/etc/raddb/client.conf
server local 127.0.0.1 localtest 1645 1646
source_ip 127.0.0.1
timeout 3
retry 1
4) В файл /usr/local/etc/raddb/users занесите для теста
# This is the users database.
uzver Auth-Type = Local, Password = "test"
Service-Type = NAS-Prompt-User
radius уже может работать и отвечать на запросы
Можно проверить на работоспособность radiusd запустив
$/usr/local/sbin/radiusd
(radiusd должен быть запущен относительно корневого пути, например
/usr/local/sbin/radiusd, иначе работа будет некорректной)
У меня с ходу не запустился, так как не были указаны пути к библиотекам
PostgreSQL. Я внес пути в /etc/ld.so.conf и запустил ldconfig, после
чего все удачно заработало.
Ответы от radius можно проверить тестовой утилитой /usr/local/sbin/radauth
Если вы получили такой ответ, то radius работает и из текстового users отдает
ответы на запросы аутентификации, если нет, то нужно искать в чем ошибка.
Теперь самое страшное ;) - связь с SQL. В описании приведена только схема
связи данного продукта с MySQL, да и то с ошибками. Ниже приведена
последовательность действий с PostgreSQL для подготовки его к работе с radius:
1) Становимся пользователем из под которого запущен postmaster и создаем базу
(не будем оригинальны) radius.
[root@ns /]# su - postgres
[postgres@ns postgres]$ createdb radius
2) Входим в командный режим управления базой и создаем пользователя radius с
паролем test
3) Создаем таблицы для хранения информации о пользователях, сами SQL
выражения изменены под PostgreSQL и вроде как полнофункционально работают.
Я заменил все типы char(n) на тип varchar(n) так как odbc добавляет пробелы
в конец строки до требуемого числа символов.
Таблица passwd (здесь в документации допущена ошибка, пропущено поле active
я дал ему тип varchar(3) и значение по умолчанию лучше 'Framed-User')
radius=# CREATE TABLE passwd ( user_name varchar(32) UNIQUE default
'' not null, service varchar(16) default 'Framed-User' not
null, password varchar(64), active varchar(3));
Таблица groups (все прозрачно)
radius=# CREATE TABLE groups ( user_name varchar(32) default ''
not null, user_group varchar(32));
Таблица attrib (вместо MySQL enum() просто проверяем на присутствие - check)
radius=# CREATE TABLE attrib ( user_name varchar(32) default ''
not null, attr varchar(32) default '' not null,
value varchar(128), op varchar(3)
check (op in ('=', '!=', '<', '>', '<=', '>='))
default null );
Таблица calls
radius=# CREATE TABLE calls ( status int, user_name varchar(32),
event_date_time timestamp without time zone
DEFAULT '1970-01-01 00:00:00' NOT NULL,
nas_ip_address varchar(17), nas_port_id bigint,
acct_session_id varchar(16) DEFAULT '' NOT NULL,
acct_session_time bigint, acct_input_octets bigint,
acct_output_octets bigint, connect_term_reason int,
framed_ip_address varchar(17), called_station_id varchar(32),
calling_station_id varchar(32) );
Даем право на чтение, запись пользователю radius
radius=# grant select on passwd,groups,attrib,calls to radius;
radius=# grant insert,update on calls to radius;
4) Теперь выходим из командного режима "q".
Не забудьте прописать в pg_hba.conf возможность доступа к базе radius
с localhost через аутентификацию логин-пароль например:
host radius all 127.0.0.1 255.255.255.255 password passwd
И естественно, что postmaster нужно запускать с ключиком -i
Вроде ничего не забыл про PostgreSQL теперь возвращаемся к radius и
правим файл /usr/local/etc/raddb/sqlserver
interface postgres
server localhost
port 5432
login radius
password test
keepopen yes
doauth yes
auth_db radius
doacct yes
Я указал только строки в которые я вносил изменения. От локальной
аутентификации я отказался на случай переноса сервера SQL на другую машину.
Теперь возвращаемся к /usr/local/etc/raddb/users и добавляем к примеру:
Внимание! При аутентификации через SQL пароли в таблице должны храниться
криптованые или md5 или des. Долго я выяснял это, пока не наткнулся в
документации:
Specifying Passwords in SQL Database.
user-name Auth-Type = Crypt-Local,
Password-Location = SQL
Using this profile, the user's password is retrieved from the authentication
database using auth_query. The configuration of SQL authentication is
described in detail on section Authentication Server Parameters.
The shortcut for this notation is Auth-Type = SQL.
In any case, the passwords used with this authentication type must be
either DES or MD5 hashed.
Для криптования паролей я воспользовался утилитой /sbin/grub-md5-crypt
Запускаете, вводите пароль, полученную строку вносите в таблицу.
Если Вы занесли данные о пользователе, прописали в группу, добавили атрибутов
то при помощи /usr/local/sbin/radauth можно проверить работоспособность
того, что мы сделали. Можно добавлять, удалять атрибуты в PostgreSQL и
смотреть как radius честно их отдает. Очень удобен механизм групп. например:
Пользователи, которые в группе test1 могут получить доступ только с 18:00
до 07:55 по рабочим дням и круглосуточно по выходным, а из группы test2
пользователи не имеют временных ограничений. В общем, большая широта для
творчества.