Freeradius est un serveur RADIUS extrêmement complet, modulaire et stable. C’est un des fleurons du logiciel libre et sans doute le serveur radius le plus répandu au monde. Parmi les modules fournis par freeradius, certain permettent de plugin le radius à des bases de données pour l’authentification et l’accounting notamment. Cet article traite de l’intégration de freeradius avec les SGBD Oracle. En effet le support d’Oracle étant souvent retiré des packages fournis par les distributions pour d’évidentes raisons de licenses.
Freeradius n’est rien de moins que le serveur RADIUS le plus utilisé dans le monde. Cela n’a pourtant pas toujours été le cas. Il fut une époque où les déploiements de freeradius donnait lieu à de nombreuses interrogations voire même des railleries de la part des tiers avec lesquels on souhaitait implémenter un mécanisme d’authentification (lorsque vous faisiez de la collecte IP par exemple). Cette époque est maintenant révolu et aujourd’hui ce produit libre sous licence GPL a su s’imposer grâce à son coût, bien évidement, mais aussi grâce à sa conception modulaire qui le rend extrêmement versatile. A ma connaissance c’est le serveur radius qui gère le plus grand nombre de types d’authentification EAP. Ajoutez à cela la prise en charge les mécanismes d’authentification PAP, CHAP, MS-CHAP v1 et v2, Digest, PAM, ; des backends SQL, un backend LDAP et la prise en charge de plus d’une centaine de dictionnaires d’attributs (dont les attributs wimax)… et vous comprenez alors que « versatile » n’est pas un vain mot dans le monde du RADIUS. Pour couronner le tout le code est maintenu par la société networkradius, emmenée par Alan Dekok qui a participé à la rédaction de plusieurs RFC autour des protocoles RADIUS et DIAMETER. NetworkRadius propose d’ailleurs un support commercial de grande qualité comme c’est souvent le cas des produits opensource supportés commercialement (je vous en parle en tant qu’utilisateur du support commercial GOLD).
Dans cet article je vais détaillé un point un peu obscure de freeradius, et pour cause, puisqu’il s’agit de son interfaçage avec les SGBD Oracle… Si si: y’en a qu’on essayé… Ils ont eu des problèmes!
C’est certainement à cause de la nature non libre d’Oracle mais la documentation concernant freeradius et Oracle est assez sommaire et disparate. Nous allons donc voir comment intégrer de façon simple et efficace ces softs dans un environnement debian… bref comment construire un package debian freeradius-oracle!
Préparation de l’environnement:
A la base il nous faut bien entendu un sytème debian opérationnel. Ici on utilise une Debian Squeeze comme base de travail. On va tout d’abord y installer un les outils nécessaires à la compilation et à l’installation des softs:
sudo apt-get install build-essential unzip libtool automake dpkg-dev debhelper quilt libssl-dev libpam0g-dev libmysqlclient-dev libgdbm-dev libldap2-dev libsasl2-dev libiodbc2-dev libkrb5-dev libperl-dev libpcap-dev python-dev libsnmp-dev libpq-dev
Installation des composants Oracle
A ce stade il nous manque les librairies Oracles pour pouvoir compiler freeradius avec le support d’oracle. Oracle ne distribuant pas les sources des ces softs (oui on parle bien de la boite qui a racheté mysql sun et gère openoffice.org), nous allons devoir installer manuellement les librairies clientes d’Oracle. Plusieurs possibilités pour cela:
- On peut tout bonnement installer un serveur Oracle complet: par exemple Oracle 11g (je ne l’ai jamais testé avec la version XE d’oracle). Dans ce cas retenez bien votre $ORACLE_HOME car c’est là que seront installer les librairies nécessaires à la compilation
- On peut aussi se contenter d’installer l’Oracle instant_client, distribué gratuitement par Oracle sous forme de bianires (une inscription est nécessaire)
Ici nous choisirons cette deuxième solutions car elle n’oblige pas à l’achat coûteux d’une licence logiciel Oracle. Rendez vous donc sur le site d’Oracle, section download, et choisissez la version de l’instantclient correspondant à votre version de GNU/Linux ainsi que son SDK: http://www.oracle.com/technetwork/database/features/instant-client/
Pour ce tuto nous utilisons une Debian 6.0 amd64. Les archives récupérées sont donc:
instantclient-basic-linux-x86-64-11.2.0.2.0.zip
instantclient-sdk-linux-x86-64-11.2.0.2.0.zip
On va décompresser les archives dans un répertoire dédié à ‘linstallation d’Oracle:
sudo mkdir /opt/oracle
sudo unzip -d /opt/oracle/ instantclient-basic-linux-x86-64-11.2.0.2.0.zip
sudo unzip -d /opt/oracle/ instantclient-sdk-linux-x86-64-11.2.0.2.0.zip
Le package nécessite une modification pour permettre la compilation et le lancement du serveur. Sans la modification suivante, le serveur plantera lors du chargement du module Oracle:
cd /opt/oracle/instantclient_11_2/
sudo ln -s libclntsh.so.11.1 libclntsh.so
On ajoute les librairies installées à la liste des librairies du système en ajoutant le fichier suivant /etc/ld.so.conf.d/oracle.conf, contenant la ligne ci-dessous:
/opt/oracle/instantclient_11_2
Puis on recharge les librairies.
sudo ldconfig
Les softs oracles sont maintenant installés, place à la compilation de FreeRadius.:
Installation de FreeRadius
Récupérons les sources. Je vous conseille de prendre au minimum la version 2.1.10 qui contient des correctifs de bugs. notamment concernant la compilation du driver rlm_sql_oracle.
http://freeradius.org/download.html
cd
wget ftp://ftp.freeradius.org/pub/freeradius/freeradius-server-2.1.10.tar.bz2
tar jxvf freeradius-server-2.1.10.tar.bz2
Encore mieux, vous pouvez utiliser les dernières source via git. Si vous préférez tout de même utiliser la release officielle, sachez qu’il vous faudra appliquer un petit patch que j’ai écrit si vous utilisez une version d’Oracle différente de la 10g. Ce patch ayant été intégré upstream, la prochaine release (2.1.11), ou les dernières sources git devraient l’intégrer de base.
Quoi qu’il en soit il en soit, afin de générer un package debian freeradius-oracle, il vous faudra télécharger cette archive. Elle contient les définitions du packages ainsi que quelques patch pour configurer les règles de compilation debian.
wget http://www.horoa.net/wp-content/uploads/2011/06/freeradius-oracle.tar.gz
tar zvxf freeradius-oracle.tar.gz
cd freeradius-server-2.1.10
cp ../freeradius-oracle/freeradius-oracle.* debian/
Si vous n’utilisez pas les dernières sources, appliquez le patch suivant, sinon ignorez cette ligne:
patch -p0 < ../freeradius-oracle/oracle_versionlibs.patch
Appliquez ce patch afin de permettre la construction du packge debian
patch -p0 < ../freeradius-oracle/debian.oracle_enabled.patch
Notez que ce dernier patch est fait pour la version 11.2 des lib Oracle, installées dans /opt/oracle. Si vous utilisez une version différente ou un chemin d’installation différent, veillez à ajuster les options de configuration dans le fichier debian/rules.
Avant de créer le package on va re-générer les scripts de configuration avec:
cd src/modules/rlm_sql/drivers/rlm_sql_oracle
autoreconf
cd -
On peut maintenant générer les packages debian
sudo dpkg-buildpackage -b -uc
Cette commande terminée, on devrait obtenir une floppée de .deb dans le répertoire parent, notamment: freeradius-oracle_2.1.10+git_amd64.deb
Il ne nous reste plus qu’à installer les packages et leurs dépendances
sudo apt-get install libaio1 openssl-blacklist ssl-cert
sudo dpkg -i ../libfreeradius2_2.1.10+git_amd64.deb ../freeradius_2.1.10+git_amd64.deb ../freeradius-common_2.1.10+git_all.deb ../freeradius-oracle_2.1.10+git_amd64.deb
Afin d’éviter de perdre le fruit de notre travail lors d’une mise à jour, on configure dpkg pour qu’il n’écrase pas les paquets liées à freeradius
sudo dpkg --get-selections | grep freeradius | sed 's/install$/hold/' | sudo dpkg --set-selections
Le reste n’est qu’une affaire de configuration. En substance, il faut dé-commenter la ligne suivante dans /etc/freeradius/radiusd.conf:
$INCLUDE sql.conf
et configurer un instance sql dans /etc/freeradius/sql.conf en utilisant le driver oracle et une chaine de connexion adéquate:
sql {
database = "oracle"
driver = "rlm_sql_${database}"
login = "scott"
password = "tiger"
radius_db = "(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=A.B.C.D)(PORT=1521))(CONNECT_DATA=(SID=GEN1)))"
...
}
On peut alors tester que le serveur ce lancera correctement
sudo freeradius -X -C
Laisser un commentaire