<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>#blogdump &#187; sysadmin</title>
	<atom:link href="http://aandre.evolix.net/tag/sysadmin/feed/" rel="self" type="application/rss+xml" />
	<link>http://aandre.evolix.net</link>
	<description>geeky lines</description>
	<lastBuildDate>Wed, 17 Jun 2009 15:43:07 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>freeradius et rlm_sqlcounter</title>
		<link>http://aandre.evolix.net/2009/04/15/freeradius-et-rlm_sqlcounter/</link>
		<comments>http://aandre.evolix.net/2009/04/15/freeradius-et-rlm_sqlcounter/#comments</comments>
		<pubDate>Wed, 15 Apr 2009 10:15:38 +0000</pubDate>
		<dc:creator>arno</dc:creator>
				<category><![CDATA[dump]]></category>
		<category><![CDATA[freeradius]]></category>
		<category><![CDATA[rlm_sqlcounter]]></category>
		<category><![CDATA[sysadmin]]></category>

		<guid isPermaLink="false">http://aandre.evolix.net/?p=260</guid>
		<description><![CDATA[Cette note s&#8217;adresse aux utilisateurs de freeradius utilisant rlm_sqlcounter, et rajoute une précision concernant son utilisation.
Ce module est présent et activé par défaut dans freeradius depuis la version 1.1.0. Il permet de définir une durée maximale de connexion pour un utilisateur donné, en se basant sur les valeurs stockées dans la table radacct (Accounting) pour [...]]]></description>
			<content:encoded><![CDATA[<p>Cette note s&#8217;adresse aux utilisateurs de <a title="Freeradius" href="http://www.freeradius.org" target="_blank">freeradius</a> utilisant <strong>rlm_sqlcounter</strong>, et rajoute une précision concernant son utilisation.</p>
<p>Ce module est présent et activé par défaut dans freeradius depuis la version 1.1.0. Il permet de définir une durée maximale de connexion pour un utilisateur donné, en se basant sur les valeurs stockées dans la table <em>radacct </em>(Accounting) pour chaque session.</p>
<p><span id="more-260"></span></p>
<p>On trouvera le fichier de configuration du module dans <em>/etc/freeradius/sql/mysql/counter.conf</em></p>
<p>Il est possible de définir une période de rafraîchissement pour laquelle la durée autorisée est réinitialisée à intervalle régulier. On pourra par exemple accorder <strong>x</strong> minutes par jour ou par mois en utilisant les scénarios prédéfinis <strong>daily</strong> et <strong>monthly </strong>de <em>counter.conf</em>, ou en écrivant son propre <strong>sqlcounter</strong>.</p>
<p>On trouve aussi dans <em>counter.conf</em>, le <strong>sqlcounter noresetcounter</strong>, permettant de définir une durée maximale unique pour l&#8217;utilisateur qu&#8217;il pourra utiliser sur une ou plusieurs sessions:</p>

<div class="wp_syntax"><div class="code"><pre class="" style="font-family:monospace;">sqlcounter noresetcounter <span class="br0">&#123;</span>
counter-name = Max-All-Session-Time
check-name = Max-All-Session
sqlmod-inst = sql
key = User-Name
reset = never
query = &quot;SELECT SUM<span class="br0">&#40;</span>AcctSessionTime<span class="br0">&#41;</span> FROM radacct WHERE UserName='%<span class="br0">&#123;</span>%k<span class="br0">&#125;</span>'&quot;
<span class="br0">&#125;</span></pre></div></div>

<p>Le fichier de conf est assez bien commenté et on trouvera une doc complète de mise en place sur <a title="doc Rlm_sqlcounter" href="http://wiki.freeradius.org/Rlm_sqlcounter" target="_blank">http://wiki.freeradius.org/Rlm_sqlcounter</a></p>
<p>Une fois activée, à chaque <strong>Access-Request</strong>, freeradius va consulter le module <strong>rlm_sqlcounter</strong> qui va calculer le temps de connexion passé en additionnant les <strong>AcctSessionTime</strong> des sessions précédentes, et le comparer avec la valeur de l&#8221;attribut <strong>Max-All-Session</strong> (placé dans <em>radcheck</em> ou <em>radgroupcheck</em>).</p>
<p>Si <strong>Max-All-Session &gt; SUM(AcctSessionTime)</strong> alors freeradius va renvoyer un <strong>Access-Accept</strong> avec un attribut <strong>Session-Timeout = Max-All-Session &#8211; SUM(AcctSessionTime)</strong>, sinon il envoie un <strong>Access-Reject</strong>.</p>
<p>Exemple avec un utilisateur min5 (avec un <strong>Max-All-Session de 5min</strong>, ayant déjà consommé 124s de connexion) envoyant un <strong>Access-Request</strong> (logs crachés par un freeradius lancé avec l&#8217;option -X):</p>

<div class="wp_syntax"><div class="code"><pre class="" style="font-family:monospace;"><span class="br0">&#91;</span>...<span class="br0">&#93;</span>
rlm_sqlcounter: Entering module authorize code
sqlcounter_expand:  'SELECT SUM<span class="br0">&#40;</span>AcctSessionTime<span class="br0">&#41;</span> FROM radacct WHERE UserName='%<span class="br0">&#123;</span>User-Name<span class="br0">&#125;</span>''
<span class="br0">&#91;</span>noresetcounter<span class="br0">&#93;</span>     expand: SELECT SUM<span class="br0">&#40;</span>AcctSessionTime<span class="br0">&#41;</span> FROM radacct WHERE UserName='%<span class="br0">&#123;</span>User-Name<span class="br0">&#125;</span>' -&gt; SELECT SUM<span class="br0">&#40;</span>AcctSessionTime<span class="br0">&#41;</span> FROM radacct WHERE UserName='min5'
sqlcounter_expand:  '%<span class="br0">&#123;</span>sql:SELECT SUM<span class="br0">&#40;</span>AcctSessionTime<span class="br0">&#41;</span> FROM radacct WHERE UserName='min5'<span class="br0">&#125;</span>'
<span class="br0">&#91;</span>noresetcounter<span class="br0">&#93;</span> sql_xlat
<span class="br0">&#91;</span>noresetcounter<span class="br0">&#93;</span>     expand: %<span class="br0">&#123;</span>User-Name<span class="br0">&#125;</span> -&gt; min5
<span class="br0">&#91;</span>noresetcounter<span class="br0">&#93;</span> sql_set_user escaped user --&gt; 'min5'
<span class="br0">&#91;</span>noresetcounter<span class="br0">&#93;</span>     expand: SELECT SUM<span class="br0">&#40;</span>AcctSessionTime<span class="br0">&#41;</span> FROM radacct WHERE UserName='min5' -&gt; SELECT SUM<span class="br0">&#40;</span>AcctSessionTime<span class="br0">&#41;</span> FROM radacct WHERE UserName='min5'
rlm_sql <span class="br0">&#40;</span>sql<span class="br0">&#41;</span>: Reserving sql socket id: <span style="">1</span>
<span class="br0">&#91;</span>noresetcounter<span class="br0">&#93;</span> sql_xlat finished
rlm_sql <span class="br0">&#40;</span>sql<span class="br0">&#41;</span>: Released sql socket id: <span style="">1</span>
<span class="br0">&#91;</span>noresetcounter<span class="br0">&#93;</span>     expand: %<span class="br0">&#123;</span>sql:SELECT SUM<span class="br0">&#40;</span>AcctSessionTime<span class="br0">&#41;</span> FROM radacct WHERE UserName='min5'<span class="br0">&#125;</span> -&gt; <span style="">124</span>
rlm_sqlcounter: Check item is greater than query result
rlm_sqlcounter: Authorized user min5, check_item=<span style="">300</span>, counter=<span style="">124</span>
rlm_sqlcounter: Sent Reply-Item for user min5, Type=Session-Timeout, value=<span style="">176</span>
++<span class="br0">&#91;</span>noresetcounter<span class="br0">&#93;</span> returns ok
&nbsp;
Sending Access-Accept of id <span style="">85</span> to 78.114.63.174 port <span style="">53158</span>
Session-Timeout == <span style="">176</span>
<span class="br0">&#91;</span>...<span class="br0">&#93;</span></pre></div></div>

<p>Si <strong>Max-All-Session &lt; SUM(AcctSessionTime)</strong> alors on aura:</p>

<div class="wp_syntax"><div class="code"><pre class="" style="font-family:monospace;"><span class="br0">&#91;</span>...<span class="br0">&#93;</span>
rlm_sqlcounter: Entering module authorize code
sqlcounter_expand:  'SELECT SUM<span class="br0">&#40;</span>AcctSessionTime<span class="br0">&#41;</span> FROM radacct WHERE UserName='%<span class="br0">&#123;</span>User-Name<span class="br0">&#125;</span>''
<span class="br0">&#91;</span>noresetcounter<span class="br0">&#93;</span>     expand: SELECT SUM<span class="br0">&#40;</span>AcctSessionTime<span class="br0">&#41;</span> FROM radacct WHERE UserName='%<span class="br0">&#123;</span>User-Name<span class="br0">&#125;</span>' -&gt; SELECT SUM<span class="br0">&#40;</span>AcctSessionTime<span class="br0">&#41;</span> FROM radacct WHERE UserName='min5'
sqlcounter_expand:  '%<span class="br0">&#123;</span>sql:SELECT SUM<span class="br0">&#40;</span>AcctSessionTime<span class="br0">&#41;</span> FROM radacct WHERE UserName='min5'<span class="br0">&#125;</span>'
<span class="br0">&#91;</span>noresetcounter<span class="br0">&#93;</span> sql_xlat
<span class="br0">&#91;</span>noresetcounter<span class="br0">&#93;</span>     expand: %<span class="br0">&#123;</span>User-Name<span class="br0">&#125;</span> -&gt; min5
<span class="br0">&#91;</span>noresetcounter<span class="br0">&#93;</span> sql_set_user escaped user --&gt; 'min5'
<span class="br0">&#91;</span>noresetcounter<span class="br0">&#93;</span>     expand: SELECT SUM<span class="br0">&#40;</span>AcctSessionTime<span class="br0">&#41;</span> FROM radacct WHERE UserName='min5' -&gt; SELECT SUM<span class="br0">&#40;</span>AcctSessionTime<span class="br0">&#41;</span> FROM radacct WHERE UserName='min5'
rlm_sql <span class="br0">&#40;</span>sql<span class="br0">&#41;</span>: Reserving sql socket id: <span style="">1</span>
<span class="br0">&#91;</span>noresetcounter<span class="br0">&#93;</span> sql_xlat finished
rlm_sql <span class="br0">&#40;</span>sql<span class="br0">&#41;</span>: Released sql socket id: <span style="">1</span>
<span class="br0">&#91;</span>noresetcounter<span class="br0">&#93;</span>     expand: %<span class="br0">&#123;</span>sql:SELECT SUM<span class="br0">&#40;</span>AcctSessionTime<span class="br0">&#41;</span> FROM radacct WHERE UserName='min5'<span class="br0">&#125;</span> -&gt; <span style="">301</span>
rlm_sqlcounter: <span class="br0">&#40;</span>Check item - counter<span class="br0">&#41;</span> is less than zero
rlm_sqlcounter: Rejected user min5, check_item=<span style="">300</span>, counter=<span style="">301</span>
++<span class="br0">&#91;</span>noresetcounter<span class="br0">&#93;</span> returns reject
&nbsp;
Sending Access-Reject of id <span style="">124</span> to 78.114.63.174 port <span style="">51651</span>
Reply-Message = &quot;Your maximum never usage time has been reached&quot;
<span class="br0">&#91;</span>...<span class="br0">&#93;</span></pre></div></div>

<p>Néanmoins, que se passe t&#8217;il lors de la première connexion de l&#8217;utilisateur, alors qu&#8217;il n&#8217;y a aucune durée de connexion loggée dans la table <em>radacct</em> ?</p>

<div class="wp_syntax"><div class="code"><pre class="" style="font-family:monospace;"><span class="br0">&#91;</span>...<span class="br0">&#93;</span>
rlm_sqlcounter: Entering module authorize code
sqlcounter_expand:  'SELECT SUM<span class="br0">&#40;</span>AcctSessionTime<span class="br0">&#41;</span> FROM radacct WHERE UserName='%<span class="br0">&#123;</span>User-Name<span class="br0">&#125;</span>''
<span class="br0">&#91;</span>noresetcounter<span class="br0">&#93;</span>     expand: SELECT SUM<span class="br0">&#40;</span>AcctSessionTime<span class="br0">&#41;</span> FROM radacct WHERE UserName='%<span class="br0">&#123;</span>User-Name<span class="br0">&#125;</span>' -&gt; SELECT SUM<span class="br0">&#40;</span>AcctSessionTime<span class="br0">&#41;</span> FROM radacct WHERE UserName='min5'
sqlcounter_expand:  '%<span class="br0">&#123;</span>sql:SELECT SUM<span class="br0">&#40;</span>AcctSessionTime<span class="br0">&#41;</span> FROM radacct WHERE UserName='min5'<span class="br0">&#125;</span>'
<span class="br0">&#91;</span>noresetcounter<span class="br0">&#93;</span> sql_xlat
<span class="br0">&#91;</span>noresetcounter<span class="br0">&#93;</span>     expand: %<span class="br0">&#123;</span>User-Name<span class="br0">&#125;</span> -&gt; min5
<span class="br0">&#91;</span>noresetcounter<span class="br0">&#93;</span> sql_set_user escaped user --&gt; 'min5'
<span class="br0">&#91;</span>noresetcounter<span class="br0">&#93;</span>     expand: SELECT SUM<span class="br0">&#40;</span>AcctSessionTime<span class="br0">&#41;</span> FROM radacct WHERE UserName='min5' -&gt; SELECT SUM<span class="br0">&#40;</span>AcctSessionTime<span class="br0">&#41;</span> FROM radacct WHERE UserName='min5'
rlm_sql <span class="br0">&#40;</span>sql<span class="br0">&#41;</span>: Reserving sql socket id: <span style="">1</span>
<span class="br0">&#91;</span>noresetcounter<span class="br0">&#93;</span> row<span class="br0">&#91;</span><span style="">0</span><span class="br0">&#93;</span> returned NULL
rlm_sql <span class="br0">&#40;</span>sql<span class="br0">&#41;</span>: Released sql socket id: <span style="">1</span>
<span class="br0">&#91;</span>noresetcounter<span class="br0">&#93;</span>     expand: %<span class="br0">&#123;</span>sql:SELECT SUM<span class="br0">&#40;</span>AcctSessionTime<span class="br0">&#41;</span> FROM radacct WHERE UserName='min5'<span class="br0">&#125;</span> -&gt;
rlm_sqlcounter: No integer found in string &quot;&quot;
++<span class="br0">&#91;</span>noresetcounter<span class="br0">&#93;</span> returns noop
&nbsp;
Sending Access-Accept of id <span style="">81</span> to 78.114.63.174 port <span style="">57171</span>
<span class="br0">&#91;</span>...<span class="br0">&#93;</span></pre></div></div>

<p><strong>Rlm_sqlcounter</strong> n&#8217;est pas capable d&#8217;effectuer sa requête puisqu&#8217;il n&#8217;y a pas de session antérieure concernant le nouvel utilisateur. Il est échoue et freeradius renvoie un <strong>Access-Accept</strong>, sans <strong>Session-Timeout</strong>, donc sans aucune restriction concernant la durée de connexion !</p>
<p>Il faut préalablement définir pour l&#8217;utilisateur (table <em>radreply</em>) ou un groupe d&#8217;utilisateur (table <em>radgroupreply</em>) un <strong>Session-Timeout</strong> correspondant au <strong>Max-All-Session</strong>, afin qu&#8217;il soit utilisé lors de la première connexion. Pour les futures connexions, le module <strong>Rlm_sqlcounter</strong> génèrera un <strong>Session-Timeout</strong> que freeradius utilisera à la place de la valeur configurée par défaut.</p>
]]></content:encoded>
			<wfw:commentRss>http://aandre.evolix.net/2009/04/15/freeradius-et-rlm_sqlcounter/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
