Oxidized | Really Awesome New Cisco confIg Differ


Présentation


Oxidized est un projet lancé par ytti en Avril 2013.
Il a pour objectif de récupérer, de versionner et de gérer les configurations de vos équipement réseau. C’est un remplaçant de RANCID (Really Awesome New Cisco confIg Differ).

Oxidized se divise en trois paquets :

  • oxidized (core, codé en Ruby et Bash)
  • oxidized-script (CLI et Librairie permettant l’interaction entre les équipements réseaux et Oxidized, codé en Ruby)
  • oxidized-web (Interface web et API pour oxidized, codé en JavaScript, Ruby, HTML et CSS)

Oxidized est compatible avec plusieurs systèmes linux. (Ubuntu, Debian, CentOS, Oracle Linux, Red Hat Linux) et avec un bon nombre d’équipements/OS réseaux.


Mise en place


Nous ferons une installation très basique afin de comprendre les mécanismes du système. Pour cela nous utiliserons une VM Ubuntu 16.04 fraîchement installée et à jour.

Installation des packages nécessaires :

1
2
3
apt-get install ruby ruby-dev libsqlite3-dev libssl-dev pkg-config cmake libssh2-1-dev
gem install oxidized
gem install oxidized-script oxidized-web

Configuration d’Oxidized :
Commencez par créer l’utilisateur oxidized :

1
useradd oxidized

Puis connectez-vous avec et lancez le programme à l’aide des commandes suivantes :

1
2
su oxidized
oxidized

Cela aura pour effet de générer le fichier de configuration. Par défaut, le fichier s’appelle

1
config

et se situe dans

1
/home/oxidized/.config/oxidized

Éditez le fichier

1
vi /home/oxidized/.config/oxidized/config

Voici ce que vous devriez obtenir:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
---
username: username
password: password
model: junos
interval: 3600
use_syslog: false
debug: false
threads: 30
timeout: 20
retries: 3
prompt: !ruby/regexp /^([\w.@-]+[#>]\s?)$/
rest: 127.0.0.1:8888
vars: {}
groups: {}
pid: "/home/oxidized/.config/oxidized/pid"
input:
default: ssh, telnet
debug: false
ssh:
secure: false
output:
default: file
source:
default: csv
csv:
file: "/home/oxidized/.config/oxidized/router.db"
delimiter: !ruby/regexp /:/
map:
name: 0
model: 1
model_map:
cisco: ios
juniper: junos

Explications :

1
username

et

1
password

Correspondent aux identifiants de l’utilisateur se connectant aux équipements pour récupérer les configurations.
Exemple :

1
2
username: oxidized
password: S3cre7
1
model: ios

Correspond au modèle utilisé par défaut. Oxidized utilise des scripts en ruby pour se connecter et s’adapter à l’environnement des équipements. Le nom du modèle sera toujours le nom du script ruby correspondant, et de la même manière, le nom des scripts ruby se rapprochera toujours du nom de l’OS.

1
interval: 86400

Définissez, en seconde, l’intervalle de temps entre chaque récupération de configuration. Par défaut la valeur est fixée à 3600. Une récupération par jours est suffisante.

1
use_syslog: false

Vous permet de journaliser les actions d’Oxidized.

1
debug: false

Vous permet d’activer ou non la fonction debug.

1
timeout: 20

Correspond au temps, en seconde, nécessaire pour considérer qu’une connexion échoue.

1
retries: 1

Correspond au nombre de tentative avant de passer à l’équipement suivant. (1 seul suffit).

1
rest: 127.0.0.1:8888

Correspond à l’adresse et au port d’écoute pour l’interface Web. Si votre serveur est adressé en 10.1.2.3 et que vous souhaitez vous connecter sur le port 8080, il suffira de mettre :

1
rest: 10.1.2.3:8080

NB : Ceci n’est valable que si vous avez installé le paquet

1
oxidized-web

. Si ce n’est pas le cas, vous devez supprimer cette ligne de la configuration.

1
vars: {}

Permet d’insérer des variables. Par exemple, pour les équipement cisco sur lesquelles un mot de passe enable est paramétré, vous l’indiquerez à cette endroit de la manière suivante :

1
2
vars:
enable: MotDePasseEnable
1
groups: {}

Permet le paramétrage des groupes. Imaginons que nous ayons deux groupes avec deux utilisateurs d’administrations différents :

1
2
3
4
5
6
7
groups:
switch:
username: Switch
password: MotDePasseSwitch
routeur:
username: Routeur
password: MotDePasseRouteur

Chacun aura donc son dossier avec les configurations correspondantes.

1
pid: "/home/oxidized/.config/oxidized/pid"

Chemin où Oxidized sera exécuté.

1
input:

Méthode de connexion aux équipements :

  • SSH
  • Telnet (n’y pensez même pas.)
1
output:

Type de sortie des fichiers de configurations :

  • GIT : Versionning et gestion des configurations dans le temps
  • HTTP : Poster une configuration à une URL bien précise avec POST
  • File : Fichiers à plat
1
source:

Type d’entrée de la liste des équipements gérés :

  • CSV
  • SQL (SQLite, MySQL)

Dans la cas ou la source est en CSV :

1
file:

Définir où se trouve le fichier des routeurs à gérer.

1
delimiter:

Définir le caractère de séparation des paramètres présent dans le fichier.

1
map:

Définir les paramètre présent dans le fichier. Dans le fichier contenant la liste des routeurs, vous pouvez ajouter des paramètre pour chaque hôte. Il faut définir ces paramètres dans la « map » pour qu’Oxidized puisse bien les interpréter et bien les traiter.

Exemple 1 :

1
2
3
4
5
6
7
8
9
10
11
source:
default: csv
csv:
file: "/home/oxidized/.config/oxidized/router.db"
delimiter: !ruby/regexp /:/
map:
name: 0
model: 1
group: 2
username: 3
password: 4

Contenu de router.db :

1
my.host.net:ios:switch

Ici, Oxidized va comprendre le FQDN de l’hôte, le modèle à appliquer (ici ios pour un équipement cisco), le groupe auquel l’équipement appartient et éventuellement des identifiants de gestion différents à ceux indiqués en début de configuration.

Résultat attendu :

1
2
3
4
5
6
7
/etc/oxidized/.config/oxidized
├── config
├── log-router-ssh
├── pid
├── router.db
└── switch
└── my.host.net

Exemple 2 :

Vous pouvez également faire du versionning. Pour cela il faudra configurer GIT comme méthode de sortie. Dans la configuration suivante, un dépôt sera créer par groupe :

1
2
3
4
5
6
output:
default: git
git:
user: oxidized
email: oxidized@example.fr
repo: /var/lib/oxidized/git-repos/default.git

Si vous souhaitez tout rassembler dans le même dépôt, vous devrez appliquer la configuration suivante :

1
2
3
4
5
output:
default: git
git:
single_repo: true
repo: "/var/lib/oxidized/devices.git"

Résultat attendu :

1
model_map:

Liste des modèles que vous utilisez.

1
2
3
4
cisco: ios
ubiquiti: edgeos
alcatel: aos
ciscoasa: asa

Une fois que votre configuration est prête, lancez

1
oxidized

et connectez-vous à votre interface Web à l’aide de l’adresse renseignée dans

1
rest:

Création d’un screen pour le lancement d’Oxidized :

Pour permettre d’accéder à n’importe quel moment à la « console » Oxidized, nous pouvons créer une session screen dédiée au programme. Cela permet de visualiser rapidement le bon fonctionnement du programme.

En tant que root lancez la commande suivante :

1
screen -S Oxidized

Une fois votre session créée, connectez-vous avec l’utilisateur Oxidized et lancez le programme :

1
2
su oxidized
oxidized@oxidized-ubuntu:/home/oxidized/ oxidized

Légende :

  • : Configuration récupérée avec succès.
  • : Configuration en attente de récupération.
  • : Échec de la récupération de configuration.

💡 ProTIP!
Si vous souhaitez récupérer la configuration de pare-feu Fortigate, pensez à augmenter le timeout. Les configurations étant très longues, Oxidized a besoin de plus de temps pour les récupérer.

Enjoy. 🙂