OUR SITES NetworkRADIUS FreeRADIUS

SQL counter module

Introduction

The sqlcounter module provides a mechanism which can be used to enforce periodic resource limits.

Each instance of the module is configured with a period (e.g. daily) which is used to populate values in two attributes in the control list when the module is called.

An attribute is defined to contain a "limit" for whatever resource is being counted, (e.g. session time or data volume) for the specified period.

If that attribute exists, the module will run an SQL query to calculate the used resource quantity.

The retrieved value is then compared with the limit and if the limit has been exceeded, the module will return reject

Configuration

A sample module configuration is provided in raddb/mods-available/sqlcounter.

This includes configurations which cover daily and monthly periods, plus a couple of examples where there are no reset dates on the periods being considered.

The SQL queries associated with these sample module configurations are found in raddb/mods-config/sql/counter/<dialect>/*.conf with each instances query in a different file.

As provided, the counters are all based on session time, using the acctsessiontime, field from radacct.

In order to enforce limits based on data volume, the queries should be updated to use the acctinputoctets and / or acctoutputoctets fields depending on the requirement.

See the sample module configuration for details of the configuration options.

Usage

As a prerequisite to using the sqlcounter module with the sample configurations an instance of the sql module must be configured and called when processing accounting packets.

This instance of the sql module should be set as the sql_module_instance in the sqlcounter module configuration.

Depending on how user limits are to be set, appropriate entries should be added to the relevant source data store being used to set control attributes during authorization. e.g. if the sql module is being used to hold user data, add entries to radcheck or radgroupcheck as appropriate.

The attribute to set is the one referred to in the check_name module, configuration, e.g. on the sample dailycounter module instance the attribute is &control.Max-Daily-Session.

In the authorization policy, call the required sqlcounter module instance, having made sure that the appropriate check_name attribute is set.

If the configured query returns a value which exceeds the value in the limit attribute, the module will return reject and populate the attribute set in reply_message_name.

If the retrieved value is below the limit, then the attribute set in reply_name will be populated in the reply list with the difference between the limit and the retrieved value and the module will return updated.

If that attribute already exists with a lower value, that value will be left and the module will return ok.

If no reply_name is configured, then the module returns ok.

For the use case where the reply attribute is being used to set a point when a user re-authenticates, specifically using time (in seconds), the option auto_extend can be used to avoid unnecessary re-authentications.

Setting this option to yes causes a check to be done to see if the difference between the configured limit and the retrieved value is sufficient to cover the time to the next period. If it is, then the value returned in the reply attribute will be the number of seconds until the next period plus the value of the limit.