Auditando Plantillas de Configuración segun Línea base de Seguridad


En la auditoria a dispositivos de redes, existen varias herramientas de software propietarias (ej. Nipper Studio, Cisco Prime) y open sources (ej. Cisco Auditing Tool, Yersenia…) que apoyan este procedimiento, sin embargo, dependiendo del alcance u objetivo de la auditoria, muchas de estas herramientas se quedan cortas o quizás ya no tienen soporte y actualizaciones (ej. Nipper) o simplemente no se adaptan a la necesidad especifica o al tipo de auditoria que se va a realizar (ej. de caja blanca o gris), por ejemplo, verificar que se esté cumpliendo la línea base definida e implementada por el área pertinente (ej. OpSec) en la organización.

Comando en Nipper

Ejemplo de comando en Nipper con varios archivos de configuración

Es en estos casos en donde se hace necesario crear scripts o herramientas de software propias para realizar ciertas validaciones, por ejemplo, hacer búsquedas de comandos que están definidos en la línea base y en caso de que lo encuentre indicar si cumple o no con lo establecido en dicho documento.

Conceptualización:

¿Qué es una línea base? En el contexto de seguridad informática, una linea base tiene que ver con un conjunto de parametros o configuraciones definidas para los activos de T.I. con el fin de estar más seguros o con un nivel de riesgo minimo. Por lo general, se documentan para ser publicados en la base de conocimiento de T.I. con los respectivos permisos solo para el personal de seguridad, operación o quien lo consideren por demanda (ej. Auditores, Jefes…). Las guias/herramientas de Hardening publicadas por los Fabricantes o entidades como el Center for Internet Security – CIS, son un buen inicio para crear las lineas base.

¿Qué es Windows Powershell – PS? Es un Framework con interface de linea de comandos (CLI) basado en .NET, con el fin de automatizar tareas y administrar configuraciones en entornos Microsoft, por medio de lenguaje scripting.

¿Y por qué no Python u otro lenguaje scripting? Para este caso, porque PowerShell esta embebido por defecto en sistemas operativos Windows Vista en Adelante y posee una gran cantidad de funcionalidades o CMDLETs que le permiten interactuar de forma directa con el sistema operativo Windows; Además porque en muchas ocasiones no se tiene facilidad de instalar el entorno o interprete para Python, lo que es más conveniente usar comandos ninja o scripts con un lenguaje nativo por defecto.

En este post, se comparte un sencillo script en Powershell para la finalidad de auditar los comandos definidos en una línea base de dispositivos de redes y comunicaciones, básicamente funciona de la siguiente manera:

  • El script solicita ingresar como parámetros el nombre de la categoría, el comando o string a buscar, la ruta en donde están almacenadas las plantillas o archivos de configuración de la muestra seleccionada y finalmente la ruta del archivo de salida.
parámetros Script

Información que solicita el Script

NOTA: Este código puede ser modificado para que la variable tenga un valor en específico o tome la información desde un array.

  • Finalmente, este recorre cada una de las plantillas en búsqueda del comando y en caso de que lo encuentre indica que cumple sino indica que no cumple; este resultado se almacena en un archivo CSV el cual puedes manipular para crear una tabla dinámica y mostrar los resultados en forma percentil o más resumida.
Reporte CSV

Reporte en formato CSV

 El código fuente del script lo publique en CodePlex y se puede clonar con GIT (git clone https://git01.codeplex.com/auditsecbaselinenet Folder) o se puede copiar y pegar a un archivo PS1 para ser ejecutado.

Codigo Fuente Script en Power Shell

Código Fuente Script en Power Shell

NOTA: Pueden aprender a usar GIT con CodePlex en este enlace> http://bit.ly/1VPKxj5

  • Luego de validar los cumplimientos y otras actividades que se incluyen en una auditoria de seguridad, se puede obtener una tabla como la siguiente para anexar en el informe final.
Tabla de Cumplimiento

Tabla de Cumplimiento

Cabe aclarar que este script se puede adaptar para otras situaciones en las que sea necesario realizar búsquedas masivas sobre un conjunto de archivos.

By @JOGAcrack

Anuncios

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.