Installer et configurer SNMP sur CentOS 8
Sommaire
I. Présentation
Récemment, j'ai eu besoin d'installer et configurer le SNMP sur un serveur sous CentOS 8, avec notamment l'utilisation des ACL pour restreindre l'accès à la communauté déclarée. L'occasion d'écrire quelques lignes sur le sujet pour les partager avec vous.
La procédure étant variable d'un système à l'autre et d'une version à l'autre, ici nous allons voir comment installer SNMP sous CentOS 8. L'un de nos précédents articles (lien ci-dessous), reste valable en fonction du système que vous utilisez mais notamment pour la configuration de base, ici je vais plutôt mettre l'accent sur les ACL.
II. Installer SNMP sous CentOS 8
Pour installer les paquets utiles au bon fonctionnement de SNMP, nous allons utiliser le gestionnaire de paquets "dnf" présent sous Fedora depuis la version 22. Commençons par mettre à jour la base de paquets :
dnf update
Lorsque c'est fait, nous allons installer NET-SNMP et les outils nécessaires sur la machine :
dnf install net-snmp net-snmp-libs net-snmp-utils
Pour que le service snmpd démarre automatiquement lorsque le système reboot, exécutez cette commande :
systemctl enable snmpd
Le retour suivant va s'afficher dans la console :
Created symlink /etc/systemd/system/multi-user.target.wants/snmpd.service → /usr/lib/systemd/system/snmpd.service.
Profitons-en pour prendre connaissance de la commande qui sert à redémarrer le service snmpd. Classique mais à connaître :
systemctl restart snmpd
De la même façon, nous pouvons afficher le statut du service snmpd avec cette commande :
systemctl status snmpd
L'installation est terminée et le service est démarré, passons à sa configuration.
III. Configurer SNMP sous CentOS 8
Le fichier de configuration du service snmpd est le fichier "/etc/snmp/snmpd.conf" donc avant de le modifier, je vous propose d'en faire une copie :
cp /etc/snmp/snmpd.conf /etc/snmp/snmpd.bak
Avant de commencer à le modifier, vous pouvez vérifier que l'hôte local est bien accessible via SNMP (version 2c) :
snmpwalk -v2c -c public localhost system
Si vous n'obtenez pas d'erreur et que vous avez plusieurs lignes retournées dans la console, c'est tout bon ! Dernière chose avant d'attaquer la configuration via snmpd.conf, nous allons ouvrir les flux dans le pare-feu du système. Sans cette modification, l'accès SNMP est possible uniquement en local.
Créons une règle pour autoriser le port 161/UDP correspondant au SNMP :
firewall-cmd --add-port=161/udp --permanent firewall-cmd --reload
Pour la configuration, on peut se contenter de créer une communauté et de la rendre accessible sans limitation. On peut aussi décider de créer une communauté et de limiter son accès à certains hôtes, c'est là où la configuration se complique un peu car nous devons utiliser les ACL.
La logique est la suivante :
A - Créer une vue (ou utiliser la vue systemview existante)
B - Déclarer les hôtes sources et la communauté associée
C - Créer un groupe d'hôtes sources (avec les noms utilisés précédemment)
D - Créer une règle d'accès pour autoriser un groupe à utiliser une vue
Pour parvenir à réaliser cette configuration, cela nécessite de modifier en profondeur le fichier de configuration snmpd.conf, plus particulièrement la section "Access Control".
Dans cet exemple, nous allons utiliser la vue prédéfinie systemview afin d'autoriser l'accès à cette vue à deux hôtes seulement : localhost et le serveur de supervision (déclaré en tant que "centreon") avec l'adresse IP 192.168.1.100. L'accès à cette vue sera possible via le SNMP en version 2C et la communauté itconnect, en lecture seule.
Reprenons les étapes dans l'ordre...
A. Créer une vue
Comme je le disais, nous allons reprendre la vue systemview déjà définie et cela correspond à ces lignes :
view systemview included .1.3.6.1.2.1.1 view systemview included .1.3.6.1.2.1.25.1.1
Pour ouvrir un peu plus l'accès à la MIB SNMP, vous pouvez modifier comme ceci :
view systemview included .1
B. Déclarer les hôtes et la communauté
Pour déclarer les hôtes et la communauté, la syntaxe est la suivante :
com2sec <nom-hote> <adresse IP> <nom-de-la-communauté>
Il est à noter que le nom d'hôte est libre, il ne doit pas nécessairement correspondre au nom de la machine. Pour déclarer l'hôte local et le serveur de supervision, cela donne :
com2sec local localhost itconnect com2sec centreon 192.168.1.100/32 itconnect
C. Créer un groupe d'hôtes
Maintenant, nous allons créer un groupe nommé "group_ro" pour "Groupe Read-Only" puisqu'il s'agit d'un groupe en lecture seule cela sera parlant. La syntaxe est la suivante :
group <nom-groupe> <version-snmp> <hôte-à-ajouter>
Puisque nous avons deux hôtes à ajouter au même groupe, cela donne :
group group_ro v2c local group group_ro v2c centreon
D. Créer une règle d'accès SNMP
Enfin, nous allons réutiliser les éléments précédents pour créer une règle d'accès afin que le groupe "group_ro" soit autorisé à utiliser la vue "systemview". Ce qui donne (syntaxe : context - sec.model - sec.level - prefix - read - write - notif) :
access group_ro "" any noauth exact systemview none none
Dans le fichier de configuration, il va falloir commenter ou supprimer certaines lignes, et ajouter nos propres déclarations. Voici ce que ça donne pour la section "Access Control" :
############################################################################### # Access Control ############################################################################### # [...] # ----------------------------------------------------------------------------- # Make at least snmpwalk -v 1 localhost -c public system fast again. # name incl/excl subtree mask(optional) view systemview included .1.3.6.1.2.1.1 view systemview included .1.3.6.1.2.1.25.1.1 #### # Finally, grant the group read-only access to the systemview view. # group context sec.model sec.level prefix read write notif access notConfigGroup "" any noauth exact systemview none none # Here is a commented out example configuration that allows less # restrictive access. # YOU SHOULD CHANGE THE "COMMUNITY" TOKEN BELOW TO A NEW KEYWORD ONLY # KNOWN AT YOUR SITE. YOU *MUST* CHANGE THE NETWORK TOKEN BELOW TO # SOMETHING REFLECTING YOUR LOCAL NETWORK ADDRESS SPACE. ## sec.name source community #com2sec local localhost COMMUNITY com2sec local localhost itconnect com2sec centreon 192.168.1.100/32 itconnect ## group.name sec.model sec.name #group MyRWGroup any local #group MyROGroup any mynetwork # #group MyRWGroup any otherv3user #... group group_ro v2c local group group_ro v2c centreon ## incl/excl subtree mask #view all included .1 80 ## -or just the mib2 tree- #view mib2 included .iso.org.dod.internet.mgmt.mib-2 fc ## context sec.model sec.level prefix read write notif #access MyROGroup "" any noauth 0 all none none #access MyRWGroup "" any noauth 0 all all all access group_ro "" any noauth exact systemview none none
Avant de fermer le fichier de configuration, vous pouvez en profiter pour modifier les directives syslocation et syscontact en début de fichier. Ensuite, sauvegardez le fichier et redémarrez le service :
systemctl restart snmpd
Il ne reste plus qu'à tester que l'ACL fonctionne, à la fois depuis l'hôte local mais aussi depuis l'hôte distant que l'on a autorisé, en passant par l'outil snmpwalk.
IV. CentOS 8 - SNMP : CPU, RAM, LOAD, etc
Puisque je suis un mec sympa, je vais vous donner quelques pistes pour trouver les informations utiles sur votre système via SNMP. J'entends par là, obtenir des informations sur l'usage de la RAM, ou encore la charge système.
Pour obtenir des informations sur la mémoire, il faut interroger la MIB de cette façon :
snmpwalk -v2c -c itconnect 192.168.1.101 UCD-SNMP-MIB::memory
Ensuite, à vous de récupérer la valeur que vous trouvez pertinente dans votre cas. Par exemple, pour avoir la quantité de mémoire disponible sur l'hôte (sans la SWAP), cela donne :
snmpwalk -v2c -c itconnect 192.168.1.101 UCD-SNMP-MIB::memAvailReal.0
Avec un retour dans la console sous cette forme :
UCD-SNMP-MIB::memAvailReal.0 = INTEGER: 5988276 kB
Pour la mémoire SWAP disponible, utilisez :
snmpwalk -v2c -c itconnect 192.168.1.101 UCD-SNMP-MIB::memAvailSwap.0
Concernant la charge système avec les indicateurs à 1 minute, 5 minutes et 15 minutes, il faut interroger cette partie de la MIB :
snmpwalk -v2c -c itconnect 192.168.1.101 UCD-SNMP-MIB::laTable
Pour avoir l'une des valeurs de charge (1, 5 ou 15), il faudra spécifier de cette façon :
snmpwalk -v2c -c itconnect 192.168.1.101 UCD-SNMP-MIB::laNames.1 snmpwalk -v2c -c itconnect 192.168.1.101 UCD-SNMP-MIB::laNames.2 snmpwalk -v2c -c itconnect 192.168.1.101 UCD-SNMP-MIB::laNames.3
L'indice de charge associé sera retourné à chaque fois.
Enfin, concernant le disque dur, on peut interroger "UCD-DISKIO-MIB::diskIOTable" dans la MIB. J'en profite pour vous faire utiliser l'outil snmptable qui permet d'afficher une sortie en mode tableau lorsque cela est possible. La lecture devient simplifiée ?
snmptable -c itconnect -v 2c 192.168.1.101 UCD-DISKIO-MIB::diskIOTable
Il y a d'autres informations accessibles :
- CPU : UCD-SNMP-MIB::systemStats
- Interfaces réseau : IF-MIB::ifTable
- Trafic réseau : IF-MIB::ifOutOctets et IF-MIB::ifInOctets
Amusez-vous bien ! ?