Compare commits

..

No commits in common. "ca1f1557c4dc9ba3cd066555aea2ef6a6f4b966c" and "6b6a56ab3f50d76b8adbedcf5eee377fed489cf9" have entirely different histories.

15 changed files with 22 additions and 207 deletions

View file

@ -1,32 +1,5 @@
# CHANGELOG — Set-OPS # CHANGELOG — Set-OPS
## 2026-09-28 (26) — `identite` vérifie que Keycloak atteint l'annuaire ; l'archive Keycloak cesse de voyager pour rien
Troisième des cinq sondes « répond » de la revue (25).
**`identite` (Keycloak).** S'arrêtait à la découverte OIDC du realm. Or les comptes vivent dans
LDAP : un lien rompu vers l'annuaire (certificat, mot de passe de liaison tourné d'un seul côté,
slapd tombé) laisse la découverte parfaite et refuse chaque connexion. La sonde demande
désormais à Keycloak de s'authentifier auprès de l'annuaire avec SA PROPRE configuration
(`testLDAPConnection`, `testAuthentication`, `componentId` de la fédération enregistrée, secret
masqué : Keycloak substitue le secret stocké — la sonde ne manipule jamais le secret LDAP). Le
jeton admin est pris avec les identifiants de `/etc/keycloak/keycloak.env` (0640, lus en root,
jamais affichés ni passés en argument). Éprouvé avant d'écrire : 204 sur la vraie fédération,
400 `AuthenticationFailure` avec un faux bindDn. Chez les deux locataires : fédération
`openldap` authentifiée, reçue par Icinga (0,12 s). Mise en défaut par paramètre
(`serveur_keycloak_sonde_federation`) : critique, « la fédération n'existe pas » ; fichier
d'identifiants illisible : avertissement, « fédération non vérifiée ». Sans fédération
(`serveur_keycloak_ldap_federation: false`), la sonde s'en tient à la découverte.
**Au passage : l'archive Keycloak repartait à chaque déploiement.** « Déjà posée ? » regardait
`/tmp/keycloak-<version>.tar.gz`, que le système vide : l'archive repartait du contrôleur à
chaque passage (`changed` sur les deux locataires). Le repère est désormais le marqueur
`.kc-built-<version>` : cette version est en place, rien à apporter. Redéployé : `changed=0`
sur les deux.
Reste de la revue : `console` (Icinga Web lit-il sa base ?), `passerelle` (oauth2-proxy
atteint-il Keycloak ?).
## 2026-09-28 (25) — Deux sondes qui disaient « répond » apprennent à dire « sert » ; l'edge refuse les noms inconnus ## 2026-09-28 (25) — Deux sondes qui disaient « répond » apprennent à dire « sert » ; l'edge refuse les noms inconnus
Revue de toutes les sondes, à la recherche de celles qui resteraient vertes pendant que le Revue de toutes les sondes, à la recherche de celles qui resteraient vertes pendant que le

View file

@ -228,8 +228,3 @@ serveur_keycloak_signature_url: "{{ serveur_keycloak_url }}.asc"
# installation derriere un proxy (verifie le 2026-09-10 : 8080, pas 8443). # installation derriere un proxy (verifie le 2026-09-10 : 8080, pas 8443).
serveur_keycloak_sonde_url: "http://127.0.0.1:8080" serveur_keycloak_sonde_url: "http://127.0.0.1:8080"
serveur_keycloak_sonde_realm: "{{ serveur_keycloak_realm }}" serveur_keycloak_sonde_realm: "{{ serveur_keycloak_realm }}"
# La federation que la sonde fait s'AUTHENTIFIER aupres de l'annuaire (2026-09-28). Vide =
# pas de federation a verifier (`serveur_keycloak_ldap_federation: false`). Mise en defaut
# PAR PARAMETRE : un nom de federation qui n'existe pas.
serveur_keycloak_sonde_federation: >-
{{ serveur_keycloak_ldap_nom if serveur_keycloak_ldap_federation | bool else '' }}

View file

@ -3,7 +3,6 @@
sondes: sondes:
- nom: identite - nom: identite
ttl: 5400 ttl: 5400
raison: Le realm sert-il sa decouverte OIDC, et Keycloak ATTEINT-IL l'annuaire ? La decouverte est la raison: Le realm sert-il encore sa decouverte OIDC ? C'est la porte par laquelle tout le SSO de l'ecosysteme
porte par laquelle tout le SSO entre ; la federation LDAP est ce qui la rend utile. Un Keycloak dont entre. Un Keycloak debout dont le realm n'a pas charge repond sur son port et refuse toute connexion
le lien a l'annuaire est rompu (certificat, mot de passe de liaison, slapd tombe) publie une decouverte — sans rien dire.
parfaite et refuse chaque connexion — sans rien dire.

View file

@ -84,14 +84,9 @@
# Sans garde, `get_url` recontacte le serveur distant a CHAQUE deploiement — et un # Sans garde, `get_url` recontacte le serveur distant a CHAQUE deploiement — et un
# serveur tiers lent suffit alors a faire tomber un deploiement de flotte. Constate le # serveur tiers lent suffit alors a faire tomber un deploiement de flotte. Constate le
# 2026-08-09 sur le binaire Forgejo, meme motif ici. # 2026-08-09 sur le binaire Forgejo, meme motif ici.
# LE REPERE EST LA CONSTRUCTION DE CETTE VERSION, PAS L'ARCHIVE (2026-09-28). On regardait
# `/tmp/keycloak-<version>.tar.gz` : /tmp se vide, et l'archive repartait du controleur a
# CHAQUE deploiement — `changed` a tous les coups sur les deux locataires, pour un Keycloak
# deja extrait et construit. Le marqueur `.kc-built-<version>` dit exactement ce qu'on veut
# savoir : cette version est en place, rien a apporter.
- name: L artefact de cette version est-il deja pose ? - name: L artefact de cette version est-il deja pose ?
ansible.builtin.stat: ansible.builtin.stat:
path: "{{ serveur_keycloak_home }}/.kc-built-{{ serveur_keycloak_version }}" path: "/tmp/keycloak-{{ serveur_keycloak_version }}.tar.gz"
register: serveur_keycloak_archive_present register: serveur_keycloak_archive_present
# Le controleur telecharge, puis pousse par SSH — la cible ne tire jamais d'Internet. # Le controleur telecharge, puis pousse par SSH — la cible ne tire jamais d'Internet.

View file

@ -1,27 +1,14 @@
#!/bin/bash #!/bin/bash
# GENERE par Set-OPS (role serveur_keycloak). Ne pas editer a la main. # GENERE par Set-OPS (role serveur_keycloak). Ne pas editer a la main.
# #
# SONDE « identite » — le realm sert sa decouverte OIDC, et Keycloak ATTEINT l'annuaire # SONDE « identite » — le realm sert sa decouverte OIDC
# #
# Contrat : docs/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. # Contrat : docs/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2.
# Mise en defaut PAR PARAMETRE : `serveur_keycloak_sonde_realm` (realm inexistant) pour la # Mise en defaut PAR PARAMETRE : `serveur_keycloak_sonde_realm` (realm inexistant).
# premiere etape, `serveur_keycloak_sonde_federation` (federation inexistante) pour la seconde.
#
# LA FEDERATION, DEPUIS LE 2026-09-28. Cette sonde s'arretait a la decouverte OIDC. Or les
# comptes vivent dans LDAP, pas dans Keycloak : un lien rompu vers l'annuaire (certificat
# renouvele mais non recharge, mot de passe de liaison tourne d'un seul cote, slapd tombe)
# laisse la decouverte PARFAITE et refuse chaque connexion. On demande donc a Keycloak de
# s'authentifier aupres de l'annuaire AVEC SA PROPRE configuration — celle de la federation
# enregistree (`componentId`, secret masque) : c'est le meme chemin qu'une vraie connexion.
#
# LE MOT DE PASSE ADMIN EST LU LA OU IL EST, pas recopie : `/etc/keycloak/keycloak.env`,
# 0640 root:keycloak. La sonde tourne en root ; il n'est ni affiche, ni passe en argument.
set -uo pipefail set -uo pipefail
URL={{ serveur_keycloak_sonde_url }} URL={{ serveur_keycloak_sonde_url }}
REALM={{ serveur_keycloak_sonde_realm }} REALM={{ serveur_keycloak_sonde_realm }}
FEDERATION="{{ serveur_keycloak_sonde_federation | trim }}"
ENV=/etc/keycloak/keycloak.env
s=$(curl -s --max-time 10 "${URL}/realms/${REALM}/.well-known/openid-configuration" 2>/dev/null) s=$(curl -s --max-time 10 "${URL}/realms/${REALM}/.well-known/openid-configuration" 2>/dev/null)
[[ -n "${s}" ]] || { echo "Keycloak ne repond pas sur ${URL}."; exit 2; } [[ -n "${s}" ]] || { echo "Keycloak ne repond pas sur ${URL}."; exit 2; }
@ -34,81 +21,4 @@ for cle in authorization_endpoint token_endpoint jwks_uri; do
printf '%s' "${s}" | grep -q "\"${cle}\"" \ printf '%s' "${s}" | grep -q "\"${cle}\"" \
|| { echo "Decouverte OIDC incomplete pour « ${REALM} » : ${cle} absent."; exit 2; } || { echo "Decouverte OIDC incomplete pour « ${REALM} » : ${cle} absent."; exit 2; }
done done
echo "Realm « ${REALM} » : decouverte OIDC complete."
if [[ -z "${FEDERATION}" ]]; then
echo "Realm « ${REALM} » : decouverte OIDC complete (pas de federation a verifier)."
exit 0
fi
KC_UTIL=$(grep -hoP '^KC_BOOTSTRAP_ADMIN_USERNAME=\K\S+' "${ENV}" 2>/dev/null | head -1)
KC_MDP=$(grep -hoP '^KC_BOOTSTRAP_ADMIN_PASSWORD=\K\S+' "${ENV}" 2>/dev/null | head -1)
if [[ -z "${KC_UTIL}" || -z "${KC_MDP}" ]]; then
echo "Realm « ${REALM} » : decouverte OIDC complete, mais federation NON verifiee (identifiants admin illisibles dans ${ENV})."
exit 1
fi
KC_UTIL="${KC_UTIL}" KC_MDP="${KC_MDP}" python3 - "${URL}" "${REALM}" "${FEDERATION}" <<'PY'
import json, os, sys, urllib.parse, urllib.request
url, realm, nom = sys.argv[1:4]
def appel(chemin, data=None, jeton=None, form=False):
h = {"Authorization": "Bearer " + jeton} if jeton else {}
if data is not None:
if form:
data = urllib.parse.urlencode(data).encode()
h["Content-Type"] = "application/x-www-form-urlencoded"
else:
data = json.dumps(data).encode()
h["Content-Type"] = "application/json"
try:
with urllib.request.urlopen(urllib.request.Request(url + chemin, data=data, headers=h), timeout=8) as r:
b = r.read()
return r.status, (json.loads(b) if b else None)
except urllib.error.HTTPError as e:
b = e.read()
try:
return e.code, json.loads(b)
except ValueError:
return e.code, {"errorMessage": f"HTTP {e.code}"}
except OSError as e:
return 0, {"errorMessage": str(e)[:80]}
c, t = appel("/realms/master/protocol/openid-connect/token",
{"grant_type": "password", "client_id": "admin-cli",
"username": os.environ["KC_UTIL"], "password": os.environ["KC_MDP"]}, form=True)
if c != 200 or not isinstance(t, dict) or "access_token" not in t:
print(f"Realm « {realm} » : decouverte OIDC complete, mais federation NON verifiee "
f"(jeton admin refuse, HTTP {c}).")
sys.exit(1)
jeton = t["access_token"]
c, comps = appel(f"/admin/realms/{realm}/components?type=org.keycloak.storage.UserStorageProvider", jeton=jeton)
if c != 200 or not isinstance(comps, list):
print(f"Realm « {realm} » : la liste des federations est illisible (HTTP {c}).")
sys.exit(1)
fed = next((x for x in comps if x.get("name") == nom), None)
if fed is None:
print(f"Realm « {realm} » : la federation « {nom} » N'EXISTE PAS "
f"({', '.join(x.get('name', '?') for x in comps) or 'aucune'}) — les comptes de l'annuaire ne peuvent pas se connecter.")
sys.exit(2)
cfg = fed.get("config", {})
val = lambda k, d="": (cfg.get(k) or [d])[0]
if val("enabled", "true") != "true":
print(f"Realm « {realm} » : la federation « {nom} » est DESACTIVEE — les comptes de l'annuaire ne peuvent pas se connecter.")
sys.exit(2)
# `**********` : Keycloak substitue le secret ENREGISTRE pour ce `componentId`. On teste donc
# la liaison telle qu'une vraie connexion la ferait, sans jamais manipuler le secret LDAP.
corps = {"action": "testAuthentication", "componentId": fed["id"], "bindCredential": "**********",
"connectionUrl": val("connectionUrl"), "bindDn": val("bindDn"),
"authType": val("authType", "simple"), "startTls": val("startTls", "false"),
"useTruststoreSpi": val("useTruststoreSpi", "always"),
"connectionTimeout": val("connectionTimeout")}
c, r = appel(f"/admin/realms/{realm}/testLDAPConnection", corps, jeton=jeton)
if c != 204:
motif = (r or {}).get("errorMessage", f"HTTP {c}") if isinstance(r, dict) else f"HTTP {c}"
print(f"Realm « {realm} » : decouverte OIDC complete, mais Keycloak N'ATTEINT PAS l'annuaire "
f"({val('connectionUrl')} : {motif}) — toute connexion echoue.")
sys.exit(2)
print(f"Realm « {realm} » : decouverte OIDC complete, federation « {nom} » authentifiee aupres de {val('connectionUrl')}.")
PY

View file

@ -8,7 +8,6 @@
```mermaid ```mermaid
graph LR graph LR
R["<b>sante</b>"] R["<b>sante</b>"]
R -.->|"sonde « disque »"| ICINGA[["Icinga"]]
``` ```
## Qui lui parle ## Qui lui parle
@ -17,9 +16,7 @@ graph LR
## Ce qu'il rend à la supervision ## Ce qu'il rend à la supervision
| sonde | TTL | ce qu'elle voit | *Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.*
|---|---|---|
| `disque` | 5400 s | Reste-t-il de la place, et des inodes, sur chaque systeme de fichiers ? Seuls le cache apt et les depots de sauvegarde etaient surveilles : un disque plein arretait la base ou le courriel sans prevenir. |
## Ce qu'il expose en séries ## Ce qu'il expose en séries

View file

@ -1,39 +0,0 @@
# Rôle `serveur_dns_public`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>dns_public</b>"]
E0["externe"] -->|"1053 · clair"| R
E1["site"] -->|"53 · clair"| R
R -.->|"sonde « zones-publiques »"| ICINGA[["Icinga"]]
```
## Qui lui parle
| port | depuis | chiffrement | pourquoi |
|---|---|---|---|
| `1053` | `externe` | clair | Les resolveurs de l'Internet interrogent les zones publiques des locataires du site. Les reponses sont signees DNSSEC : leur integrite ne depend ni du transport, ni de nous. |
| `1053` | `externe` | clair | Repli TCP : reponses tronquees par dnsdist (ANY, debit) et reponses signees trop grosses pour l'UDP. |
| `53` | `voisins_site` | clair | NOTIFY des primaires des locataires du site : une zone publique a change. Le contenu d'une zone publique n'a rien de secret ; ce qui compte est QUI peut le modifier, et c'est TSIG qui le garde, sur le transfert. |
| `53` | `voisins_site` | clair | Repli TCP des notifications des primaires des locataires. |
## Ce qu'il rend à la supervision
| sonde | TTL | ce qu'elle voit |
|---|---|---|
| `zones-publiques` | 5400 s | Le serveur public sert-il TOUTES les zones de ses locataires ? Un secondaire qui n'a jamais recu une zone repond REFUSED : pour Internet, ce domaine n'a plus de serveur de noms, pendant que le service a l'air parfaitement vivant. |
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : 1 cœur(s), 512 Mo, 2 Go.
- **Authentification** : `sans-auth-humaine` — Serveur DNS autoritatif public : il repond a qui le demande, et c'est son objet. Ce qui s'authentifie ici, ce sont les SERVEURS entre eux (TSIG sur le transfert), jamais un humain.

View file

@ -23,7 +23,7 @@ graph LR
| sonde | TTL | ce qu'elle voit | | sonde | TTL | ce qu'elle voit |
|---|---|---| |---|---|---|
| `tableaux` | 5400 s | Grafana repond-il, sa base tient-elle, et ses SOURCES DE DONNEES aussi ? Un Grafana dont la base est tombee sert encore sa page de connexion ; un Grafana dont la source Loki parle en clair a un Loki en HTTPS repond aussi — et n'affiche rien (2026-09-28). | | `tableaux` | 5400 s | Grafana repond-il, et sa base tient-elle ? Un Grafana dont la base est tombee sert encore sa page de connexion : il a l'air en ligne et ne peut plus rien montrer. |
## Ce qu'il expose en séries ## Ce qu'il expose en séries

View file

@ -8,8 +8,7 @@
```mermaid ```mermaid
graph LR graph LR
R["<b>icingaweb2</b>"] R["<b>icingaweb2</b>"]
E0["admin"] -->|"8080 · clair"| R E0["edge"] -->|"8080 · clair"| R
E1["edge"] -->|"8080 · clair"| R
R -.->|"sonde « console »"| ICINGA[["Icinga"]] R -.->|"sonde « console »"| ICINGA[["Icinga"]]
``` ```
@ -17,7 +16,7 @@ graph LR
| port | depuis | chiffrement | pourquoi | | port | depuis | chiffrement | pourquoi |
|---|---|---|---| |---|---|---|---|
| `8080` | `edge`, `admin` | clair | Interface web servie via l'edge (TLS terminé à l'edge ; SSO possible via oauth2-proxy), et joignable depuis le plan d'administration là où il n'y a pas d'edge. | | `8080` | `edge` | clair | Interface web servie via l'edge (TLS terminé à l'edge ; SSO possible via oauth2-proxy). |
## Ce qu'il rend à la supervision ## Ce qu'il rend à la supervision

View file

@ -22,7 +22,7 @@ graph LR
| sonde | TTL | ce qu'elle voit | | sonde | TTL | ce qu'elle voit |
|---|---|---| |---|---|---|
| `identite` | 5400 s | Le realm sert-il sa decouverte OIDC, et Keycloak ATTEINT-IL l'annuaire ? La decouverte est la porte par laquelle tout le SSO entre ; la federation LDAP est ce qui la rend utile. Un Keycloak dont le lien a l'annuaire est rompu (certificat, mot de passe de liaison, slapd tombe) publie une decouverte parfaite et refuse chaque connexion — sans rien dire. | | `identite` | 5400 s | Le realm sert-il encore sa decouverte OIDC ? C'est la porte par laquelle tout le SSO de l'ecosysteme entre. Un Keycloak debout dont le realm n'a pas charge repond sur son port et refuse toute connexion — sans rien dire. |
## Ce qu'il expose en séries ## Ce qu'il expose en séries

View file

@ -8,24 +8,18 @@
```mermaid ```mermaid
graph LR graph LR
R["<b>ops</b>"] R["<b>ops</b>"]
E0["admin"] -->|"8090 · clair"| R
E1["edge"] -->|"8090 · clair"| R
R -.->|"sonde « runner »"| ICINGA[["Icinga"]] R -.->|"sonde « runner »"| ICINGA[["Icinga"]]
R -.->|"sonde « console-ops »"| ICINGA[["Icinga"]]
``` ```
## Qui lui parle ## Qui lui parle
| port | depuis | chiffrement | pourquoi | *Aucun flux entrant déclaré — `meta/flux.yml` absent ou sans `ingress`.*
|---|---|---|---|
| `8090` | `edge`, `admin` | clair | Console d'exploitation servie par l'edge (TLS terminé à l'edge), et joignable depuis le plan d'administration là où il n'y a pas d'edge. Le GUI lui-même reste sur la boucle locale : c'est nginx qui authentifie devant. |
## Ce qu'il rend à la supervision ## Ce qu'il rend à la supervision
| sonde | TTL | ce qu'elle voit | | sonde | TTL | ce qu'elle voit |
|---|---|---| |---|---|---|
| `runner` | 5400 s | Le poste d'exploitation peut-il encore agir ? Deux choses : ses depots sont-ils PROPRES et sur leur branche (une modification locale fait diverger le runner du depot que tout le monde lit), et Ansible repond-il dans son venv. | | `runner` | 5400 s | Le poste d'exploitation peut-il encore agir ? Deux choses : ses depots sont-ils PROPRES et sur leur branche (une modification locale fait diverger le runner du depot que tout le monde lit), et Ansible repond-il dans son venv. |
| `console-ops` | 5400 s | La console d'exploitation repond-elle, et son vestibule tient-il ? Un GUI mort derriere un nginx vivant rend une page d'erreur a qui sait deja entrer ; un vestibule tombe rend la fabric entiere a qui trouve l'URL. Le second ne fait echouer personne — c'est pourquoi il faut le mesurer. |
## Ce qu'il expose en séries ## Ce qu'il expose en séries

View file

@ -9,8 +9,6 @@
graph LR graph LR
R["<b>ops_site</b>"] R["<b>ops_site</b>"]
R -.->|"sonde « pouvoir-materialiser »"| ICINGA[["Icinga"]] R -.->|"sonde « pouvoir-materialiser »"| ICINGA[["Icinga"]]
R -.->|"sonde « fabric »"| ICINGA[["Icinga"]]
R -.->|"sonde « genome-a-jour »"| ICINGA[["Icinga"]]
``` ```
## Qui lui parle ## Qui lui parle
@ -22,8 +20,6 @@ graph LR
| sonde | TTL | ce qu'elle voit | | sonde | TTL | ce qu'elle voit |
|---|---|---| |---|---|---|
| `pouvoir-materialiser` | 5400 s | Le runner du site peut-il encore materialiser, et son secret est-il toujours protege ? La carte de la fabric, la voute du site et sa cle ne font tomber aucun service en disparaissant — on s'en apercoit quand un ecosysteme doit naitre. Et une voute dechiffree en transit ne fait echouer aucun deploiement : Ansible la lit tres bien, elle expose simplement tout. | | `pouvoir-materialiser` | 5400 s | Le runner du site peut-il encore materialiser, et son secret est-il toujours protege ? La carte de la fabric, la voute du site et sa cle ne font tomber aucun service en disparaissant — on s'en apercoit quand un ecosysteme doit naitre. Et une voute dechiffree en transit ne fait echouer aucun deploiement : Ansible la lit tres bien, elle expose simplement tout. |
| `fabric` | 5400 s | Le pare-feu Proxmox, le SDN, la frontiere et les acces WireGuard disent-ils encore ce que le plan dit ? Le 2026-09-28, aucune VM des locataires n'avait son pare-feu actif et rien ne le signalait ; les plans existaient, personne ne les jouait sans raison. |
| `genome-a-jour` | 5400 s | La forge du site porte-t-elle ce que le poste a publie ? Elle fait autorite, mais un `git push` seul, ou un runner injoignable au moment de publier, la laisse en retard sans rien dire — le 2026-08-26, quatre commits dont un correctif du pare-feu. |
## Ce qu'il expose en séries ## Ce qu'il expose en séries

View file

@ -9,7 +9,6 @@
graph LR graph LR
R["<b>powerdns</b>"] R["<b>powerdns</b>"]
E0["flotte"] -->|"derive · clair"| R E0["flotte"] -->|"derive · clair"| R
E1["public_site"] -->|"5300 · clair"| R
R -.->|"sonde « zones »"| ICINGA[["Icinga"]] R -.->|"sonde « zones »"| ICINGA[["Icinga"]]
``` ```
@ -19,8 +18,6 @@ graph LR
|---|---|---|---| |---|---|---|---|
| `derive` | `flotte` | clair | Zone souveraine. 53 seul sur son hôte, 5300 sur la loopback derrière le résolveur. | | `derive` | `flotte` | clair | Zone souveraine. 53 seul sur son hôte, 5300 sur la loopback derrière le résolveur. |
| `derive` | `flotte` | clair | Idem en TCP (réponses volumineuses, AXFR restreint par allow_axfr_ips). | | `derive` | `flotte` | clair | Idem en TCP (réponses volumineuses, AXFR restreint par allow_axfr_ips). |
| `5300` | `dns_public_site` | clair | AXFR signe TSIG par le serveur DNS public du site, vers l'instance publique uniquement. |
| `5300` | `dns_public_site` | clair | Interrogation du SOA par le secondaire du site avant chaque transfert. |
## Ce qu'il rend à la supervision ## Ce qu'il rend à la supervision

View file

@ -24,7 +24,7 @@ graph LR
| sonde | TTL | ce qu'elle voit | | sonde | TTL | ce qu'elle voit |
|---|---|---| |---|---|---|
| `filtrage` | 5400 s | Le filtrage du courrier repond-il, et ANALYSE-T-IL (GTUBE rejete) ? Un filtre muet ne bloque pas le courrier, il le laisse passer : Postfix sans verdict delivre sans filtrer ou differe, et le service de courriel a l'air sain pendant que le pourriel entre. | | `filtrage` | 5400 s | Le filtrage du courrier repond-il ? Un filtre muet ne bloque pas le courrier, il le laisse passer : Postfix sans verdict delivre sans filtrer ou differe, et le service de courriel a l'air sain pendant que le pourriel entre. |
## Ce qu'il expose en séries ## Ce qu'il expose en séries

View file

@ -20,7 +20,7 @@ Chaque fiche est construite depuis ce que le rôle **déclare lui-même** — `m
| [`client_metrique`](Rôle-client_metrique) | 1 | 1 | — | | [`client_metrique`](Rôle-client_metrique) | 1 | 1 | — |
| [`client_pki`](Rôle-client_pki) | — | 1 | — | | [`client_pki`](Rôle-client_pki) | — | 1 | — |
| [`client_resolveur`](Rôle-client_resolveur) | — | — | — | | [`client_resolveur`](Rôle-client_resolveur) | — | — | — |
| [`client_sante`](Rôle-client_sante) | — | 1 | — | | [`client_sante`](Rôle-client_sante) | — | — | — |
| [`client_smtp`](Rôle-client_smtp) | — | — | — | | [`client_smtp`](Rôle-client_smtp) | — | — | — |
| [`cloud_init`](Rôle-cloud_init) | — | — | — | | [`cloud_init`](Rôle-cloud_init) | — | — | — |
| [`cloud_init_retrait`](Rôle-cloud_init_retrait) | — | — | — | | [`cloud_init_retrait`](Rôle-cloud_init_retrait) | — | — | — |
@ -44,7 +44,6 @@ Chaque fiche est construite depuis ce que le rôle **déclare lui-même** — `m
| [`serveur_cache_site`](Rôle-serveur_cache_site) | 1 | 1 | — | | [`serveur_cache_site`](Rôle-serveur_cache_site) | 1 | 1 | — |
| [`serveur_collabora`](Rôle-serveur_collabora) | 2 | 1 | — | | [`serveur_collabora`](Rôle-serveur_collabora) | 2 | 1 | — |
| [`serveur_debian`](Rôle-serveur_debian) | 3 | 2 | — | | [`serveur_debian`](Rôle-serveur_debian) | 3 | 2 | — |
| [`serveur_dns_public`](Rôle-serveur_dns_public) | 4 | 1 | — |
| [`serveur_dovecot`](Rôle-serveur_dovecot) | 3 | 1 | — | | [`serveur_dovecot`](Rôle-serveur_dovecot) | 3 | 1 | — |
| [`serveur_durci`](Rôle-serveur_durci) | — | 1 | — | | [`serveur_durci`](Rôle-serveur_durci) | — | 1 | — |
| [`serveur_forge_site`](Rôle-serveur_forge_site) | 1 | 1 | — | | [`serveur_forge_site`](Rôle-serveur_forge_site) | 1 | 1 | — |
@ -58,12 +57,12 @@ Chaque fiche est construite depuis ce que le rôle **déclare lui-même** — `m
| [`serveur_nginx`](Rôle-serveur_nginx) | 4 | 1 | — | | [`serveur_nginx`](Rôle-serveur_nginx) | 4 | 1 | — |
| [`serveur_oauth2_proxy`](Rôle-serveur_oauth2_proxy) | 1 | 1 | — | | [`serveur_oauth2_proxy`](Rôle-serveur_oauth2_proxy) | 1 | 1 | — |
| [`serveur_openldap`](Rôle-serveur_openldap) | 2 | 1 | — | | [`serveur_openldap`](Rôle-serveur_openldap) | 2 | 1 | — |
| [`serveur_ops`](Rôle-serveur_ops) | 1 | 2 | — | | [`serveur_ops`](Rôle-serveur_ops) | — | 1 | — |
| [`serveur_ops_site`](Rôle-serveur_ops_site) | — | 3 | — | | [`serveur_ops_site`](Rôle-serveur_ops_site) | — | 1 | — |
| [`serveur_ops_tenant`](Rôle-serveur_ops_tenant) | 1 | 1 | — | | [`serveur_ops_tenant`](Rôle-serveur_ops_tenant) | 1 | 1 | — |
| [`serveur_postfix`](Rôle-serveur_postfix) | 2 | 1 | — | | [`serveur_postfix`](Rôle-serveur_postfix) | 2 | 1 | — |
| [`serveur_postgresql`](Rôle-serveur_postgresql) | 2 | 1 | oui | | [`serveur_postgresql`](Rôle-serveur_postgresql) | 2 | 1 | oui |
| [`serveur_powerdns`](Rôle-serveur_powerdns) | 4 | 1 | — | | [`serveur_powerdns`](Rôle-serveur_powerdns) | 2 | 1 | — |
| [`serveur_prometheus`](Rôle-serveur_prometheus) | 1 | 1 | — | | [`serveur_prometheus`](Rôle-serveur_prometheus) | 1 | 1 | — |
| [`serveur_redis`](Rôle-serveur_redis) | 1 | 1 | — | | [`serveur_redis`](Rôle-serveur_redis) | 1 | 1 | — |
| [`serveur_resolveur`](Rôle-serveur_resolveur) | 2 | 1 | — | | [`serveur_resolveur`](Rôle-serveur_resolveur) | 2 | 1 | — |
@ -82,11 +81,11 @@ Chaque fiche est construite depuis ce que le rôle **déclare lui-même** — `m
## Ce qui reste à déclarer ## Ce qui reste à déclarer
Sur **69** rôles : Sur **68** rôles :
- **35** ne déclarent aucun flux entrant - **36** ne déclarent aucun flux entrant
- **31** ne déclarent aucune sonde - **32** ne déclarent aucune sonde
- **68** ne déclarent aucune métrique - **67** ne déclarent aucune métrique
Ces nombres ne sont pas tous des dettes : un rôle de durcissement n'a rien à exposer, et beaucoup de `client_*` n'ont aucun verdict à rendre. Mais un service qui porte de l'état et ne déclare rien mérite qu'on se demande pourquoi. Ces nombres ne sont pas tous des dettes : un rôle de durcissement n'a rien à exposer, et beaucoup de `client_*` n'ont aucun verdict à rendre. Mais un service qui porte de l'état et ne déclare rien mérite qu'on se demande pourquoi.