Aller au contenu principal

Introduction à Rudder

Dans ce premier tutoriel, nous verrons comment installer un serveur rudder localement sur votre machine en utilisant une stack Vagrant. Nous verrons aussi comment configurer plusieurs nodes.

Présentation de Rudder

Rudder est un logiciel open source de gestion de configuration. Il se veut simple d'utilisation en proposant une interface utilisateur écrite en scala. Rudder, contrairement à Ansible, s'appuie sur des agents légers installés sur chacun des nodes pour déployer les configurations.

Le serveur RUDDER est appelé le master et les clients les nodes. Sur le master les configuration sont déclarées et ce sont les agents tournant sur les nodes qui se charge de les appliquer. Dans le cas où la configuration décrite n'est pas celle présente sur le node, l'agent appliquera les changements nécessaires pour la respecter en utilisant CFEngine.

Rudder prend en charge des nodes provisionnés avec la plupart des distributions Linux. Windows Server, Solaris et AIX sont également supportés via une souscription.

Les configurations permettent :

  • d'installer des packages en utilisant les gestionnaires de packages des OS cibles.
  • de configurer les paramètres et services tournant sur les nodes.
  • de créer et maintenir des comptes et les groupes d'utilisateurs.
  • de construire un système durci en configurant puis en contrôlant que les règles de sécurité sont toujours appliquées.
  • d'appliquer des configurations aux middlewares en utilisant des templates.
  • ...

Rudder peut être étendu via des plugins. On retrouve :

  • Un système de gestion d'application de patchs OS.
  • Des systèmes de contrôle de compliance ISO 27001, PCI-DSS, NIST
  • Openscap, que je vous ai déjà présenté avec son utilisation pour développer des rôles Ansible proposant des options pour durcir les systèmes d'exploitation
  • CIS, un autre système d'audit de sécurité
  • Gestion des bastions Wallix
  • Gestion de Vault pour le stockage des secrets
  • Authentification
  • Zabbix, Centreon
  • ...

Certains de ces plugins sont gratuits et d'autres sont propriétaires et nécessitent une licence.

Notions importantes

Avant de commencer à utiliser Rudder, il est important de mettre en place son vocabulaire technique.

Techniques

Les Techniques sont les squelettes de configuration, adapté à une fonction ou à un service particulier (par ex. Configuration du DNS). Ce squelette comprend la logique de configuration pour cette fonction ou ce service et peut être défini selon une liste de variables (dans le même exemple: adresses IP des serveurs DNS, la zone de recherche par défaut, etc)

La bibliothèque standard de Rudder ne fournit que les techniques les plus courantes. Vous pouvez créer de nouvelles techniques avec l'Éditeur de Technique.

Directives

Les directives sont les instances d'une technique qui permet de définir des valeurs aux paramètres de cette technique. Chaque directive peut avoir un nom unique. Une directive doit être complétée par une description et les valeurs pour les paramètres définies dans la technique.

Groupe de nodes

Il est possible de créer un groupe de nœuds basé sur des critères de recherche pour faciliter l'attribution Règles de gestion de la configuration. Par exemple : un groupe par version de système d'exploitation, un groupe par environnement, un groupe par fonction, etc

Rules

Les rules permettent de définir l'application d'une ou plusieurs directives à un groupe de nœuds.

Installation de Rudder

Comme dit précédemment, je vais l'installer sur ma machine de développement en utilisant Vagrant et le provider libvirt. Vous pouvez utiliser le Vagrantfile fourni par l'éditeur qui lui utilise le provider Virtualbox.

Mon vagrantfile :

# -*- mode: ruby -*-
# vi: set ft=ruby :
ENV['VAGRANT_NO_PARALLEL'] = 'yes'

nb_nodes = 3

Vagrant.configure("2") do |config|
  config.vm.synced_folder '.', '/vagrant', disabled: true
  config.hostmanager.enabled = true
  config.hostmanager.manage_host = true

  config.vm.define "server" do |server|
    server.vm.box = "generic/ubuntu2204"
    server.vm.provider :libvirt do |lv|
      lv.memory = 2048
      lv.cpus = 2
      lv.management_network_name = 'my_network'
      lv.management_network_address = '192.168.3.0/24'
    end
    server.vm.provision :shell, :inline => "apt update"
    server.vm.provision :shell, :path => "https://repository.rudder.io/tools/rudder-setup",
                                :args => ["setup-server", "latest"],
                                :env  => {"ADMIN_USER" => "admin", "ADMIN_PASSWORD" => "admin"}
    server.vm.hostname = "server.rudder.local"
    server.vm.network :forwarded_port, guest: 443, host: 8081
  end
  for i in 1..nb_nodes do
    config.vm.define "node#{i}" do |node|
      node.vm.box = "generic/ubuntu2204"
      node.vm.provider :libvirt do |lv|
        lv.memory = 1024
        lv.management_network_name = 'my_network'
        lv.management_network_address = '192.168.3.0/24'
      end
      node.vm.provision :shell, :inline => "apt update"
      node.vm.provision :shell, :path => "https://repository.rudder.io/tools/rudder-setup",
                                :args => ["setup-agent", "latest", "server.rudder.local"]
      node.vm.provision :shell, :inline => "echo 'SUCCESS: You can now access the Rudder web interface on https://localhost:8081/ with admin/admin credentials'"
      node.vm.hostname = "node#{i}.rudder.local"
    end
  end
end

Ce vagrantfile provisionne un master et 3 nodes. Si vous voulez moins ou plus de nodes, il suffit de changer la variable nb_nodes.

Allez, on provisionne :

vagrant up

Au bout de 2-3 minutes l'application est disponible à l'adresse https://localhost:8081

Utilisation de Rudder

Nous allons voir comment prendre en main rapidement Rudder.

Ligne de commande rudder.

Sur les nodes et le master, vous avez à votre disposition une CLI (utilitaire de ligne de commande) qui permet de lancer un certain nombre d'actions comme :

  • mettre à jour l'inventaire des nodes, récupère l'ensemble des informations des nodes : caractéristiques techniques, disques, packages, services, OS, etc
  • d'obtenir des informations sur un node
  • ...

L'utilisation de la CLI permet de lancer plus rapidement des actions que via l'interface. Cette CLI doit être lancé avec le compte root.

root@node1:~# rudder agent info

General
           Hostname: node1.rudder.local
               UUID: c3b662fb-5a63-4733-b142-7dcd62c76bb0
      Policy server: server.rudder.local
               Role: node
            Version: 7.2.4

Policies
             Status: enabled
        Report mode: full-compliance
       Run interval: 5 min
  Forced audit mode: no
   Configuration id: 20230212-125729-9aa773d3
     Policy updated: 2023-02-12 13:22:51
     Inventory sent: 2023-02-11 13:30:59

Key/Certificate
           Key hash: MD5=3fbcf20c30626b76a3baadbda65e28f7
           Key hash: sha256//Gwq1jftVAVu5+94nohYNAHjdMiTBNKo38/3vHtMYP+0=
  Cert. fingerprint: 14:9E:9A:51:40:38:5A:0A:F3:AA:79:C0:94:E7:4A:B0:35:30:DA:79
        Key pinning: full
     Cert. creation: 2023-02-11
   Cert. expiration: 2033-02-08

Vous pouvez obtenir plus d'infos en utilisant l'option help.

rudder help

Usage: rudder help
       rudder agent <command> [parameters ...]
       rudder directive <command> [parameters ...]
       rudder relay <command> [parameters ...]
       rudder remote <command> [parameters ...]
       rudder server <command> [parameters ...]

  This is rudder generic command line interface.

  help: this help
  agent: rudder agent related commands
  directive: rudder directive related commands
  relay: rudder relay related commands
  remote: rudder remote related commands
  server: rudder server related commands

Prise en main de l'interface de Rudder

L'interface est vraiment bien faite et une fois les concepts compris (voir ci-dessus) vous devriez vous en sortir.

Ajout d'un node

Dans notre cas nos nodes sont déjà déctectés puisque vagrant s'est chargé de les déclarer via l'outil setup. Mais il faut les accepter et pour cela, il faut se rendre dans le menu pending nodes.

Cochez-les nodes et acceptez-les.

Création d'un groupe

Nous allons créer un groupe dynamique Ubuntu 22.04. Allez dans le menu groups et cliquez sur [Create].

Saisissez les informations de nom et une description, puis cliquez sur [Create]. On peut ensuite ajouter des critères pour qu'il n'accepte que les nodes tournant sous Ubuntu 22.04.

Rentrez les critères comme dans l'image ci-dessus. Cliquez sur [Search], vous devriez voir apparaître nos 3 nodes.

Création d'une directive

Nous allons créer une directive package installant openscap sur les nodes ubuntu 22.04. Allez dans le menu directives et cliquez package dans la liste des techniques cliquez packages puis [Create]

Dans les parmètres, complétez nom avec openscap et dans les packages entrez libopenscap8 python3-openscap. Finissez par [Save].

Création d'une rules

Nous allons créer une | qui installe le package openscap sur le group ubuntu 22.04. Allez dans le menu rules, puis cliquez sur [Create] et dans la partie directive sélection package OpenScap et dans group Ubuntu 22.04 et saisissez le nom Ubuntu 22.04 OpenScap. Finissez par [Save]

Application des rules

Il existe deux méthodes :

  • par la CLI depuis le node server : rudder remote run node2.rudder.local.
Start execution with config [20230212-142437-25657aa8]

Hostname        M| State         Technique                 Component                 Key                Message
192.168.3.75    E| compliant     Common                    ncf Initialization                           Configuration library initialization was correct
192.168.3.75    E| repaired      Common                    Update                                       Policy or configuration library were updated
192.168.3.75    E| compliant     Common                    Security parameters                          The internal environment security is acceptable
192.168.3.75    E| compliant     Common                    CRON Daemon                                  CRON is correctly running
192.168.3.75    E| compliant     Common                    Log system for reports                       Reports forwarding to policy server was correct
192.168.3.75    E| compliant     Inventory                 Inventory                                    Next inventory scheduled between 00:00 and 06:00
192.168.3.75    E| repaired      packageManagement         Package                   python3-openscap   Presence of package python3-openscap in any version was repaired
192.168.3.75    E| compliant     packageManagement         Package                   libopenscap8       Presence of package libopenscap8 in any version was correct
192.168.3.75    E| n/a           packageManagement         Post-modification script  python3-openscap   No post-modification script was defined
192.168.3.75    E| n/a           packageManagement         Post-modification script  libopenscap8       No post-modification script was defined
192.168.3.75    E| n/a           Common                    Monitoring                                   No Rudder monitoring information to share with the server

## Summary #####################################################################
11 components verified in 5 directives
   => 11 components in Enforce mode
      -> 6 compliant
      -> 2 repaired
      -> 3 not-applicable
Execution time: 22.22s
################################################################################
  • par l'interface en allant dans nodes / Compliance reports et cliquez sur Trigger Agent.

Normalement les packages vont s'installer et dans le rapport de compliance, vous devriez voir que tout s'est passé comme attendu.

Conclusion

Rudder est un outil de gestion de configuration plutôt convivial une fois les concepts compris. Il est clair que cela prend un peu plus de temps que via l'utilisation d'un DSL comme avec puppet ou ansible. Mais ne connaissant pas encore totalement le produit, il existe peut-être des moyens plus rapides pour créer tous les objets de l'interface.

Rudder est un système ouvert et par exemple, il fournit une collection Ansible permettant de le piloter et de récupérer l'inventaire.

Plus d'infos

Sites

Vidéos