Compare commits
2 commits
6b6a56ab3f
...
ca1f1557c4
| Author | SHA1 | Date | |
|---|---|---|---|
| ca1f1557c4 | |||
| 9e6f33d1cf |
15 changed files with 207 additions and 22 deletions
27
CHANGELOG.md
27
CHANGELOG.md
|
|
@ -1,5 +1,32 @@
|
|||
# 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
|
||||
|
||||
Revue de toutes les sondes, à la recherche de celles qui resteraient vertes pendant que le
|
||||
|
|
|
|||
|
|
@ -228,3 +228,8 @@ serveur_keycloak_signature_url: "{{ serveur_keycloak_url }}.asc"
|
|||
# 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_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 '' }}
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@
|
|||
sondes:
|
||||
- nom: identite
|
||||
ttl: 5400
|
||||
raison: 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.
|
||||
raison: 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.
|
||||
|
|
|
|||
|
|
@ -84,9 +84,14 @@
|
|||
# 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
|
||||
# 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 ?
|
||||
ansible.builtin.stat:
|
||||
path: "/tmp/keycloak-{{ serveur_keycloak_version }}.tar.gz"
|
||||
path: "{{ serveur_keycloak_home }}/.kc-built-{{ serveur_keycloak_version }}"
|
||||
register: serveur_keycloak_archive_present
|
||||
|
||||
# Le controleur telecharge, puis pousse par SSH — la cible ne tire jamais d'Internet.
|
||||
|
|
|
|||
|
|
@ -1,14 +1,27 @@
|
|||
#!/bin/bash
|
||||
# GENERE par Set-OPS (role serveur_keycloak). Ne pas editer a la main.
|
||||
#
|
||||
# SONDE « identite » — le realm sert sa decouverte OIDC
|
||||
# SONDE « identite » — le realm sert sa decouverte OIDC, et Keycloak ATTEINT l'annuaire
|
||||
#
|
||||
# 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).
|
||||
# Mise en defaut PAR PARAMETRE : `serveur_keycloak_sonde_realm` (realm inexistant) pour la
|
||||
# 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
|
||||
|
||||
URL={{ serveur_keycloak_sonde_url }}
|
||||
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)
|
||||
[[ -n "${s}" ]] || { echo "Keycloak ne repond pas sur ${URL}."; exit 2; }
|
||||
|
|
@ -21,4 +34,81 @@ for cle in authorization_endpoint token_endpoint jwks_uri; do
|
|||
printf '%s' "${s}" | grep -q "\"${cle}\"" \
|
||||
|| { echo "Decouverte OIDC incomplete pour « ${REALM} » : ${cle} absent."; exit 2; }
|
||||
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
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@
|
|||
```mermaid
|
||||
graph LR
|
||||
R["<b>sante</b>"]
|
||||
R -.->|"sonde « disque »"| ICINGA[["Icinga"]]
|
||||
```
|
||||
|
||||
## Qui lui parle
|
||||
|
|
@ -16,7 +17,9 @@ graph LR
|
|||
|
||||
## Ce qu'il rend à la supervision
|
||||
|
||||
*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`.*
|
||||
| sonde | TTL | ce qu'elle voit |
|
||||
|---|---|---|
|
||||
| `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
|
||||
|
||||
|
|
|
|||
39
wiki/Rôle-serveur_dns_public.md
Normal file
39
wiki/Rôle-serveur_dns_public.md
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
# 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.
|
||||
|
||||
|
|
@ -23,7 +23,7 @@ graph LR
|
|||
|
||||
| sonde | TTL | ce qu'elle voit |
|
||||
|---|---|---|
|
||||
| `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. |
|
||||
| `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). |
|
||||
|
||||
## Ce qu'il expose en séries
|
||||
|
||||
|
|
|
|||
|
|
@ -8,7 +8,8 @@
|
|||
```mermaid
|
||||
graph LR
|
||||
R["<b>icingaweb2</b>"]
|
||||
E0["edge"] -->|"8080 · clair"| R
|
||||
E0["admin"] -->|"8080 · clair"| R
|
||||
E1["edge"] -->|"8080 · clair"| R
|
||||
R -.->|"sonde « console »"| ICINGA[["Icinga"]]
|
||||
```
|
||||
|
||||
|
|
@ -16,7 +17,7 @@ graph LR
|
|||
|
||||
| port | depuis | chiffrement | pourquoi |
|
||||
|---|---|---|---|
|
||||
| `8080` | `edge` | clair | Interface web servie via l'edge (TLS terminé à l'edge ; SSO possible via oauth2-proxy). |
|
||||
| `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. |
|
||||
|
||||
## Ce qu'il rend à la supervision
|
||||
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ graph LR
|
|||
|
||||
| sonde | TTL | ce qu'elle voit |
|
||||
|---|---|---|
|
||||
| `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. |
|
||||
| `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. |
|
||||
|
||||
## Ce qu'il expose en séries
|
||||
|
||||
|
|
|
|||
|
|
@ -8,18 +8,24 @@
|
|||
```mermaid
|
||||
graph LR
|
||||
R["<b>ops</b>"]
|
||||
E0["admin"] -->|"8090 · clair"| R
|
||||
E1["edge"] -->|"8090 · clair"| R
|
||||
R -.->|"sonde « runner »"| ICINGA[["Icinga"]]
|
||||
R -.->|"sonde « console-ops »"| ICINGA[["Icinga"]]
|
||||
```
|
||||
|
||||
## Qui lui parle
|
||||
|
||||
*Aucun flux entrant déclaré — `meta/flux.yml` absent ou sans `ingress`.*
|
||||
| port | depuis | chiffrement | pourquoi |
|
||||
|---|---|---|---|
|
||||
| `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
|
||||
|
||||
| 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. |
|
||||
| `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
|
||||
|
||||
|
|
|
|||
|
|
@ -9,6 +9,8 @@
|
|||
graph LR
|
||||
R["<b>ops_site</b>"]
|
||||
R -.->|"sonde « pouvoir-materialiser »"| ICINGA[["Icinga"]]
|
||||
R -.->|"sonde « fabric »"| ICINGA[["Icinga"]]
|
||||
R -.->|"sonde « genome-a-jour »"| ICINGA[["Icinga"]]
|
||||
```
|
||||
|
||||
## Qui lui parle
|
||||
|
|
@ -20,6 +22,8 @@ graph LR
|
|||
| 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. |
|
||||
| `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
|
||||
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@
|
|||
graph LR
|
||||
R["<b>powerdns</b>"]
|
||||
E0["flotte"] -->|"derive · clair"| R
|
||||
E1["public_site"] -->|"5300 · clair"| R
|
||||
R -.->|"sonde « zones »"| ICINGA[["Icinga"]]
|
||||
```
|
||||
|
||||
|
|
@ -18,6 +19,8 @@ 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 | 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
|
||||
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@ graph LR
|
|||
|
||||
| sonde | TTL | ce qu'elle voit |
|
||||
|---|---|---|
|
||||
| `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. |
|
||||
| `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. |
|
||||
|
||||
## Ce qu'il expose en séries
|
||||
|
||||
|
|
|
|||
|
|
@ -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_pki`](Rôle-client_pki) | — | 1 | — |
|
||||
| [`client_resolveur`](Rôle-client_resolveur) | — | — | — |
|
||||
| [`client_sante`](Rôle-client_sante) | — | — | — |
|
||||
| [`client_sante`](Rôle-client_sante) | — | 1 | — |
|
||||
| [`client_smtp`](Rôle-client_smtp) | — | — | — |
|
||||
| [`cloud_init`](Rôle-cloud_init) | — | — | — |
|
||||
| [`cloud_init_retrait`](Rôle-cloud_init_retrait) | — | — | — |
|
||||
|
|
@ -44,6 +44,7 @@ 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_collabora`](Rôle-serveur_collabora) | 2 | 1 | — |
|
||||
| [`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_durci`](Rôle-serveur_durci) | — | 1 | — |
|
||||
| [`serveur_forge_site`](Rôle-serveur_forge_site) | 1 | 1 | — |
|
||||
|
|
@ -57,12 +58,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_oauth2_proxy`](Rôle-serveur_oauth2_proxy) | 1 | 1 | — |
|
||||
| [`serveur_openldap`](Rôle-serveur_openldap) | 2 | 1 | — |
|
||||
| [`serveur_ops`](Rôle-serveur_ops) | — | 1 | — |
|
||||
| [`serveur_ops_site`](Rôle-serveur_ops_site) | — | 1 | — |
|
||||
| [`serveur_ops`](Rôle-serveur_ops) | 1 | 2 | — |
|
||||
| [`serveur_ops_site`](Rôle-serveur_ops_site) | — | 3 | — |
|
||||
| [`serveur_ops_tenant`](Rôle-serveur_ops_tenant) | 1 | 1 | — |
|
||||
| [`serveur_postfix`](Rôle-serveur_postfix) | 2 | 1 | — |
|
||||
| [`serveur_postgresql`](Rôle-serveur_postgresql) | 2 | 1 | oui |
|
||||
| [`serveur_powerdns`](Rôle-serveur_powerdns) | 2 | 1 | — |
|
||||
| [`serveur_powerdns`](Rôle-serveur_powerdns) | 4 | 1 | — |
|
||||
| [`serveur_prometheus`](Rôle-serveur_prometheus) | 1 | 1 | — |
|
||||
| [`serveur_redis`](Rôle-serveur_redis) | 1 | 1 | — |
|
||||
| [`serveur_resolveur`](Rôle-serveur_resolveur) | 2 | 1 | — |
|
||||
|
|
@ -81,11 +82,11 @@ Chaque fiche est construite depuis ce que le rôle **déclare lui-même** — `m
|
|||
|
||||
## Ce qui reste à déclarer
|
||||
|
||||
Sur **68** rôles :
|
||||
Sur **69** rôles :
|
||||
|
||||
- **36** ne déclarent aucun flux entrant
|
||||
- **32** ne déclarent aucune sonde
|
||||
- **67** ne déclarent aucune métrique
|
||||
- **35** ne déclarent aucun flux entrant
|
||||
- **31** ne déclarent aucune sonde
|
||||
- **68** 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.
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue