![Stacks Image 17415](files/stacks-image-5a04a3c.png)
La nouvelle version des plugins Centreon datant du 24 janvier 2019 va nous permettre l'utilisation de fichiers chiffrés pour certaines macros comme par exemple le nom de communauté SNMP. L'intérêt est de pouvoir cacher certaines informations à certains utilisateurs qui ne seraient pas habilités à les connaître. Pour cela, Quentin nous a concocter une option pass-manager permettant l'utilisation d'un logiciel de chiffrage de mot de passe. Vous avez la possibilité d'utiliser Teampass en utilisant une API ou KeePass en utilisant un fichier plat. Dans ce tutoriel nous utiliserons KeePass sur une architecture CentOS 7 et Debian 9 avec Centreon 18.10. Cette option est normalement disponible pour tous les plugins (Global Options).
Mise à jour de ce tutoriel, auparavant cette fonctionnalité supportait seulement les fichiers KeePass en version 3. Depuis le début juillet 2021, la lib perl-KeePass-Header est compatible avec la version 4 des bases KeePass.
Mise à jour de ce tutoriel, auparavant cette fonctionnalité supportait seulement les fichiers KeePass en version 3. Depuis le début juillet 2021, la lib perl-KeePass-Header est compatible avec la version 4 des bases KeePass.
1 Prérequis
Avant de réaliser la configuration dans Centreon, nous devons installer les prérequis pour le plugin.
1.1 AlmaLinux
Tout d'abord, nous Installer les paquets rpm prérequis
dnf install perl-Test-Base perl-ExtUtils-MakeMaker wget gcc git
Ensuite il faudra installer les librairies perl. Patientez, cela prends un peu de temps.
cpan install Log::Log4perl cpan install Text::Levenshtein::XS cpan install Crypt::Argon2
1.2 CentOS 7 (ISO Centreon)
Tout d'abord, nous aurons besoin de wget pour récupérer certaines sources et gcc pour les compiler.
yum install perl-ExtUtils-MakeMaker wget gcc git
Ensuite il faudra activer le dépôt openfusion.
rpm -Uvh http://repo.openfusion.net/centos7-x86_64/openfusion-release-0.7-1.of.el7.noarch.rpm
Et récupérer quelques packages de librairies Perl.
yum install perl-Crypt-Argon2
Passez au point 2.2
1.3 Debian
Tout d'abord, nous aurons besoin de wget pour récupérer certaines sources, gcc pour les compiler et quelques librairies perl.
apt install libcryptx-perl libextutils-makemaker-cpanfile-perl
Ensuite il faudra installer les librairies perl. Patientez, cela prends un peu de temps.
cpan install Log::Log4perl cpan install Crypt::Argon2 cpan install XML::LibXML::Simple module cpan install JSON::Path
Passez au point 2.2
2 Installation des librairies perl
2.1 Installation de la librairie perl-KeePass-Reader
Nous allons récupérer le GitHub proposé par Centreon pour pouvoir lire les fichier KeePass.
git clone https://github.com/garnier-quentin/perl-KeePass-Reader.git
Lancez la commande suivante
perl Makefile.PL Generating a Unix-style Makefile Writing Makefile for KeePass::Reader Writing MYMETA.yml and MYMETA.json
Continuez par la compilation
make cp lib/KeePass/constants.pm blib/lib/KeePass/constants.pm cp lib/KeePass/Keys/Composite.pm blib/lib/KeePass/Keys/Composite.pm cp lib/KeePass/Crypto/Aes2Kdf.pm blib/lib/KeePass/Crypto/Aes2Kdf.pm cp lib/KeePass/Crypto/Argon2Kdf.pm blib/lib/KeePass/Crypto/Argon2Kdf.pm cp lib/KeePass/Keys/File.pm blib/lib/KeePass/Keys/File.pm cp lib/KeePass/Reader.pm blib/lib/KeePass/Reader.pm cp lib/KeePass/Keys/Password.pm blib/lib/KeePass/Keys/Password.pm Manifying 1 pod document
Installons notre librairie
make install Manifying 1 pod document Installing /usr/local/share/perl5/KeePass/constants.pm Installing /usr/local/share/perl5/KeePass/Reader.pm Installing /usr/local/share/perl5/KeePass/Keys/Composite.pm Installing /usr/local/share/perl5/KeePass/Keys/File.pm Installing /usr/local/share/perl5/KeePass/Keys/Password.pm Installing /usr/local/share/perl5/KeePass/Crypto/Aes2Kdf.pm Installing /usr/local/share/perl5/KeePass/Crypto/Argon2Kdf.pm Installing /usr/local/share/man/man3/KeePass::Reader.3pm Appending installation info to /usr/lib64/perl5/perllocal.pod
2.2 Installation de la librairie Keypass de Centreon
Pour éviter cette erreur ci-dessous
/usr/lib/centreon/plugins/centreon_linux_snmp.pl --plugin=os::linux::snmp::plugin --mode=load --hostname=127.0.0.1 --pass-manager=keepass --keepass-endpoint=general --keepass-endpoint-file=/etc/centreon/keepass/keepass_conn.pm --debug UNKNOWN: Cannot load module 'centreon::plugins::passwordmgr::keepass' Can't locate centreon/plugins/passwordmgr/keepass.pm in @INC (@INC contains: /usr/lib/centreon/plugins FatPacked::9223048=HASH(0x8cbb88) /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /usr/lib/centreon/plugins/centreon_linux_snmp.pl line 399.
Il faut récupérer le fichier keepass.pm
Debian
mkdir -p /usr/share/perl5/centreon/plugins/passwordmgr wget https://raw.githubusercontent.com/centreon/centreon-plugins/master/centreon/plugins/passwordmgr/keepass.pm -O /usr/share/perl5/centreon/plugins/passwordmgr/keepass.pmCENTREON
mkdir -p /usr/share/perl5/vendor_perl/centreon/plugins/passwordmgr wget https://raw.githubusercontent.com/centreon/centreon-plugins/master/centreon/plugins/passwordmgr/keepass.pm -O /usr/share/perl5/vendor_perl/centreon/plugins/passwordmgr/keepass.pmAlmaLinux
mkdir -p /usr/share/perl5/vendor_perl/centreon/plugins/passwordmgr wget https://raw.githubusercontent.com/centreon/centreon-plugins/master/centreon/plugins/passwordmgr/keepass.pm -O /usr/share/perl5/vendor_perl/centreon/plugins/passwordmgr/keepass.pm
2 Création du fichier keepass
Nous allons aborder la création de notre fichier keepass. Notre exemple est réalisé avec KeePass pour Linux mais fonctionne sans problème sur d'autres système. Créez votre fichier avec un mot de passe maître "centreon" pour l'exemple.
![Stacks Image 17582](files/stacks-image-d06eb15.png)
création du fichier
Vérifiez que vous utilisez la version 4 de KeePass
![Stacks Image 43810](files/stacks-image-4f10892.png)
Version du fichier
Cliquez sur Paramètres Avancés pour vérifier le type de chiffrage.
![Stacks Image 43830](files/stacks-image-7832ff9.png)
Type du chiffrage
Saisissez votre mot de passe
![Stacks Image 17611](files/stacks-image-4a1eb0b-800x534.png)
Saisie du mot de passe maître
Sauvegardez votre fichier sous le nom centreonv4.kdbx
![Stacks Image 17632](files/stacks-image-e1dd586-800x464.png)
Sauvegarde du fichier
Il reste à peupler cette base de données.
![Stacks Image 43835](files/stacks-image-46f6579-800x298.png)
Le fichier vide
Dans notre exemple, nous allons créer 3 groupes : SERVERS, NETWORKS et NAS. Le groupe SERVERS contiendra 2 entrées Linux et Windows. Le mot de passe des ces entrées contiendra le nom de communauté SNMP de chaque entité. Idem pour le groupe NETWORKS, il contiendra l'entrée SWITH et le groupe NAS contiendra les entrées QNAP et SYNOLOGY.
![Stacks Image 43838](files/stacks-image-5b94bda-800x476.png)
Organisation du fichier
Voici une représentation simplifiée de l'architecture du fichier centreonv4.kbdx. Il n'y a que les informations essentielles représentées.
![Stacks Image 43869](files/stacks-image-5bc9566-800x596.jpg)
Organisation du fichier
3 Configuration de l'accès au fichier pour le plugin.
Maintenant, copiez le fichier centreonv4.kbdx dans le dossier /etc/centreon/keepass. Le user centreon-engine doit avoir les droits de lecture. il s'agit d'indiquer aux plugins l'accès à ce fichier. Nous utiliserons un nouveau fichier comme ceci :
mkdir /etc/centreon/keepass chown centreon: /etc/centreon/keepass chmod 775 /etc/centreon/keepass chmod 755 /etc/centreon/keepass/centreonv4.kdbx vi /etc/centreon/keepass/keepass_conn.pm
Nous utiliserons un nouveau fichier comme ceci :
our $keepass_connections = { general => { file => '/etc/centreon/keepass/centreonv4.kdbx', password => 'centreon', } }; 1;
Ce fichier indique le chemin du fichier KeePass et le mot de passe maître.
4 Premier test
![Stacks Image 43825](files/stacks-image-fa0737e-48x46.png)
On peut utiliser un fichier de test livré dans le GitHub, il s'agit du fichier keepass_read.pl dans le dossier examples. Il faudra modifier une ligne pour mettre le bon chemin du fichier à tester.
my $content = $keepass->load_db(file => '/etc/centreon/keepass/centreonv4.kdbx', password => 'centreon');
ensuite il suffit de lancer la commande comme ceci
perl keepass_read.pl
Avant toute chose, vérifiez que l'option pass-manager est disponible sur votre plugin. Exemple :
plugin GitHub
/usr/lib/centreon/plugins/centreon_plugins.pl --plugin=os::linux::snmp::plugin --plugin=os::linux::snmp::plugin.pm --helpplugin FatPacked
/usr/lib/centreon/plugins/centreon_linux_snmp.pl --plugin=os::linux::snmp::plugin --plugin=os::linux::snmp::plugin.pm --help
Plugin Description: Check Linux operating systems in SNMP. Global Options: --mode Choose a mode. --dyn-mode Specify a mode with the path (separated by '::'). --list-mode List available modes. --mode-version Check minimal version of mode. If not, unknown error. --version Display plugin version. --pass-manager Use a password manager.
Nous ferons un test en ligne de commande pour l'instant. Nous utiliserons le plugin os::linux::snmp::plugin pour les serveurs Central et Poller. Commençons d'abord à lire le fichier KeePass pour voir la structure du fichier. N'oubliez pas de vous connecter en tant que centreon-engine sur le Central (bonne pratique Centreon).
plugin GitHub
/usr/lib/centreon/plugins/centreon_plugins.pl --plugin=os::linux::snmp::plugin --mode=load --hostname=127.0.0.1 --pass-manager=keepass --keepass-endpoint=general --keepass-endpoint-file=/etc/centreon/keepass/keepass_conn.pm --debugplugin FatPacked
/usr/lib/centreon/plugins/centreon_linux_snmp.pl --plugin=os::linux::snmp::plugin --mode=load --hostname=127.0.0.1 --pass-manager=keepass --keepass-endpoint=general --keepass-endpoint-file=/etc/centreon/keepass/keepass_conn.pm --debug
Voici les principaux paramètres :
--pass-manager=keepass —> type de logiciel keepass ou teampass
--keepass-endpoint=general —> point d'entrée dans le fichier de configuration. Il est possible d'avoir plusieurs configurations keepass ou teampass
--keepass-endpoint-file=/etc/centreon/keepass/keepass_conn.pm —> l'emplacement du fichier de configuration.
Le paramètre optionnel --debug nous permet d'afficher au format json le fichier lu par le plugin ci-dessous un extrait du résultat :
--pass-manager=keepass —> type de logiciel keepass ou teampass
--keepass-endpoint=general —> point d'entrée dans le fichier de configuration. Il est possible d'avoir plusieurs configurations keepass ou teampass
--keepass-endpoint-file=/etc/centreon/keepass/keepass_conn.pm —> l'emplacement du fichier de configuration.
Le paramètre optionnel --debug nous permet d'afficher au format json le fichier lu par le plugin ci-dessous un extrait du résultat :
$VAR1 = { 'Meta' => { 'EntryTemplatesGroupChanged' => 'Q/KK2A4AAAA=', 'MasterKeyChangeForce' => '-1', 'DefaultUserName' => {}, 'DefaultUserNameChanged' => 'Q/KK2A4AAAA=', 'LastTopVisibleGroup' => 'AAAAAAAAAAAAAAAAAAAAAA==', 'DatabaseDescription' => 'Test avec groupes', 'MaintenanceHistoryDays' => '365', 'Color' => {}, 'Generator' => 'KeePassXC', 'LastSelectedGroup' => 'AAAAAAAAAAAAAAAAAAAAAA==', 'DatabaseName' => 'centreonv4-1', 'CustomIcons' => {}, 'HistoryMaxSize' => '6291456', 'MasterKeyChanged' => 'ZfKK2A4AAAA=', 'RecycleBinEnabled' => 'True', 'DatabaseNameChanged' => 'WPKK2A4AAAA=', 'HistoryMaxItems' => '10', 'RecycleBinChanged' => '/PKK2A4AAAA=', 'CustomData' => { 'Item' => [ { 'Key' => '_LAST_MODIFIED', 'Value' => 'jeu. juil. 22 05:00:12 2021 GMT' }, { 'Value' => '1000', 'Key' => 'KPXC_DECRYPTION_TIME_PREFERENCE' } ] }, 'RecycleBinUUID' => 'bklxbdcdTeW+vPHiNBJnnw==', 'DatabaseDescriptionChanged' => 'WPKK2A4AAAA=', 'EntryTemplatesGroup' => 'AAAAAAAAAAAAAAAAAAAAAA==', 'SettingsChanged' => 'Q/KK2A4AAAA=', 'MemoryProtection' => { 'ProtectUserName' => 'False', 'ProtectNotes' => 'False', 'ProtectTitle' => 'False', 'ProtectURL' => 'False', 'ProtectPassword' => 'True' }, 'MasterKeyChangeRec' => '-1' }, 'Root' => { 'DeletedObjects' => {}, 'Group' => [ { 'LastTopVisibleEntry' => 'AAAAAAAAAAAAAAAAAAAAAA==', 'EnableAutoType' => 'null', 'Notes' => {}, 'DefaultAutoTypeSequence' => {}, 'IsExpanded' => 'True', 'EnableSearching' => 'null', 'UUID' => 'tn2sp75VSyWKxLlasmw99Q==', 'Group' => [ { 'Name' => 'SERVERS', 'IconID' => '48', 'Times' => { 'CreationTime' => 'mfKK2A4AAAA=', 'Expires' => 'False', 'LastAccessTime' => 'RvSK2A4AAAA=', 'ExpiryTime' => 'mfKK2A4AAAA=', 'LastModificationTime' => 'RvSK2A4AAAA=', 'LocationChanged' => 'zvKK2A4AAAA=', 'UsageCount' => '0' }, 'EnableAutoType' => 'null', 'LastTopVisibleEntry' => 'AAAAAAAAAAAAAAAAAAAAAA==', 'DefaultAutoTypeSequence' => {}, 'Notes' => {}, 'UUID' => '1o0oAdJ5RTuZvm8PZwBB5Q==', 'EnableSearching' => 'null', 'Entry' => [ { 'Times' => { 'ExpiryTime' => 'wvOK2A4AAAA=', 'LocationChanged' => '2fOK2A4AAAA=', 'LastModificationTime' => '2fOK2A4AAAA=', 'LastAccessTime' => '2fOK2A4AAAA=', 'UsageCount' => '0', 'Expires' => 'False', 'CreationTime' => 'wvOK2A4AAAA=' }, 'IconID' => '0', 'History' => {}, 'UUID' => '3S9/MzxSQ/GzbyzsbRE7lQ==', 'Title' => 'Linux', 'ForegroundColor' => {}, 'OverrideURL' => {}, 'Tags' => {}, 'String' => [ { 'Key' => 'Notes', 'Value' => {} }, { 'Key' => 'Password', 'Value' => { 'Protected' => 'True', 'content' => 'publick' } }, { 'Value' => 'Linux', 'Key' => 'Title' }, { 'Key' => 'URL', 'Value' => {} }, { 'Key' => 'UserName', 'Value' => 'SNMP_COMMUNITY' } ], 'BackgroundColor' => {}, 'AutoType' => { 'DefaultSequence' => {}, 'DataTransferObfuscation' => '0', 'Enabled' => 'True' } }, …………………………………………….
Pour retrouver les valeurs qui nous intéresse, il faudra utiliser le paramètre --keepass-search-value. Les champs utiles sont le champ Name dans les groupes (Group), le champ Title dans les entrées (entry) et le champ password (String). Voici la syntaxe de la recherche pour les serveurs Linux un peu abscons, il faut l'admettre ;)
--keepass-search-value='snmpcommunity=$..Root..Group..Group[?($_->{Name} =~ /SERVERS/i)].Entry[?($_->{Title} =~ /Linux/i)].String[?($_->{Key} =~ /Password/i)].Value.content'
La recherche se fait sur la chaine SERVERS pour les groupes et Linux pour les entrées, le caractère i annule le case sensitive. On récupère le champ password associé au champ title dans la variable snmpcommunity. Ensuite on utilise un autre paramètre --keepass-map-option permettant de surcharger le paramètre SNMP du plugin avec le résultat de la recherche.
--keepass-map-option="snmp-community=%{snmpcommunity}"
Finalement la commande complète pour récupérer la charge du serveur Central donne ceci :
plugin GitHub
/usr/lib/centreon/plugins/centreon_plugins.pl --plugin=os::linux::snmp::plugin.pm --mode=load --hostname=127.0.0.1 --pass-manager=keepass --keepass-endpoint=general --keepass-endpoint-file=/etc/centreon/keepass/keepass_conn.pm --keepass-search-value='snmpcommunity=$..Root..Group..Group[?($_->{Name} =~ /SERVERS/i)].Entry[?($_->{Title} =~ /Linux/i)].String[?($_->{Key} =~ /Password/i)].Value.content' --keepass-map-option="snmp-community=%{snmpcommunity}"plugin FatPacked
/usr/lib/centreon/plugins/centreon_linux_snmp.pl --plugin=os::linux::snmp::plugin.pm --mode=load --hostname=127.0.0.1 --pass-manager=keepass --keepass-endpoint=general --keepass-endpoint-file=/etc/centreon/keepass/keepass_conn.pm --keepass-search-value='snmpcommunity=$..Root..Group..Group[?($_->{Name} =~ /SERVERS/i)].Entry[?($_->{Title} =~ /Linux/i)].String[?($_->{Key} =~ /Password/i)].Value.content' --keepass-map-option="snmp-community=%{snmpcommunity}" OK: Load average: 0.00, 0.03, 0.06 | 'load1'=0.00;;;0; 'load5'=0.03;;;0; 'load15'=0.06;;;0;
Dans ce cas, l'option --debug nous permettra de visualiser le résultat de la recherche.
lookup = $..Root..Group..Group[?($_->{Name} =~ /SERVERS/i)].Entry[?($_->{Title} =~ /Linux/i)].String[?($_->{Key} =~ /Password/i)].Value.content - response = $VAR1 = 'publick';
5 Configuration dans Centreon
5.1 Configuration Plugin-Pack
Nous utiliserons la macro SNMPEXTRAOPTIONS pour ajouter les options keepass comme ceci.
SNMPEXTRAOPTIONS=--pass-manager=keepass --keepass-endpoint=general --keepass-endpoint-file=/etc/centreon/keepass/keepass_conn.pm --keepass-search-value='snmpcommunity=$..Root..Group..Group[?($_->{Name} =~ /SERVERS/i)].Entry[?($_->{Title} =~ /Linux/i)].String[?($_->{Key} =~ /Password/i)].Value.content' --keepass-map-option="snmp-community=%{snmpcommunity}"
![Stacks Image 43849](files/stacks-image-8274d34-800x638.jpg)
Configuration de l'hôte
5.2 Configuration avec mes plugins
Si vous utilisez mes scripts pour la création des plugins, utilisez la macro OPTION.
OPTION=--pass-manager=keepass --keepass-endpoint=general --keepass-endpoint-file=/etc/centreon/keepass/keepass_conn.pm --keepass-search-value='snmpcommunity=$..Root..Group..Group[?($_->{Name} =~ /SERVERS/i)].Entry[?($_->{Title} =~ /Linux/i)].String[?($_->{Key} =~ /Password/i)].Value.content' --keepass-map-option="snmp-community=%{snmpcommunity}"
![Stacks Image 43856](files/stacks-image-fb848d5-800x418.jpg)
Configuration de l'hôte
5.3 Création manuelle
Nous utiliserons un exemple très simple, par exemple le cpu.
5.3a Création de la commande
créez la commande OS-Linux-SNMP-Cpu. Nous ajouterons une macro d'hôte personnalisée SNMPOPTION
![Stacks Image 17833](files/stacks-image-65124bb.jpg)
La commande de vérification
$CENTREONPLUGINS$/centreon_linux_snmp.pl --plugin=os::linux::snmp::plugin --mode=cpu --hostname=$HOSTADDRESS$ --snmp-version='$_HOSTSNMPVERSION$' $_HOSTSNMPOPTION$ --warning-average='$_SERVICEWARNING$' --critical-average='$_SERVICECRITICAL$'
5.3b Création du template de service
créez le template de service OS-Linux-Cpu-SNMP
![Stacks Image 43729](files/stacks-image-dfe14fa-800x482.jpg)
Le template de service
5.3c Création du template d'hôte
créez le template d'hôte OS-Linux-SNMP
![Stacks Image 43734](files/stacks-image-4baa0b9-800x322.jpg)
Le template d'hôte
Associez le template de service
![Stacks Image 43739](files/stacks-image-b22f8ff.jpg)
Relation template de service -> template d'hôte
5.3d Création de l'hôte
Créons l'hôte Central avec le template d'hôte OS-Linux-SNMP
![Stacks Image 43746](files/stacks-image-d916bc2-800x496.jpg)
Création de l'hôte Central
Insérez les données suivantes dans la macro SNMPOPTION
OPTION=--pass-manager=keepass --keepass-endpoint=general --keepass-endpoint-file=/etc/centreon/keepass/keepass_conn.pm --keepass-search-value='snmpcommunity=$..Root..Group..Group[?($_->{Name} =~ /SERVERS/i)].Entry[?($_->{Title} =~ /Linux/i)].String[?($_->{Key} =~ /Password/i)].Value.content' --keepass-map-option="snmp-community=%{snmpcommunity}"
5.4 Test de la configuration
Une fois la configuration appliquée, on constate qu'il n'est pas possible de voir le nom de communauté.
![Stacks Image 43759](files/stacks-image-7347301-800x622.jpg)
Un service SNMP utilisant la fonctionnalité pass-manager