Set-OPS-Public/roles/serveur_icingaweb2/templates/nginx.conf.j2
Daniel Allaire 5ecce4282a une console pour le site, et un repli qui ouvrait vers l Internet
Icinga Web 2 gagne un troisieme mode, locale : nginx authentifie en HTTP Basic
et pose REMOTE_USER, l application le croit. Un SITE n a ni annuaire ni Keycloak
— ce sont des services d ecosysteme. Ni backend LDAP ni backend de groupes : un
backend qui vise une ressource inexistante fait echouer chaque ouverture de
session. L habilitation nomme alors une personne, entorse a D-66 ecrite plutot
que contournee.

Deux pieges en chemin : resoudre_annuaire etait appele sans condition et tombait
sur NoneType has no len (default sans son second argument ne remplace pas None),
et le flux du role ne nommait que l edge — le site n en a pas, donc personne ne
pouvait entrer. serveur_grafana portait deja la reponse.

LE DEFAUT DU DEVIS : une sortie vers un role ABSENT de l ecosysteme retombait
sur !SETOPS_INTERNES, la forme de vers l Internet. La frontiere aurait autorise
la console a parler LDAPS a n importe quelle machine du monde, pour joindre un
annuaire qui n existe pas. C est une source vide ouvre le port, cote
destination. Trois regles du meme defaut etaient DEJA posees pour postfix.

La frontiere n est pas ecrite : elle porte la production, et le devis attend un
mot.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 19:11:22 -04:00

45 lines
1.9 KiB
Django/Jinja

# Géré par Set-OPS (rôle serveur_icingaweb2). Ne pas éditer à la main.
# nginx LOCAL : sert Icinga Web 2 (PHP-FPM). L'edge nginx proxifie par nom vers ce port.
server {
listen {{ serveur_icingaweb2_nginx_bind }}{{ serveur_icingaweb2_http_port }};
{% if not serveur_icingaweb2_nginx_bind %}
listen [::]:{{ serveur_icingaweb2_http_port }};
{% endif %}
server_name {{ serveur_icingaweb2_hostname }};
root {{ serveur_icingaweb2_docroot }};
index index.php;
{% if serveur_icingaweb2_auth == 'locale' %}
# MODE `locale` : C'EST NGINX QUI AUTHENTIFIE.
#
# Icinga Web 2 n'a pas d'OIDC natif et un SITE n'a ni annuaire ni passerelle SSO.
# HTTP Basic devant `external` est le contrat que l'application attend deja — le
# serveur web dit QUI, l'application le croit. C'est exactement ce que fait
# oauth2-proxy chez un locataire, avec un vestibule plus simple.
#
# AU NIVEAU DU `server`, PAS DU `location` : place dans le seul bloc PHP, la
# protection sauterait tout ce que `try_files` sert directement — feuilles de style,
# icones, et surtout les fichiers que `location ~ /\.ht` croit couvrir. Une
# authentification qu'on peut contourner par un chemin voisin n'en est pas une.
auth_basic "{{ serveur_icingaweb2_realm }}";
auth_basic_user_file {{ serveur_icingaweb2_htpasswd }};
{% endif %}
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ ^/index\.php {
fastcgi_pass unix:{{ serveur_icingaweb2_php_fpm_socket }};
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME {{ serveur_icingaweb2_docroot }}/index.php;
fastcgi_param ICINGAWEB_CONFIGDIR {{ serveur_icingaweb2_config_dir }};
fastcgi_param REMOTE_USER {{ serveur_icingaweb2_remote_user }};
}
location ~ /\.ht {
deny all;
}
}