help with changing to use named instance of sql module

Matt Zagrabelny mzagrabe at d.umn.edu
Mon Jul 31 15:34:29 UTC 2023


Greetings FR-users,

Running freeradius 3.0.21+dfsg-2.2+deb11u1.

The default FR configs (obviously!) work wonderfully. Thank you for
making a robust system.

I am attempting to deviate from those defaults and am hitting a snag.
I would like to use multiple databases (within the sql module), thus I
am attempting to change:

sql {
}

to

sql foo {
}

After successfully adding "foo", I can then add "bar".

>From running -X it appears that I am connecting to "foo" correctly:

(0) foo: EXPAND %{User-Name}
(0) foo:    --> mzagrabe
(0) foo: SQL-User-Name set to 'mzagrabe'
rlm_sql (foo): Reserved connection (0)
(0) foo: EXPAND SELECT id, UserName, Attribute, Value, Op FROM
radius_check WHERE Username = '%{SQL-User-Name}' ORDER BY id
(0) foo:    --> SELECT id, UserName, Attribute, Value, Op FROM
radius_check WHERE Username = 'mzagrabe' ORDER BY id
(0) foo: Executing select query: SELECT id, UserName, Attribute,
Value, Op FROM radius_check WHERE Username = 'mzagrabe' ORDER BY id
rlm_sql_postgresql: Status: PGRES_TUPLES_OK
rlm_sql_postgresql: query affected rows = 1 , fields = 5
(0) foo: User found in radcheck table
(0) foo: Conditional check items matched, merging assignment check items
(0) foo:   Crypt-Password := "REDACTED"
(0) foo: EXPAND SELECT id, UserName, Attribute, Value, Op FROM
radius_reply WHERE Username = '%{SQL-User-Name}' ORDER BY id
(0) foo:    --> SELECT id, UserName, Attribute, Value, Op FROM
radius_reply WHERE Username = 'mzagrabe' ORDER BY id
(0) foo: Executing select query: SELECT id, UserName, Attribute,
Value, Op FROM radius_reply WHERE Username = 'mzagrabe' ORDER BY id
rlm_sql_postgresql: Status: PGRES_TUPLES_OK
rlm_sql_postgresql: query affected rows = 0 , fields = 5
rlm_sql (foo): Reserved connection (1)
rlm_sql (foo): Released connection (1)
Need 6 more connections to reach 10 spares
rlm_sql (foo): Opening additional connection (5), 1 of 27 pending slots used
rlm_sql_postgresql: Connecting using parameters: dbname='foo'
host='foo-dev.example.com' user='radius_user' password='REDACTED'
application_name='FreeRADIUS 3.0.21 - radiusd (foo)'
Connected to database 'foo' on 'foo-dev.example.com' server version
130011, protocol version 3, backend PID 1378924
(0) foo: EXPAND SELECT GroupName FROM radius_user_group WHERE
UserName='%{SQL-User-Name}' ORDER BY priority
(0) foo:    --> SELECT GroupName FROM radius_user_group WHERE
UserName='mzagrabe' ORDER BY priority
(0) foo: Executing select query: SELECT GroupName FROM
radius_user_group WHERE UserName='mzagrabe' ORDER BY priority
rlm_sql_postgresql: Status: PGRES_TUPLES_OK
rlm_sql_postgresql: query affected rows = 2 , fields = 1
(0) foo: User found in the group table
(0) foo: EXPAND SELECT id, GroupName, Attribute, Value, op FROM
radius_group_check WHERE GroupName = '%{foo-SQL-Group}' ORDER BY id
(0) foo:    --> SELECT id, GroupName, Attribute, Value, op FROM
radius_group_check WHERE GroupName = 'network-admin' ORDER BY id
(0) foo: Executing select query: SELECT id, GroupName, Attribute,
Value, op FROM radius_group_check WHERE GroupName = 'network-admin'
ORDER BY id
rlm_sql_postgresql: Status: PGRES_TUPLES_OK
rlm_sql_postgresql: query affected rows = 0 , fields = 5
(0) foo: Group "network-admin": Conditional check items matched
(0) foo: Group "network-admin": Merging assignment check items
(0) foo: EXPAND SELECT id, GroupName, Attribute, Value, op FROM
radius_group_reply WHERE GroupName = '%{foo-SQL-Group}' ORDER BY id
(0) foo:    --> SELECT id, GroupName, Attribute, Value, op FROM
radius_group_reply WHERE GroupName = 'network-admin' ORDER BY id
(0) foo: Executing select query: SELECT id, GroupName, Attribute,
Value, op FROM radius_group_reply WHERE GroupName = 'network-admin'
ORDER BY id
rlm_sql_postgresql: Status: PGRES_TUPLES_OK
rlm_sql_postgresql: query affected rows = 0 , fields = 5
(0) foo: Group "network-admin": Merging reply items
rlm_sql (foo): Released connection (0)
(0)     [foo] = ok
(0)     [expiration] = noop
(0)     [logintime] = noop
(0)     [pap] = updated
(0)     if ("%{client:group}" == 'two-factor-authentication-group') {
(0)     EXPAND %{client:group}
(0)        --> network-infrastructure
(0)     if ("%{client:group}" == 'two-factor-authentication-group')  -> FALSE
(0)     else {
(0)       update control {
(0)         Proxy-To-Realm := 'default-authentication-realm'
(0)       } # update control = noop
(0)     } # else = noop
(0)   } # authorize = updated
(0) Starting proxy to home server 10.0.0.1 port 1812
(0) server default {
(0) }

The above -X output is generally the same output as the working
default sql configuration output.

However, the default working sql configuration does not match the
following -X output when I change the configs to use "sql foo {". I am
not seeing correct behavior in the post-auth section of
sites-enabled/default:

[...]
(0) Auth-Type = Accept, accepting the user
(0) # Executing section post-auth from file
/etc/freeradius/3.0/sites-enabled/default
(0)   post-auth {
(0)     if ("%{client:group}" == 'network-infrastructure') {
(0)     EXPAND %{client:group}
(0)        --> network-infrastructure
(0)     if ("%{client:group}" == 'network-infrastructure')  -> TRUE
(0)     if ("%{client:group}" == 'network-infrastructure')  {
(0)       if (foo:SQL-Group == 'network-admin') {
(0)       if (foo:SQL-Group == 'network-admin')  -> FALSE
(0)       else {

I am expecting the last FALSE to be TRUE, as in the -X output with the
default sql configuration:

(0)       if (SQL-Group == 'network-admin') {
(0)       sql_groupcmp
(0)       EXPAND %{User-Name}
(0)          --> mzagrabe
(0)       SQL-User-Name set to 'mzagrabe'
rlm_sql (sql): Reserved connection (5)
rlm_sql (sql): Reserved connection (6)
rlm_sql (sql): Released connection (6)
(0)       EXPAND SELECT GroupName FROM radius_user_group WHERE
UserName='%{SQL-User-Name}' ORDER BY priority
(0)          --> SELECT GroupName FROM radius_user_group WHERE
UserName='mzagrabe' ORDER BY priority
(0)       Executing select query: SELECT GroupName FROM
radius_user_group WHERE UserName='mzagrabe' ORDER BY priority
rlm_sql_postgresql: Status: PGRES_TUPLES_OK
rlm_sql_postgresql: query affected rows = 2 , fields = 1
(0)       sql_groupcmp finished: User is a member of group network-admin
rlm_sql (sql): Released connection (5)
(0)       if (SQL-Group == 'network-admin')  -> TRUE

Here is what I have added to the top of my post-auth section:

post-auth {
    if ("%{client:group}" == 'network-infrastructure') {
        if (foo:SQL-Group == 'network-admin') {
            update reply {
                APC-Service-Type = Admin

                # Set user type for Eaton UPS's
                Service-Type = Administrative-User
            }
        }
        else {
            reject
        }
    }

I have also tried changing (in the same post-auth section) the

    -sql

to

    -foo

but it was not successful.

Any hints or ideas about where to look next would be very appreciated.

Thank you for your time!

-m


More information about the Freeradius-Users mailing list