Internet Information Services (IIS)
Introducció a Internet Information Services (IIS)
Internet Information Services (IIS) és el servidor web desenvolupat per Microsoft que s'integra directament amb el sistema operatiu Windows Server. Es tracta d'un servei que permet publicar llocs web i aplicacions a Internet o a una xarxa interna, i que forma part de l'ecosistema tecnològic de Microsoft des de la seva primera versió l'any 1995.A diferència d'altres servidors web com Apache o Nginx que funcionen en múltiples sistemes operatius, IIS està dissenyat específicament per treballar en entorns Windows, aprofitant totes les característiques de seguretat, gestió i integració que ofereix aquest sistema operatiu. La versió actual més recent és IIS 10.0, que ve instal·lada amb Windows Server 2016, 2019, 2022 i també amb Windows 10/11 en les seves versions professionals.
La principal fortalesa d'IIS resideix en la seva integració nativa amb l'ecosistema Microsoft. Això significa que si la vostra organització ja treballa amb tecnologies Microsoft com Active Directory per gestionar usuaris, SQL Server per bases de dades, o desenvolupa aplicacions amb el framework .NET, IIS s'integrarà de manera natural i eficient amb tots aquests components sense necessitat de configuracions complexes.Un altre avantatge significatiu és la seva interfície gràfica d'administració (IIS Manager), que permet gestionar el servidor de manera visual i intuïtiva. Mentre que altres servidors web requereixen editar fitxers de configuració en text pla, IIS ofereix una consola on podem configurar pràcticament tots els aspectes del servidor amb clics del ratolí, encara que també permet gestió per línia de comandes si ho preferim.
La seguretat integrada és també un punt fort, ja que IIS hereta tots els mecanismes de seguretat de Windows, incloent l'autenticació integrada de Windows (Kerberos i NTLM), que permet que els usuaris accedeixin a recursos web utilitzant les mateixes credencials que fan servir per iniciar sessió al seu ordinador, sense haver d'introduir usuari i contrasenya cada vegada.
Components
IIS utilitza una arquitectura modular on cada funcionalitat està implementada com un mòdul independent. Aquesta modularitat permet instal·lar només els components necessaris, millorant així la seguretat i el rendiment del servidor. Els components principals inclouen el motor HTTP principal (http.sys), que s'executa en mode kernel per obtenir millor rendiment, els processos de treball (worker processes) que executen les aplicacions web, i els diferents mòduls que proporcionen funcionalitats específiques com autenticació, compressió o registre d'esdeveniments.
El gestor de processos d'IIS (anomenat WAS - Windows Process Activation Service) és el responsable de crear i gestionar els processos de treball que executen les aplicacions web. Aquest component permet configurar pools d'aplicacions, que són contenidors aïllats on s'executen una o més aplicacions web, proporcionant aïllament i estabilitat: si una aplicació falla, no afecta les altres.
Instal·lació
La instal·lació es pot fer per l'interfície gràfica o per comandes de powershell.
# Windows Server
Install-WindowsFeature -Name Web-Server -IncludeManagementTools
# Instal·lar característiques addicionals
Install-WindowsFeature -Name Web-Common-Http, Web-Static-Content, Web-Dir-Browsing, Web-Http-Errors, Web-Http-Redirect, Web-App-Dev, Web-Net-Ext45, Web-Asp-Net45, Web-ISAPI-Ext, Web-ISAPI-Filter, Web-Mgmt-Console
# Windows 10/11
Enable-WindowsOptionalFeature -Online -FeatureName IIS-WebServerRole, IIS-WebServer, IIS-CommonHttpFeatures, IIS-HttpErrors, IIS-HttpRedirect, IIS-ApplicationDevelopment, IIS-NetFxExtensibility45, IIS-HealthAndDiagnostics, IIS-HttpLogging, IIS-Security, IIS-RequestFiltering, IIS-Performance, IIS-WebServerManagementTools, IIS-IIS6ManagementCompatibility, IIS-Metabase
Estructura de de directoris
Un cop instal·lat IIS, el sistema crea una estructura de directoris estàndard que és important comprendre. El directori principal per defecte és C:\inetpub, que conté diverses subcarpetes amb funcions específiques.Dins d'inetpub trobem wwwroot, que és el directori arrel del lloc web per defecte
Quan IIS s'instal·la, crea automàticament un lloc web bàsic que apunta a aquesta carpeta, i si hi col·loquem un fitxer index.html o default.aspx, aquest serà accessible visitant http://localhost en el navegador del servidor.També hi ha la carpeta logs, on IIS emmagatzema els registres d'accés i errors de tots els llocs web. Aquests fitxers són crucials per fer auditoria, depuració i anàlisi de trànsit.
Els registres es guarden en format W3C per defecte, que és un estàndard de la indústria fàcilment processable per eines d'anàlisi.La carpeta temp s'utilitza per a fitxers temporals de compressió i altres operacions internes, mentre que custerr conté les pàgines d'error personalitzades per defecte que IIS mostra quan es produeixen errors (404, 500, etc.).És important entendre que aquests directoris per defecte són només convencions. Quan creem nous llocs web, podem apuntar-los a qualsevol ubicació del sistema de fitxers, encara que es recomana mantenir-los organitzats dins d'una estructura lògica, per exemple creant C:\websites\nom_projecte per cada projecte web diferent.
C:\inetpub\
├── wwwroot\ # Directori arrel per defecte
├── logs\ # Registres
│ └── LogFiles\
├── temp\ # Fitxers temporals
├── custerr\ # Pàgines d'error personalitzades
└── history\ # Historial de configuració
Configuració Bàsica d'IIS
Crear un lloc web
# Importar mòdul IIS
Import-Module WebAdministration
# Crear Application Pool
New-WebAppPool -Name "AppPoolExemple"
# Crear lloc web
New-Website -Name "ExempleWeb" `
-Port 80 `
-PhysicalPath "C:\inetpub\exemple" `
-ApplicationPool "AppPoolExemple" `
-HostHeader "www.exemple.cat"
# Configurar binding SSL
New-WebBinding -Name "ExempleWeb" `
-Protocol https `
-Port 443 `
-HostHeader "www.exemple.cat" `
-SslFlags 1
AC0375/03/04 — Miniactivitat
RA3 · CA3b, CA3c, CA3d, CA3e
Instal·la el rol IIS en un Windows Server i crea dos llocs web amb HostHeader diferents (per exemple www.empresa1.local i www.empresa2.local), cadascun amb el seu propi PhysicalPath. Comprova des d'un client (editant el fitxer hosts o amb Invoke-WebRequest -Headers @{Host="..."}) que cada nom respon amb el contingut correcte.
Mòduls IIS
Els mòduls poden ser Win32 DLLs (mòduls natius) o tipus .NET en un assembly (mòduls gestionats).
Instal·lació de Mòduls Addicionals
# URL Rewrite
Install-WindowsFeature -Name Web-Url-Auth
# Compressió dinàmica
Install-WindowsFeature -Name Web-Dyn-Compression
# Autenticació Windows
Install-WindowsFeature -Name Web-Windows-Auth
Autenticació i Autorització
IIS suporta diversos mètodes d'autenticació incloent Anonymous, Basic, Windows (Kerberos/NTLM), i Certificate Authentication.
Configuració d'Autenticació Windows
<!-- web.config -->
<configuration>
<system.webServer>
<security>
<authentication>
<windowsAuthentication enabled="true">
<providers>
<clear />
<add value="Negotiate" />
<add value="NTLM" />
</providers>
</windowsAuthentication>
<anonymousAuthentication enabled="false" />
</authentication>
<authorization>
<add accessType="Allow" users="DOMINI\Grup" />
<add accessType="Deny" users="*" />
</authorization>
</security>
</system.webServer>
</configuration>
Application Request Routing (ARR) - Proxy Invers
ARR és un mòdul d'IIS que permet implementar balanceig de càrrega i configuracions de proxy invers complexes.
Instal·lació
# Instal·lar Web Platform Installer
# Descarregar des de: https://www.iis.net/downloads/microsoft/web-platform-installer
# Instal·lar ARR i URL Rewrite via Web PI
# O descarregar manualment:
# - Application Request Routing
# - URL Rewrite Module
Configuració de Proxy Invers
<!-- web.config -->
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="ReverseProxyInboundRule1" stopProcessing="true">
<match url="(.*)" />
<action type="Rewrite" url="http://backend-server/{R:1}" />
</rule>
</rules>
<outboundRules>
<rule name="ReverseProxyOutboundRule1" preCondition="ResponseIsHtml">
<match filterByTags="A, Form, Img" pattern="^http://backend-server/(.*)" />
<action type="Rewrite" value="/{R:1}" />
</rule>
<preConditions>
<preCondition name="ResponseIsHtml">
<add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html" />
</preCondition>
</preConditions>
</outboundRules>
</rewrite>
<httpProtocol>
<customHeaders>
<add name="X-Forwarded-For" value="{REMOTE_ADDR}" />
<add name="X-Forwarded-Proto" value="https" />
</customHeaders>
</httpProtocol>
</system.webServer>
</configuration>
Configuració de Server Farm (Balanceig)
# Crear Server Farm
Add-WebConfigurationProperty -PSPath 'MACHINE/WEBROOT/APPHOST' `
-Filter "webFarms" `
-Name "." `
-Value @{name='MyServerFarm'}
# Afegir servidors
Add-WebConfigurationProperty -PSPath 'MACHINE/WEBROOT/APPHOST' `
-Filter "webFarms/webFarm[@name='MyServerFarm']" `
-Name "." `
-Value @{address='192.168.1.10'}
Add-WebConfigurationProperty -PSPath 'MACHINE/WEBROOT/APPHOST' `
-Filter "webFarms/webFarm[@name='MyServerFarm']" `
-Name "." `
-Value @{address='192.168.1.11'}
# Configurar algoritme de balanceig
Set-WebConfigurationProperty -PSPath 'MACHINE/WEBROOT/APPHOST' `
-Filter "webFarms/webFarm[@name='MyServerFarm']/applicationRequestRouting/loadBalancing" `
-Name "algorithm" `
-Value "WeightedRoundRobin"
URL Rewrite
Exemples de Regles URL Rewrite
<!-- Redirigir HTTP a HTTPS -->
<rule name="HTTP to HTTPS redirect" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{HTTPS}" pattern="off" ignoreCase="true" />
</conditions>
<action type="Redirect" url="https://{HTTP_HOST}/{R:1}"
redirectType="Permanent" />
</rule>
<!-- Redirigir www a no-www -->
<rule name="Remove WWW" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{HTTP_HOST}" pattern="^www\.(.+)$" />
</conditions>
<action type="Redirect" url="https://{C:1}/{R:0}" />
</rule>
<!-- URL amigables -->
<rule name="Rewrite Product URLs">
<match url="^product/([0-9]+)/([_0-9a-z-]+)" />
<action type="Rewrite" url="product.aspx?id={R:1}&name={R:2}" />
</rule>
Seguretat i Certificats SSL/TLS
Certificats amb Let's Encrypt
Let's Encrypt és una Autoritat de Certificació que facilita l'obtenció i instal·lació de certificats TLS/SSL gratuïts.
# Descarregar Win-ACME
# https://github.com/win-acme/win-acme/releases
# Executar configuració interactiva
wacs.exe --interactive
# O via línia de comandes
wacs.exe --target iis --siteid 1 --emailaddress admin@exemple.cat --accepttos --usedefaulttaskuser
Configuració SSL/TLS Segura
# Configurar protocols TLS
New-Item 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server' -Force
New-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server' `
-Name Enabled -Value 1 -PropertyType 'DWord'
New-Item 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.3\Server' -Force
New-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.3\Server' `
-Name Enabled -Value 1 -PropertyType 'DWord'
# Deshabilitar protocols antics
@('SSL 2.0', 'SSL 3.0', 'TLS 1.0', 'TLS 1.1') | ForEach-Object {
New-Item "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\$_\Server" -Force
New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\$_\Server" `
-Name Enabled -Value 0 -PropertyType 'DWord'
}
Hardening de Seguretat
Headers de Seguretat
<configuration>
<system.webServer>
<httpProtocol>
<customHeaders>
<remove name="X-Powered-By" />
<remove name="Server" />
<add name="X-Frame-Options" value="SAMEORIGIN" />
<add name="X-Content-Type-Options" value="nosniff" />
<add name="X-XSS-Protection" value="1; mode=block" />
<add name="Referrer-Policy" value="strict-origin-when-cross-origin" />
<add name="Strict-Transport-Security" value="max-age=31536000; includeSubDomains" />
<add name="Content-Security-Policy" value="default-src 'self'" />
<add name="Permissions-Policy" value="geolocation=(), microphone=(), camera=()" />
</customHeaders>
</httpProtocol>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="10485760" />
<verbs>
<add verb="GET" allowed="true" />
<add verb="POST" allowed="true" />
<add verb="HEAD" allowed="true" />
<add verb="OPTIONS" allowed="false" />
<add verb="PUT" allowed="false" />
<add verb="DELETE" allowed="false" />
<add verb="TRACE" allowed="false" />
</verbs>
<fileExtensions>
<add fileExtension=".config" allowed="false" />
<add fileExtension=".ini" allowed="false" />
<add fileExtension=".log" allowed="false" />
</fileExtensions>
</requestFiltering>
</security>
</system.webServer>
</configuration>
Monitoratge, rendiment i optimització
Configuració de Logs
# Configurar logs IIS
Set-WebConfigurationProperty -PSPath 'MACHINE/WEBROOT/APPHOST' `
-Filter "system.applicationHost/sites/siteDefaults/logFile" `
-Name "logFormat" -Value "W3C"
Set-WebConfigurationProperty -PSPath 'MACHINE/WEBROOT/APPHOST' `
-Filter "system.applicationHost/sites/siteDefaults/logFile" `
-Name "directory" -Value "C:\inetpub\logs\LogFiles"
# Camps de log personalitzats
Set-WebConfigurationProperty -PSPath 'MACHINE/WEBROOT/APPHOST' `
-Filter "system.applicationHost/sites/siteDefaults/logFile" `
-Name "logExtFileFlags" `
-Value "Date,Time,ClientIP,UserName,ServerIP,Method,UriStem,UriQuery,HttpStatus,Win32Status,TimeTaken,ServerPort,UserAgent,Referer,Host"
Performance Counters
# Monitors de rendiment
$counters = @(
"\Web Service(*)\Current Connections",
"\Web Service(*)\Bytes Total/sec",
"\Web Service(*)\Total Method Requests/sec",
"\ASP.NET\Requests Current",
"\ASP.NET Applications(*)\Requests/Sec"
)
Get-Counter -Counter $counters -Continuous -SampleInterval 5
Optimització del Rendiment
<configuration>
<system.applicationHost>
<applicationPools>
<add name="OptimizedPool">
<processModel
identityType="ApplicationPoolIdentity"
idleTimeout="00:00:00"
maxProcesses="0" />
<recycling>
<periodicRestart time="00:00:00" />
</recycling>
<failure
rapidFailProtection="true"
rapidFailProtectionInterval="00:05:00"
rapidFailProtectionMaxCrashes="5" />
</add>
</applicationPools>
</system.applicationHost>
</configuration>