Intégration professionnelle BTS SIO SISR · Étape 01

Publie un premier service web Windows avec IIS

Déploie un service web interne IIS sans refaire le cours HTTP : installe le rôle, publie un site dédié, relie DNS, pare-feu, permissions, journaux et tests client, puis diagnostique une panne mono-cause.

Durée indicative · ~2 h 15Niveau intermédiairePrérequis conseillé · Windows Server leçons 7 à 10 ; Réseaux leçons 12 à 15 ; leçon BTS 7 — adressage, passerelle Linux et routagePratique · TP
Intégration BTS

« Installer IIS suffit pour mettre un service à disposition. »

Un rôle installé n’est qu’un composant. Un service utilisable exige aussi une adresse cohérente, un nom résolu, un binding, des permissions, une règle de flux bornée, un test depuis le client attendu, des journaux et une procédure de retour arrière.

01Ce que ce TP ajoute — et ce qu’il ne répète pas

Ce TP ne réenseigne pas HTTP, HTTPS, TLS, DNS ni la méthode générale de diagnostic. Il réutilise :

windows/installer-inventorier-retirer-roles-fonctionnalites
windows/configurer-adressage-nommage-dns-local
windows/diagnostiquer-services-reseau-parefeu

reseaux/resoudre-noms-dns
reseaux/observer-http-https-tls
reseaux/diagnostiquer-service-bout-en-bout

bts-sisr/conduire-diagnostic-remediation
bts-sisr/construire-dossier-preuves

Le nouveau geste est volontairement ciblé : publier et exploiter un premier service web sur Windows Server avec IIS.

Le scénario PHP cité dans certaines progressions locales n’est pas ajouté ici. Le blueprint BTS le conserve comme exigence locale exacte ou variante technologique encore à arbitrer ; ce TP ne l’invente donc pas.

02Besoin de SORIA Distribution

SORIA Distribution demande un intranet interne de démonstration.

Architecture minimale :

CLIENT-USERS
  |
  | DNS + HTTP TCP 8080
  v
SRV-WEB01 — Windows Server 2022 — IIS

Contraintes :

nom attendu        = intranet.corp.soria.test
service            = HTTP sur TCP 8080
accès attendu      = depuis la zone Utilisateurs du laboratoire
contenu            = page HTML statique de démonstration
site IIS           = dédié
application pool   = dédié
pare-feu           = règle entrante bornée au besoin
preuves             = DNS + port + HTTP + état IIS + journal
production réelle  = interdite

Si tu réutilises le plan de l’évaluation précédente, adapte les exemples à tes propres sous-réseaux validés. Les adresses ci-dessous restent purement pédagogiques.

03Établis l’état avant changement

Sur SRV-WEB01 :

Get-WindowsFeature -Name Web-Server
Get-NetIPConfiguration
Get-NetFirewallProfile |
  Select-Object Name, Enabled, DefaultInboundAction, DefaultOutboundAction
Get-Service W3SVC,WAS -ErrorAction SilentlyContinue

Consigne :

rôle IIS présent ou absent
adresse IPv4 du serveur
profil de pare-feu actif
état de W3SVC et WAS si présents
snapshot / point de retour disponible

Ne commence pas par modifier le pare-feu ou DNS. Il faut d’abord connaître l’état initial.

04Simule puis installe IIS

Commence par la simulation :

Install-WindowsFeature -Name Web-Server \
  -IncludeManagementTools -WhatIf

Après validation du changement sur une VM de laboratoire snapshotée :

$result = Install-WindowsFeature -Name Web-Server \
  -IncludeManagementTools

$result | Format-List Success, RestartNeeded, ExitCode, FeatureResult
Get-WindowsFeature -Name Web-Server
Get-Service W3SVC,WAS

Le résultat attendu n’est pas seulement Installed = True. Les services nécessaires doivent être observables et le changement doit être traçable.

05Prépare un contenu et un pool dédiés

$siteName = 'SORIA-Intranet'
$poolName = 'SORIA-IntranetPool'
$root     = 'C:\SORIA-Labs\IIS\Intranet'
$serverIp = '10.44.0.114'   # exemple : adapte à ton plan validé

New-Item -ItemType Directory -Path $root -Force

@'
<!doctype html>
<html lang="fr">
<head><meta charset="utf-8"><title>SORIA Distribution</title></head>
<body>
  <h1>Intranet SORIA Distribution</h1>
  <p>Service IIS de laboratoire opérationnel.</p>
</body>
</html>
'@ | Set-Content -Path "$root\index.html" -Encoding UTF8

Charge le module d’administration et crée un pool séparé :

Import-Module WebAdministration
New-WebAppPool -Name $poolName
Get-WebAppPoolState -Name $poolName

Accorde uniquement la lecture nécessaire au contenu :

& icacls.exe $root /grant \
  "IIS AppPool\${poolName}:(OI)(CI)RX"

Get-Acl $root | Format-List

Un service web n’a pas besoin d’un droit d’écriture sur son contenu statique pour fonctionner.

06Crée un site avec un binding explicite

New-Website \
  -Name $siteName \
  -PhysicalPath $root \
  -IPAddress $serverIp \
  -Port 8080 \
  -HostHeader 'intranet.corp.soria.test' \
  -ApplicationPool $poolName

Vérifie :

Get-Website -Name $siteName |
  Select-Object Name, Id, State, PhysicalPath

Get-WebBinding -Name $siteName |
  Select-Object protocol, bindingInformation

Get-WebAppPoolState -Name $poolName

Un binding associe ici le service à une adresse, un port et un nom HTTP. Il ne crée pas lui-même l’enregistrement DNS.

07Valide d’abord localement sans masquer DNS

Teste le serveur avec son adresse tout en envoyant le nom attendu dans l’en-tête Host :

Invoke-WebRequest \
  -Uri "http://$serverIp`:8080/" \
  -Headers @{ Host = 'intranet.corp.soria.test' } \
  -UseBasicParsing

Puis observe les éléments locaux :

Get-Service W3SVC,WAS
Get-Website -Name $siteName
Get-NetTCPConnection -LocalPort 8080 -State Listen \
  -ErrorAction SilentlyContinue

Avec IIS, l’écoute HTTP passe par HTTP.sys. Ne déduis donc pas l’état applicatif uniquement du PID propriétaire du socket : vérifie aussi le site, le pool, le service et une vraie requête HTTP.

08Relie le service au DNS du laboratoire

Sur le serveur DNS du laboratoire, commence par vérifier l’absence ou la valeur de l’enregistrement :

Resolve-DnsName intranet.corp.soria.test \
  -ErrorAction SilentlyContinue

Si le scénario utilise le rôle DNS Windows et qu’aucun enregistrement correct n’existe, crée-le sur le serveur DNS autorisé :

Add-DnsServerResourceRecordA \
  -ZoneName 'corp.soria.test' \
  -Name 'intranet' \
  -IPv4Address $serverIp

Depuis le client :

Resolve-DnsName intranet.corp.soria.test

Conserve la valeur renvoyée. Une résolution réussie vers une mauvaise adresse reste une panne.

09Ouvre seulement le flux nécessaire

Adapte le sous-réseau à ton plan VLSM validé :

$usersSubnet = '10.44.0.0/26'   # exemple à adapter

New-NetFirewallRule \
  -DisplayName 'SORIA-Lab-IIS-8080' \
  -Direction Inbound \
  -Action Allow \
  -Protocol TCP \
  -LocalPort 8080 \
  -RemoteAddress $usersSubnet \
  -Profile Domain,Private

Vérifie la règle :

Get-NetFirewallRule -DisplayName 'SORIA-Lab-IIS-8080' |
  Get-NetFirewallPortFilter

N’utilise pas « désactiver le pare-feu » comme méthode de diagnostic ou de mise en service.

10Fais la recette depuis le client attendu

Sur CLIENT-USERS :

Resolve-DnsName intranet.corp.soria.test

Test-NetConnection intranet.corp.soria.test \
  -Port 8080 -InformationLevel Detailed

$response = Invoke-WebRequest \
  -Uri 'http://intranet.corp.soria.test:8080/' \
  -UseBasicParsing

$response.StatusCode
$response.Content

Preuves minimales :

DNS -> adresse attendue
TCP 8080 -> joignable depuis le client autorisé
HTTP -> code de succès
contenu -> page attendue

Test négatif

Vérifie qu’un port non publié ne répond pas :

Test-NetConnection intranet.corp.soria.test -Port 8081

Si le laboratoire contient un poste situé hors du sous-réseau autorisé, teste aussi TCP 8080 depuis ce poste. La règle de pare-feu doit empêcher ce second accès.

Un test négatif sur 8081 prouve seulement l’absence de service sur ce port ; il ne remplace pas le test d’isolation depuis une zone non autorisée lorsque celle-ci existe.

11Lis les journaux comme preuve de service

Récupère l’identifiant IIS du site :

$siteId = (Get-Website -Name $siteName).Id
$logDir = "C:\inetpub\logs\LogFiles\W3SVC$siteId"

Get-ChildItem $logDir -Filter *.log \
  -ErrorAction SilentlyContinue |
  Sort-Object LastWriteTime -Descending |
  Select-Object -First 1

Puis lis les dernières lignes du fichier réellement produit :

$latestLog = Get-ChildItem $logDir -Filter *.log |
  Sort-Object LastWriteTime -Descending |
  Select-Object -First 1

Get-Content $latestLog.FullName -Tail 20

Corrèle avec les événements récents :

Get-WinEvent -FilterHashtable @{
  LogName   = 'System'
  StartTime = (Get-Date).AddHours(-1)
} | Where-Object ProviderName -Match 'WAS|W3SVC' |
  Select-Object TimeCreated, Id, LevelDisplayName,
                ProviderName, Message

Une ligne de journal prouve une requête observée ; elle ne prouve pas à elle seule que tous les utilisateurs attendus peuvent utiliser le service ni que la configuration survivra à toutes les pannes.

12Panne volontaire mono-cause

Après validation de l’état fonctionnel, l’évaluateur injecte une seule cause parmi :

A — enregistrement DNS pointant vers une mauvaise adresse
B — site IIS arrêté
C — HostHeader du binding incorrect
D — règle de pare-feu IIS désactivée ou limitée au mauvais sous-réseau
E — permission de lecture retirée au pool sur le répertoire du site

Symptôme remis :

« Le client autorisé ne peut plus utiliser intranet.corp.soria.test:8080. »

Méthode obligatoire :

1. collecter les faits ;
2. distinguer DNS, port, site, binding, permission et pare-feu ;
3. formuler plusieurs hypothèses ;
4. choisir un test discriminant ;
5. corriger uniquement la cause démontrée ;
6. refaire la recette positive et le test négatif ;
7. déclarer la limite de la preuve.

Outils utiles :

Resolve-DnsName intranet.corp.soria.test
Test-NetConnection intranet.corp.soria.test -Port 8080
Get-Website -Name 'SORIA-Intranet'
Get-WebBinding -Name 'SORIA-Intranet'
Get-WebAppPoolState -Name 'SORIA-IntranetPool'
Get-Service W3SVC,WAS
Get-NetFirewallRule -DisplayName 'SORIA-Lab-IIS-8080'
Get-Acl 'C:\SORIA-Labs\IIS\Intranet'
Get-WinEvent -LogName System -MaxEvents 50

13Prépare le retour arrière

Dans la VM de laboratoire :

Remove-NetFirewallRule \
  -DisplayName 'SORIA-Lab-IIS-8080' \
  -ErrorAction SilentlyContinue

Remove-Website -Name 'SORIA-Intranet' \
  -ErrorAction SilentlyContinue

Remove-WebAppPool -Name 'SORIA-IntranetPool' \
  -ErrorAction SilentlyContinue

Remove-Item 'C:\SORIA-Labs\IIS\Intranet' \
  -Recurse -Force -ErrorAction SilentlyContinue

Si ce TP a créé l’enregistrement DNS, retire exactement cet enregistrement sur le serveur DNS du laboratoire. Ne supprime jamais une zone complète pour annuler une entrée A.

Le retrait du rôle IIS n’est nécessaire que si la VM était dédiée au TP et que le plan de retour l’exige :

Uninstall-WindowsFeature -Name Web-Server -IncludeManagementTools -WhatIf

14Conserve les preuves BTS

L’entrée de dossier doit répondre au contrat :

EXIGENCE
Mettre à disposition un premier service web Windows aux utilisateurs autorisés.

CONTEXTE
SORIA Distribution — IIS interne de laboratoire, données et adresses synthétiques.

ACTION
Installation du rôle, site/pool dédiés, binding, DNS, permission et règle de flux bornée.

RÉSULTAT + VÉRIFICATION
Résolution correcte, TCP 8080 joignable depuis la zone autorisée, réponse HTTP attendue, journal IIS corrélé et test négatif conservé.

LIMITE
Le TP ne démontre ni haute disponibilité, ni exposition Internet, ni TLS de production, ni application PHP, ni résistance à une cyberattaque complète.

Livrables :

1. schéma client -> DNS -> IIS ;
2. fiche de changement ;
3. configuration utile du site et du binding ;
4. règle de pare-feu et portée ;
5. preuve DNS ;
6. preuve TCP ;
7. preuve HTTP ;
8. extrait de journal pertinent ;
9. test négatif ;
10. diagnostic de la panne imposée ;
11. rollback ;
12. limite de la conclusion.
Fil rouge SORIA Distribution

Un service n’est « disponible » que du point de vue de son utilisateur

Le but n’est pas de mémoriser l’assistant IIS. Tu dois relier rôle serveur, contenu, identité du site, DNS, flux réseau, permission, état IIS, journal et validation client dans une même chaîne de preuves.

✓Compétence réinvestissable

Tu sais maintenant mettre à disposition un premier service Windows de bout en bout sans confondre « rôle installé », « port ouvert » et « service réellement utilisable ». Cette méthode sera réinvestie dans la segmentation, les services exposés et les remédiations plus complexes.

0
Ta progression

Chargement de l’état… Se connecter pour synchroniser.