Configurer un vhost NGINX sécurisé pour iTop 3.x (guide complet)

iTop est une solution ITSM largement déployée en environnement professionnel. Historiquement, la majorité des installations reposent sur Apache, notamment car iTop fournit de nombreux fichiers .htaccess prêts à l’emploi pour sécuriser l’application.

Lorsque l’on choisit NGINX, ces fichiers .htaccess ne sont pas interprétés. Il est donc impératif de retranscrire manuellement l’ensemble des règles de sécurité dans le vhost, sous peine d’exposer des fichiers critiques : configuration, données, logs ou code applicatif.

Dans cet article, nous proposons une configuration NGINX complète, commentée et conforme à 100 % aux recommandations officielles Combodo, testée avec iTop 3.x.

Pourquoi iTop nécessite une configuration NGINX spécifique ?

Contrairement à Apache, NGINX :

  • ne supporte pas les .htaccess,
  • fonctionne par priorités de blocs location,
  • nécessite une approche whitelist pour l’exécution PHP.

iTop, de son côté :

  • contient de nombreux répertoires sensibles (conf, data, log, env-*),
  • utilise des URLs complexes de type exec.php/browse/...
  • génère dynamiquement du code compilé dans les dossiers env-*.

Une configuration générique NGINX est donc insuffisante.

Hypothèses techniques

Cette configuration repose sur les choix suivants :

  • iTop 3.2.x
  • NGINX 1.18+
  • PHP 8.0 à 8.3 via PHP-FPM
  • HTTPS obligatoire
  • Racine web pointant vers le dossier /web d’iTop

Structure recommandée du vhost NGINX iTop

La configuration complète repose sur les piliers suivants :

  1. Redirection HTTP → HTTPS
  2. TLS moderne (TLS 1.2 / 1.3)
  3. Headers HTTP de sécurité (HSTS, CSP, etc.)
  4. Blocage strict des répertoires sensibles
  5. Autorisation fine des ressources statiques
  6. Exécution PHP uniquement sur des points d’entrée autorisés
  7. Support du portail (fastcgi_split_path_info)

Exemple de vhost NGINX production-ready pour iTop 3.x

L’exemple ci-dessous correspond à un vhost NGINX sécurisé , conçu pour iTop 3.2.x, et intégrant :

  • la traduction complète des .htaccess fournis par iTop,
  • toutes les recommandations de sécurité officielles Combodo,
  • une approche whitelist stricte pour l’exécution PHP,
  • un durcissement HTTPS et HTTP headers.

⚠️ Ce vhost est volontairement verbeux et commenté : il sert à la fois de référence technique et de support pédagogique.

# ============================================================================
# Configuration Nginx pour iTop 3.x - Version HTTPS native (SSL direct)
# ============================================================================
#
# Architecture : Internet -> Nginx (HTTPS/SSL) -> iTop
#
# Nginx gere directement :
# - Terminaison SSL/TLS avec certificats
# - Header HSTS (Strict-Transport-Security)
# - Redirection HTTP -> HTTPS
# - Regles de securite iTop (conversion des .htaccess)
# - PHP-FPM, protections dossiers, headers de securite applicatifs
#
# Base sur :
# - Documentation officielle Combodo "Security best practices"
# - Documentation officielle Combodo "iTop and NGINX"
# - Analyse des 11 fichiers .htaccess presents dans iTop 3.2.x
# (conf, data, log, lib, lib/tecnickcom/tcpdf/tools, node_modules,
# datamodels, env-production, extensions, setup/permissions-test-folder,
# setup/unattended-install)
#
# ============================================================================
# ============================================================================
# UPSTREAM PHP-FPM
# ============================================================================
# Adapter le chemin du socket selon votre version de PHP.
# Exemples :
# PHP 8.3 : unix:/var/run/php/php8.3-fpm.sock
# ============================================================================
upstream itop_php_fpm {
  server unix:/var/run/php/php8.3-fpm.sock;
}
# ============================================================================
# SERVEUR HTTP -> Redirection vers HTTPS
# ============================================================================

server {
  listen 80;
  listen [::]:80;

  # --- A ADAPTER : votre nom de domaine ---
  server_name itop.example.com;

  # Redirection permanente vers HTTPS
  return 301 https://$server_name$request_uri;
}
# ============================================================================
# SERVEUR HTTPS - iTop (SSL natif)
# ============================================================================
server {
  listen 443 ssl http2;
  listen [::]:443 ssl http2;

  # --- A ADAPTER : votre nom de domaine ---
  server_name itop.example.com;

  # --- A ADAPTER : chemin vers le dossier racine web d'iTop ---
  root /var/www/web;
  index index.php;

  # Masquer la version de Nginx dans les headers de réponse
  server_tokens off;

  # Désactiver le listing des répertoires
  # Ref : Combodo doc "You should also prevent directory listing."
  autoindex off;

  # Logs  iTop
  access_log /var/log/nginx/itop-access.log;
  error_log /var/log/nginx/itop-error.log warn;

  # Taille maximale des uploads (pièces jointes iTop, imports CSV, etc.)
  client_max_body_size 10M;
  client_body_buffer_size 128k;

  # Timeouts adaptés pour les opérations longues d'iTop
  client_body_timeout 300s;
  client_header_timeout 300s;
  send_timeout 300s;
  fastcgi_read_timeout 300s;
  
  # ========================================================================
  # CONFIGURATION SSL/TLS
  # ========================================================================
  # --- A ADAPTER : chemins vers vos certificats ---
  # ========================================================================
  ssl_certificate /etc/letsencrypt/live/itop.example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/itop.example.com/privkey.pem;

  # Protocoles TLS : uniquement TLS 1.2 et 1.3 (TLS 1.0 et 1.1 obsoletes)
  ssl_protocols TLSv1.2 TLSv1.3;

  # Suites de chiffrement modernes et securisees
  ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
  ssl_prefer_server_ciphers off;

  # ========================================================================
  # HEADERS DE SECURITE
  # ========================================================================
  # Ref : Combodo doc "Security best practices" - section HTTP headers
  #
  # IMPORTANT : Nginx n'hérite PAS les add_header des blocs parents
  # dans les blocs location qui définissent leurs propres add_header.
  # Pour les locations avec cache (static assets), on redéfinit
  # uniquement Cache-Control ; les headers de sécurité sont définis
  # au niveau server et s'appliquent a toutes les autres reponses.
  # ========================================================================

  # Strict-Transport-Security (HSTS) : force le navigateur à utiliser HTTPS
  # Ref : Combodo recommande max-age=63072000 (2 ans)
  add_header Strict-Transport-Security "max-age=63072000; includeSubDomains;" always;

  # X-Frame-Options : empêche l'inclusion dans des iframes tierces
  # Ref : Combodo - parametre security_header_xframe (defaut SAMEORIGIN)
  add_header X-Frame-Options "SAMEORIGIN" always;

  # X-Content-Type-Options : empêche le MIME sniffing
  # Ref : Combodo - parametre security.enable_header_xcontent_type_options
  add_header X-Content-Type-Options "nosniff" always;

  # Referrer-Policy : controle les informations envoyées dans le Referer
  # Ref : Combodo recommande strict-origin-when-cross-origin
  add_header Referrer-Policy "strict-origin-when-cross-origin" always;

  # Content-Security-Policy : restreint les sources de contenu
  # Ref : Combodo doc - CSP pour iTop community
  # - unsafe-inline et unsafe-eval sont requis par iTop (inline scripts/styles)
  # - www.itophub.io est requis pour le connecteur iTop Hub (iframe setup + newsroom)
  # - data: et blob: sont requis pour les images générées dynamiquement
  add_header Content-Security-Policy "default-src 'self'; frame-src 'self' www.itophub.io; img-src 'self' data: blob:; script-src 'self' 'unsafe-inline' 'unsafe-eval'; connect-src 'self' www.itophub.io; style-src 'self' 'unsafe-inline'; object-src 'none'; base-uri 'self'; form-action 'self';" always;

  # ========================================================================
  # SECTION 1 : DOSSIERS TOTALEMENT INTERDITS
  # ========================================================================
  # Conversion des .htaccess contenant "Require all denied" sans exception.
  # Ces dossiers ne doivent JAMAIS etre accessibles depuis le web.
  # ========================================================================

  # /conf/ - Fichiers de configuration iTop (config-itop.php, etc.)
  # Source : conf/.htaccess -> "Require all denied"
  location ^~ /conf/ {
    return 403;
  }

  # /data/ - Données applicatives (cache, exports, modules téléchargés, etc.)
  # Source : data/.htaccess -> "Require all denied"
  location ^~ /data/ {
    return 403;
  }

  # /log/ - Fichiers de logs iTop
  # Source : log/.htaccess -> "Require all denied"
  location ^~ /log/ {
    return 403;
  }

  # /setup/unattended-install/ - Scripts d'installation automatique
  # Source : setup/unattended-install/.htaccess -> "Require all denied"
  location ^~ /setup/unattended-install/ {
    return 403;
  }

  # /setup/permissions-test-folder/ - Dossier de test des permissions
  # Source : setup/permissions-test-folder/.htaccess -> "Require all denied"
  # Ref : Combodo doc - requis pour éviter un Security Warning au setup (>= 3.0.2 / 2.7.8)
  location ^~ /setup/permissions-test-folder/ {
    return 403;
  }

  # /lib/tecnickcom/tcpdf/tools/ - Outils TCPDF (generation PDF)
  # Source : lib/tecnickcom/tcpdf/tools/.htaccess -> "Require all denied"
  location ^~ /lib/tecnickcom/tcpdf/tools/ {
    return 403;
  }

  # ========================================================================
  # SECTION 2 : DOSSIERS AVEC RESSOURCES STATIQUES FILTREES
  # ========================================================================
  # Conversion des .htaccess contenant "Require all denied" avec des
  # exceptions FilesMatch pour certaines extensions.
  #
  # Stratégie Nginx : on utilise un bloc ^~ (prefix prioritaire) pour capturer tout le dossier, puis des sous-blocs location pour autoriser uniquement les extensions listées dans le .htaccess.
  # Tout le reste est refuse (deny all en fallback).
  # ========================================================================

  # /lib/ - Bibliothèques tierces
  # Source : lib/.htaccess -> deny all, sauf : css|scss|js|map|png|bmp|gif|jpe?g|svg|tiff|woff2?|ttf|eot
  # Note : PAS de html ou PHP autorisé (risque de pages de test exécutant du JS)
  location ^~ /lib/ {
    # Autoriser uniquement les ressources statiques
    location ~* \.(css|scss|js|map|png|bmp|gif|jpe?g|svg|tiff|woff2?|ttf|eot)$ {
      expires 30d;
      add_header Cache-Control "public, immutable";
      access_log off;
    }

# Tout le reste est interdit
    return 403;
  }

  # /node_modules/ - Dependances Node.js
  # Source : node_modules/.htaccess -> deny all, sauf : css|scss|js|map|png|bmp|gif|jpe?g|svg|tiff|woff2?|ttf|eot
  # Note : meme regles que /lib/ (pas de html, pas de PHP)
  location ^~ /node_modules/ {
    location ~* \.(css|scss|js|map|png|bmp|gif|jpe?g|svg|tiff|woff2?|ttf|eot)$ {
      expires 30d;
      add_header Cache-Control "public, immutable";
      access_log off;
    }

    return 403;
  }

  # /datamodels/ - Modeles de donnees iTop
  # Source : datamodels/.htaccess -> deny all, sauf : css|scss|js|map|png|bmp|gif|jpe?g|svg|tiff|woff2?|ttf|eot|html
  # Note : html autorise (contrairement a /lib/) et pas de PHP
  location ^~ /datamodels/ {
    location ~* \.(css|scss|js|map|png|bmp|gif|jpe?g|svg|tiff|woff2?|ttf|eot|html)$ {
      expires 7d;
     add_header Cache-Control "public";
     access_log off;
    }

    return 403;
  }

  # /extensions/ - Extensions iTop
  # Source : extensions/.htaccess -> deny all, sauf : css|scss|js|map|png|bmp|gif|jpe?g|svg|tiff|woff2?|ttf|eot|html
  # Note : mêmes règles que /datamodels/ (html autorise, pas de PHP)
  location ^~ /extensions/ {
    location ~* \.(css|scss|js|map|png|bmp|gif|jpe?g|svg|tiff|woff2?|ttf|eot|html)$ {
      expires 7d;
     add_header Cache-Control "public";
     access_log off;
    }

    return 403;
  }

# /env-*/ - Environnements compilés (env-production, env-test, etc.)
#
# DEUX SOURCES, DEUX APPROCHES :
#
# 1) Le .htaccess réel (env-production/.htaccess) autorise PHP :
# FilesMatch ".+\.(css|scss|js|map|png|bmp|gif|jpe?g|svg|tiff|woff2?|ttf|eot|html|php)$"
# C'est nécessaire car certains modules Combodo appellent directement des fichiers PHP dans env-production/ via URL HTTP

# 2) La documentation Combodo "Security best practices" ne liste PAS php :
# env-* : allow only css|scss|js|map|png|bmp|gif|jpe?g|svg|tiff|woff2?|ttf|eot|html
# C'est l'approche la plus sécurisée. Elle suppose que toutes les extensions utilisent pages/exec.php comme proxy au lieu d'appeler directement les PHP dans env-*/ via URL.
# Exemple :
# Ancien (appel direct) :
# GetAbsoluteUrlModulesRoot().'approval-base/approve.php?token=xxx'
# Nouveau (via exec.php) :
# GetAbsoluteUrlAppRoot().'pages/exec.php?exec_module=approval-base&exec_page=approve.php&token=xxx'
#
# CHOIX : Deux blocs sont fournis ci-dessous. Un seul doit être actif.
# - MODE COMPATIBLE (par defaut) : PHP autorise - compatible avec tous les modules
# - MODE STRICT (commente) : PHP bloque - conforme a la doc Combodo
#
# Pour passer en mode strict :
# 1. Commentez le bloc "MODE COMPATIBLE" (ajoutez # devant chaque ligne)
# 2. Décommentez le bloc "MODE STRICT" (retirez les # devant chaque ligne hors commentaires)
# 3. Testez que toutes vos extensions fonctionnent correctement
# 4. nginx -t && systemctl reload nginx
#

  # --- MODE COMPATIBLE (actif par défaut) ---
  # PHP autorise dans env-*/ : fidèle au .htaccess reel d'iTop
  # Compatible avec tous les modules, y compris ceux qui appellent directement des PHP dans env-production/ via URL HTTP.
  location ~ ^/env-[^/]+/ {
  # Fichiers PHP : exécution autorisée (modules compiles iTop)
    location ~ \.php(/|$) {
      fastcgi_pass itop_php_fpm;
      fastcgi_split_path_info ^(.+\.php)(/.*)$;
      include fastcgi_params;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      fastcgi_param PATH_INFO $fastcgi_path_info;
      fastcgi_param HTTPS on;
      fastcgi_param PHP_VALUE "session.cookie_httponly=1
      session.cookie_secure=1
      session.cookie_samesite=Lax";
      }

    # Ressources statiques autorisees (+ html)
    location ~* \.(css|scss|js|map|png|bmp|gif|jpe?g|svg|tiff|woff2?|ttf|eot|html)$ {
      expires 7d;
      add_header Cache-Control "public";
      access_log off;
    }

    # Tout le reste est interdit
    return 403;
  }

# --- MODE STRICT (commente par défaut) ---
# PHP bloque dans env-*/ : conforme a la documentation Combodo
# Plus sécurisé, mais nécessite que TOUTES les extensions utilisent pages/exec.php comme proxy au lieu d'appeler directement les PHP.

  # location ~ ^/env-[^/]+/ {
    # # Ressources statiques autorisées (+ html) - PAS de PHP
    # location ~* \.(css|scss|js|map|png|bmp|gif|jpe?g|svg|tiff|woff2?|ttf|eot|html)$ {
    # expires 7d;
    # add_header Cache-Control "public";
    # access_log off;
    # }
    #
    # # Tout le reste est interdit (y compris PHP)
    # return 403;
  # }

  # ========================================================================
  # SECTION 3 : FICHIERS CACHES ET SENSIBLES
  # ========================================================================

  # Bloquer l'accès aux fichiers caches (.htaccess, .git, .env, etc.)
  location ~ /\. {
    return 403;
  }

  # Bloquer l'accès aux fichiers sensibles par extension
  # - config : couvre web.config (IIS) et tout *.config
  # - xml : couvre manifest.xml (révèle la version iTop installée)
  location ~* \.(htaccess|htpasswd|ini|log|sh|sql|conf|config|bak|swp|dist|xml)$ {
    return 403;
  }
  # ========================================================================
  # SECTION 4 : RESSOURCES STATIQUES PUBLIQUES
  # ========================================================================
  # Ces dossiers contiennent les assets publics d'iTop (CSS, JS, images).
  # Ils ne contiennent pas de fichiers PHP à protéger.
  # ========================================================================

  location ^~ /css/ {
    expires 7d;
    add_header Cache-Control "public";
    access_log off;
  }

  location ^~ /js/ {
    expires 7d;
    add_header Cache-Control "public";
    access_log off;
  }

  location ^~ /images/ {
    expires 30d;
    add_header Cache-Control "public, immutable";
    access_log off;
  }

  location ^~ /resources/ {
    expires 7d;
    add_header Cache-Control "public";
    access_log off;
  }

  location ^~ /dictionaries/ {
    expires 7d;
    add_header Cache-Control "public";
    access_log off;
  }

  location ^~ /templates/ {
    expires 7d;
    add_header Cache-Control "public";
    access_log off;
  }
   # ========================================================================
  # SECTION 5 : POINTS D'ENTREE PHP AUTORISES
  # ========================================================================
  # iTop utilise plusieurs scripts PHP comme points d'entrée.
  # Seuls ces scripts sont autorises à être exécutés.
  # Tout autre fichier .php sera bloque (voir section 6).
  #
  # Paramètres PHP de session transmis via fastcgi_param PHP_VALUE :
  # Ref : Combodo doc "Prevent session theft"
  # - session.cookie_httponly=1 : empeche le JS de lire le cookie de session
  # - session.cookie_secure=1 : cookie envoye uniquement en HTTPS
  # - session.cookie_samesite=Lax : protection contre le CSRF
  #
  # Les paramètres suivants ne sont PAS répètés ici car déjà configures
  # dans php.ini (FPM) avec les bonnes valeurs par défaut :
  # - zend.exception_ignore_args = On
  # - expose_php = Off
  # - display_errors = Off
  # - log_errors = On
  # Si votre php.ini n'a pas ces valeurs, voir la section NOTES en fin
  # de fichier pour les ajouter dans le pool FPM ou ici.
  # ========================================================================

  # Point d'entrée principal - Console iTop
  location = /index.php {
    fastcgi_pass itop_php_fpm;
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param HTTPS on;
    fastcgi_param PHP_VALUE "session.cookie_httponly=1
    session.cookie_secure=1
    session.cookie_samesite=Lax";
  }

  # app.php - Point d'entrée Symfony (portail)
    location = /app.php {
    fastcgi_pass itop_php_fpm;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param HTTPS on;
    fastcgi_param PHP_VALUE "session.cookie_httponly=1
    session.cookie_secure=1
    session.cookie_samesite=Lax";
  }

  # /pages/ - Pages de la console et portail
  # Ref : Combodo doc "iTop and NGINX" - section Portal
  # Le portail amélioré utilise des URLs de type :
  # /pages/exec.php/browse/faq?exec_module=itop-portal.php&exec_page=index.php
  # Nginx doit gérer le PATH_INFO après le .php pour que ca fonctionne.
  location ^~ /pages/ {
    location ~ \.php(/|$) {
      fastcgi_pass itop_php_fpm;
      fastcgi_split_path_info ^(.+\.php)(/.*)$;
      include fastcgi_params;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      fastcgi_param PATH_INFO $fastcgi_path_info;
      fastcgi_param HTTPS on;
      fastcgi_param PHP_VALUE "session.cookie_httponly=1
      session.cookie_secure=1
      session.cookie_samesite=Lax";
    }
  }

  # /webservices/ - API REST, SOAP, exports, imports, cron
  location ^~ /webservices/ {
    location ~ \.php(/|$) {
      fastcgi_pass itop_php_fpm;
      fastcgi_split_path_info ^(.+\.php)(/.*)$;
      include fastcgi_params;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      fastcgi_param PATH_INFO $fastcgi_path_info;
      fastcgi_param HTTPS on;
      fastcgi_param PHP_VALUE "session.cookie_httponly=1
      session.cookie_secure=1
      session.cookie_samesite=Lax";
    }
  }

  # /synchro/ - Synchronisation de donnees
  location ^~ /synchro/ {
    location ~ \.php(/|$) {
      fastcgi_pass itop_php_fpm;
     fastcgi_split_path_info ^(.+\.php)(/.*)$;
     include fastcgi_params;
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
     fastcgi_param PATH_INFO $fastcgi_path_info;
     fastcgi_param HTTPS on;
     fastcgi_param PHP_VALUE "session.cookie_httponly=1
     session.cookie_secure=1
     session.cookie_samesite=Lax";
   }
  }

  # /portal/ - Portail utilisateur
  location ^~ /portal/ {
    location ~ \.php(/|$) {
      fastcgi_pass itop_php_fpm;
      fastcgi_split_path_info ^(.+\.php)(/.*)$;
      include fastcgi_params;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      fastcgi_param PATH_INFO $fastcgi_path_info;
      fastcgi_param HTTPS on;
      fastcgi_param PHP_VALUE "session.cookie_httponly=1
      session.cookie_secure=1
      session.cookie_samesite=Lax";
   }
  }

  location ~ \.php(/|$) {
    fastcgi_pass itop_php_fpm;
    fastcgi_split_path_info ^(.+\.php)(/.*)$;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_param HTTPS on;
    fastcgi_param PHP_VALUE "session.cookie_httponly=1
    session.cookie_secure=1
    session.cookie_samesite=Lax";
  }
}
  # ========================================================================
  # SECTION 6 : BLOCAGE PHP PAR DEFAUT ET ROUTING
  # ========================================================================

  # Route par défaut - try_files puis fallback sur index.php
  location / {
    try_files $uri $uri/ /index.php?$query_string;
  }

  # Bloquer l'exécution de tout fichier PHP non explicitement autorise
  # dans les sections precedentes. Ceci est le filet de securite final.
  location ~ \.php(/|$) {
    return 403;
  }
}
# ============================================================================
# NOTES DE DEPLOIEMENT
# ============================================================================
#
# 1. PARAMETRES A ADAPTER :
# - server_name : votre nom de domaine (ex: itop.example.com)
# - root : chemin vers le dossier web d'iTop (ex: /var/www/web)
# - upstream : socket PHP-FPM (ex: unix:/var/run/php/php8.3-fpm.sock)
# - ssl_certificate : chemin vers votre certificat SSL
# - ssl_certificate_key : chemin vers votre cle privee SSL
#
# 2. APRES CHAQUE MISE A JOUR ITOP :
# Verifier si de nouveaux .htaccess ont ete ajoutes ou modifies.
# Ref : Combodo doc "after each upgrade, you should check if new rules were introduced"
#
# 3. SECURISATION PHP (php.ini / pool FPM) :
# Les paramètres suivants doivent être configures dans php.ini ou dans
# le pool PHP-FPM (/etc/php/8.x/fpm/pool.d/www.conf).
# S'ils ne sont pas déjà présents, ajoutez les dans le pool FPM
# avec php_admin_flag/php_admin_value (non modifiables par ini_set) :
#
# php_admin_flag[expose_php] = off
# php_admin_flag[display_errors] = off
# php_admin_flag[log_errors] = on
# php_admin_value[zend.exception_ignore_args] = 1
#
# Ces paramètres ne sont pas répétés dans les blocs Nginx car ils sont normalement déjà configures dans php.ini par defaut.
#
# Les paramètres de session (cookie_httponly, cookie_secure,cookie_samesite) sont gardes dans les blocs Nginx car ils ne sont PAS configures par défaut dans php.ini et sont spécifiques a iTop.
# Pour une sécurité maximale, vous pouvez aussi les ajouter dans le pool FPM :
#
# php_admin_value[session.cookie_httponly] = 1
# php_admin_value[session.cookie_secure] = 1
# php_admin_value[session.cookie_samesite] = Lax
#
# ============================================================================

Focus : portail avancé iTop (enhanced portal)

Le portail amélioré d’iTop repose sur Symfony et utilise des URLs comme :

/pages/exec.php/browse/faq

Sans la directive suivante, NGINX renvoie une 404 :

fastcgi_split_path_info ^(.+\\.php)(/.*)$;

C’est le point le plus critique lors d’un déploiement iTop sur NGINX.

Correspondance .htaccess Apache → NGINX

 

Apache (.htaccess) NGINX
Deny from all deny all;
FilesMatch location ~
Options -Indexes autoindex off;
RewriteRule try_files

À chaque montée de version iTop, il est recommandé de comparer les nouveaux .htaccess livrés.

Bonnes pratiques complémentaires

PHP

  • session.cookie_httponly = 1
  • session.cookie_secure = 1
  • session.cookie_samesite = Lax
  • zend.exception_ignore_args = On

Sécurité

Conclusion

Configurer iTop derrière NGINX demande plus de rigueur qu’avec Apache, mais offre en retour :

  • une surface d’attaque réduite,
  • une meilleure lisibilité des règles,
  • une maîtrise totale de l’exécution PHP.

Ce vhost constitue une base robuste et conforme aux recommandations Combodo, adaptée aux environnements ITSM exigeants