Tutorial, HowTo, How-To ...

Ce HowTo décrit l’installation d’un serveur Freeradius + MySQL sur une distribution Debian, version sarge (testing) ; ainsi qu’une interface web d’administration : Dialupadmin.

N’hésitez pas à m’envoyer un petit mail pour toute remarque et améliorer ce How-To.

Rq : les commentaires dans le code sont en italique : exemple de commentaire

Historique des modifications

  • 11/06/2008 : nouveau tutorial pour l’installation de freeradius 2.0.4 : Installation de freeradius 2.0.4 + mysql sur une debian (testing)
  • 07/07/2006 : addendum pour debian testing/etch
  • 19/01/2006 : ajout d’1 chapitre sur l’installation de apache2-ssl suite à plusieurs questions sur sa configuration
  • 20/12/2005 : ajout d’1 chapitre sur l’utilisation de la table ’nas’ de la base MySQL

Installation de Freeradius

# apt-get install freeradius
# apt-get install freeradius-dialupadmin
# apt-get install freeradius-mysql

Installation de MySQL

# apt-get install mysql-server
# apt-get install mysql-client

Configuration de MySQL

# echo "create database radius;" | mysql -u root -p
# echo "grant all on radius.* to radius@'%' identified by 'motdepasse_sql'; flush privileges;" | mysql -u root -p
# zcat /usr/share/doc/freeradius/examples/db_mysql.sql.gz | mysql -u root -p radius

Rq : (07/07/2006) dans la debian etch, freeradius>= 1.1.2-1, le fichier est /usr/share/doc/freeradius/examples/mysql.sql.gz donc vous devez désormais taper :

# zcat /usr/share/doc/freeradius/examples/mysql.sql.gz | mysql -u root -p radius

Création de comptes utilisateur

Vous pouvez choisir les méthodes d’authentification CHAP ou PAP. Pour connaître les avantages et inconvénients de chaque méthode, je vous invite à lire la FAQ 4.4 de Freeradius.

- Créer un nouvel utilisateur (Thus0) avec un mot de passe stocké en clair (motdepasse) (authentification CHAP)

# echo "INSERT INTO radcheck(UserName,Attribute,op,Value) VALUES ('Thus0','User-Password','==','motdepasse');" | mysql -u root -p radius

- Créer un utilisateur (Thus0) avec un mot de passe crypté (motdepasse) (authentification PAP)

# echo "INSERT INTO radcheck(UserName,Attribute,op,Value) VALUES ('Thus0','Crypt-Password','==',ENCRYPT('motdepasse')); " | mysql -u root -p radius
# echo "INSERT INTO radcheck(UserName,Attribute,op,Value) VALUES ('Thus0','Auth-Type',':=','Crypt-Local'); " | mysql -u root -p radius

Configuration de Freeradius

Modifier le fichier /etc/freeradius/sql.conf

sql {
        driver = "rlm_sql_mysql"
        server = "localhost"
        login = "radius"
        password = "motdepasse_sql"
        radius_db = "radius"
        [...]
        # Set to 'yes' to read radius clients from the database ('nas' table)
        readclient = yes
}

Modifier le fichier /etc/freeradius/radiusd.conf

        $INCLUDE ${confdir}/sql.conf
authorize {
        preprocess
        chap
        suffix
        eap
        #files
        sql
}
authenticate {
        Auth-Type PAP {
          pap
        }
        Auth-Type CHAP {
          chap
        }
        eap
}
accounting {
        detail
        radutmp
        sql
}
session {
        sql
}

Test de l’installation de freeradius

- créer un NAS [1] pour tester en local au freeradius : modifier dans le fichier /etc/freeradius/clients.conf le secret partagé entre le NAS et le serveur radius :

client 127.0.0.1 {
       #
       #  The shared secret use to "encrypt" and "sign" packets between
       #  the NAS and FreeRADIUS.  You MUST change this secret from the
       #  default, otherwise it's not a secret any more!
       #
       #  The secret can be any string, up to 32 characters in length.
       #
       #secret         = testing123
       secret          = monsecret_nasradius
}

- Lancer freeradius en mode console pour voir les messages de debug :

# /etc/init.d/freeradius stop
# freeradius -XXX -A
[...]
Debug: Listening on authentication *:1812
Debug: Listening on accounting *:1813
Debug: Listening on proxy *:1814
Info: Ready to process requests.

- Utiliser l’outil radtest : la syntaxe est de la forme : radtest utilisateur mot_de_passe_utilisateur ip_serveur_radius numero_port_NAS secret_partage_NAS_radius

# radtest Thus0 motdepasse 127.0.0.1 0 monsecret_nasradius
Sending Access-Request of id 95 to 127.0.0.1:1812
       User-Name = "Thus0"
       User-Password = "motdepasse"
       NAS-IP-Address = localhost
       NAS-Port = 0
rad_recv: Access-Accept packet from host 127.0.0.1:1812, id=95, length=20

Vous devriez avoir une réponse Access-Accept si tout est bien configuré !

Dans les messages de debug de freeradius, vous devriez également voir les lignes suivantes :

[...]
rad_recv: Access-Request packet from host 127.0.0.1:51307, id=95, length=60
       User-Name = "Thus0"
       User-Password = "motdepasse"
       NAS-IP-Address = 255.255.255.255
       NAS-Port = 0
Debug:   Processing the authorize section of radiusd.conf
Debug: modcall: entering group authorize for request 4
Debug:   modsingle[authorize]: calling preprocess (rlm_preprocess) for request 4
Debug:   modsingle[authorize]: returned from preprocess (rlm_preprocess) for request 4
Debug:   modcall[authorize]: module "preprocess" returns ok for request 4
Debug:   modsingle[authorize]: calling chap (rlm_chap) for request 4
Debug:   modsingle[authorize]: returned from chap (rlm_chap) for request 4
Debug:   modcall[authorize]: module "chap" returns noop for request 4
Debug:   modsingle[authorize]: calling suffix (rlm_realm) for request 4
Debug:     rlm_realm: No '@' in User-Name = "Thus0", looking up realm NULL
Debug:     rlm_realm: No such realm "NULL"
Debug:   modsingle[authorize]: returned from suffix (rlm_realm) for request 4
Debug:   modcall[authorize]: module "suffix" returns noop for request 4
Debug:   modsingle[authorize]: calling eap (rlm_eap) for request 4
Debug:   rlm_eap: No EAP-Message, not doing EAP
Debug:   modsingle[authorize]: returned from eap (rlm_eap) for request 4
Debug:   modcall[authorize]: module "eap" returns noop for request 4
Debug:   modsingle[authorize]: calling sql (rlm_sql) for request 4
Debug: radius_xlat:  'Thus0'
Debug: rlm_sql (sql): sql_set_user escaped user --> 'Thus0'
Debug: radius_xlat:  'SELECT id,UserName,Attribute,Value,op FROM radcheck WHERE Username = 'Thus0' ORDER BY id'
[...]
Debug: rlm_sql (sql): Released sql socket id: 3
Debug:   modsingle[authorize]: returned from sql (rlm_sql) for request 4
Debug:   modcall[authorize]: module "sql" returns ok for request 4
Debug: modcall: group authorize returns ok for request 4
[...]
Auth: Login OK: [Thus0/motdepasse] (from client localhost port 0)
Sending Access-Accept of id 228 to 127.0.0.1:51428
Debug: Finished request 4
Debug: Going to the next request
Debug: --- Walking the entire request list ---

Vous devriez avoir une ligne du type Sending Access-Accept of id 228 to 127.0.0.1:51428 si tout est bien configuré !

Dans ce cas, vous pouvez arrêter freeradius, en tapant Ctr+C puis relancer freeradius en tâche de fond :

# /etc/init.d/freeradius start

Installation de apache2-ssl

Il existe de nombreux tutoriaux détaillant l’installation de apache2-ssl. Ci-dessous, je résume les principales étapes :

- Installer les packages debian nécessaires :

# apt-get install apache2 apache2-common apache2-utils
# apt-get install libapache2-mod-php4

- Générer un certificat /etc/apache2/ssl/apache.pem pour le serveur web : lancer la commander suivante et répondre aux questions :

# apache2-ssl-certificate -days 365

creating selfsigned certificate
replace it with one signed by a certification authority (CA)

enter your ServerName at the Common Name prompt

If you want your certificate to expire after x days call this programm
with -days x
Generating a 1024 bit RSA private key
..............++++++
..........++++++
writing new private key to '/etc/apache2/ssl/apache.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [GB]:FR
State or Province Name (full name) [Some-State]:Paris
Locality Name (eg, city) []:Paris
Organization Name (eg, company; recommended) []:Pervasive
Organizational Unit Name (eg, section) []:
server name (eg. ssl.domain.tld; required!!!) []:www.pervasive-network.org
Email Address []:root@pervasive-network.org

- Créer un fichier de configuration pour le serveur web :

# zcat /usr/share/doc/apache2.2-common/examples/apache2/extra/httpd-ssl.conf.gz > /etc/apache2/sites-available/ssl.conf

(Rq : dans les versions antérieures, le fichier était /usr/share/doc/apache2/examples/ssl-std.conf.gz)

Dans ce fichier, modifier la ligne suivante :

SSLCertificateFile /etc/apache2/ssl/apache.pem

- Activer les modules (ssl php4 rewrite) et le fichier de conf ssl.conf :

# a2enmod ssl
# a2enmod php4
# a2enmod rewrite
# a2ensite ssl.conf

Installation de Freeradius DialupAdmin

Vérifier que le module php4-mysql est installé et activé (sinon vous aurez des pages blanches).

- Installer la librairie php4-mysql :

# apt-get install php4-mysql

- Activer la librairie php4-mysql : Dans le fichier /etc/php4/apache2/php.ini, vérifier que la ligne extension=mysql.so n’est pas commentée. Rq : sous Mandriva, le fichier à modifier est : /etc/php.ini

- Dans le fichier /etc/apache2/sites-available/ssl.conf, rajouter les lignes suivantes :

Alias /dialupadmin/ "/usr/share/freeradius-dialupadmin/htdocs/"
<Directory /usr/share/freeradius-dialupadmin/htdocs>
 #SSLVerifyClient require
 #SSLVerifyDepth 5
 Options Indexes FollowSymLinks MultiViews
 AllowOverride None
 Order allow,deny
 Allow from all
</Directory>

L’interface web dialupadmin sera alors accessible via l’URL : https://adresse_ip/dialupadmin

- Modifier le fichier /etc/freeradius-dialupadmin/admin.conf :

general_base_dir: /usr/share/freeradius-dialupadmin
general_radiusd_base_dir: /usr/sbin
general_domain: paris-sansfil.fr
general_strip_realms : yes

general_raddb_dir: /etc/freeradius
general_clients_conf: /etc/freeradius/clients.conf
general_sql_attrmap: %{general_base_dir}/conf/sql.attrmap
general_accounting_attrs_file: %{general_base_dir}/conf/accounting.attrs
general_extra_ldap_attrmap: %{general_base_dir}/conf/extra.ldap-attrmap

general_radius_server: localhost
general_radius_server_port: 1812

# can be either pap or chap
# general_radius_server_auth_proto: pap
general_radius_server_auth_proto: chap

general_radius_server_secret: monsecret_nasradius

# can be one of crypt,md5,clear
general_encryption_method: clear

#
# can be one of mysql,pg where:
# mysq: MySQL database (port 3306)
# pg: PostgreSQL database (port 5432)
#
sql_type: mysql
sql_server: localhost
sql_port: 3306
# mettre le nom utilisateur (à modifier)
sql_username: radius
# mot de passe utilisateur (à modifier)
sql_password: motdepasse_sql
sql_database: radius
sql_accounting_table: radacct
sql_badusers_table: badusers
sql_check_table: radcheck
sql_reply_table: radreply
sql_user_info_table: userinfo
sql_groupcheck_table: radgroupcheck
sql_groupreply_table: radgroupreply
sql_usergroup_table: usergroup
sql_total_accounting_table: totacct
sql_nas_table: nas

sql_command: /usr/bin/mysql

general_snmpwalk_command: /usr/bin/snmpwalk
general_snmpget_command: /usr/bin/snmpget

sql_debug: false

- Créer les tables MySQL :

# cd /usr/share/freeradius-dialupadmin/sql
# mysql -u radius -p radius < badusers.sql
# mysql -u radius -p radius < mtotacct.sql
# mysql -u radius -p radius < totacct.sql
# mysql -u radius -p radius < userinfo.sql

- Dans les 2 fichiers /usr/share/freeradius-dialupadmin/bin/monthly/bin/monthly_tot_stats et /usr/share/freeradius-dialupadmin/bin/tot_stats, remplacer la ligne suivante :

$sql_password = ($sql_password == '') ? '' : "-p$sql_password";

par la ligne :

$sql_password = ($sql_password eq '') ? '' : "-p$sql_password";

- Rajouter les 2 scripts précédents dans la crontab : cf. le fichier /usr/share/doc/freeradius-dialupadmin/examples/freeradius-dialupadmin.cron

Captures d’écran/Screenshots

Si tout est bien configuré, voici les screenshots que vous devriez obtenir avec Freeradius + MySQL et ChilliSpot...

- Statistics

- Online Users

Pour modifier la liste des NAS, il faut modifier le fichier : /usr/share/freeradius-dialupadmin/conf/naslist.conf. Rq (mise à jour le le mardi 20 décembre 2005) : il est également possible d’utiliser la table ’nas’ de la base MySQL : cf. le dernier chapitre ajouté à cet article).

Par exemple, pour mon PC où est installé le logiciel chillispot (portail captif) :

nas1_name: localhost-chillispot
nas1_model: Packard Bell with Debian testing
nas1_ip: 127.0.0.1
nas1_port_num: 16
nas1_community: public

- User Statistics

Utilisation de la table ’nas’ de la base MySQL

article mis à jour le mardi 20 décembre 2005.

Ci-dessous, voici les étapes pour utiliser la table ’nas’ de la base MySQL :

- dans le fichier /etc/freeradius/sql.conf, vérifier que la dernière ligne est décommentée :

        readclient = yes

- ajouter une nouvelle entrée dans la table ’nas’ (il faut mettre l’adresse IP dans la variable ’nasname’) :

soit en ligne de commande MySQL :

# echo "INSERT INTO nas(id,nasname,shortname,type,ports,secret,community,description) VALUES ('','127.0.0.1','nas1','other',NULL,'monsecret_nasradius','public','test de nas');" | mysql -u radius -p radius

(petit rappel : le mot de passe du tutorial pour l’utilisateur radius est motdepasse_sql)

soit en utilisant l’interface graphique de dialupadmin, en cliquant dans le menu "RADIUS Clients" et en remplissant les champs adéquats, par exemple :

NAS Name : 127.0.0.1
NAS Short Name : nas1
NAS Type : Other
NAS Ports Number :
NAS Secret : monsecret_nasradius
NAS SNMP community : public
NAS Description : test de nas

- Prise en compte des modifications de la table ’nas’.

A la date de l’écriture de cet article, l’ajout d’une nouvelle entrée dans la table NAS n’est pas dynamique (la liste des NAS est construite au lancement de freeradius à partir du fichier /etc/freeradius/clients.conf et de la table sql ’nas’). Pour prendre en compte l’ajout du nouveau NAS, il faut soit :

  • relancer le serveur freeradius :
# /etc/init.d/freeradius restart
  • recharger la configuration du serveur freeradius :

Vérifier auparavant que les fichiers de configuration sont en lecture pour l’utilisateur sous lequel tourne le daemon freeradius :

# cd /etc/freeradius/
# chown root:freerad ./*
# chmod g+r ./*

Vous pouvez maintenant recharger la configuration du serveur :

# /etc/init.d/freeradius reload

Client de test pour Microsoft Windows

PNG - 26 ko
NTRadPing

[1] Network Access Server