Puppet: autosignature de certificats

La signature de certificats est un processus essentiel de puppet visant à renforcer la sécurité du puppetmaster et de ses données.

Dans le cas d’une architecture sécurisée/maîtrisée/fermée avec beaucoup de machines à déployer, il peut être judicieux de changer de stratégie et d’autoriser les machines à accéder immédiatement au puppet master, sans intervention manuelle, permettant de déployer rapidement un grand parc de machines. Continuer à lire

Puppet: configurer des variables dconf

dconf est une sorte de système de « registre » très léger où sont stockées quelques informations de configuration utilisateur dans gnome, comme son fond d’écran, par exemple.

Nous allons créer un module qui va permettre de configurer des variables dconf.

Ce module prend 4 paramètres:

  • Le chemin de la clef
  • Sa valeur
  • L’utilisateur qu’on souhaite modifier
  • Le groupe qu’on souhaite modifier

Afin d’utiliser cette fonction, il suffit de l’appeler dans une classe existante:

C’est tout

Source initialeSources modifiées

Puppet: supprimer un fichier

Puppet permet de déployer des configurations, mais il permet également de supprimer des fichiers. Cela peut être utile lors d’une migration de logiciel, ou bien pour désactiver des services, comme sous Debian (si vous n’utilisez pas la méthode dédiée).

Pour se faire, il suffit de définir un fichier de s’assurer qu’il est absent.

Puppet: changer le shell d’un utilisateur

Puppet permet d’administrer un parc, de manière globale, pour du déploiement de configurations, de machine, mais également de faire des choses plus fines.

Voici comment changer le shell d’un utilisateur avec puppet (attention au chemin !):

Insérez ces quelques lignes dans l’une de vos classes et en quelques instants vous aurez changé le shell d’un de vos utilisateurs sur un ensemble de machines !

Puppet: créer/modifier un lien symbolique

Puppet est un outil très puissant permettant de configurer un parc de machines.

Il peut parfois être utile de définir des liens symboliques sur des ensembles de machines. Afin de réaliser cette action, nous allons tout simplement ajouter les lignes suivantes dans l’une de nos classes.

Le fichier suivant permet de configurer le fuseau horaire d’un ensemble de machines BSD.

Si le lien symbolique existe, alors celui-ci sera remplacé par le nouveau lien. Ici cela nous permettrait de changer de fuseau horaire sur l’ensemble du parc de manière très simple.

Puppet: Gestion centralisée de configurations

 

Puppet est un système de gestion centralisée des configurations. Il permet de déployer très rapidement des configurations sur un parc de serveurs, au moyen d'un système client-serveur cryptés via SSL, un système de droits et de fichiers à déployer. Nous allons voir comment l'installer, mais également quelques astuces de configuration.

Serveur

Installation

Sous Debian

apt-get install puppetmaster

Sous FreeBSD

cd /usr/ports/sysutils/factor
make install clean
cd /usr/ports/sysutils/puppet
make install clean

Configuration

Allez dans le répertoire /usr/local/etc/puppet. Tous les fichiers de configuration se trouveront ici. Créons déjà l'arborescence des dossiers.

mkdir modules manifests files files/bsd files/debian

  • Le répertoire modules définit l'ensemble des modules à utiliser pour un hôte. Ce module est défini par un nom et va servir à définir les permissions, le chemin et le contenu d'un fichier de configuration distribué.
  • Le répertoire files contient l'arborescence des fichiers de configuration. Par convention, ce sera distribution/arborescence locale. Par exemple pour le syslog sous Debian : files/debian/etc/syslog-ng.conf
  • Le répertoire manifests contient uniquement le fichier principal (site.pp) qui définit les clients

Configuration d'un module

Pour créer un module placez vous dans le dossier modules puis créez le répertoire correspondant au nom que vous souhaitez donner à votre module puis le répertoire manifests et enfin créez le fichier init.pp

cd modules
mkdir syslogng-bsd syslogng-bsd/manifests
cd syslogng-bsd/manifests
vi init.pp

Voici la base d'un fichier de configuration.

class syslogng-bsd {
    file { "/usr/local/etc/syslog-ng.conf":
            path => '/usr/local/etc/syslog-ng.conf',
            owner => 'root',
            group => 'wheel',
            mode => '0644',
            source => "puppet://puppetmaster.domain.tld/files/bsd/usr/local/etc/syslog-ng.conf",
    }
    exec { "service nrpe restart":
           command     => "/usr/sbin/service syslog-ng restart",
           logoutput   => false,
           subscribe => File["/etc/nrpe.cfg"],
           refreshonly => true,
    }
}

Détaillons les directives:

  • class : correspond au nom du module

  • file : les définitions du fichier de configuration

    • le premier champ est le nom du fichier

    • path : le chemin local vers le fichier

    • owner : le propriétaire du fichier

    • group : le groupe propriétaire du fichier

    • mode : les permissions sur le fichier

    • source : le chemin distant vers le fichier

    • ensure : type de fichier
  • exec : la commande à exécuter une fois la modification effectuée

    • command : chemin absolu de la commande à faire

    • logoutput : si on affiche la sortie ou non

    • subscribe : liste des fichiers qu'on vérifie afin de valider le lancement de la commande
    • refreshonly : exécute la commande uniquement si les fichiers subscribe ont été modifiés

Le paragraphe contenant la directive ensure permet de créer un répertoire, voire une arborescence.

Création de répertoire

Afin de créer un répertoire, il suffit d'ajouter un fichier de type directory, et de positionner les droits.

file { "/usr/local/etc/nrpe.d/":
      ensure => 'directory',
      owner => 'root',
      group => 'wheel',
      mode => '0644',
}

Si les droits, utilisateurs ou groupes sont modifiés, puppet modifiera ceux-ci sans altérer le contenu du répertoire.

Configuration d'un client

Pour configurer un client ouvrez le fichier manifests/site.pp. Voici un exemple:

node "ftp.domain.tld" {
      include syslogng-bsd
      include proftpd-bsd
}

On inscrit le serveur ftp.domain.tld et on déclare 2 modules actifs, celui du syslog et celui de proftpd. Lorsque celui-ci viendra se connecter il va checker les deux modules et faire les actions programmées.

Configuration du répertoire racine des fichiers

Créez/ouvrez le fichier fileserver.conf et inscrivez les lignes suivantes:

[files]
  path /usr/local/etc/puppet/files/
  allow *.domain.tld
  allow *.domain2.tld

On déclare que le répertoire réseau puppet/files est dans /usr/local/etc/puppet/files/. On n'autorise que les machines qui sont avec un suffixe DNS connu.

Lancement du service

Le service est opérationnel. Vous pouvez le lancer.

service puppetmaster start

Note: il est inutile de redémarrer si vous ne modifiez pas la configuration du serveur mais uniquement les fichiers à distribuer.

Clients

Installation

Sous FreeBSD:

cd /usr/ports/sysutils/facter
make install clean
cd /usr/ports/sysutils/puppet
make install clean

Sous Debian:

apt-get install puppet

Configuration

Bases

On va configurer le client pour discuter avec le serveur puppetmaster. Ouvrez le fichier /etc/puppet/puppet.conf (ou /usr/local/etc/puppet/puppet.conf sous FreeBSD) et indiquez les lignes suivantes:

[agent]
  server=puppetmaster.server.tld

Vous pouvez maintenant démarrer le service:

service puppet start

Connexion au serveur

Pour permettre le client de se connecter au serveur, il faut lui faire contacter déjà une première fois celui-ci:

puppet agent --test

Allez ensuite sur le serveur pour vérifier qu'il est reconnu via la commande

puppet cert list

et ensuite acceptez le certificat

puppet cert sign myserver.domain.tld

Relancez ensuite la première commande pour vérifier que tout va bien.

Gestion des erreurs et changements

Changer de serveur puppet

Il peut parfois être utile de changer de serveur puppet, suite à une migration de serveur ou de version (avec le changement récent de 2.X vers 3.X par exemple).

Lors du changement de serveur vous vous apercevrez tout d'abord qu'il y a des problèmes de certificats. Pour les résoudre, il suffit de vous rendre dans le répertoire de certificats et de supprimer tous les fichiers .pem et .crl dans l'arborescence de certificats puppet

Sous FreeBSD ce répertoire racine est:

/var/puppet/ssl/*

Une fois ces certificats supprimés, il faudra ensuite changer le nom du serveur dans le fichier puppet.conf et enfin relancer la commande puppet agent --test (et valider le certificat sur le serveur)

Erreur de certificat (header too long)

root@puppetc1> puppet agent --test
Error: Could not request certificate: Neither PUB key nor PRIV key:: header too long
Exiting; failed to retrieve certificate and waitforcert is disabled

Cette erreur survient généralement lorsque puppet essaye d'écrire un fichier alors que le système de fichiers est plein.