Ci-dessous, les différences entre deux révisions de la page.
wiki:services:backup_cfg_cisco [2018/07/08 19:55] no_pseudo [Autre fonctionnalité des archives Cisco] |
wiki:services:backup_cfg_cisco [2020/06/27 18:16] |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | ====== Sauvegarder la configuration des commutateurs Cisco ====== | ||
- | |||
- | « Sauvegarder la configuration des commutateurs c'est très important, parce qu'un jour vous allez faire de la merde et ça ne va plus marcher. » | ||
- | --- // | ||
- | |||
- | <wrap lo>Et oui, je vais utiliser le mot « commutateur » tout le long de cet article.</ | ||
- | |||
- | ===== Ce qui a été fait par le passé ===== | ||
- | |||
- | Il y a très longtemps il semble qu'on utilisait un script qui analysait les logs des commutateurs sur la machine // | ||
- | |||
- | Ensuite, on a la solution actuelle (qui date aussi) et qui marche... plus ou moins... C'est la tache nommée « Sauvegarde switchs »< | ||
- | |||
- | < | ||
- | |||
- | < | ||
- | |||
- | < | ||
- | |||
- | ===== Ce qu'on voulait faire ===== | ||
- | |||
- | Vu que la solution de la tâche « Sauvegarde switchs » ne marchait plus très très bien, on a décidé (entre septembre et décembre 2017) avec varens de trouver une solution alternative. Cette solution c' | ||
- | |||
- | Bref, ayant surement des choses plus urgentes (ou pas) à gérer on a mis ce projet de côté. | ||
- | Et puis on en a reparlé il y a pas longtemps et je me suis chauffé pour lire un peu la doc Cisco pour savoir comment s'y prendre pour implémenter tout le bordel. Et là < | ||
- | |||
- | ===== Ce qu'il faut faire ===== | ||
- | |||
- | <WRAP center round important 60%> | ||
- | Actuellement ce n'est qu'un proof-of-concept déployé en dev et sur le commutateur du local. Voir la partie « Démo ». | ||
- | </ | ||
- | |||
- | En fait il est possible de définir des « archives de configuration » sur les commutateurs. Ainsi pour définir une archive on doit donner au commutateur un chemin où stocker l' | ||
- | |||
- | Ce qu'on veut faire c'est sauvegarder sur un serveur la configuration de notre commutateur lorsque quelqu' | ||
- | On a plusieurs protocole à notre disposition pour faire parler notre commutateur avec notre serveur: FTP, TFTP, HTTP(S), RCP, SCP. | ||
- | |||
- | Ici j'ai choisi d' | ||
- | 1) Éviter d' | ||
- | |||
- | 2) Vu que SCP est basé sur SSH, on a pas grand chose à installer sur notre serveur: // | ||
- | |||
- | ==== Côté commutateur ==== | ||
- | < | ||
- | sw> enable | ||
- | sw# configure terminal | ||
- | sw(config)# archive | ||
- | </ | ||
- | |||
- | < | ||
- | sw(archive-config)# | ||
- | </ | ||
- | C.f. : Note sur le nom du fichier < | ||
- | |||
- | < | ||
- | sw(archive-config)# | ||
- | </ | ||
- | < | ||
- | sw(archive-config)# | ||
- | </ | ||
- | On va lancer le processus d' | ||
- | |||
- | < | ||
- | |||
- | Le « $h » correspond au nom d'hote du commutateur, | ||
- | |||
- | Ici le timestamp est sous la forme «mois–numéro du jour-année-heure-minute-seconde-milliseconde», | ||
- | < | ||
- | sw(config)# service timestamp log datetime msec year | ||
- | </ | ||
- | |||
- | <WRAP center round important 60%> | ||
- | Il est important de garder des noms de fichier uniformes, ça nous sera utile ensuite pour la partie versionning. | ||
- | </ | ||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | ==== Côté serveur ==== | ||
- | |||
- | La configuration __minimale__ du serveur est très simple: **openssh-server**, | ||
- | |||
- | On commence par créer un utilisateur et définir son mot de passe: | ||
- | < | ||
- | |||
- | Il nous faudra faire aussi 2 petites modifications de la configuration de notre serveur SSH: | ||
- | |||
- | Nos commutateurs utilisent une veille version de SSH qui utilise des algorithmes d' | ||
- | Pour déterminer les algos à ajouter à notre sshd on va essayer de se connecter en SSH depuis le commutateur sur notre serveur, normalement ça foire. Il ne nous reste plus qu'a retrouver les algos proposés par le commutateur dans /// | ||
- | |||
- | Easy: | ||
- | < | ||
- | root@confsw:/# | ||
- | Jul 7 13:11:49 confsw sshd[1537]: Unable to negotiate with 192.168.103.219 port 25650: no matching key exchange method found. Their offer: diffie-hellman-group1-sha1 [preauth] | ||
- | Jul 7 13:13:53 confsw sshd[1212]: Unable to negotiate with 192.168.103.219 port 50277: no matching cipher found. Their offer: aes128-cbc, | ||
- | |||
- | </ | ||
- | |||
- | On ajoute donc ces algos à notre /// | ||
- | < | ||
- | KexAlgorithms +diffie-hellman-group1-sha1 | ||
- | Ciphers +aes128-cbc, | ||
- | </ | ||
- | |||
- | < | ||
- | |||
- | === SCP oui, SSH non ! === | ||
- | |||
- | Pour éviter que le commutateur ait un accès shell à notre machine on va utiliser un petit programme qui s' | ||
- | |||
- | < | ||
- | |||
- | On change le login shell de notre utilisateur par rssh: | ||
- | < | ||
- | |||
- | Dans le fichier /// | ||
- | < | ||
- | |||
- | Ce qui veut dire: « Pour l' | ||
- | |||
- | Extrait de //man 5 rssh.conf//: | ||
- | < | ||
- | The user keyword' | ||
- | |||
- | username | ||
- | The username of the user for whom the entry provides options | ||
- | umask | ||
- | The umask for this user, in octal, just as it would be specified to the shell | ||
- | access bits | ||
- | Six binary digits, which indicate whether the user is allowed to use rsync, | ||
- | path | ||
- | The directory to which this user should be chrooted (this is not a command, it is a directory name). | ||
- | |||
- | </ | ||
- | |||
- | |||
- | Il nous reste plus qu'a créer le chroot: | ||
- | < | ||
- | root@confsw:/# | ||
- | root@confsw:/# | ||
- | root@confsw:/# | ||
- | root@confsw:/# | ||
- | </ | ||
- | |||
- | |||
- | <WRAP center round important 60%> | ||
- | TODO: Comment tester rapidement la configuration de rssh | ||
- | </ | ||
- | |||
- | |||
- | === Gestion des versions === | ||
- | |||
- | On commence par créer un utilisateur qui va « gitter » nos configurations. | ||
- | On crée également le dossier qui va être le dossier de travail de notre utilisateur, | ||
- | <WRAP center round important 60%> | ||
- | Il faut bien faire en sorte que notre nouvel utilisateur ait les droits de lecture au moins dans /// | ||
- | </ | ||
- | |||
- | On utilise **inotify** via **incron** pour monitorer les fichiers dans /// | ||
- | |||
- | < | ||
- | root@confsw:/# | ||
- | </ | ||
- | |||
- | Il faudra ensuite éditer la incrontab de jhondoe: | ||
- | < | ||
- | root@confsw:/# | ||
- | </ | ||
- | Pour y ajouter notre tâche: | ||
- | < | ||
- | / | ||
- | </ | ||
- | Qui peut se traduire par: « Lorsqu' | ||
- | /// | ||
- | |||
- | Le script « git_swconfig.sh » va alors traiter notre fichier de configuration fraîchement uploadé par le commutateur afin de le copier dans un dépôt git (tout en générant des logs dans syslog): | ||
- | <code bash> | ||
- | #!/bin/bash | ||
- | |||
- | INPUT_FILE=$1 | ||
- | LOGGER="/ | ||
- | GIT_BIN="/ | ||
- | GIT_USER=" | ||
- | OUTPUT_DIR="/ | ||
- | GIT_WORK_TREE=" | ||
- | |||
- | #Expected filename format: < | ||
- | FILENAME=$(basename $INPUT_FILE) | ||
- | |||
- | HOSTNAME=$(echo $FILENAME | awk -F' | ||
- | REVISION=$(echo $FILENAME | awk -F' | ||
- | |||
- | TIMESTAMP_RAW=$(echo $FILENAME | awk -F' | ||
- | MONTH=$(echo $TIMESTAMP_RAW | awk ' | ||
- | DAY=$(echo $TIMESTAMP_RAW | awk ' | ||
- | YEAR=$(echo $TIMESTAMP_RAW | awk ' | ||
- | HOUR=$(echo $TIMESTAMP_RAW | awk ' | ||
- | MIN=$(echo $TIMESTAMP_RAW | awk ' | ||
- | SEC=$(echo $TIMESTAMP_RAW | awk ' | ||
- | MSEC=$(echo $TIMESTAMP_RAW | awk ' | ||
- | |||
- | OUTPUT_FILE=" | ||
- | DATE=$(date -d" | ||
- | |||
- | function versionning { | ||
- | ACTION=$1 | ||
- | $GIT_BIN $GIT_WORK_TREE init $OUTPUT_DIR | ||
- | cp $INPUT_FILE $OUTPUT_FILE | ||
- | if [ $ACTION = " | ||
- | $GIT_BIN $GIT_WORK_TREE add ${HOSTNAME}.conf | ||
- | ADD_STATUS=$? | ||
- | $LOGGER " | ||
- | fi | ||
- | COMMIT_MSG=" | ||
- | $GIT_BIN $GIT_WORK_TREE $GIT_USER commit -am " | ||
- | COMMIT_STATUS=$? | ||
- | | ||
- | #$GIT_BIN $GIT_WORK_TREE push -u origin master | ||
- | # | ||
- | | ||
- | } | ||
- | |||
- | if [ -e $OUTPUT_FILE ]; then | ||
- | diff -q $INPUT_FILE $OUTPUT_FILE | ||
- | DIFF=$? | ||
- | if [ $DIFF -eq 1 ]; then | ||
- | $LOGGER "DEST: ${OUTPUT_FILE} differs from SRC: ${INPUT_FILE}. Updating DEST." | ||
- | versionning " | ||
- | else | ||
- | $LOGGER "No change detected between ${INPUT_FILE} and ${OUTPUT_FILE}. Nothing to do." | ||
- | fi | ||
- | else | ||
- | $LOGGER "DEST: ${OUTPUT_FILE} does not exist. Adding DEST." | ||
- | versionning " | ||
- | fi | ||
- | |||
- | </ | ||
- | |||
- | Notre dossier /// | ||
- | |||
- | ===== Démo ===== | ||
- | |||
- | Un container tourne en dev | ||
- | < | ||
- | ct: 105 | ||
- | hostname: confsw | ||
- | ip: 192.168.103.178 | ||
- | </ | ||
- | |||
- | |||
- | On peut faire un « git log » dans /// | ||
- | |||
- | Les choses intéressantes sur le CT: | ||
- | < | ||
- | /etc/passwd | ||
- | / | ||
- | / | ||
- | / | ||
- | / | ||
- | / | ||
- | / | ||
- | / | ||
- | / | ||
- | </ | ||
- | |||
- | Les choses intéressantes sur le commutateur du local (en mode privilégié): | ||
- | < | ||
- | Le bloc de configuration « archive ». | ||
- | La configuration de « service timestamp log ». | ||
- | Le résultat de « show archive ». | ||
- | </ | ||
- | |||
- | ===== Autre fonctionnalité des archives Cisco ===== | ||
- | |||
- | |||
- | Il est possible de journaliser toutes les commandes entrées sur le commutateur par un utilisateur. Combiné avec l' | ||
- | Tout est expliqué dans [[https:// | ||
- | |||
- | Exemple de log: | ||
- | {{: | ||
- | |||
- | ===== FIN ===== | ||
- | |||
- | |||
- | --- // | ||