Set-OPS-Public/roles/serveur_icingaweb2
Daniel Allaire b4e3520561 annuaire : un compte de service par consommateur, et la porte se ferme
Keycloak, Dovecot, Postfix et Icinga Web 2 se liaient TOUS avec cn=admin, le compte
d administration de la base. C est le rootDN : slapd lui fait contourner toutes les
ACL. Un seul secret, quatre services, tous les droits sur l arbre — pour ce qui est,
trois fois sur quatre, une simple lecture.

Et les droits livres par Debian etaient intacts : `to * by * read`. Sur ldap://, sans
s authentifier, une machine du reseau enumerait tous les comptes et toutes les
adresses. Des comptes a droits mesures n auraient rien valu tant que cette ligne
restait : on aurait ferme la porte en laissant la fenetre.

L indice etait deja dans le depot. `validatePasswordPolicy` existe parce que slapd
n applique pas ses controles de qualite au rootDN : la consequence etait compensee,
la cause intacte.

- ou=services, un compte par consommateur, secret propre en voute
- sept regles d acces posees EN ENTIER (state: exact) : l ordre est la regle, et
  inserer c est parier sur ce que le paquet aura mis avant nous
- amorcage_acces garde le compte d administration, NOMME comme l exception : il ne
  consomme pas l annuaire, il le provisionne depuis la socket locale
- la sonde passe de -x a -Y EXTERNAL : elle lisait en anonyme et aurait annonce un
  annuaire VIDE sur un annuaire parfaitement sain
- la rotation du compte d administration devient possible (elle n etait posee qu a
  l installation, par debconf : la voute et slapd divergeaient en silence)

Quatre marches payees en chemin :
1. un cinquieme appelant oublie, dont l echec etait masque par no_log — la garde
   refuse desormais SANS no_log : elle nomme la cle absente, jamais son contenu
2. la federation Keycloak ne reecrivait son bindDn que si l URL ou le mode changeaient
   — nouveau secret, ancien nom, error code 49
3. la rotation placee APRES les taches qui se lient en administrateur
4. ansible-vault et son tube : sortie non bloquante = echec silencieux, la voute
   paraissait tournee et etait identique a l octet

P72 exige que tout role incluant resoudre_annuaire NOMME son compte, et qu aucun sauf
amorcage_acces ne nomme admin. Eprouvee dans les deux sens.

Verifie sur l infrastructure : chaque compte lit ce qu il doit, aucun ne voit les
autres, la lecture anonyme rend 0 entree, et les quatre services repondent (doveadm
user, postmap -q, decouverte OIDC 200, portier SSO 200).

vault_openldap_admin et vault_ldap_bind_postfix renouveles : les deux avaient transite
en clair par une session d exploitation. Les anciennes valeurs rendent Invalid
credentials (49).

make prouver : 71 OK, 0 echec, 1 saute. ansible-lint : 0 failure, profil production.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q
2026-09-13 13:36:38 -04:00
..
defaults icingaweb2 : habilitation par groupe d'annuaire, plus par liste d'uid 2026-08-07 19:54:41 -04:00
handlers serveur_oauth2_proxy : passerelle SSO OIDC générique + Icinga Web 2 au SSO 2026-07-03 19:05:04 -04:00
meta icingaweb2 : habilitation par groupe d'annuaire, plus par liste d'uid 2026-08-07 19:54:41 -04:00
tasks annuaire : un compte de service par consommateur, et la porte se ferme 2026-09-13 13:36:38 -04:00
templates icingaweb2 : habilitation par groupe d'annuaire, plus par liste d'uid 2026-08-07 19:54:41 -04:00
README.md docs : un README par rôle (12 manquants) + carte remise à l'état du code 2026-07-29 11:32:06 -04:00

serveur_icingaweb2

Frontal de supervision : Icinga Web 2 + module IcingaDB + module Business Process, co-localisé avec le moteur serveur_icinga. Application PHP servie par un nginx local et php-fpm ; l'edge nginx proxifie par nom.

Rôle

  • Résout sa base IcingaDB via resoudre_base (même consommateur que le moteur) et l'annuaire via resoudre_annuaire — aucun câblage en dur.
  • Installe icingadb-web (qui tire icingaweb2), le module BPM, PHP 8.4 (fpm, pgsql, ldap, intl, gd, curl, xml, mbstring) et nginx.
  • Déploie la configuration .ini (ressources, authentification, rôles, IcingaDB, Redis), active les modules, déploie le vhost nginx local et retire le site par défaut.
  • Processus métier (BPM) : peut en semer en IaC (serveur_icingaweb2_bpm_processes), tout en laissant le répertoire éditable depuis l'UI.

Deux modes d'authentification

serveur_icingaweb2_auth Fonctionnement
ldap (défaut) Connexion directe à OpenLDAP (LDAPS) — Icinga Web 2 n'a pas d'OIDC natif
external L'utilisateur est fourni par une passerelle SSO devant (serveur_oauth2_proxy → Keycloak) ; nginx pose REMOTE_USER

En mode external, restreindre l'écoute de nginx à la boucle locale (serveur_icingaweb2_nginx_bind: "127.0.0.1:") — sinon l'application reste joignable en contournant la passerelle.

Variables principales

Variable Défaut Rôle
serveur_icingaweb2_hostname icinga.{{ domaine_interne }} Nom servi
serveur_icingaweb2_http_port 8080 nginx local (l'edge proxifie ici)
serveur_icingaweb2_auth ldap Backend d'authentification
serveur_icingaweb2_remote_user $remote_user Variable nginx source de REMOTE_USER
serveur_icingaweb2_nginx_bind "" "127.0.0.1:" derrière une passerelle
serveur_icingaweb2_admins testmail uid recevant le rôle Administrateur (liste séparée par virgules)
serveur_icingaweb2_redis_port 6380 Redis IcingaDB local
serveur_icingaweb2_modules [icingadb, businessprocess] Modules activés
serveur_icingaweb2_bpm_processes {} Processus métier semés en IaC

Flux (meta/flux.yml)

8080/tcp entrant depuis l'edge · 5432/tcp → PostgreSQL (IcingaDB, verify-full) · 636/tcp → OpenLDAP. Icinga 2 (API 5665) et le Redis IcingaDB (6380) sont co-localisés : consommés en localhost, donc absents du registre des flux.

Notes / limites

  • serveur_icingaweb2_admins doit désigner de vrais uid de l'annuaire — sinon plus personne n'est administrateur de l'interface.
  • Les versions PHP sont épinglées à 8.4 (Debian 13) dans les noms de paquets, de service et de socket : une montée de Debian demandera de les changer ensemble.
  • Le Redis IcingaDB (6380) est distinct du groupe serveur_redis (cache applicatif) et du Redis de serveur_rspamd.
  • Semer un processus BPM ici le met sous gestion Ansible : il sera réécrit à chaque passage, même modifié dans l'UI. Par défaut, le rôle n'en sème aucun.

Prérequis

  • serveur_icingaweb2 requiert serveur_icinga, serveur_postgresql, serveur_openldap actifs (docs/dependances-groupes.yml).
  • client_pki (LDAPS + PostgreSQL verify-full). Couche apps.