Vous êtes ici:

Menu


Stacks Image 17415
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.

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.pm
CENTREON
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
AlmaLinux
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
création du fichier
Vérifiez que vous utilisez la version 4 de KeePass
Stacks Image 43810
Version du fichier
Cliquez sur Paramètres Avancés pour vérifier le type de chiffrage.
Stacks Image 43830
Type du chiffrage
Saisissez votre mot de passe
Stacks Image 17611
Saisie du mot de passe maître
Sauvegardez votre fichier sous le nom centreonv4.kdbx
Stacks Image 17632
Sauvegarde du fichier
Il reste à peupler cette base de données.
Stacks Image 43835
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
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
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
Autre exemple pour tester le fichier
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 --help
plugin 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 --debug
plugin 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 :
$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
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
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
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
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
Le template d'hôte
Associez le template de service
Stacks Image 43739
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
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
Un service SNMP utilisant la fonctionnalité pass-manager

Nous utilisons des cookies pour nous permettre de mieux comprendre comment le site est utilisé. En continuant à utiliser ce site, vous acceptez cette politique.