Le cache du site couvrait apt ; quatre artefacts arrivaient autrement, parce qu ils ne vivent dans aucun depot apt. Le controleur les tire puis les pousse par SSH. Mesure du 2026-09-12 : le cache du runner du site est ABSENT. Un second locataire monte depuis lui sortait chercher 570 Mo sur codeberg.org, github.com et download.nextcloud.com, alors que le meme ecosysteme ne demandait plus un seul paquet a Debian. Le poste du mainteneur les a depuis toujours : personne ne l avait vu. Pas de relais transparent, et la mesure tranche : github.com redirige vers une URL signee valable une heure, differente a chaque requete. Un cache qui la prend pour cle ne fait jamais mouche. Le relais marcherait pour deux amonts sur quatre. Donc un vrai depot, dans le service qui existe deja. LocalDirs d apt-cacher-ng publie un repertoire du disque sous un prefixe, eprouve AVANT d ecrire le role. Aucun service, aucun port, aucun certificat, aucun flux nouveaux : l ingress 3142 pair flotte couvre exactement ce chemin. Les versions ne sont pas recopiees : le role lit les defauts des quatre consommateurs. Les quatre roles recoivent une tache AJOUTEE, placee avant leur stat de cache — si le depot sert, le stat le voit et la tache amont se saute d elle-meme. Aucune tache existante n a change. P70 exige que tout dest ecrit sous un cache_local figure au depot. Une liste qui suit une autre prend du retard ; celle-ci est nee avec sa garde. Deux marches payees en chemin : - failed_when: false REECRIT le verdict, donc la premiere garde de signature ne gardait rien. Elles mesurent le fichier desormais. - file: state=directory cree les parents en 0750 : apt-cacher-ng, qui ne tourne pas en root, rendait 403 sur chaque fichier. Un chemin se traverse en entier. Verifie sur l infrastructure : 6/6 artefacts servis (200/206) depuis le runner du site ET depuis une machine du locataire a travers la frontiere ; les 6 empreintes SHA-256 sont identiques a celles qui ont construit Chezlepro ; second passage changed=0. make prouver : 69 OK, 0 echec, 1 saute. ansible-lint : 0 failure, profil production. Inclut aussi force: true sur cinq telechargements de cles : une reprise conditionnelle ne reprend rien (304 Not Modified, size 0, attempts 5). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q |
||
|---|---|---|
| .. | ||
| defaults | ||
| handlers | ||
| meta | ||
| tasks | ||
| templates | ||
| README.md | ||
serveur_oauth2_proxy
Passerelle SSO générique : place Keycloak devant n'importe quelle application qui n'a pas d'OIDC natif. L'utilisateur s'authentifie une fois auprès de Keycloak ; l'application le reçoit via un en-tête (authentification « external »).
C'est le patron réutilisable qui évite d'écrire une intégration OIDC par application. Éprouvé devant Icinga Web 2.
Comment ça s'assemble
navigateur → edge nginx (TLS) → oauth2-proxy :4180 → application (127.0.0.1:8080)
↓
Keycloak (OIDC)
L'application passe en auth: external et lit REMOTE_USER, posé par nginx depuis l'en-tête
de la passerelle. Elle n'a aucune connaissance d'OIDC.
Rôle
- Installe le binaire Go officiel depuis les releases GitHub (pas d'apt), sous
/usr/local/bin/oauth2-proxy, avec un utilisateur système dédié. - Déploie la configuration et l'unité systemd, active le service.
- Assère d'entrée toute la configuration OIDC obligatoire — pas de démarrage à moitié configuré.
Variables obligatoires (par instance)
| Variable | Rôle |
|---|---|
serveur_oauth2_proxy_client_id |
Client OIDC déclaré dans Keycloak |
serveur_oauth2_proxy_client_secret |
Secret du client (voûte) |
serveur_oauth2_proxy_redirect_url |
https://<app>/oauth2/callback |
serveur_oauth2_proxy_upstream |
Application protégée (ex. http://127.0.0.1:8080) |
serveur_oauth2_proxy_cookie_secret |
32 octets base64 (voûte, vault_oauth2_cookie) |
Autres variables
| Variable | Défaut | Rôle |
|---|---|---|
serveur_oauth2_proxy_version |
v7.15.3 |
Version épinglée |
serveur_oauth2_proxy_ecoute |
0.0.0.0:4180 |
L'edge proxifie ici |
serveur_oauth2_proxy_realm |
{{ identite_realm }} |
Realm applicatif |
serveur_oauth2_proxy_issuer |
https://keycloak.<domaine>/realms/<realm> |
Émetteur OIDC |
serveur_oauth2_proxy_email_domains |
* |
Tout utilisateur authentifié par Keycloak |
serveur_oauth2_proxy_allow_unverified_email |
true |
Voir ci-dessous |
serveur_oauth2_proxy_ca_bundle |
/etc/ssl/certs/ca-certificates.crt |
Racine step_ca (via client_pki) |
Notes / limites
allow_unverified_email: trueest nécessaire ici : les comptes viennent de l'annuaire LDAP, qui ne porte pas de drapeauemail_verified. L'IdP est interne et de confiance ; sans ce réglage, aucune connexion ne passe.- La version est épinglée : une montée de version est un geste délibéré (relire les notes de version d'oauth2-proxy, les options changent de nom entre majeures).
- Le service écoute en clair sur
:4180— le TLS est terminé à l'edge. À restreindre à l'edge par pare-feu (meta/flux.yml,pair: edge). - Une instance protège une application (upstream unique). Deux applications = deux instances (ou un déploiement par nœud applicatif).
Prérequis
client_pki(confiance step_ca pour joindre Keycloak en HTTPS) etserveur_keycloakactif.- Le client OIDC doit exister dans le realm Keycloak, avec la bonne URL de redirection.