FreeRadius

De NCad Wiki
Aller à la navigation Aller à la recherche

center

Présentation

FreeRadius (Remote Authentication Dial-In User Service) est un serveur Radius libre sous license BSD soutenu par la société Network Radius SARL. Le protocol RADIUS permet de centraliser les informations d'authentification des utilisateurs. Ces informations sont stockées dans une base de données. Elles sont sollicitées lorsque le client (l'utilisateur) tente d'établir une session. La requête est alors transmise à un serveur (client) qui soumet la requête d'authentification au serveur radius central. Cet exemple peut être illustré avec les réseaux wifi de grande envergure. Les utilisateurs sont stockés dans la base de données du serveur radius. L'opérateur dispose de plusieurs points d'accès pour proposer son service sans fil. Lorsqu'un client se connecte avec ses identifiants, ces derniers sont soumis à la borne wifi. Cette dernière transmet la requête d'authentification au serveur RADIUS central qui répond favorablement ou non à la requête initiale.

Installation

  • Le logiciel serveur FreeRadius est disponible dans les dépôts Ubuntu. Pour l'installer il suffit de lancer la commande suivante :

sudo apt-get install freeradius freeradius-utils freeradius-mysql

clients.conf

Le fichier clients.conf contient la liste des machines autorisées à transmettre une requête d'authentification au serveur RADIUS. Par défaut, le serveur est aussi un client RADIUS et on retrouve ces quelques lignes dans le fichier :

client localhost {
       secret          = testing123
       ipaddr          = 127.0.0.1
       nastype         = other
}

Si une autre machine - comme un point d'accès par exemple - est amené à transmettre des requêtes au serveur RADIUS, il faudra au préalable le renseigner dans le fichier clients.conf et définir un secret partagé. Dans notre cas le point d'accès dispose d'une IP fixe qui est 10.0.0.110 :

client 10.0.0.110 {
       secret          = secretpartage
       ipaddr          = 10.0.0.110
       nastype         = other
}

Module MySQL

Installation du module

Ce module permettra de renseigner directement dans la base de données les clients et utilisateurs RADIUS au lieu d'éditer les fichier clients.conf et users. Au préalable on créera sur le serveur MySQL une base de données dédiée à freeradius.

  • Voici la liste des tables SQL a créer dans la base de données nouvellement crée :
CREATE TABLE radacct (
 radacctid bigint(21) NOT NULL auto_increment,
 acctsessionid varchar(64) NOT NULL default ,
 acctuniqueid varchar(32) NOT NULL default ,
 username varchar(64) NOT NULL default ,
 groupname varchar(64) NOT NULL default ,
 realm varchar(64) default ,
 nasipaddress varchar(15) NOT NULL default ,
 nasportid varchar(15) default NULL,
 nasporttype varchar(32) default NULL,
 acctstarttime datetime NULL default NULL,
 acctstoptime datetime NULL default NULL,
 acctsessiontime int(12) default NULL,
 acctauthentic varchar(32) default NULL,
 connectinfo_start varchar(50) default NULL,
 connectinfo_stop varchar(50) default NULL,
 acctinputoctets bigint(20) default NULL,
 acctoutputoctets bigint(20) default NULL,
 calledstationid varchar(50) NOT NULL default ,
 callingstationid varchar(50) NOT NULL default ,
 acctterminatecause varchar(32) NOT NULL default ,
 servicetype varchar(32) default NULL,
 framedprotocol varchar(32) default NULL,
 framedipaddress varchar(15) NOT NULL default ,
 acctstartdelay int(12) default NULL,
 acctstopdelay int(12) default NULL,
 xascendsessionsvrkey varchar(10) default NULL,
 PRIMARY KEY  (radacctid),
 KEY username (username),
 KEY framedipaddress (framedipaddress),
 KEY acctsessionid (acctsessionid),
 KEY acctsessiontime (acctsessiontime),
 KEY acctuniqueid (acctuniqueid),
 KEY acctstarttime (acctstarttime),
 KEY acctstoptime (acctstoptime),
 KEY nasipaddress (nasipaddress)
) ;

CREATE TABLE radcheck (
 id int(11) unsigned NOT NULL auto_increment,
 username varchar(64) NOT NULL default ,
 attribute varchar(64)  NOT NULL default ,
 op char(2) NOT NULL DEFAULT '==',
 value varchar(253) NOT NULL default ,
 PRIMARY KEY  (id),
 KEY username (username(32))
) ;

CREATE TABLE radgroupcheck (
 id int(11) unsigned NOT NULL auto_increment,
 groupname varchar(64) NOT NULL default ,
 attribute varchar(64)  NOT NULL default ,
 op char(2) NOT NULL DEFAULT '==',
 value varchar(253)  NOT NULL default ,
 PRIMARY KEY  (id),
 KEY groupname (groupname(32))
) ;

CREATE TABLE radgroupreply (
 id int(11) unsigned NOT NULL auto_increment,
 groupname varchar(64) NOT NULL default ,
 attribute varchar(64)  NOT NULL default ,
 op char(2) NOT NULL DEFAULT '=',
 value varchar(253)  NOT NULL default ,
 PRIMARY KEY  (id),
 KEY groupname (groupname(32))
) ;

CREATE TABLE radreply (
 id int(11) unsigned NOT NULL auto_increment,
 username varchar(64) NOT NULL default ,
 attribute varchar(64) NOT NULL default ,
 op char(2) NOT NULL DEFAULT '=',
 value varchar(253) NOT NULL default ,
 PRIMARY KEY  (id),
 KEY username (username(32))
) ;

CREATE TABLE radusergroup (
 username varchar(64) NOT NULL default ,
 groupname varchar(64) NOT NULL default ,
 priority int(11) NOT NULL default '1',
 KEY username (username(32))
) ;

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)
) ;

CREATE TABLE nas (
 id int(10) NOT NULL auto_increment,
 nasname varchar(128) NOT NULL,
 shortname varchar(32),
 type varchar(30) DEFAULT 'other',
 ports int(5),
 secret varchar(60) DEFAULT 'secret' NOT NULL,
 server varchar(64),
 community varchar(50),
 description varchar(200) DEFAULT 'RADIUS Client',
 PRIMARY KEY (id),
 KEY nasname (nasname)
);


Les fichiers de commandes sont stockées dans le dossier /etc/freeradius/sql/mysql. Il s'agit ici des fichiers schema.sql et nas.sql.
  • Pour que FreeRadius interroge la base de données MySQL, il faut adapter le fichier de configuration sql.conf qui regroupe les informations de connexion au serveur :
sql {
       database = "mysql"        
       driver = "rlm_sql_${database}"
       server = "<ip_server>"
       login = "<login>"
       password = "<mot_de_passe>"
       radius_db = "<nom_de_la_base_mysql>"
[...]
}
  • Dans le fichier /etc/freeradius/radiusd.conf il faut également décommenter la ligne suivantes :
$INCLUDE sql.conf
  • Et enfin dans le fichier /etc/freeradius/sites-enabled/default il faut décommenter toutes les lignes contenant le terme sql.

Création d'un utilisateur

Les utilisateurs sont définis dans la table radcheck. Ici, nous allons créer l'utilisateur test qui a pour mot de passe 123 :

INSERT INTO `freeradius`.`radcheck` (
 `id` ,
 `username` ,
 `attribute` ,
 `op` ,
 `value`
)
VALUES (
 NULL , 'test', 'Cleartext-Password', ':=', '123'
);

La colonne op doit contenir l'opérateur ':='et non '==' !

Vérification

  • Pour vérifier le fonctionnement du serveur radius, il faut d'abord arrêter ce dernier si il a été démarré :

sudo /etc/init.d/freeradius stop

  • Ensuite sur le même terminal, on exécute FreeRadius en mode débogueur pour voir en temps réel les requêtes qui lui sont soumises :

sudo freeradius -XX

  • Puis dans un second terminal on va tester l'authentification de l'utilisateur test avec son mot de passe 123 :

radtest test 123 127.0.0.1 0 testing123

  • Dans ce même terminal on observe immédiatement la réponse suivante :

Sending Access-Request of id 16 to 127.0.0.1 port 1812
User-Name = "test"
User-Password = "123"
NAS-IP-Address = 127.0.1.1
NAS-Port = 0
rad_recv: Access-Accept packet from host 127.0.0.1 port 1812, id=16, length=20

  • Tandis que sur le premier terminal on obtient en détail la requête et sa résolution par le serveur :

rad_recv: Access-Request packet from host 127.0.0.1 port 34964, id=16, length=56
User-Name = "test"
User-Password = "123"
NAS-IP-Address = 127.0.1.1
NAS-Port = 0
Wed Aug 31 00:39:53 2011 : Info: # Executing section authorize from file /etc/freeradius/sites-enabled/default
Wed Aug 31 00:39:53 2011 : Info: +- entering group authorize {...}
Wed Aug 31 00:39:53 2011 : Info: ++[preprocess] returns ok
Wed Aug 31 00:39:53 2011 : Info: ++[chap] returns noop
Wed Aug 31 00:39:53 2011 : Info: ++[mschap] returns noop
Wed Aug 31 00:39:53 2011 : Info: ++[digest] returns noop
Wed Aug 31 00:39:53 2011 : Info: [suffix] No '@' in User-Name = "test", looking up realm NULL
Wed Aug 31 00:39:53 2011 : Info: [suffix] No such realm "NULL"
Wed Aug 31 00:39:53 2011 : Info: ++[suffix] returns noop
Wed Aug 31 00:39:53 2011 : Info: [eap] No EAP-Message, not doing EAP
Wed Aug 31 00:39:53 2011 : Info: ++[eap] returns noop
Wed Aug 31 00:39:53 2011 : Info: ++[files] returns noop
Wed Aug 31 00:39:53 2011 : Info: [sql] expand: %{User-Name} -> test
Wed Aug 31 00:39:53 2011 : Info: [sql] sql_set_user escaped user --> 'test'
Wed Aug 31 00:39:53 2011 : Debug: rlm_sql (sql): Reserving sql socket id: 4
Wed Aug 31 00:39:53 2011 : Info: [sql] expand: SELECT id, username, attribute, value, op FROM radcheck WHERE username = '%{SQL-User-Name}' ORDER BY id -> SELECT id, username, attribute, value, op FROM radcheck WHERE username = 'test' ORDER BY id
Wed Aug 31 00:39:53 2011 : Info: [sql] User found in radcheck table
Wed Aug 31 00:39:53 2011 : Info: [sql] expand: SELECT id, username, attribute, value, op FROM radreply WHERE username = '%{SQL-User-Name}' ORDER BY id -> SELECT id, username, attribute, value, op FROM radreply WHERE username = 'test' ORDER BY id
Wed Aug 31 00:39:53 2011 : Info: [sql] expand: SELECT groupname FROM radusergroup WHERE username = '%{SQL-User-Name}' ORDER BY priority -> SELECT groupname FROM radusergroup WHERE username = 'test' ORDER BY priority
Wed Aug 31 00:39:53 2011 : Debug: rlm_sql (sql): Released sql socket id: 4
Wed Aug 31 00:39:53 2011 : Info: ++[sql] returns ok
Wed Aug 31 00:39:53 2011 : Info: ++[expiration] returns noop
Wed Aug 31 00:39:53 2011 : Info: ++[logintime] returns noop
Wed Aug 31 00:39:53 2011 : Info: ++[pap] returns updated
Wed Aug 31 00:39:53 2011 : Debug: rlm_sqlcounter: Entering module authorize code
Wed Aug 31 00:39:53 2011 : Debug: rlm_sqlcounter: Could not find Check item value pair
Wed Aug 31 00:39:53 2011 : Info: ++[noresetcounter] returns noop
Wed Aug 31 00:39:53 2011 : Debug: rlm_sqlcounter: Entering module authorize code
Wed Aug 31 00:39:53 2011 : Debug: rlm_sqlcounter: Could not find Check item value pair
Wed Aug 31 00:39:53 2011 : Info: ++[dailycounter] returns noop
Wed Aug 31 00:39:53 2011 : Info: Found Auth-Type = PAP
Wed Aug 31 00:39:53 2011 : Info: # Executing group from file /etc/freeradius/sites-enabled/default
Wed Aug 31 00:39:53 2011 : Info: +- entering group PAP {...}
Wed Aug 31 00:39:53 2011 : Info: [pap] login attempt with password "123"
Wed Aug 31 00:39:53 2011 : Info: [pap] Using clear text password "123"
Wed Aug 31 00:39:53 2011 : Info: [pap] User authenticated successfully
Wed Aug 31 00:39:53 2011 : Info: ++[pap] returns ok
Wed Aug 31 00:39:53 2011 : Info: # Executing section post-auth from file /etc/freeradius/sites-enabled/default
Wed Aug 31 00:39:53 2011 : Info: +- entering group post-auth {...}
Wed Aug 31 00:39:53 2011 : Info: [sql] expand: %{User-Name} -> test
Wed Aug 31 00:39:53 2011 : Info: [sql] sql_set_user escaped user --> 'test'
Wed Aug 31 00:39:53 2011 : Info: [sql] expand: %{User-Password} -> 123
Wed Aug 31 00:39:53 2011 : Info: [sql] expand: INSERT INTO radpostauth (username, pass, reply, authdate) VALUES ( '%{User-Name}', '%{%{User-Password}:-%{Chap-Password} }', '%{reply:Packet-Type}', '%S') -> INSERT INTO radpostauth (username, pass, reply, authdate) VALUES (
'test', '123', 'Access-Accept', '2011-08-31 00:39:53')
Wed Aug 31 00:39:53 2011 : Debug: rlm_sql (sql) in sql_postauth: query is INSERT INTO radpostauth (username, pass, reply, authdate) VALUES (
'test', '123', 'Access-Accept', '2011-08-31 00:39:53')
Wed Aug 31 00:39:53 2011 : Debug: rlm_sql (sql): Reserving sql socket id: 3
Wed Aug 31 00:39:53 2011 : Debug: rlm_sql (sql): Released sql socket id: 3
Wed Aug 31 00:39:53 2011 : Info: ++[sql] returns ok
Wed Aug 31 00:39:53 2011 : Info: ++[exec] returns noop
Sending Access-Accept of id 16 to 127.0.0.1 port 34964
Wed Aug 31 00:39:53 2011 : Info: Finished request 0.
Wed Aug 31 00:39:53 2011 : Debug: Going to the next request
Wed Aug 31 00:39:53 2011 : Debug: Waking up in 4.9 seconds.
Wed Aug 31 00:39:58 2011 : Info: Cleaning up request 0 ID 16 with timestamp +27
Wed Aug 31 00:39:58 2011 : Info: Ready to process requests.

Module counter

Rôle

Ce module permet d'appliquer des restrictions de durée aux sessions des utilisateurs.

Activation

  • Il faut activer le module en éditant le fichier /etc/freeradius/radiusd.conf et en décommentant la ligne :
$INCLUDE sql/mysql/counter.conf
  • Il faut définir dans le dictionnaire RADIUS les attribus Max-All-Session, Max-Daily-Session et Max-Monthly-Session :
ATTRIBUTE      Max-All-Session        3000    integer
ATTRIBUTE      Max-Daily-Session        3001    integer
ATTRIBUTE      Max-Monthly-Session        3002    integer
  • Ensuite il faut déclarer les fonctions définies dans le fichier /etc/freeradius/sql/mysql/counter.conf noresetcounter, dailycounter, monthlycounter dans le fichier de configuration /etc/freeradius/sites-enabled/default en les ajoutant à la section authorize comme ceci :

/etc/freeradius/sites-enabled/default dans la section authorize

authorize {
  [...]
  pap
  noresetcounter
  dailycounter
  monthlycounter
}

Utilisation

  • Pour limiter à 1 heure par jour la session utilisateur de test on ajoute dans la table radcheck l’attribue Max-Daily-Session avec pour valeur 3600 :
INSERT INTO `freeradius`.`radcheck` (
 `id` ,
 `username` ,
 `attribute` ,
 `op` ,
 `value`
)
VALUES (
 NULL , 'test', 'Max-Daily-Session', ':=', '3600'
);
  • Pour limiter à 31 heure par mois la session utilisateur de test on ajoute dans la table radcheck l’attribue Max-Monthly-Session avec pour valeur 111600 :
INSERT INTO `freeradius`.`radcheck` (
 `id` ,
 `username` ,
 `attribute` ,
 `op` ,
 `value`
)
VALUES (
 NULL , 'test', 'Max-Monthly-Session', ':=', '111600'
);
  • Pour limiter à 24 heure d'utilisation la session utilisateur de test on ajoute dans la table radcheck l’attribue Max-All-Session avec pour valeur 86400 :
INSERT INTO `freeradius`.`radcheck` (
 `id` ,
 `username` ,
 `attribute` ,
 `op` ,
 `value`
)
VALUES (
 NULL , 'test', 'Max-All-Session', ':=', '86400'
);

Limiter la bande passante

Dowload

  • Pour limiter la vitesse de téléchargement d'un utilisateur, il faut ajouter dans la table radreply un enregistrement avec comme attribue WISPr-Bandwidth-Max-Down et comme valeur le seuil de la vitesse de téléchargement exprimé en bps. Par exemple, on souhaite limiter la vitesse de téléchargement de l'utilisateur test à 256 kbps :
INSERT INTO `freeradius`.`radreply` (
 `id` ,
 `username` ,
 `attribute` ,
 `op` ,
 `value`
)
VALUES (
 NULL , 'test', 'WISPr-Bandwidth-Max-Down', '=', '256000'
);

La colonne op a pour valeur ici '=' et non := comme précédemment !

Upload

  • Pour limiter la vitesse d'envoi de données d'un utilisateur (transfert de fichiers par exemple, VoIP, ...), il faut ajouter dans la table radreply un enregistrement avec comme attribue WISPr-Bandwidth-Max-Up et comme valeur le seuil de la vitesse de téléchargement exprimé en bps. Par exemple, on souhaite limiter la vitesse d'envoi de données de l'utilisateur test à 128 kbps :
INSERT INTO `freeradius`.`radreply` (
 `id` ,
 `username` ,
 `attribute` ,
 `op` ,
 `value`
)
VALUES (
 NULL , 'test', 'WISPr-Bandwidth-Max-Up', '=', '128000'
);

Liens