====== Apache : VirtualHosts et contrôle des accès ====== **Formation :** BTS SIO — Option SISR {{ :wiki:logo.png?120 |Logo PLC-SIO}} ===== 1. Fonctionnement ===== Apache peut héberger plusieurs sites sur la même adresse IP. Le DNS conduit le client au serveur ; l'en-tête HTTP Host permet à Apache de sélectionner le VirtualHost demandé. L'exemple comporte deux sites sur ''192.36.3.20'' : WordPress sur ''www0.californie.cub.sioplc.fr'' et une application de diagnostic sur ''scanner0.californie.cub.sioplc.fr''. ===== 2. Séparer les sites et leurs accès ===== Le scanner se trouve dans un sous-répertoire de la racine WordPress. Le VirtualHost WordPress doit donc interdire cet accès alternatif pour ne pas contourner la protection du scanner. Fichier ''/etc/apache2/sites-available/000-default.conf'' : ServerName www0.californie.cub.sioplc.fr ServerAdmin webmaster@localhost DocumentRoot /var/www/html AllowOverride None Require all denied ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined {{:services:apache:capture_decran_2026-10-15_a_11.31.36.png?800|VirtualHost WordPress et refus d’accès à son sous-répertoire scanner.}} //VirtualHost WordPress et refus d’accès à son sous-répertoire scanner.// ===== 3. Créer le compte HTTP ===== sudo apt install apache2-utils sudo htpasswd -c /etc/apache2/scanner0.htpasswd etudiant sudo chown root:www-data /etc/apache2/scanner0.htpasswd sudo chmod 640 /etc/apache2/scanner0.htpasswd sudo a2enmod auth_basic authn_file authz_user authz_host L'option ''-c'' est réservée à la première création du fichier ; elle écrase un fichier existant. Le mot de passe est saisi à l'invite, et le fichier d'empreintes reste hors de la racine Web. ===== 4. Cumuler réseau autorisé et authentification ===== Fichier ''/etc/apache2/sites-available/scanner0.conf'' : ServerName scanner0.californie.cub.sioplc.fr DocumentRoot /var/www/html/scanner Options -Indexes AllowOverride None DirectoryIndex index.php AuthType Basic AuthName "Scanner Californie - Acces administrateurs" AuthBasicProvider file AuthUserFile /etc/apache2/scanner0.htpasswd Require ip 192.168.3.192/28 Require valid-user ErrorLog ${APACHE_LOG_DIR}/scanner0-error.log CustomLog ${APACHE_LOG_DIR}/scanner0-access.log combined ''RequireAll'' impose les deux conditions : origine dans ''192.168.3.192/28'' et compte valide. ''Options -Indexes'' désactive la liste des fichiers ; ''AllowOverride None'' empêche un .htaccess de modifier ces règles. {{:services:apache:capture_decran_2026-10-15_a_13.12.23.png?800|Configuration finale du scanner avec RequireAll.}} //Configuration finale du scanner avec RequireAll.// L'exemple a été réalisé en HTTP. L'authentification Basic ne chiffre pas les identifiants : utiliser HTTPS avant de réemployer ce mécanisme hors d'une maquette contrôlée. ===== 5. Activer et vérifier ===== sudo a2ensite scanner0.conf sudo apache2ctl configtest # Seulement si le contrôle retourne Syntax OK : sudo systemctl reload apache2 sudo apache2ctl -S Les deux VirtualHosts doivent apparaître sur le port attendu. Une requête par IP sans Host correspondant peut atteindre le site par défaut. ===== 6. Associer les noms DNS ===== Sur le primaire de la zone, l'exemple utilise : web0 IN A 192.36.3.20 www0 IN CNAME web0.californie.cub.sioplc.fr. scanner0 IN CNAME web0.californie.cub.sioplc.fr. Augmenter le numéro de série, valider la zone et la recharger sur son primaire. Ne pas modifier la copie transférée sur un secondaire. Le nom demandé dans l'en-tête HTTP reste celui du site, même lorsque le DNS retourne un CNAME. dig A scanner0.californie.cub.sioplc.fr {{:services:apache:capture_decran_2026-10-15_a_11.46.32.png?800|VirtualHosts et résolution vers 192.36.3.20.}} //VirtualHosts et résolution vers 192.36.3.20.// La sortie dig visible est antérieure au passage aux CNAME : elle valide l'adresse obtenue, pas le rechargement des nouveaux alias. ===== 7. Résultats des essais ===== ^ Contrôle ^ Observation consignée ^ | Accès par le nom scanner0 | Formulaire affiché | | Accès depuis le VLAN Admin | Invite d'authentification ; accès avec le bon compte déclaré réussi | | Accès depuis le VLAN client | HTTP 403 Forbidden | {{:services:apache:capture_decran_2026-10-15_a_13.13.06.png?800|Demande d’authentification depuis le réseau Admin.}} //Demande d’authentification depuis le réseau Admin.// {{:services:apache:capture_decran_2026-10-15_a_13.17.39.png?800|Poste client 192.168.3.130/26 utilisé pour le test de refus.}} //Poste client 192.168.3.130/26 utilisé pour le test de refus.// {{:services:apache:capture_decran_2026-10-15_a_13.18.03.png?800|Refus HTTP 403 depuis le réseau client.}} //Refus HTTP 403 depuis le réseau client.// HTTP 403 signifie que le serveur a répondu et refusé l'accès. Ce résultat ne doit pas être interprété comme un simple problème de routage. ===== 8. Limite de l'application de diagnostic ===== L'application pédagogique concatène une entrée utilisateur à une commande système : exec("ping " . $_GET['ip'], $reponse, $retour); Cette construction expose à une injection de commandes avec les droits du processus PHP. Le filtrage IP et l'authentification réduisent l'accès, mais ne corrigent pas le code. La correction applicative et le passage à HTTPS sont des améliorations proposées, pas des résultats déjà réalisés. ===== 9. Références ===== * [[https://httpd.apache.org/docs/2.4/vhosts/name-based.html|Apache — VirtualHosts]] * [[:cyber:tls|TLS et certificats]] * [[:reseau:cisco:cours:cours_nat|Publication et contrôle du NAT]]