Hello Bruno -

You don’t need to modify any code.

You can define an AuthBy SQL clause with an Identifier outside any Handler or 
Realm and call it like this:


sub 
{
    my $p = ${$_[0]};   # proxy reply packet
    my $rp = ${$_[1]};  # reply packet to NAS
    my $op = ${$_[2]};  # original request packet
    my $sp = ${$_[3]};  # packet sent to proxy 

    # Get the Identifier for this Realm/Handler
    my $identifier = Radius::Util::format_special('%{Handler:Identifier}', $op, 
$rp);
    &main::log($main::LOG_DEBUG, "Using Identifier $identifier");

    # Find the AuthBy clause with the same Identifier        
    my $authby = Radius::AuthGeneric::find($identifier);
    &main::log($main::LOG_DEBUG, "Found AuthBy with Identifier $identifier”);


This example is from “goodies/hooks.txt” and derives the Identifier from the 
Realm or Handler, but you can set the Identifier in your hook code any way you 
like.

hope that helps

Hugh


> On 3 Oct 2019, at 21:21, Bruno Tiago Rodrigues 
> <[email protected]> wrote:
> 
> Thank you, Hugh.
> 
> The load is already being shared between multiple instances and request type. 
> It's been a best practice we've been following for a while. 
> 
> I will need to have a look at the RADIUS class attribute, but I'm afraid it 
> might not work as expected, since the authentication 3GPP parameters stored 
> in database I want to retrieve come from a different RADIUS client than the 
> one really establishing the session and sending the accounting packets. 
> 
> The first authentication flow is sent from the mobile gateway (which sends 
> the 3GPP attributes related to the mobile session I want to keep) to my 
> Radiator.
> Radiator returns the tunnel endpoint for that specific connection (let's call 
> it B)
> 
> The second authentication flow is sent from B towards my Radiator server - 
> once authenticated, it starts a session and will send accounting packets as 
> needed - which I need to correlate with information from the first 
> authentication flow. 
> 
> I'm feeling like I need to clone the AuthSQL.pm code, create a new AuthBy and 
> change the handle_request to react on Accounting packets, fetch the relevant 
> data from database and "enrich" the request packet. I was just curious if 
> there was a direct way to access the database connection handles from within 
> a hook.
> 
> Thanks again.
> 
> Bruno Tiago Rodrigues
> 
> 
> On Mon, Sep 30, 2019 at 11:55 PM Hugh Irvine <[email protected]> wrote:
> 
> Hi again -
> 
> BTW - you should always be running separate Radiator instances for 
> authenticaiton and accounting.
> 
> regards
> 
> Hugh
> 
> 
> > On 1 Oct 2019, at 07:44, Hugh Irvine <[email protected]> wrote:
> > 
> > 
> > Hello Bruno -
> > 
> > Have you considered using the RADIUS Class attribute for this?
> > 
> > You can add whatever information you require for accounting to a Class 
> > attribute that is returned when you process the authentication.
> > 
> > The Class attribute will then be included in all accounting requests for 
> > the session and you can use the data directly without having to hit the DB 
> > again.
> > 
> > Let me know if you need any further information.
> > 
> > regards
> > 
> > Hugh
> > 
> > 
> >> On 30 Sep 2019, at 23:31, Bruno Tiago Rodrigues 
> >> <[email protected]> wrote:
> >> 
> >> Our organization has a Radiator server handling a large volume of requests 
> >> and we're trying to squeeze ops and optimize as much as possible.
> >> 
> >> On one of our recent audits we ran to the production server, we found out 
> >> that for each accounting request we need to get data from the underlying 
> >> database from the related authentication packet before processing the 
> >> accounting itself.
> >> 
> >> There's a PreAuthHook running for each Handler which basically clones the 
> >> Radiator database connection properties to establish a connection and 
> >> fetch data from the authentication table.
> >> 
> >> #!/usr/bin/perl
> >> 
> >> sub
> >> {
> >> use DBI;
> >> my $p = ${$_[0]};
> >> my $username = $p->get_attr('User-Name');
> >> my $anumber = $p->get_attr('Calling-Station-Id');
> >> 
> >> my $dbconn = &main::getVariable('dbconn');
> >> my $dbuser = &main::getVariable('dbuser');
> >> my $dbpass = &main::getVariable('dbpass');
> >> 
> >> my $dbh = DBI->connect($dbconn, $dbuser, $dbpass);
> >> 
> >> ($country_code, $imei, $rat) = &get_location_info($username, $anumber, 
> >> $dbh);
> >> 
> >> $p->add_attr('3GPP-SGSN-MCC-MNC', $country_code);
> >> $p->add_attr('3GPP-IMEISV', $imei);
> >> $p->add_attr('3GPP-RAT-TYPE', $rat);
> >> 
> >> &main::log($main::LOG_INFO,"Got extra RADIUS parameters from database for 
> >> user: $username");
> >> }
> >> 
> >> sub get_location_info {
> >> my $query = 'SELECT * FROM (SELECT country_code, imei, rat, row_number() 
> >> over(order by timestamp desc) rn FROM authentication WHERE username = 
> >> \''.$_[0].'\' and anumber = \''.$_[1].'\' order by TIMESTAMP desc) tbl 
> >> WHERE tbl.rn <= 1';
> >> my $sth = $_[2]->prepare($query);
> >> $sth->execute();
> >> my @result=$sth->fetchrow_array();
> >> $sth->finish();
> >> return @result;
> >> }
> >> }
> >> 
> >> According to our DBAs, however, this is hurting the database because it 
> >> requires establishing a connection to the database, logging in and 
> >> fetching data. Logging in, for auditing purposes, is taking a huge toll on 
> >> the response times.
> >> 
> >> Is there any efficient way to reuse an existing handle bound to the 
> >> instance or persistently get a DBI->connect handle on a Startup Hook for 
> >> each instance and then reuse it inside the PreAuthHook (eventually 
> >> reconnecting if necessary)?
> >> 
> >> 
> >> 
> >> Bruno Tiago Rodrigues
> >> _______________________________________________
> >> radiator mailing list
> >> [email protected]
> >> https://lists.open.com.au/mailman/listinfo/radiator
> > 
> > 
> > --
> > 
> > Hugh Irvine
> > [email protected]
> > 
> > Radiator: the most portable, flexible and configurable RADIUS server 
> > anywhere. SQL, proxy, DBM, files, LDAP, NIS+, password, NT, Emerald, 
> > Platypus, Freeside, TACACS+, PAM, external, Active Directory, EAP, TLS, 
> > TTLS, PEAP, TNC, WiMAX, RSA, Vasco, Yubikey, MOTP, HOTP, TOTP,
> > DIAMETER, SIM, etc. 
> > Full source on Unix, Linux, Windows, macOS, Solaris, VMS, NetWare etc.
> > 
> > _______________________________________________
> > radiator mailing list
> > [email protected]
> > https://lists.open.com.au/mailman/listinfo/radiator
> 
> 
> --
> 
> Hugh Irvine
> [email protected]
> 
> Radiator: the most portable, flexible and configurable RADIUS server 
> anywhere. SQL, proxy, DBM, files, LDAP, NIS+, password, NT, Emerald, 
> Platypus, Freeside, TACACS+, PAM, external, Active Directory, EAP, TLS, 
> TTLS, PEAP, TNC, WiMAX, RSA, Vasco, Yubikey, MOTP, HOTP, TOTP,
> DIAMETER, SIM, etc. 
> Full source on Unix, Linux, Windows, macOS, Solaris, VMS, NetWare etc.
> 


--

Hugh Irvine
[email protected]

Radiator: the most portable, flexible and configurable RADIUS server 
anywhere. SQL, proxy, DBM, files, LDAP, NIS+, password, NT, Emerald, 
Platypus, Freeside, TACACS+, PAM, external, Active Directory, EAP, TLS, 
TTLS, PEAP, TNC, WiMAX, RSA, Vasco, Yubikey, MOTP, HOTP, TOTP,
DIAMETER, SIM, etc. 
Full source on Unix, Linux, Windows, macOS, Solaris, VMS, NetWare etc.

_______________________________________________
radiator mailing list
[email protected]
https://lists.open.com.au/mailman/listinfo/radiator

Reply via email to