Cómo usar PowerShell para configurar IIS en varios servidores

dotshock/Shutterstock.com

PowerShell es una excelente herramienta para administrar todo lo relacionado con Windows. Aún así, también puede hacer un poco de trabajo por usted al configurar Internet Information Services (IIS), y mejora aún más cuando puede usarlo para configurar servidores IIS en masa.

A medida que adquiere más y más experiencia con el trabajo de administración/ingeniería de sistemas, tiende a preguntarse: «¿Puede PowerShell hacer esto más fácil para mí?» Casi siempre comienza un viaje de aprendizaje que solo lo ayuda a comprender PowerShell aún más. Pensando en la tarea de configurar varios componentes de IIS para múltiples servidores, los pasos se pueden dividir en pasos lógicos, que son básicamente los pasos que tomaría en la GUI en un solo servidor de Windows. Trabajemos con una breve lista de pasos que pueden ayudarlo a comenzar y que se pueden agregar para configuraciones adicionales, si lo desea:

  • Importar un certificado PFX desde un recurso compartido remoto
  • Cree un nuevo enlace para https en IIS
  • Adjunte el certificado importado al enlace https
  • Marque la casilla ‘Requerir SSL’ en el Administrador de IIS
  • Agregue un registro personalizado para obtener el valor X-Forwarded-For de un balanceador de carga

La mayoría de estos pasos son clics sencillos en la GUI, entonces, ¿por qué no se puede hacer todo esto con un puñado de comandos de PowerShell? Mejor aún, ¿ejecutar contra una lista de múltiples servidores remotos para hacer la misma tarea? Una gran parte de los pasos que se demostrarán en esta publicación serán fragmentos de código que puede colocar en su estructura típica de PowerShell. Es posible que tenga un registro personalizado y cosas que son exclusivas de cómo depura los scripts de PowerShell. De lo contrario, puede improvisar fácilmente estos para obtener un cambio rápido de lo que necesita completar para sus configuraciones de IIS.

Algunas cosas para configurar al frente

Se necesitan algunas variables para empezar. Una lista de trabajo de servidores para configurar y un recurso compartido de red accesible donde se encuentra el archivo de certificado PFX:

$Servers = Get-Content -Path C:WebServers.txt
$CertFolder="FileServer01SharedCerts"

Esto tomará la lista de servidores del archivo TXT y establecerá una ubicación donde se encontrará el certificado para importar.

Si ejecutará esto en varios servidores, eventualmente querrá asegurarse de que está trabajando en servidores que están en línea. El siguiente uso del cmdlet Test-Connection para hacer ping a cada servidor al menos una vez para asegurarse de que esté activo antes de continuar. Si el servidor está en línea, la lógica copiará la carpeta del recurso compartido de red que contiene el certificado a la carpeta C:WindowsTemp del servidor remoto. De esta forma, el cmdlet Invoke-Command para importar el certificado no tendrá problemas de permisos al copiar desde una ubicación de red:

foreach ($Server in $Servers) {
     if (Test-Connection -ComputerName $Server -Quiet -Count 1) {
          Copy-Item -Path $CertFolder `
          -Destination $ServerC$WindowsTempCertAssets `
          -Recurse -Force
          Write-Host "Assets successfully copied!"
     }
     else {
          Write-Host "$Server appears to be offline!"
     }
...code demonstrated below...
}

Tenga en cuenta que es bueno enviar comentarios a la consola con las líneas Write-Host mientras ejecuta esto. También sería bueno agregar a un registro existente si envuelve su secuencia de comandos con uno. Ahora sabemos qué servidores están en línea y tienen los activos copiados localmente. Ahora estamos listos para seguir adelante.

Importe el certificado y cree un nuevo enlace

Esta acción se completa con el cmdlet Invoke-Command que ejecutará esta acción localmente en cada servidor. Según el nivel de seguridad que desee incorporar, puede hacer algunas cosas con la contraseña que se necesita para importar el certificado PFX. Puede almacenarlo sobre la marcha utilizando Get-Credential o simplemente puede ingresar la contraseña en texto sin formato en línea con el comando utilizado para importar. Sugeriría asegurar la contraseña utilizando Get-Credential como mínimo, aunque hay muchas otras formas de inyectar la contraseña de forma segura aquí. Para recolectar la contraseña, puede usar:

$MyPwd = Get-Credential -UserName 'Enter password below' -Message 'Enter password below'

Solicitar contraseña después del cmdlet Get-Credential

Esto almacenará la contraseña del certificado sin tener que tener la contraseña en texto sin formato dentro de su secuencia de comandos. Pasaremos esta variable local al comando remoto utilizando el componente $Using:. Debido a que Invoke-Command y el bloque de script que lo acompaña se ejecutan en un ámbito diferente (local a la máquina remota), no sabe nada de las variables locales que se definen fuera del bloque de script. Esto le permite pasar cualquier variable local a la sesión remota y usarla en consecuencia.

Importaremos el certificado al almacén de certificados personales (Mi) de la cuenta de la máquina.

El siguiente código recorre estos pasos:

  1. El inicio del proceso en el servidor remoto.
  2. La acción de importación utilizando la contraseña proporcionada en el paso Obtener credencial
  3. Cree un enlace https en el puerto 443
  4. Agregar el certificado importado al enlace https

*Esto todavía cae dentro del bucle foreach definido anteriormente:


Invoke-Command -ComputerName $Server -ScriptBlock {
     $SiteName = "My Web Site"
     Import-PfxCertificate -Password $Using:MyPwd.Password `
          -CertStoreLocation Cert:LocalMachineMy `
          -FilePath C:WindowsTempCertAssetsMyCert.pfx
     Import-Module WebAdministration
     New-WebBinding -Name $SiteName -IP "*" -Port 443 -Protocol https
     $SSLCert = Get-ChildItem -Path Cert:LocalMachineMy `
          | Where-Object {$_.Subject.Contains("CertFriendlyName")}
     $Binding = Get-WebBinding -Name $SiteName -Protocol "https"
     $Binding.AddSslCertificate($SSLCert.GetCertHashString(), "My")
     Write-Host "Setup successful on: $env:COMPUTERNAME"
}

Además de cualquier salida que fuerce a la consola como parte de su propia personalización, también habrá alguna salida para la acción de importación del certificado una vez que se haya importado correctamente.

También es bueno limpiar sus problemas, así que agregue algunas líneas para eliminar la carpeta con el archivo .pfx que se copió en la máquina. Esto residirá dentro del ciclo foreach, preferiblemente hacia el final:

Remove-Item -Path "$ServerC$WindowstempCertAssets" -Recurse -Force
Write-Host "Cleanup on $Server completed!"

Requerir SSL en su sitio

Este siguiente bit de comandos se usará sin importar cómo implemente su implementación. Si desea que esto sea necesario de inmediato, simplemente introdúzcalo con el resto del código anterior y listo. Es posible que tenga una implementación por etapas en la que puede hacer que desee habilitar esto en servidores específicos. De cualquier manera que elabores esto, la esencia del trabajo serán estas pocas líneas:

Import-Module WebAdministration
Set-WebConfiguration -Location "My Web Site" `
     -Filter 'system.webserver/security/access' -Value "Ssl"

Note que el -Ubicación El parámetro es el nombre del sitio de IIS que desea requerir SSL. Esto ahora forzará todas las conexiones seguras a su nuevo enlace con su certificado asociado. Esta sería la interfaz gráfica de usuario equivalente a hacer clic en el icono Configuración de SSL en el Administrador de IIS para su sitio en particular y verificar la Requerir SSL caja:

Configuración de IIS para requerir SSL

Personalizar las opciones de registro de IIS

Si administra una flota de servidores IIS que se encuentran detrás de un balanceador de carga, puede aprovechar la información que el balanceador de carga recopila de las conexiones entrantes. Suponiendo que su balanceador de carga particular esté configurado para capturar el X-reenviado-para valor, puede obtener la dirección IP entrante de todas las conexiones entrantes a sus servidores IIS y verlas dentro de los registros conocidos de IIS. Esto es especialmente útil cuando se trata de solucionar problemas en los que necesita rastrear conexiones de recursos específicos que pueden haber tenido errores en un servidor en particular.

En resumen, IIS no recopila el valor X-Forwarded-For. Debe configurarse como un valor personalizado para que IIS lo tome y lo registre. También hay una manera de configurar esto en la GUI, pero puede agregar este comando en nuestro script de aprovisionamiento actual para tener esto en su lugar desde el principio:

Add-WebConfigurationProperty -PSPath 'MACHINE/WEBROOT/APPHOST' `
     -Filter "system.applicationHost/sites/siteDefaults/logFile/customFields" `
     -Name "." `
     -Value @{logFieldName="X-Forwarded-For";sourceName="X-Forwarded-For";sourceType="RequestHeader"}

Una vez completado, puede verificar que este campo personalizado se agregó a IIS en el nivel de servidor abriendo el Administrador de IIS y haciendo clic en MiServidor > Registro > Archivo de registro: Seleccionar campos…

Configuración de registro de IIS

Una vez que esto esté en su lugar, podrá ver las direcciones IP para las conexiones entrantes a sus servidores IIS en los registros tradicionales de IIS.

Estos son solo algunos ejemplos de las configuraciones que puede configurar en sus servidores IIS. Cuantos más servidores administre y esté configurado de manera similar, más clics ahorrará, lo que siempre es bueno. Sugiero probar los diferentes comandos para la configuración deseada en un servidor. Una vez que tenga el proceso para ese único servidor, puede repetirse en tantos como necesite con la estructura que se proporciona aquí en esta publicación. Esto debería ser más que suficiente para comenzar a ahorrar tiempo y tener una implementación de IIS más estandarizada en su entorno.

Deja un comentario

En esta web usamos cookies para personalizar tu experiencia de usuario.    Política de cookies
Privacidad