Déc 30 2007

Heartbeat 2: Mise en oeuvre

Publié par sous Linux




Note importante:
Heartbeat est maintenant obsolète et a migré vers une nouvelle stack disponible sur Clusterlabs. Pour un projet de haute disponibilité simple utilisant une IP virtuelle, essayez keepalived qui fait la surveillance et la bascule juste avec un simple fichier de configuration.

Depuis sa version 2, Heartbeat est capable de gérer plus de 2 noeuds, et surtout n’a plus besoin de l’utilitaire « mon » pour la surveillance des services. Cette fonctionnalité est directement intégrée. Par conséquent, la hausse du nombre de possibilités a complexifié la configuration de Heartbeat. Il est à noter que les fichiers version 1 sont toujours suportés.

Installation

Les sources de Heartbeat sont disponibles sur le site officiel http://www.linux-ha.org. Des rpms compatibles Redhat Enterprise sont téléchargeables depuis le site de Centos (lien inclus sur le site Heartbeat). Les packages sont mis à jour relativement vite puisque la version source est la 2.1.0 alors que le rpm est la 2.0.8-2 lors de cette installation. 3 rpms sont nécessaires:

heartbeat-pils
heartbeat-stonith
heartbeat

Le service monitoré sera Apache mais la configuration reste valide pour n’importe quel autre service: mail, bases de données, DNS, DHCP, serveurs de fichiers, etc…

Schéma

Failover ou load-balancing

Heartbeat supporte les modèles Actif-Passif pour le failover et Actif-Actif pour le load-balancing. De nombreuses autres configurations sont possibles en ajoutant des serveurs et/ou services; Les possibilités sont énormes.
Nous traiterons du load-balancing ici, seules quelques lignes devront être supprimées pour le failover.

Failover Load-balancing

Configuration

Dans cette configuration, les 2 serveurs sont interconnectés via leur interface eth0. Les flux applicatifs arrivent sur eth1, laquelle est configuée comme dans le schéma ci-dessus, avec les adresses 192.168.0.4 et .5 Les adresses sur eth0 doivent appartenir à un sous-réseau dédié à Heartbeat. Ces adresses doivent apparaître dans /etc/hosts sur chaque noeud.
3 fichiers sont nécessaires à la configuration de Heartbeat 2. Ils doivent être identiques sur tous les noeuds.

Sous /etc/ha.d/
– ha.cf
– authkeys
Sous /var/lib/heartbeat/crm/
– cib.xml

ha.cf
ha.cf contient les paramètres généraux tels que les noeuds du cluster ou la topologie des communications.

use_logd on
# Fréquence d'envoi des paquets Heartbeat
keepalive 500ms # secondes - Spécifier ms pour des temps inférieur à 1 seconde
# Laps de temps après lequel un noeud est considéré "mort"
deadtime 2
# Envoi d'un message warning
# Important pour ajuster la valeur deadtime
warntime 1
# Identique à deadtime mais lors de l'initialisation
initdead 8
updport 694
# Test du host pour vérifier que le host est toujours en ligne
# La passerelle par défaut en général
ping 192.168.0.1
# Interface sur laquelle les "Heartbeats" sont envoyés
# Utiliser "serial" pour un port série,
# "mcast" et "ucast" respectivement pour multicast et unicast
bcast eth0
# La resource bascule sur le noeud primaire dès qu'il redevient disponible
auto_failback on
# Liste des noeuds faisant partie du cluster
node n1.domain.com
node n2.domain.com
# Activer la config Heartbeat 2
crm yes
# Permet d'ajouter un nouveau en live sans reconfigurer les anciens noeuds
autojoin any

D’autres options sont disponibles telles que la compression ou le débit pour la communication sur cable série. Consulter http://linux-ha.org/ha.cf

authkeys

Authkeys permet de définir les clés d’authentification. Plusieurs types sont disponibles: crc, md5 et sha1. crc est à utiliser sur un réseau qui est déjà sécurisé (vlan isolé ou cable croisé. sha1 offre un niveau de sécurité haute mais consomme beaucoup de ressource processeur. md5 est un intermédiaire tout-à-fait satisfaisant.

auth 1
1 md5 secret

Le mot de passe est stocké en clair, il est important de changer les permissions du fichier avec un chmod 600.

cib.xml

 <cib>
   <configuration>
     <crm_config/>
     <nodes/>
     <resources>
       <group id="server1">
         <primitive class="ocf" id="IP1" provider="heartbeat" type="IPaddr">
           <operations>
             <op id="IP1_mon" interval="10s" name="monitor" timeout="5s"/>
           </operations>
           <instance_attributes id="IP1_inst_attr">
             <attributes>
               <nvpair id="IP1_attr_0" name="ip" value="192.168.0.2"/>
               <nvpair id="IP1_attr_1" name="netmask" value="24"/>
               <nvpair id="IP1_attr_2" name="nic" value="eth1"/>
             </attributes>
           </instance_attributes>
         </primitive>
         <primitive class="lsb" id="apache1" provider="heartbeat" type="apache">
           <operations>
             <op id="apache1_mon" interval="30s" name="monitor" timeout="20s"/>
           </operations>
         </primitive>
       </group>
       <group id="server2">
         <primitive class="ocf" id="IP2" provider="heartbeat" type="IPaddr">
           <operations>
             <op id="IP2_mon" interval="10s" name="monitor" timeout="5s"/>
           </operations>
           <instance_attributes id="IP2_inst_attr">
             <attributes>
               <nvpair id="IP2_attr_0" name="ip" value="192.168.0.3"/>
               <nvpair id="IP2_attr_1" name="netmask" value="24"/>
               <nvpair id="IP2_attr_2" name="nic" value="eth1"/>
             </attributes>
           </instance_attributes>
         </primitive>
         <primitive class="lsb" id="apache2" provider="heartbeat" type="apache">
           <operations>
             <op id="apache2_mon" interval="30s" name="monitor" timeout="20s"/>
           </operations>
         </primitive>
       </group>
     </resources>
     <constraints>
       <rsc_location id="location_server1" rsc="server1">
         <rule id="best_location_server1" score="100">
           <expression_attribute="#uname" id="best_location_server1_expr" operation="eq" value="n1.domain.com"/>
         </rule>
       </rsc_location>
       <rsc_location id="location_server2" rsc="server2">
         <rule id="best_location_server2" score="100">
           <expression_attribute="#uname" id="best_location_server2_expr" operation="eq" value="n2.domain.com"/>
         </rule>
       </rsc_location>
       <rsc_location id="server1_connected" rsc="server1">
         <rule id="server1_connected_rule" score="-INFINITY" boolean_op="or">
           <expression id="server1_connected_undefined" attribute="pingd" operation="not_defined"/>
           <expression id="server1_connected_zero" attribute="pingd" operation="lte" value="0"/>
         </rule>
       </rsc_location>
       <rsc_location id="server2_connected" rsc="server2">
         <rule id="server2_connected_rule" score="-INFINITY" boolean_op="or">
           <expression id="server2_connected_undefined" attribute="pingd" operation="not_defined"/>
           <expression id="server2_connected_zero" attribute="pingd" operation="lte" value="0"/>
         </rule>
       </rsc_location>
     </constraints>
   </configuration>
 </cib>

Il est possible de générer ce fichier depuis le fichier de configuration Heartbeat1, haresources situé dans /etc/ha.d/, gràce à la commande suivante:
python /usr/lib/heartbeat/haresources2cib.py > /var/lib/heartbeat/crm/cib.xml
De manière globale, le fichier se décompose en 2 parties: les ressources et les contraintes.

Ressources

Les ressources sont organisées sous forme de groupes (server1 & 2) rassemblant une adresse IP virtuelle et un service: Apache. Les ressources sont déclarées avec la syntaxe <primitive> à l’intérieur du groupe. Les groupes sont utiles pour rassembler plusieurs ressources répondant aux mêmes contraintes.

La primitive IP1 surveille que l’adresse virtuelle 1 est bien joignable. Elle fait appel au script IPaddr de type OCF. Les scripts OCF sont fournis avec Heartbeat et se situent dans l’arborescence des rpms. Il est possible de spécifier l’adresse virtuelle, son masque de réseau ainsi que l’interface qui va l’accueillir.
La ressource apache est de type LSB, c’est-à-dire qu’elle fait appel à un script de démarrage situé dans /etc/init.d. Le nom du script est entré dans la variable type: type= »nom ». Pour fonctionner avec Heartbeat, le script doit respecter la norme LSB. La norme LSB spécifie entre autres que l’on doit pouvoir:

  • collecter le status du service par « script status »
  • exécuter un « script start » sur un service déjà démarré
  • arréter un service déjà arrété

Toutes les spécifications LSB sont disponibles à l’adresse http://www.linux- ha.org/LSBResourceAgent

Les temps définissables ici sont:

  • interval: temps avant qu’une action ne soit considérée en échec et redémarrée
  • timeout: définit le temps avant qu’une action du type start, stop ou status ne soit considérée en échec

Contraintes

2 contraintes sont appliquées à chaque groupe de ressources:
La location préférée oû les ressources « devraient » s’exécuter. On donne un score de 100 à n1.domain.com pour le 1er groupe de ressources. Ainsi, si n1.domain.com est actif, et que l’option auto_failback est à « on », les ressources du 1er groupe reviendront toujours sur cette machine.
L’action suivant le ping. Si aucun des gateways ne répond aux pings, les ressources sont migrées vers un autre serveur, et le noeud est mis en standby.

Le score -INFINITY signifie qu’en aucun cas, la machine ne doit accepter les ressources si les gateways sont injoignables.

Notes importantes

Droits sur les fichiers

Le répertoire /etc/ha.cf contient des données sensibles. Il est obligatoire de changer les droits en lecture/écriture pour le propriétaire – ou l’application ne se lancera pas.
chmod 600 /etc/ha.d/ha.cf

Le fichier /var/lib/heartbeat/crm/cib.crm doit appartenir à hacluster et au groupe haclient. Il ne doit pas être accessible aux autres utilisateurs.
chown hacluster:haclient /var/lib/heartbeat/crm/cib.crm
chmod 660 /var/lib/heartbeat/crm/cib.crm

Le fichier cib.xml est accédé en écriture par l’application Heartbeat. Des fichiers sont créés en parallèle. Si une édition manuelle est nécessaire, arréter Heartbeat sur tous les noeuds, effacer cib.xml.sig dans le même répertoire, éditer cib.xml sur tous les noeuds, et redémarrer Heartbeat.
Il faut normalement utiliser la commande crm_resource pour réaliser ces modifications (voir section plus bas).

Interfaces

Les interfaces où vont résider les adresses virtuelles n’ont pas besoin d’être configurées ni d’avoir une une adresse physique, théoriquement. Cela permettait de réduire le nombre d’adresses à utiliser. L’interface doit toutefois être activée lors du démarrage (Un simple DEVICE=eth1 dans /etc/sysconfig/network-scripts/ifcfg-eth1 suffit). Les adresses virtuelles sont toujours créées en tant que sous-interfaces, ex: eth0:0, même dans le cas ou l’interface principale n’est pas configurée.

Fichier hosts

Le fichier /etc/hosts doit obligatoirement contenir les noms de tous les noeuds faisant partie du cluster. Ces noms doivent être identiques à la commande ‘uname -n’.

Démarrage des services

Heartbeat se charge du démarrage d’Apache lorsque celui-ci est inactif. Il est préférable de désactiver Apache avec chkconfig par exemple, celui-ci pouvant mettre un certain temps à se lancer, Heartbeat pourrait essayer de démarrer le service une deuxième fois.
chkconfig httpd off

Un script de démarrage est présent dans /etc/init.d/. Pour lancer Heartbeat, exécuter « /etc/init.d/hearbeat start ». Il est préférable que Heartbeat se lance automatiquement:
chkconfig heartbeat on

Comportement et tests

Les actions suivantes permettent de simuler des incidents qui pourraient avoir lieu au quotidien, et altérer le bon fonctionnement du cluster. Le comportement de Heartbeat a été étudié dans chaque cas.

Arrêt d’Apache

Le service Heartbeat local va redémarrer Apache. Si le redémarrage échoue, un warning sera ajouté dans les logs. Heartbeat n’essayera plus de lancer le service. L’adresse IP virtuelle reste sur la machine et n’est pas migrée. Cela dit, l’adresse peut être migrée manuellement avec les outils Heartbeat.

Arrêt ou crash d’un serveur

Les adresses virtuelles migrent vers les autres serveurs.

Arrêt manuel de Heartbeat sur un noeud

Apache est arrêté par Heartbeat. Les adresses virtuelles de la machine sont migrées vers les autres serveurs. La procédure normale serait d’utiliser la commande crm_standby pour mettre la machine en standby et migrer les ressources.

Déconnexion du cable entre les 2 serveurs

Chaque machine se croit « seule » et s’approprie les 2 adresses virtuelles. Toutefois, cela ne semblent pas poser de problème puisque le gateway continue d’envoyer les paquets à l’adresse ARP présente dans sa table. Un ping sur l’adresse de broadcast renvoie des duplicats.

Déconnexion de la passerelle

Ceci pourrait survenir dans 2 situations:
– Le gateway est indisponible. Dans ce cas, les 2 noeuds vont supprimer leur adresse IP virtuelle et arréter Apache.
– La connexion de l’un des noeuds au réseau est tombée. Les adresses sont migrées vers l’autre serveur qui a normalement encore accès à la passerelle.

Tous les cas envisagés permettent de maintenir le système en vie sauf dans le cas où la passerelle est tombée. Ceci n’est plus du ressort du cluster…

Outils

Plusieurs outils sont disponibles pour vérifier le comportement de Heartbeat.

Logs

Heartbeat utilise le démon logd qui envoie les logs dans le fichier système /var/log/messages.

Outils Unix

Les commandes Unix usuelles peuvent être employées. Heartbeat crée des sous-interfaces que l’on peut visualiser avec « ifconfig » ou « ip address show ». L’état des processus sont visualisables avec les scripts de démarrage ou encore la commande « ps ».

Commandes Heartbeat

Heartbeat offre une série de commandes fournies dans le package rpm. Voici les principales:

  • crmadmin: Permet de gérer les managers de noeuds sur chaque machine du cluster.
  • crm_mon: Pratique et rapide; Permet de visualiser l’état des noeuds et ressources.
  • crm_resource: Fait des requêtes et modifie les données relatives aux ressources/services. Possibilité de lister, migrer, désactiver et supprimer des ressources.
  • crm_verify: Reporte les warnings et erreurs sur le cluster
  • crm_standby: Migre toutes les ressources d’un noeud. Utile lors des mises à jour par exemple.

Maintenance

Arrêt du service

Lors d’une mise à jour ou d’un arrêt d’Apache, procéder comme ceci:

  • Arrêter Apache sur le noeud 1 et migrer l’adresse virtuelle sur le noeud 2:
    crm_standby -U n1.domain.com -v true
  • Effectuer les mises à jour sur n1 puis redémarrer le noeud:
    crm_standby -U n1.domain.com -v false
  • Les ressources reviennent automatiquement sur n1 (si cib.xml a bien été configuré)

Effectuer la même démarche sur n2

Rem: La mise en standby de n2 peut être faite depuis n1 et vice versa.

Il est possible de mettre les 2 noeuds en standby en même temps; Apache sera arrété sur les 2 machines et les adresses virtuelles supprimées jusqu’à ce que l’on sorte du mode standby.

Reboot de la machine

Il n’est pas nécessaire de mettre le noeud en standby avant un reboot. Néanmoins, cela est préférable puisque le temps de migration des ressources sera plus court, si l’on considère le temps passé à détecter que le noeud n’est plus disponible.

Remise en service d’une ressource

Exemple: Apache a planté et ne redémarre plus, toutes les ressources du groupe sont migrées vers le deuxième serveur.
Lorsque le problème est résolu et que la ressource est à nouveau disponible, revérifier l’ensemble des ressources par la commande:
crm_resource –reprobe (-P)

et réinitialiser la ressource:
crm_resource –cleanup –resource apache1 (ou crm_resource -C -r apache1).
Elle sera automatiquement migré vers son serveur d’origine.

Ajout d’une nouvelle machine dans le cluster

En backup

Si le cluster est composé de 2 noeuds connectés par un cable croisé, il faudra désormais un switch pour les interfaces où les « Heartbeats » sont envoyés.
Il faut tout d’abord ajouter les nouvelles informations relatives au nouveau noeud. Editer le fichier /etc/hosts des noeuds existants et y ajouter le hostname du nouveau noeud. Le contenu doit être copié sur la nouveau serveur. Configurer Heartbeat de la même manière que sur les autres noeuds.
Les fichiers ha.cf doivent contenir l’instruction « autojoin any » pour accepter l’ajout d’un nouveau noeud.

Sur la nouvelle machine, démarrer Heartbeat; La machine devrait joindre le cluster automatiquement.

Si ce n’est pas le cas, exécuter la commande suivante sur l’un des noeuds faisant déjà partie du cluster:
/usr/lib/heartbeat/hb_addnode n3.domain.com
Le nouveau noeud ne fait qu’office de backup, aucun service n’y sera associé. Si n1.domain.com passe en mode standby, ses ressources basculerons sur n3. Elles reviendront sur le serveur d’origine dès que celui-ci sera disponible (la préférence étant fixée pour ce serveur).

Avec un nouveau service

Pour ajouter une 3me IP (associée à un troisième Apache), il faut exécuter la procédure ci-dessus puis:
– Soit stopper Heartbeat sur les 3 serveurs et éditer les fichiers cib.xml
– Soit construire des fichiers similaires à cib.xml, ne contenant que les ressources et contraintes à ajouter, puis les insérer sur le cluster à chaud. Ceci est méthode préférée. Créer les 3 fichiers suivants sur l’un des noeuds:

newGroup.xml

<group id="server3">
  <primitive class="ocf" provider="heartbeat" type="IPaddr" id="IP3">
    <operations>
      <op id="IP3_mon" interval="5s" name="monitor" timeout="2s"/>
    </operations>
    <instance_attributes id="IP3_attr">
      <attributes>
        <nvpair id="IP3_attr_0" name="ip" value="192.168.0.28"/>
        <nvpair id="IP3_attr_1" name="netmask" value="29"/>
        <nvpair id="IP3_attr_2" name="nic" value="eth1"/>
      </attributes>
    </instance_attributes>
  </primitive>
  <primitive class="lsb" provider="heartbeat" type="apache" id="apache3">
    <operations>
      <op id="apache3_mon" interval="5s" name="monitor" timeout="5s"/>
    </operations>
  </primitive>
</group>

newLocationConstraint.xml

<rsc_location id="location_server3" rsc="server3">
  <rule id="best_location_server3" score="100">
    <expression attribute="#uname" id="best_location_server3_expr" operation="eq" value="n3.domain.com"/>
  </rule>
</rsc_location>

newPingConstraint.xml

<rsc_location id="server3_connected" rsc="server3">
  <rule id="server3_connected_rule" score="-INFINITY" boolean_op="or">
    <expression id="server3_connected_undefined" attribute="pingd" operation="not_defined"/>
    <expression id="server3_connected_zero" attribute="pingd" operation="lte" value="0"/>
  </rule>
</rsc_location>

Ajouter les contraintes de server3
cibadmin -C -o constraints -x newLocationConstraint.xml
cibadmin -C -o constraints -x newPingConstraint.xml

Ajouter les ressources de server3
cibadmin -C -o resources -x newGroup.xml

Les ressources relatives à server3 devraient démarrer automatiquement.

Note: Les ajouts se font un par un. Si 2 contraintes sont entrées dans le même fichier, seule la 1re sera prise en compte.

 

12 réponses

Oct 15 2007

Carte wifi Atheros sur Linux Redhat

Publié par sous Linux




Vous avez un vieux PC ou serveur que vous aimeriez laisser tourner depuis un endroit distant chez vous?
Vous voulez éviter les cables pour vous connecter au réseau?
Ajoutez-y une carte wifi et configurez le service réseau pour qu’il se (re)connecte automatiquement quand la borne wifi (re)démarre.
Nous avons choisi une carte Netgear parce qu’elle intègre un chipset Atheros.
Ceux-ci sont très bien intégrés sous Linux.

 

Détection de la carte

Une fois la carte installée et le système redémarré, vérifiez que la carte a bien été détectée avec la commande lspci. Vous devriez obtenir la ligne suivante dans le résultat:

# lspci
...
00:0d.0 Ethernet controller: Atheros Communications, Inc. AR5212 802.11abg NIC (rev 01)
...

Installation du driver

Malheureusement, la plupart des distributions Linux ne fournissent pas de pilotes pour les cartes wifi à base de chipset Atheros.
Madwifi.org ont développé et fournissent un pilote Atheros standard pour Linux.
Pour installer madwifi, vous avez besoin des packages d’en-tête et de développement du kernel.
Sur Redhat, installez les rpms

  • kernel-header et
  • kernel-devel

Téléchargez madwifi, décompressez et compilez-le:

tar xfz madwifi-0.9.4.tar.gz
cd madwifi-0.9.4/
make
make install

A savoir que le module a été installé dans le répertoire des modules kernel /lib/modules/`uname -r`/net, ce qui signifie qu’il faudra réinstaller les modules appropriés (kernel header et devel) et recompiler madwifi lors d’une mise à jour du kernel.
 
Rendez le module noyau disponible:

modprobe ath_pci

Configuration

La dernière chose à faire est de configurer l’interface réseau wifi.
Sur les systèmes Redhat, créez un fichier nommé ifcfg-ath0 de la même manière que pour une interface réseau classique, dans /etc/sysconfig/network-scripts/. Les paramètres supplémentaires doivent être ajoutés pour les valeurs wifi.

# cat /etc/sysconfig/network-scripts/ifcfg_ath0
DEVICE=ath0
BOOTPROTO=static
BROADCAST=192.168.1.255
IPADDR=192.168.1.2
NETMASK=255.255.255.0
NETWORK=192.168.1.0
ONBOOT=yes
type=WIRELESS
ESSID=YourESSID
MODE=managed
KEY=F...A
CHANNEL=6
RATE=Auto
IWPRIV="authmode 2"
GATEWAY=192.168.1.1

A partir de maintenant, votre interface wifi sera gérée par le service « réseau ».
La carte est activée après chaque reboot;
Vous pouvez éteindre et redémarrer votre borne wifi, la carte se reconnectera sans intervention manuelle.
Vous pouvez aussi utiliser les commandes iw telles que iwlist et iwconfig pour y ajouter d’autres fonctionnalités.
Ce fichier de configuration ne fonctionne que pour l’encryption WEP, pas pour le WPA qui est beaucoup plus sécurisé.

 

Aucune Réponse

Août 01 2007

Gigawords sous Freeradius

Publié par sous Cisco,Freeradius




Les compteurs pour l’accounting Radius ont des limites bien définies comme toute norme qui se respecte. Les valeurs définies par le protocole sont enregistrées dans des champs de 32 bits, c’est-à-dire que la valeur maximum est de 4294967296 bits, soit un peu plus de 4GB. Si une session ne déconnecte pas pendant des jours, il y a de bonnes chances pour que le compteur revienne à 0 et du trafic ne sera pas pris en compte. Des extensions ont été ajoutées au protocole pour supporter des plus grosses valeurs de trafic. Depuis Freeradius 1.1.7, les Gigawords sont supportés par défaut avec Mysql. Il est fortement recommendé d’installer cette dernière version. Lors de la mise-à-jour, n’oubliez pas d’obtenir le nouveau schéma de la base dans mysql.sql. Changez AcctInputOctets et AcctOutputOctets de 32 à 64 bits. Cet article traite des versions de Freeradius inférieures à 1.1.7.

 

Avant de commencer

Nous assumons que Freeradius est installé avec Mysql pour stocker les données. Nous assumons aussi que le Network Access Server (NAS) supporte les gigawords, définis dans la RFC2869. C’est généralement le cas pour les routeurs Cisco. Vérifiez le manuel de votre NAS pour savoir comment l’activer sur d’autres types de matériels.

 

Activation de Gigawords sur le NAS

Une fois de plus, cette section traite de Cisco mais un jeu de commandes similaires est disponible sur la plupart des équipements. L’option Gigawords est activée par défaut sur Cisco, c’est pourquoi elle n’apparaît pas dans la configuration. Si c’est le cas, exécutez la commande suivante pour l’activer:

aaa accounting gigawords

On vous demandera de redémarrer le routeur pour que les nouveaux paramètres soient pris en compte. Ceci activeras les attributs Acct-Input-Gigawords et Acct-Output-Gigawords qui enregistrent combien de fois les compteurs sont revenus à zéro. Sachant cela, nous pouvons calculer les valeurs réelles. La prochaine étape est de créer une nouvelle colonne dans la base de données.

 

Modification de la table Mysql

Les champs AcctInputOctets et AcctOutputOctets doivent être convertis de 32 à 64 bits. Vous pouvez modifier ces chanmps avec un client Mysql quelconque ou PhpMyAdmin

ALTER TABLE radacct ADD AcctInputGigawords TINYINT UNSIGNED DEFAULT 0;
ALTER TABLE radacct ADD AcctOutputGigawords TINYINT UNSIGNED DEFAULT 0;

 

Modifications sur Freeradius

Le code SQL dans sql.conf doit être modifié pour les requêtes stop et update pour enregistrer les nouvelles valeurs dans la base de données. Voici à quoi elles ressemblent après modification:

accounting_update_query = "
  UPDATE ${acct_table1}
  SET AcctInputOctets = '%{Acct-Input-Gigawords:-0}' << 32 | '%{Acct-Input-Octets:-0}',
    AcctOutputOctets = '%{Acct-Output-Gigawords:-0}' << 32 | '%{Acct-Output-Octets:-0}',
    FramedIPAddress = '%{Framed-IP-Address}'
  WHERE AcctSessionId = '%{Acct-Session-Id}'
    AND UserName = '%{SQL-User-Name}'
    AND NASIPAddress= '%{NAS-IP-Address}'
    AND NASIPAddress= '%{NAS-IP-Address}'
    AND AcctStopTime = 0"

accounting_stop_query ="
  UPDATE ${acct_table2}
  SET AcctStopTime = '%S',
    AcctSessionTime = '%{Acct-Session-Time}',
    AcctInputOctets = '%{Acct-Input-Gigawords:-0}' << 32 | '%{Acct-Input-Octets:-0}',
    AcctOutputOctets = '%{Acct-Output-Gigawords:-0}' << 32 | '%{Acct-Output-Octets:-0}',
    AcctTerminateCause = '%{Acct-Terminate-Cause}',
    AcctStopDelay = '%{Acct-Delay-Time}',
    ConnectInfo_stop = '%{Connect-Info}'
  WHERE AcctSessionId = '%{Acct-Session-Id}'
    AND UserName = '%{SQL-User-Name}'
    AND NASIPAddress = '%{NAS-IP-Address}'
    AND AcctStopTime =0"

Redémarrez le service Radius, et le tour est joué!

Ceci concatène les valeurs Gigawords et Octets en ajoutant 32 bits nuls à la première et en faisant un OU logique avec la deuxième.

 

Aucune Réponse

Juin 11 2007

Encryption du trafic Mysql avec OpenSSL

Publié par sous Freeradius,Mysql




Freeradius obéit aux caractéristiques du protocole Radius, permettant d’effectuer des actions diverses, notamment l’authentification d’utilisateurs. De nombreuses cavités ont été décelées, non pas sur le software mais sur le protocole lui-même. Joshua Hill du laboratoire Infogard a réalisé une très bonne analyse disponible sur le net à l’adresse http://www.untruth.org/~josh/security/radius/. Le document fait surtout référence aux attaques possibles lors de l’envoi du login et mot de passe pendant l’authentification.
 
Nous ne nous intéresserons pas aux failles du protocole Radius, mais à celles liées à son utilisation avec un système de bases de données. L’accès à la base Radius doit être bien sûr sécurisé, mais le transport des données depuis le serveur Freeradius aussi. Ceci est d’autant plus vrai lorsque les deux serveurs sont distants, ce qui peut être le cas sur des réseaux de grandes tailles. C’est dans ce cadre que nous proposons de crypter le trafic Mysql à l’aide d’OpenSSL.

 

Installation d’OpenSSL

OpenSSL est téléchargeable depuis le site officiel. Ce test a été effectué avec la dernière version stable disponible à ce jour, la 0.9.8e. Il peut être installé de la façon suivante:
./config –prefix=/usr/local/openssl shared zlib
make
make test
make install

 
« zlib » permet d’activer le support pour la compression/décompression et « shared » pour les librairies partagées. Il est à noter que la compilation de Mysql échouera sur une plateforme Linux sans l’option « shared ».
 
Il faut ensuite inclure les nouvelles librairies dans le path. Ajoutez le chemin /usr/local/openssl/lib (ou celui sous lequel vous avez installé OpenSSL) dans le fichier /etc/ld.so.conf sous Linux. Exécutez la commande ldconfig pour rendre le chemin actif.

 

Activation d’OpenSSL sur le serveur

Les binaires Mysql sont fournis avec YaSSL en général, en remplacement à OpenSSL limité de par sa lisense. La (re)compilation est donc nécessaire:
./configure –enable-openssl=/usr/local/openssl
make
make install

 
Pour vérifier que le serveur Mysql supporte SSL après démarrage du service, il faut examiner la valeur de la variable système have_openssl comme ceci:

mysql> SHOW VARIABLES LIKE 'have_openssl';
+---------------+----------+
| Variable_name | Value    |
+---------------+----------+
| have_openssl  | DISABLED |
+---------------+----------+

 
Si la valeur est égale à « DISABLED », le serveur supporte les connexions SSL mais n’a pas été démarré avec les options appropriées. Il faut donc créer les clés et certificats nécessaires au cryptage.
 
cd /usr/local/mysql
mkdir openssl && cd openssl
mkdir certs && cd certs

 
Création du certificat CA
openssl genrsa -out ca-key.pem 2048
openssl req -new -x509 -nodes -days 1000 -key ca-key.pem -out ca-cert.pem

Répondez aux questions par les valeurs adéquates.
Ces commandes openssl génèrent une clé de 2048 bits et un certificat valable pour une durée de 1000 jours.
 
Création du certificat du serveur
openssl req -newkey rsa:2048 -days 1000 -nodes -keyout server-key.pem -out server-req.pem
openssl x509 -req -in server-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem

 
Création du certificat du client
openssl req -newkey rsa:2048 -days 1000 -nodes -keyout client-key.pem -out client-req.pem
openssl x509 -req -in client-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem

 
Les données relatives aux certificats doivent être passées en paramètre lors du lancement du service. Elles peuvent aussi être spécifiées dans le fichier de configuration Mysql /etc/my.cnf dans la section [mysqld].
 
ssl-ca=/usr/local/mysql/openssl/certs/cacert.pem
ssl-cert=/usr/local/mysql/openssl/certs/server-cert.pem
ssl-key=/usr/local/mysql/openssl/certs/server-key.pem

 
Après redémarrage du service, l’encryption SSL doit être disponible:

mysql> SHOW VARIABLES LIKE 'have_openssl';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| have_openssl  | YES   |
+---------------+-------+

 

Dès lors, le serveur accepte les connexions sécurisées. Il est toujours possible de se connecter en mode « clair » puisque le choix se fait indépendemment pour chaque connexion. Il est possible de forcer un utilisateur donné à se connecter seulement en mode sécurisé. Cette option réside dans les paramètres de cet utilisateur et peut être changée avec la commande GRANT.

 

Activation d’OpenSSL sur le client

Pour se connecter au serveur en encryptant les données, plusieurs méthodes sont possibles. Les certificats sont soit donnés en option au lancement du client Mysql, soit ils résident dans un fichier de configuration /etc/my.cnf (ou autre car on peut modifier le fichier par défaut comme ceci: mysql –defaults-file=my.cnf). En conséquence, ajoutez ces lignes dans la section [client] du fichier:
 
ssl-ca=/usr/local/mysql/openssl/certs/cacert.pem
ssl-cert=/usr/local/mysql/openssl/certs/client-cert.pem
ssl-key=/usr/local/mysql/openssl/certs/client-key.pem

 
Après s’être connecté, il est possible d’afficher le cipher utilisé pour encrypter le trafic:

SHOW STATUS LIKE 'Ssl_cipher';
+---------------+--------------------+
| Variable_name | Value              |
+---------------+--------------------+
| Ssl_cipher    | DHE-RSA-AES256-SHA |
+---------------+--------------------+

 
Dans le cas où Freeradius est le client, le nombre de connexions SSL devrait augmenter du nombre de celles-ci créées dans le pool, comme défini dans le fichier sql.conf.

show status like 'Ssl_accepts';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Ssl_accepts   | 52    |
+---------------+-------+

 

Impact sur les performances

L’encryption des données a forcément un impact sur les performance car l’opération est gourmande en ressources CPU et réseau. Voici une visualisation graphique du nombre de transactions traitées par seconde avec et sans cryptage

Impact SSL sur les performances Mysql

 

Ces tests ont été réalisés avec une machine sur laquelle sont exécutés les services Radius et Mysql. Ils permettent néanmoins d’avoir une bonne appréciation de l’impact du cryptage sur les performances qui est de l’ordre de 30%.

 

Aucune Réponse

Avr 19 2007

Mysql ou Postgresql pour Freeradius?

Publié par sous Freeradius,Mysql,Postgresql




Cet article ne cherche en aucun cas à faire un comparatif complet de Mysql et Postgresql. Le sujet a déjà été traité maintes fois et chacun a son opinion à cet égard. Des directions seront données et seuls quelques critères seront retenus pour faire un choix lors d’une utilisation avec Freeradius.

 

Critères

Si l’on se base sur la majorité des comparatifs existants, de nombreux critères pourraient être retenus. La base contenant les enregistrements Freeradius est très simple, ne contient ni transactions, ni triggers, ni vues. Que doit offrir la base de données Freeradius? La réponse à cette problématique est également très simple: disponibilité et rapidité seront les facteurs clé pour prendre une décision.
Mysql et Postgresql offrent tous deux des solutions – semblables – pour répondre aux besoins des applications nécessitant la haute disponibilité. La réplication semble être un choix judicieux puisqu’il est possible de spécifier des serveurs différents pour l’accounting et l’authentification (écritures et lectures en d’autres termes). On peut diriger les accès en écriture sur le master et en lecture sur les esclaves.
Comme les deux SGBD ne posent pas de problème au niveau de la haute disponibilité, notre choix se portera sur le temps d’exécution des requêtes. Mysql est réputé pour sa rapidité (notamment en lecture) mais d’autres diront que la robustesse de Postgresql dans un environnement concurrentiel prendrait le dessus.

 

Tests

Nous allons tenter de déterminer le nombre de transactions que chaque SGBD est capable de réaliser en un temps défini. Les résultats seront comparés à un setup basique qui obtient les noms d’utilisateurs à partir d’un fichier texte. Les conditions seront strictement identiques à savoir:

  • Ils seront exécutés sur une même machine: un Pentium II avec 384M de RAM
  • Mysql et Postgresql ont été compilés avec des compilateurs et options similaires (notamment le flag -O3)
  • La structure des tables contient des indexes identiques
    Le code SQL (pris depuis la documentation Freeradius) peut être trouvé ici pour Mysql et Postgresql.
  • Des pools de 50 connexions sont créés

Nous mesurons le temps d’exécution pour authentifier 50000 utilisateurs grâce à l’outil radclient en accès concurrents.
time /usr/local/bin/radclient -p 1000 -q -s -f radius.test 127.0.0.1 auth test

Les résultats sont plutôt édifiants:

Base de données Fichier texte Postgresql Mysql
Temps 5’13.552 » 1’46.598 » 0’35.146 »
transactions/s 159 469 1422

 
 
Voici une visualisation graphique du nombre de transactions traitées par seconde.

Performance

La lecture depuis Postgresql tout comme Mysql, est beaucoup plus rapide que celle d’un fichier texte. Ceci s’explique en partie par la présence d’indexes à l’intérieur des tables. Cette différence serait moindre et pourrait même s’inverser pour une base contenant un nombre beaucoup plus restreint d’utilisateurs.
Mysql réalise d’excellents résultats en traitant trois fois plus de transactions que Postgresql.

 

Conclusion

Ces tests de performance sont à relativiser puisqu’ils ne prennent pas en compte les utilisateurs qui se logguent avec un mot de passe incorrect. Certains aspects ne sont pas pris en compte. Citons le temps donné aux processus d’accounting, de pre et post-authentification. Les résultats seraient assez proches de ceux-ci néanmoins dans un environnement Master-Slave où les lectures s’effectueraient sur un serveur autre que les écritures.

 

Une réponse

« Précédent - Suivant »