Administrar #WSUS por linea de comandos con #PowerShell


Aunque no acostumbro publicar artículos muy técnicos en el blog, voy hacer una excepción con este post, debido a la poca información que encontré sobre el tema del asunto en idioma español y además por la gran utilidad que puede ser el WSUS y Windows PowerShell para administrar parches de seguridad de Microsoft y optimizar tareas en las organizaciones.

ProcesoMicrosoftUpdates

Figura de pág. 7 – Microsoft Security Update Guide, Second Edition.

Introducción: La gestión de parches de seguridad es un proceso necesario en todas las plataformas; todos los proveedores principales de software que estén comprometidos con la seguridad lanzarán parches de seguridad en respuesta a las nuevas vulnerabilidades identificadas. No hay ningún sistema operativo o aplicación de uso generalizado que sea inmune a los atacantes que dedican su tiempo a intentar localizar vulnerabilidades que aprovechar. De lo anterior, radica la importancia de implementar controles (ej. de la ISO 27002) y herramientas para minimizar el riesgo informático en las organizaciones; el WSUS es una herramienta que permite apoyar este proceso de gestión de parches.

ProcesoAdministracionParchesMicrosoft

Figura de slide 11 – Presentación Microsoft Security & Patch Management Solutions And Strategy

Para empezar una breve definición de los conceptos:

WSUS: Acrónimo de Windows Server Update Services, Es una solución de software o servicio que ofrece las actualizaciones disponibles en el servicio de Microsoft Update, por medio de una consola grafica de administración que permite la Gestión de Actualizaciones de todos los productos de Microsoft en entornos corporativos.

PowerShell: Es una consola de línea de comandos (CLI) que permite la escritura y ejecución de scripts o programas pequeños para que los administradores de sistemas puedan automatizar tareas o realizarla de forma mas controlada.

Ambas herramientas son solo para sistemas operativos Windows.

Escenario: Un equipo cliente con sistema operativo Windows 7 y un Servidor con Windows Server 2008 R2 con el rol del WSUS instalado y configurado.

Modelo Conceptual de equipos de consumo VS equipos corporativos con WSUS y PoweShell.
Modelo Conceptual de equipos de consumo VS equipos corporativos con WSUS y PoweShell.

Para más información sobre el WSUS pueden ver el siguiente video de la Ing. Milena Sánchez, Consultora Senior de Seguridad de la Información o ver la guía paso a paso de Microsoft para empezar a trabajar con Windows Server Update Services.

WSUS – Introducción

Ahora sí al grano. 🙂

Iniciamos PowerShell con permisos de administrador . (Inicio>Buscar>PowerShell>Clic derecho>Ejecutar como administrador…)

PowerShell

Consola de PowerShell

Ejecutamos el siguiente comando para cambiar la directiva de ejecución y poder probar localmente los scripts o cmdlets para el administrar el WSUS. Posteriormente hay que volverla a cambiar ya que podrían exponerse a riesgos de seguridad.

     Set-ExecutionPolicy  RemoteSigned

[S] Sí  [N] No  [U] Suspender  [?] Ayuda (el valor predeterminado es “S”): S

Si queremos permitir la ejecución de todos aunque no estén en local:

     Set-ExecutionPolicy  Unrestricted

[S] Sí  [N] No  [U] Suspender  [?] Ayuda (el valor predeterminado es “S”): S

Y si finalmente queremos dejar como estaba en un principio (o para no permitir la ejecución de nada que este firmado)

Set-ExecutionPolicy  AllSigned

[S] Sí  [N] No  [U] Suspender  [?] Ayuda (el valor predeterminado es “S”): s

Si estamos interesados en conocer como firmar nuestros scripts consultar:

Get-Help About_Signing

#Conectarse con el servidor WSUS

[void][reflection.assembly]::LoadWithPartialName(“Microsoft.UpdateServices.Administration”)

$wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::getUpdateServer(‘ServerWSUS’,$False)

$wsus

Luego de la conexión podemos probar las tareas comunes del WSUS por consola PowerShell.

#Buscar equipos en el WSUS

SearchComputerTargets()

$wsus.SearchComputerTargets(“Equipo”)

#Obtener los grupos de un equipo

$Client = $wsus.SearchComputerTargets(“Equipo”)

$client[0].GetComputerTargetGroups()

#Crear un nuevo grupo

$wsus.CreateComputerTargetGroup(“PruebaGrupo”)

#Buscar un grupo y crear uno hijo

$group = $wsus.GetComputerTargetGroups() | Where {$_.Name –eq “PruebaGrupo”}

#Crear un subgrupo

$wsus.CreateComputerTargetGroup(“Subgrupo”,$group)

#Listar grupos del WSUS

$wsus.GetComputerTargetGroups()

#Eliminar un grupo del WSUS

#Se busca el grupo

$group = $wsus.GetComputerTargetGroups() | Where {$_.Name –eq “PruebaGrupo”}

#verificar el valor de la variable (nombre del grupo) que se va borrar

$group

#Borrar el grupo

$group.Delete()

#Agregando equipo a un grupo

Metodo: AddComputerTarget()

$Client = $wsus.SearchComputerTargets(“PC1”)

$group = $wsus.GetComputerTargetGroups() | Where {$_.Name –eq “GrupoMover”}

$group.AddComputerTarget($client[0])

$client[0].GetComputerTargetGroups()

#Removiendo equipo de un grupo

$Client = $wsus.SearchComputerTargets(“PC1”)

$group = $wsus.GetComputerTargetGroups() | Where {$_.Name –eq “PruebaGrupo”}

$group.RemoveComputerTarget($client[0])

————————

Jugando con Scripts o CMDLets  de PowerShell…

Pero una de las ventajas que tiene Windows PowerShell, es que permite realizar tareas que no se pueden hacer por la interfaz grafica del WSUS o incluso por la base de datos interna del WSUS (SUSDB), por ejemplo, sí tienes el siguiente escenario.

Supongamos el siguiente caso: Microsoft ha publicado los boletines de seguridad como es de constumbre, el segundo Martes de cada mes, luego de estar en el Webcast que realiza para explicar cada boletín y evaluar el riesgo, se evidencia que hay un parche (KB) que puede causar fallas en una aplicación corporativa, por lo tanto, se deben identificar los equipos en el WSUS y moverlos a un grupo aparte, para no enviarles este parche por que puede afectar el funcionamiento de la aplicación y hacer pruebas detenida y controladamente; cabe aclarar que todos los equipos que se requieren mover (ej. más de 500) están ubicados en diferentes grupos del WSUS.

La forma normal, seria buscar cada equipo y cambiarlos de grupo uno por uno, pero con PowerShell podemos crear o modificar un script (cmdlet) para que haga esta tarea más eficientemente.

Un Script o cmdlet en Windows PowerShell conectado a un servidor WSUS por el puerto 80, para resolver el caso anterior, podría ser así:

#Script para agregar o mover equipos a un grupo del WSUS (sin SSL), a partir de un listado de equipos en un archivo de texto.

#El script necesita Permisos de administrador y tener instalada la consola del WSUS en la maquina local donde se ejecuta el script.

#Inicializar variables

$wsusGroup = [string] “GrupoparaMoverLosEquipos”

$date = get-date

$date = [string] $date.day + $date.month + $date.year + $date.hour + $date.minute

$succeslog = [string] “.\logs\” + $date + “_success.log”

$errorlog = [string] “.\logs\” + $date + “_errors.log”

$WindowsUpdateServer= [string] “NombreServerWSUS”

#Inicializar Objetos:

#Requiere la consola del WSUS instalada con las herramientas administrativas.

[void][reflection.assembly]::LoadWithPartialName(“Microsoft.UpdateServices.Administration”)

if (!$wsus) {

$wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer($WindowsUpdateServer,$False)

}

$serverList = Get-Content “.\listadoequipos.txt”

$updateGroups = $Wsus.GetComputerTargetGroups()

$updateGroup = $UpdateGroups | Where-Object{$_.Name -eq $wsusGroup}

$computerScope = new-object Microsoft.UpdateServices.Administration.ComputerTargetScope

$computerScope.IncludedInstallationStates = [Microsoft.UpdateServices.Administration.UpdateInstallationStates]::All

$computers = $wsus.GetComputerTargets($computerScope)

$wsusServers = @()

$WsusServersShortNames = @()

#Crear arrays (estructura de datos):

# $wsusServer = Array de los objetos (equipos) del WSUS.

# $wsusServerShortName = Cadena de Arrays, con un servidor RDN por línea

Write-Host “Recolectando lista de los equipos desde el WSUS”

$computers | foreach-object {

$wsusServer = $_.FullDomainName

$wsusServerShortName = $WsusServer.split(‘.’)[0]

$wsusServers += $WsusServer

$wsusServersShortNames += $wsusServerShortName

} #Fin del ciclo For de los equipos

#Ciclo FOR para agregar o mover los equipos al grupo en el WSUS

ForEach ($server in $serverList) {

#Chequear si el nombre Netbios de los equipos esta en el WSUS, si esta se mueve sino genera el error y lo escribe en el LOG.

$wsusComputer = $wsusServersShortNames | Where-Object {$_ -eq $server.Trim()}

If ($wsusComputer) {

$searchStr = [string] $server.Trim() + “\.”

$wsusComputer1 = $wsusServers | where-object {$_ -match $searchStr }

If ($wsusComputer1.getType().Name -match “string”) {

Write-Host “$wsusComputer1 se agregara al grupo $($updateGroup.name) ”

$computer = $wsus.GetComputerTargetByName($wsusComputer1)

$updateGroup.AddComputerTarget($computer)

out-file -append -inputobject “$Server agregado al grupo $($updategroup.name) ” -filepath $succeslog

}

Else {

write-host “count $($wsusComputer1.count)”

Out-File -append -inputobject “$Server el nombre es ambiguo, por favor verifique en el WSUS y agregue el equipo manualmente” -filepath $errorlog

}

} #Fin del si $wsusComputer

Else {

Write-Host “$Server no encontrado en el WSUS”

out-file -append -inputobject “$Server no encontrado en el WSUS” -filepath $errorlog

}

} #End ForEach $server

———————————————-

NOTA: Para probar el código del cmdlet (MoverEquiposWSUS.PS1) anterior, solo se debe cambiar el valor “GrupoparaMoverLosEquipos” de la variable “wsusGroup” por el nombre del grupo correcto y el valor “NombreServerWSUS” de la variable “$WindowsUpdateServer” por el nombre del servidor WSUS de su organización o ambiente de pruebas. Adicionalmente, en el archivo “listadoequipos.txt” se deben agregar los nombres de los equipos que se van a mover separándolos con un salto de línea.

Finalmente, espero puedan aprovechar lo aprendido en este articulo, para el mejoramiento continuo de los procesos y procedimientos de una organización.

Referencias:

By @JOGAcrack.

Anuncios