На предприятии *** возникла необходимость, чтобы все логи аутентификации записывались в базу данных на сервере отличном от того, на котором хранятся данные авторизации. Для решения поставленной задачи очень хорошо подходят политики freeRadius
Создаем на необходимом сервере базу данных
# mysql -hhostname -uradius -psecret
> CREATE DATABASE radius CHARACTER SET utf8 COLLATE utf8_general_ci;
> use radius;
> CREATE TABLE radpostauth (
id int(11) NOT NULL auto_increment,
username varchar(64) NOT NULL default '',
pass varchar(64) NOT NULL default '',
reply varchar(32) NOT NULL default '',
authdate timestamp NOT NULL,
PRIMARY KEY (id)
);
> exit
Переходим в каталог с freeRadius: # cd /usr/local/etc/raddb/
Создаем файл нашего модуля в папке с модулями modules/ freeRadius. Описание модуля начинается с sql, это означает что в модуле будут выполняться SQL запросы на сервер:
# ee modules/postauth_custom_module
sql postauth_custom_module {
database = "mysql"
driver = "rlm_sql_${database}"
server = "hostname"
login = "radius"
password = "secret"
radius_db = "radius"
postauth_table = "radpostauth"
sqltrace = yes
sqltracefile = /var/log/postauthtrace.sql
num_sql_socks = 5
connect_failure_retry_delay = 60
postauth_query = "INSERT INTO ${postauth_table} \
(`username`, `pass`, `reply`, `authdate`, `callfrom`, \
`callto`,`nasip`,`acctsessionid`,`msg`) \
VALUES ( \
'%{User-Name}', \
'%{%{User-Password}:-%{Chap-Password}}', \
'%{reply:Packet-Type}', '%S', '%{Calling-Station-Id}', \
'%{Called-Station-Id}', '%{NAS-IP-Address}', \
'%{Acct-Session-Id}', '%{reply:Reply-Message}');"
}
Создаем политику в файле policy.conf в блоке policy определяем новую политику
# ee policy.conf
policy {
...
postauth_custom_policy{
postauth_custom_module
}
}
Меняем файл текущей конфигурации /sites-enabled/default для запуска политики и выполения модуля, для этого добавляем в блок post-auth назваение нашей политики в конец блока и в условный блок Post-Auth-Type REJECT (для ведения записей непрошедших авторизацию). Также необходимо закомментировать политику sql, чтобы сервер не использовал текущую базу данных.
# ee /sites-enabled/default
post-auth {
...
#sql
postauth_custom_policy
Post-Auth-Type REJECT {
# log failed authentications in SQL, too.
update reply {
Reply-Message = "UOPW"
}
#sql
postauth_custom_policy
attr_filter.access_reject
}
}
Сохраняем файлы и проверяем конфигурацию radiusd -C
Перезагружаем freeRadius service radiusd restart