Cómo usar PowerShell para configurar IIS en varios servidores

PowerShell es una gran herramienta para administrar todo lo relacionado con Windows. Sin embargo, 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 de forma masiva.

A medida que adquiere más y más experiencia en diseño/administración de sistemas, tiende a preguntarse: «¿Puede PowerShell hacer esto más fácil para mí?» Casi siempre comienza con un tutorial que solo lo ayuda a comprender mejor PowerShell. Teniendo en cuenta la tarea de configurar varios componentes de IIS para varios servidores, los pasos se pueden dividir en pasos lógicos, que son básicamente los pasos que debe completar en una GUI en un único servidor de Windows. Analicemos una breve lista de pasos para comenzar y que puede agregar opcionalmente para configuraciones adicionales:

La mayoría de estos pasos son simples clics en la GUI, entonces, ¿por qué no se pudo haber hecho todo con unos pocos comandos de PowerShell? O mejor aún, ejecutar una lista de múltiples servidores remotos para realizar la misma tarea. La mayoría de los pasos que se demostrarán en esta publicación son fragmentos de código que puede insertar en su estructura típica de PowerShell. Puede tener un registro personalizado y elementos únicos para depurar scripts de PowerShell. De lo contrario, puede vincularlos fácilmente para hacer rápidamente lo que necesita hacer para sus configuraciones de IIS.

Algunas cosas para configurar de antemano

Para comenzar, necesita algunas variables. Una lista de trabajo de servidores para configurar y una carpeta de red disponible donde se encuentra el archivo del certificado PFX:

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

$CertFolder = '\FileServer01SharedCerts'

Esto tomará la lista de servidores del archivo .txt y establecerá la ubicación donde se encontrará el certificado de importación.

Si va a ejecutar esto en varios servidores, eventualmente querrá asegurarse de que está ejecutando en servidores que están en línea. El próximo uso del cmdlet Test-Connection es 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 en el 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 (Conexión de prueba -Nombre de la computadora $Servidor -Silencio -Cuenta 1) {

Copiar elemento -Path $CertFolder`

-Destino \\$Servidor\C$\Windows\Temp\CertAssets `

-Recurso -Fuerza

Write-Host «¡Activos copiados con éxito!»

}

más {

Write-Host «¡$Server parece estar fuera de línea!»

}

… código demostrado a continuación …

}

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

Importe el certificado y cree un nuevo enlace

Esta acción se realiza mediante el cmdlet Invoke-Command, que realiza esta acción localmente en cada servidor. Dependiendo del nivel de seguridad que desee implementar, puede hacer algunas cosas con la contraseña que se requiere para importar el certificado PFX. Puede guardarlo sobre la marcha usando Get-Credential, o simplemente puede ingresar la contraseña en texto sin formato incrustado en el comando utilizado para importar. Sugeriría al menos asegurar la contraseña con Get-Credential, aunque hay muchas otras formas de ingresar una contraseña de manera segura aquí. Para recopilar la contraseña puede utilizar:

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

Esto almacenará la contraseña del certificado sin tener que tener la contraseña en texto sin formato dentro de su script. Pasaremos esta variable local al comando remoto usando 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 reconoce ninguna variable local definida fuera del bloque de script. Esto le permite pasar cualquier variable local a la sesión remota y usarla apropiadamente.

Importaremos el certificado al almacén de certificados de la cuenta de mi computadora personal (My).

El siguiente código realiza estos pasos:

  1. Iniciar un proceso en un servidor remoto
  2. Importe la acción utilizando la contraseña proporcionada en el paso Obtener credencial
  3. Cree un enlace https en el puerto 443.
  4. Agregar un certificado importado a un ancla https

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

Invoke-Command -ComputerName $Servidor -ScriptBlock {

$NombreSitio = «Mi sitio web»

Import-PfxCertificate -Contraseña $usando:MyPwd.Password`

-CertStoreLocation Cert:\LocalMachine\My `

-Ruta de archivo C:\Windows\Temp\CertAssets\MyCert.pfx

Administración web del módulo de importación

Nuevo enlace web -Nombre $Nombre del sitio -IP «*» -Puerto 443 -Protocolo https

$SSLCert = Get-ChildItem -Path Cert:\LocalMachine\My `

| Where-Object {$_.Subject.Contains(«CertFriendlyName»)}

$Binding = Get-WebBinding -Nombre $Nombre del sitio -Protocolo «https»

$Binding.AddSslCertificate($SSLCert.GetCertHashString(), «Mi»)

Write-Host «Configuración exitosa en: $env:COMPUTERNAME»

}

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

También es bueno limpiar el desorden, así que agregue algunas líneas para eliminar la carpeta de archivos. pfx que se copió en la máquina. Esto estará dentro del ciclo foreach, preferiblemente cerca del final:

Remove-Item -Path "\\$Server\C$\Windows\temp\CertAssets"-Recurse -Force

Write-Host "Cleanup on $Server completed!"

Requerir SSL en su sitio

Este siguiente fragmento de código de comando se usará al implementar la implementación. Si desea que se requiera de inmediato, simplemente agréguelo al resto del código anterior y estará listo para comenzar. Es posible que tenga una implementación por etapas en la que desee habilitar esto en servidores específicos. En cualquier caso, tú lo creas, la esencia de la obra estará en estas pocas líneas:

Import-Module WebAdministration

Set-WebConfiguration -Ubicación «Mi sitio web»`

-Filter 'system.webserver/security/access' -Value "Ssl"

Tenga en cuenta que el parámetro -Location es el nombre del sitio de IIS que requiere SSL. Esto ahora forzará todas las conexiones seguras a su nuevo ancla con el certificado apropiado. En la GUI, esto equivaldría a hacer clic en el ícono «Configuración de SSL» en el Administrador de IIS para su sitio específico y marcar la casilla «Requerir SSL»:

Configuración de las opciones de registro de IIS

Si administra una flota de servidores IIS que están detrás de un balanceador de carga, puede aprovechar la información que recopila el balanceador de carga de las conexiones entrantes. Suponiendo que su balanceador de carga particular esté configurado para capturar el valor X-Forwarded-For, puede obtener las direcciones IP entrantes de todas las conexiones entrantes a sus servidores IIS y verlas en los registros conocidos de IIS. Esto es especialmente útil cuando se trata de solucionar problemas de seguimiento de conexión de ciertos recursos que pueden haber causado errores en un servidor en particular.

Por lo tanto, IIS no recopila el valor X-Forwarded-For. Debe configurarse como un valor personalizado para que IIS pueda capturarlo y registrarlo. También hay una manera de configurar esto en la GUI, pero puede agregar este comando a nuestro script de aprovisionamiento actual para tenerlo en su lugar desde el principio:

Add-WebConfigurationProperty -PSPath 'MACHINE/WEBROOT/APPHOST' `

-Filtrar «sistema.applicationHost/sites/siteDefaults/logFile/customFields»`

-Nombre «.»`

-Value @{logFieldName='X-Forwarded-For';sourceName='X-Forwarded-For';sourceType='RequestHeader'}

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

Una vez hecho esto, podrá ver las direcciones IP de 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 configure de la misma manera, más clics ahorrará, lo que siempre es bueno. Sugiero probar diferentes comandos para la configuración deseada en el mismo servidor. Una vez que tenga un proceso para ese servidor, puede repetirse en tantos servidores como desee con la estructura que se proporciona aquí en esta publicación.

Esto debería ser más que suficiente para empezar a ahorrar tiempo y tener una implementación de IIS más estandarizada en su entorno.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.