Con System Center Configuration Manager 2012, los clientes tienen la posibilidad de utilizar las funciones de Endpoint Protection para proporcionar servicios antimalware y seguridad a servidores y clientes. Sin embargo, para reducir los puntos de contacto y los errores del administrador, podemos utilizar la flexibilidad de System Center Orchestrator para aumentar y automatizar los procesos de seguridad estándar. En este post, voy a demostrar cómo crear un libro de ejecución para automatizar la activación de un malwarescan Endpoint Protection completo en respuesta a una alerta de malware detectado dentro de Configuration Manager.
En un escenario de operaciones normales, un administrador o especialista en seguridad recibiría una alerta por correo electrónico de Configuration Manager indicando una alerta de un cliente, y procedería a iniciar la consola de Configuration Manager, e iniciaría un análisis completo, como se muestra a continuación:
Esto, por supuesto, depende de que la(s) persona(s) asignada(s) controle(n) su correo electrónico, tenga(n) acceso a la consola y, en general, se preocupe(n) lo más mínimo, por no hablar de los ciclos de productividad perdidos. Y realmente, ¿no sería mejor automatizar todo el proceso y acabar con él alertando únicamente a alguien si algo falla?
Configuración del flujo de trabajo
La primera actividad que tenemos que hacer es trazar el flujo de trabajo (todo el código y los elementos relacionados se incluirán a continuación).
- El primer punto es determinar cómo identificar a los clientes que han tenido un evento de malware reciente. Para nuestra discusión, vamos a suponer que esto se ejecutará cada hora, y vamos a comprobar para ver lo que pasó en la última hora. La forma más sencilla es aprovechar la vista de la base de datos ConfigMgr llamada v_EP_LastMalware. Aquí está una consulta completa:
[sourcecode language="sql"]
SELECT [MachineID], [LastMessageTime], [DetectionTime], [ActionTime], [DetectionSource], [PendingActions], [CleaningAction],[ExecutionStatus], [ActionSuccess], [ErrorCode].
FROM [CM_XXX].[dbo].[vEP_LastMalware].
Donde DetectionTime > DATEADD(hora, -1, getutcdate())
[/código fuente]
También observará que la consulta utiliza getutcdate. Esto se debe a que los mensajes están marcados en tiempo UTC para ConfigMgr. Para nuestro beneficio, utilizaremos la siguiente consulta para devolver sólo el MachineID:
[sourcecode language="sql"]
SELECT [MachineID]
FROM [CM_CS1].[dbo].[vEP_LastMalware]
Where DetectionTime > DATEADD(hour, -1, getutcdate())
[/código fuente]
El MachineID devuelto es el ID del cliente ConfigMgr que usaremos para establecer la política.
- La siguiente actividad es asignar el MachineID a un nombre de ordenador. Puedes combinar las dos consultas, pero yo he optado por separarlas por motivos de registro y facilidad, ya que necesitaremos tanto el ID de la máquina como el nombre del ordenador. Aquí está la consulta para asignar el ID al nombre:
[sourcecode language=”sql”]
SELECT [Netbios_Name0]
FROM [CM_CS1].[dbo].[vSMS_R_System]
Where ItemKey = <em>InsertKeyHere.</em>
[/sourcecode]
- La tercera actividad consiste en hacer ping al nombre del ordenador y, en función de los resultados de ese ping, conectarse al ordenador para iniciar manualmente un análisis completo (utilizando MPCMDRUN.exe) o establecer una política de cliente.
- Para el MPCMDRUN, simplemente iniciaremos un proceso en el ordenador de destino. Para sistemas inalcanzables, nos conectaremos a WMI e invocaremos un método. He creado una aplicación de consola vb.net personalizada para hacer esto para mí también.
- Y luego haremos algunas notificaciones por correo electrónico, alertas SCOM, registro de archivos de texto, etc., en función de lo que necesitemos también.
Y ahora, System Center Orchestrator.
Una vez trazado el flujo de trabajo, he aquí los detalles:
- Consultar la base de datos en busca de registros EP: Aquí es donde comenzará el flujo de trabajo. Añada la actividad Consultar Base de Datos, y usando la siguiente consulta obtendrá las máquinas que tuvieron un evento reciente:
[sourcecode language="sql"]
SELECT [MachineID]
FROM [CM_CS1].[dbo].[vEP_LastMalware].
Donde DetectionTime > DATEADD(hora, -1, getutcdate())
[/código fuente]
Deberá configurar la actividad Consulta de base de datos con el nombre del servidor SQL de ConfigMgr, la base de datos y, opcionalmente, una cuenta de ejecución. Para mis propósitos, he añadido la cuenta de ejecución Orchestrator al grupo local ConfigMgr_DViewAccess en el servidor SQL.
- Añada otra actividad Query Database para convertir el ID de cliente ConfigMGR en un nombre de ordenador para futuros usos. Si lo hace, tendremos que utilizar los datos publicados de la primera consulta, como se indica a continuación:
[sourcecode language="sql"]
SELECT [Netbios_Name0]
FROM [CM_CS1].[dbo].[vSMS_R_System]
WHERE ItemKey =
[/sourcecode]
Después del '=', necesitaremos utilizar los datos publicados de la primera consulta. Utilice los datos publicados como se muestra a continuación:
Por último, configure el bucle en la actividad y coloque un retardo de 1 segundo entre los intentos. Esto servirá para iterar a través de todas las filas devueltas.
- A continuación, vamos a añadir el Get Computer/IP Status para determinar si el sistema es accesible, y si es así, entonces simplemente debemos ejecutar la utilidad de línea command disponible localmente llamado MPCMDRUN. Si no es así, utilizaremos nuestra aplicación personalizada para conectarnos al sitio ConfigMgr, y utilizar el método nativo WMI API para establecer la política.
Configure el campo Obtener Estado de Ordenador/IP con el campo de nombre de ordenador con datos publicados de la segunda Actividad de Base de Datos de Consulta - Línea completa como una cadena con campos separados por ':'
- Añade dos actividades para "Ejecutar Programa". Nombra una "Run MPCMDRUN", y la otra "Run SCCM_ClientOperation". Enlaza las actividades a "Get Computer/IP status", y en los enlaces, configura el enlace que conecta a MPCMDRUN con éxito, y el enlace a SCCM_ConsoleOperation con un fallo. Esto se utilizará para nuestra lógica de ramificación.
- Configure el "Ejecutar MPCMDRUN" de la siguiente manera"
Modo Ejecución del programa
Ordenador: Línea completa como cadena con campos separados por ':', de la segunda consulta a la base de datos.
Ruta del programa: C:Archivos de programa\Microsoft Security Client\Antimalware\MpCmdRun.exe
Parámetros del programa: -Scan 3
Ejecutar como: Utilice una cuenta dedicada si es necesario, para los privilegios administrativos.
- Configure la actividad Run SCCM_ConsoleOperation de la siguiente manera:
Modo Ejecución del programa
Ordenador: localhost (o donde se encuentre la aplicación)
Ruta del programa: C:\temp\SCCM_ClientOperations.exe
Parámetros:
/sitecode:SiteCode
/servidorsitio:SiteServerName
/resid: Línea completa como cadena con campos separados por ':' (De la primera consulta a la base de datos)
Ejecutar como: Utilice una cuenta que tenga privilegios administrativos para Configuration Manger.
Para terminar
Por supuesto, siéntase libre de añadir alertas de Operations Manager, notificaciones por correo electrónico, variables, etc., para refinar y proporcionar registro donde sea necesario. Sin embargo, esto debería proporcionarle un escenario de caso de uso simple para Orchestrator, y le llevará unos minutos desarrollarlo. Esto es sólo un ejemplo de una tarea, y se puede ampliar para incluir incluso las tareas de Active Directory, como obligar al usuario principal del equipo a cambiar su contraseña.
Código y otros asuntos
Todo el código es obra mía y soy el único responsable, sin garantía alguna.
Consulta SQL para encontrar eventos de malware:
[sourcecode language="sql"]
SELECT [MachineID]
,[HoraÚltimoMensaje]
,[DetectionTime]
,[ActionTime]
,[DetectionSource]
,[AccionesPendientes]
,[AcciónDeLimpieza]
,[ExecutionStatus]
,[ActionSuccess]
CódigoError]
FROM [CM_CS1].[dbo].[vEP_LastMalware]
WHERE DetectionTime > DATEADD(hour, -1, getutcdate())
[/códigofuente]
Consulta SQL para asignar el ID del recurso al nombre del ordenador:
[sourcecode language="sql"]
SELECT [Netbios_Name0]
FROM [CM_CS1].[dbo].[vSMS_R_System]
Where ItemKey =
[/sourcecode]
Consulta SQL para determinar las operaciones cliente iniciadas:
[sourcecode language="sql"]
SELECT TOP [ID]
,[UniqueID]
Tipo]
,[RequestedTime]
,[SitioFuente]
,[rowversion]
FROM [CM_CS1].[dbo].[ClientOperation].
[/códigofuente]
Código VB.Net para SCCM_ClientOperation.exe
He utilizado Visual Basic 2010, y he creado una aplicación de consola vb.net
--------------------
[sourcecode language="vb"]
Importaciones Sistema
Importa System.Management
Módulo Module1
Sub Main(ByVal args() As String)
Dim strSiteCode As String = Nada
Dim strSiteServer As String = Nada
Dim strResID As Integer = Nada
'líneas command válidas:
'/sitecode
/servidor del sitio
'/resid = ID del recurso (de uno en uno)
Dim s As String
Para cada s en args
s.ToLower()
If s.Contains("/sitecode:") Then
Dim arrTemp() As String
arrTemp = s.Split(":")
strSiteCode = arrTemp(1)
arrTemp = Nada
ElseIf s.Contains("/siteserver:") Then
Dim arrTemp() As String
arrTemp = s.Split(":")
strSitioServidor = arrTemp(1)
arrTemp = Nada
ElseIf s.Contains("/resid:") Then
Dim arrTemp() As String
arrTemp = s.Split(":")
strResID = arrTemp(1)
arrTemp = Nada
Fin If
Siguiente
Console.WriteLine(strCódigoSitio)
Console.WriteLine(strServidorSitio)
Consola.WriteLine(strResID)
Pruebe
Console.WriteLine("Empezando:")
Dim classInstance As New ManagementClass("\\" & strSiteServer & "\root\SMS\site_" & strSiteCode, "SMS_ClientOperation", Nothing)
Console.WriteLine("Declarando inparams:")
' Obtener [in] parámetros para el método
Dim inParams As ManagementBaseObject = classInstance.GetMethodParameters("InitiateClientOperation")
' Añade los parámetros de entrada.
inParams("TargetCollectionID") = ""
Dim arrResID() As Integer = {strResID}
inParams("TargetResourceIDs") = arrResID
inParams("Tipo") = 1
' Ejecutar el método y obtener los valores de retorno.
Dim outParams As ManagementBaseObject = classInstance.InvokeMethod("InitiateClientOperation", inParams, Nothing)
Catch err As ManagementException
Console.WriteLine("Se ha producido un error al intentar ejecutar el método WMI: ")
End Try
Fin Sub
Fin del módulo
[/código fuente]