InSpec

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Type Langage et outil de test de conformité / audit d'infrastructure (compliance as code)
Éditeur Chef, aujourd'hui Progress Software (Chef racheté en 2020)
Langage Ruby (DSL), profils organisés en controls
Prédécesseur Serverspec (basé RSpec)
Connexion Transport train : SSH, WinRM, local, Docker, API cloud
Voir aussi Chef · Ansible · Puppet · Molecule

InSpec (Chef InSpec) est un langage et un outil de test de conformité : il permet de décrire, de façon déclarative, l'état attendu d'un système (paquets installés, permissions de fichiers, services actifs, ports ouverts, règles de pare-feu...) et de vérifier que cet état est effectivement atteint. Contrairement aux outils de gestion de configuration (Puppet, Chef, Ansible) qui appliquent un état désiré, InSpec se contente de l'auditer : il ne modifie rien, il constate un écart (ou une conformité) et le rapporte. Cette séparation entre « remédiation » (appliquer une configuration) et « vérification » (contrôler qu'elle est bien en place) permet, par exemple, à une équipe sécurité/conformité d'auditer indépendamment le travail d'une équipe infrastructure.

Origine : de Serverspec à InSpec

Serverspec, apparu vers 2013, a été le pionnier du test d'infrastructure « as code » en Ruby : construit sur RSpec, il permettait de vérifier l'état d'un serveur via des matchers (package(...).should be_installed, etc.), généralement via une connexion SSH. Chef a créé InSpec en 2015 en reprenant cette philosophie mais en l'élargissant :

  • profils packageables et réutilisables (métadonnées, versionning, dépendances entre profils) ;
  • couverture des référentiels de conformité du marché (CIS Benchmarks, DISA STIG, PCI-DSS...) ;
  • transport unifié (bibliothèque train) permettant d'auditer non seulement des
 machines via SSH/WinRM, mais aussi des ressources cloud directement via leurs API, sans
 machine intermédiaire.

Profils et controls

Un profil InSpec est un répertoire structuré : inspec.yml pour les métadonnées, et un ou plusieurs fichiers dans controls/ contenant les règles.

# controls/sshd.rb
control 'sshd-01' do
  impact 1.0
  title 'Le service sshd doit être actif et activé au démarrage'
  desc 'Le service SSH doit tourner en permanence sur les hôtes gérés.'

  describe service('sshd') do
    it { should be_enabled }
    it { should be_running }
  end
end

control 'sshd-02' do
  impact 0.7
  title 'La connexion root par mot de passe doit être désactivée'

  describe sshd_config do
    its('PermitRootLogin') { should cmp 'no' }
  end
end

Exécution du profil contre une cible :

inspec exec ./mon-profil -t ssh://deploy@10.0.0.5 -i ~/.ssh/id_rsa
inspec exec ./mon-profil -t docker://mon-conteneur
inspec exec ./mon-profil                              # cible locale

Chaque control a un impact (0 à 1) qui pondère sa criticité dans le rapport de sortie, exploitable en CI pour décider d'un seuil de blocage (échec si un control critique échoue, simple avertissement sinon).

Transport (train)

InSpec s'appuie sur train, sa bibliothèque de connexion, qui abstrait la cible auditée : SSH, WinRM, exécution locale, conteneur Docker, ou directement une API cloud (AWS, Azure, GCP...). Ce dernier point permet d'auditer la conformité d'une configuration cloud (buckets publics, groupes de sécurité trop ouverts...) sans jamais se connecter à une machine.

Complémentarité avec les outils de gestion de configuration

Rôle Action sur le système
Ansible / Puppet / Chef Appliquent une configuration (remédiation) Modifient l'état du système
InSpec Vérifie une configuration (audit) Ne modifie rien, constate un écart

Un usage courant : exécuter un ansible-playbook (ou un run Puppet/Chef) puis, dans la foulée, un profil InSpec qui vérifie indépendamment que la configuration effectivement appliquée correspond bien à la politique attendue — utile en particulier quand l'équipe qui audite n'est pas celle qui gère l'IaC.

InSpec et le test de rôles Ansible

InSpec peut aussi être employé comme moteur de vérification dans Molecule (framework de test de rôles Ansible), en alternative à Testinfra/pytest, selon les versions et la configuration du scénario (support précis à vérifier selon la version de Molecule utilisée).

Voir aussi

  • Chef — éditeur d'InSpec, à ne pas confondre avec le langage cookbook/recipe
  • Ansible · Puppet — outils dont InSpec vérifie le résultat
  • Molecule — framework de test de rôles Ansible, verifier alternatif possible
  • Open Policy Agent — policy-as-code plus générique, non limité à l'audit de machines