• Accueil
  • Blog
  • Utilisation de System Center Orchestrator pour automatiser les tâches de sécurité

Utilisation de System Center Orchestrator pour automatiser les tâches de sécurité

Avec System Center Configuration Manager 2012, les clients ont la possibilité d'utiliser les fonctionnalités Endpoint Protection pour fournir des services anti-malware et sécuriser les serveurs et les clients. Cependant, pour réduire les points de contact et les erreurs des administrateurs, nous pouvons utiliser la flexibilité de System Center Orchestrator pour augmenter et automatiser les processus de sécurité standard. Dans ce billet, je vais démontrer comment créer un runbook pour automatiser le déclenchement d'une analyse complète des malwares de Endpoint Protection en réponse à une alerte de malwares détectés dans Configuration Manager.

Dans un scénario d'exploitation normal, un administrateur ou un spécialiste de la sécurité recevrait un courriel d'alerte de Configuration Manager indiquant une alerte provenant d'un client, et lancerait alors la console de Configuration Manager, ainsi qu'une analyse complète, comme indiqué ci-dessous :

Bien entendu, cela suppose que la ou les personnes désignées surveillent leur courrier électronique, aient accès à la console et s'en soucient généralement, sans parler des cycles de productivité perdus. Et vraiment, ne serait-il pas préférable d'automatiser l'ensemble du processus et de se contenter d'alerter quelqu'un en cas d'échec ?

Configuration du flux de travail

La première chose à faire est d'organiser le flux de travail (tout le code et les éléments connexes seront inclus ci-dessous).

  1. La première chose à faire est de déterminer comment identifier les clients qui ont récemment été victimes d'un programme malveillant. Pour les besoins de notre discussion, supposons que cette opération s'exécute toutes les heures et que nous vérifions ce qui s'est passé au cours de la dernière heure. Le moyen le plus simple est d'exploiter la vue de la base de données ConfigMgr nommée v_EP_LastMalware. Voici une requête complète :

[sourcecode language="sql"]
SELECT [MachineID], [LastMessageTime], [DetectionTime], [ActionTime], [DetectionSource], [PendingActions], [CleaningAction], [ExecutionStatus], [ActionSuccess], [ErrorCode]

FROM [CM_XXX].[dbo].[vEP_LastMalware]

Where DetectionTime > DATEADD(hour, -1, getutcdate())
[/sourcecode]

Vous remarquerez également que la requête utilise la fonction getutcdate. C'est parce que les messages sont horodatés en temps UTC pour ConfigMgr. Pour notre bénéfice, nous utiliserons la requête suivante pour retourner uniquement l'identifiant de la machine :

[sourcecode language="sql"]
SELECT [MachineID]
FROM [CM_CS1].[dbo].[vEP_LastMalware]
Where DetectionTime > DATEADD(hour, -1, getutcdate())

[/sourcecode]

Le MachineID renvoyé est l'ID du client ConfigMgr que nous utiliserons pour définir la politique.

  1. L'activité suivante consiste à faire correspondre l'identifiant de la machine au nom de l'ordinateur. Vous pouvez combiner les deux requêtes, mais j'ai choisi de les séparer pour des raisons de journalisation et de facilité puisque nous aurons besoin à la fois de l'identifiant de la machine et du nom de l'ordinateur. Voici la requête permettant de faire correspondre l'ID au nom :

[sourcecode language=”sql”]
SELECT [Netbios_Name0]
FROM [CM_CS1].[dbo].[vSMS_R_System]
Where ItemKey = <em>InsertKeyHere.</em>
[/sourcecode]

  1. La troisième activité consiste à envoyer une requête ping au nom de l'ordinateur et, en fonction des résultats de cette requête, à se connecter à l'ordinateur pour lancer manuellement une analyse complète (à l'aide de MPCMDRUN.exe) ou pour définir une stratégie client.
  2. Pour MPCMDRUN, nous lancerons simplement un processus sur l'ordinateur cible. Pour les systèmes inaccessibles, nous nous connecterons à WMI et invoquerons une méthode. J'ai créé une application console vb.net personnalisée pour faire cela pour moi aussi.
  3. Ensuite, nous effectuerons des notifications par courrier électronique, des alertes SCOM, des enregistrements de fichiers texte, etc. en fonction de nos besoins.

Et maintenant, System Center Orchestrator !

Une fois le flux de travail défini, voici les détails :

  1. Interroger la base de données pour les enregistrements EP : C'est ici que le flux de travail commence. Ajoutez l'activité Interroger la base de données et, en utilisant la requête suivante, vous obtiendrez les machines qui ont eu un événement récent :

[sourcecode language="sql"]
SELECT [MachineID]

FROM [CM_CS1].[dbo].[vEP_LastMalware]

Where DetectionTime > DATEADD(hour, -1, getutcdate())
[/sourcecode]

Vous devrez configurer l'activité Base de données de requête avec le nom du serveur SQL de ConfigMgr, la base de données et, en option, un compte d'exécution. Pour mes besoins, j'ai ajouté le compte d'exécution Orchestrator au groupe local ConfigMgr_DViewAccess sur le serveur SQL.

  1. Ajoutez une autre activité d'interrogation de la base de données pour convertir l'ID du client ConfigMGR en un nom d'ordinateur pour les utilisations futures. Dans ce cas, nous devrons utiliser les données publiées dans la première requête, comme suit :

[sourcecode language="sql"]
SELECT [Netbios_Name0]
FROM [CM_CS1].[dbo].[vSMS_R_System]
WHERE ItemKey =
[/sourcecode]

Après le '=', nous devons utiliser les données publiées de la première requête. Utilisez les données publiées comme indiqué ci-dessous :

Enfin, configurez le bouclage de l'activité et placez un délai d'une seconde entre les tentatives. Ceci servira à itérer à travers toutes les lignes retournées.

  1. Nous ajouterons ensuite l'option Get Computer/IP Status pour déterminer si le système est accessible, et si c'est le cas, nous devrons simplement exécuter l'utilitaire de ligne command disponible localement et appelé MPCMDRUN. Si ce n'est pas le cas, nous utiliserons notre application personnalisée pour nous connecter au site ConfigMgr et nous utiliserons la méthode native WMI API pour définir la politique.

Configurez le champ Get Computer/IP Status avec le nom de l'ordinateur et les données publiées à partir de la deuxième Query Database Activity - Full line as a string with fields separated by ':'.

  1. Ajoutez deux activités pour "Exécuter un programme". Nommez-en une "Run MPCMDRUN", et l'autre "Run SCCM_ClientOperation". Liez les activités au statut Get Computer/IP, et sur les liens, configurez le lien connectant MPCMDRUN au succès, et le lien vers SCCM_ConsoleOperation avec un échec. Ceci sera utilisé pour notre logique de branchement.
  1. Configurez l'option "Exécuter MPCMDRUN" comme suit"

Mode : Exécution du programme

Ordinateur : Ligne complète sous la forme d'une chaîne de caractères dont les champs sont séparés par des " :", à partir de la deuxième interrogation de la base de données.

Chemin d'accès au programme : C:\NProgram Files\NMicrosoft Security Client\NAntimalware\NMpCmdRun.exe

Paramètres du programme : -Scan 3

Exécuter en tant que : Utilisez un compte dédié si nécessaire, pour les privilèges administratifs.

  1. Configurez l'activité Run SCCM_ConsoleOperation comme suit :

Mode : Exécution du programme

Ordinateur : localhost (ou l'endroit où se trouve l'application)

Chemin d'accès au programme : C:\temp\SCCM_ClientOperations.exe

Paramètres :

/sitecode :SiteCode

/siteserver :SiteServerName

/resid : Ligne complète sous forme de chaîne de caractères avec des champs séparés par des ':'(à partir de la première interrogation de la base de données)

Exécuter en tant que : Utilisez un compte disposant de droits d'administration sur Configuration Manger.

Pour conclure

Bien entendu, n'hésitez pas à ajouter des alertes d'Operations Manager, des notifications par courrier électronique, des variables, etc. pour affiner et fournir une journalisation là où c'est nécessaire. Cependant, ceci devrait vous fournir un scénario d'utilisation simple pour Orchestrator, et ne prendre que quelques minutes à développer. Il ne s'agit que d'un exemple de tâche, qui peut être étendu pour inclure des tâches Active Directory, telles que forcer l'utilisateur principal de l'ordinateur à changer son mot de passe.

Code et autres éléments

Tout le code est mon propre travail, et j'en suis le seul responsable, sans aucune garantie.

Requête SQL pour trouver les événements liés aux logiciels malveillants :

[sourcecode language="sql"]
SELECT [MachineID]
,[LastMessageTime]
,[DetectionTime]
,[ActionTime]
,[DetectionSource]
,[PendingActions]
,[CleaningAction]
,[ExecutionStatus]
,[ActionSuccess]
,[ErrorCode]
FROM [CM_CS1].[dbo].[vEP_LastMalware]
WHERE DetectionTime > DATEADD(hour, -1, getutcdate())
[/sourcecode]

Requête SQL pour faire correspondre l'ID de la ressource au nom de l'ordinateur :

[sourcecode language="sql"]
SELECT [Netbios_Name0]
FROM [CM_CS1].[dbo].[vSMS_R_System]
Where ItemKey =
[/sourcecode]

Requête SQL pour déterminer les opérations initiées par le client :

[sourcecode language="sql"]
SELECT TOP [ID]
,[UniqueID]
,[Type]
,[RequestedTime]
,[SourceSite]
,[rowversion]
FROM [CM_CS1].[dbo].[ClientOperation]
[/sourcecode]

Code VB.Net pour SCCM_ClientOperation.exe

J'ai utilisé Visual Basic 2010, et créé une application console vb.net

--------------------

[sourcecode language="vb"]

Importations Système
Importe System.Management
Module Module1
Sub Main(ByVal args() As String)
Dim strSiteCode As String = Nothing
Dim strSiteServer As String = Nothing
Dim strResID As Integer = Nothing

'Lignes valides command :
'/sitecode
'/siteserver
'/resid = identifiant de la ressource (un seul à la fois)

Dim s As String
Pour chaque s dans les args
s.ToLower()

If s.Contains("/sitecode :") Then
Dim arrTemp() As String
arrTemp = s.Split(" :")
strSiteCode = arrTemp(1)
arrTemp = Rien
ElseIf s.Contains("/siteserver :") Then
Dim arrTemp() As String
arrTemp = s.Split(" :")
strSiteServer = arrTemp(1)
arrTemp = Rien
ElseIf s.Contains("/resid :") Then
Dim arrTemp() As String
arrTemp = s.Split(" :")
strResID = arrTemp(1)
arrTemp = Rien
Fin Si
Suivant

Console.WriteLine(strSiteCode)
Console.WriteLine(strSiteServer)
Console.WriteLine(strResID)

Essayer

Console.WriteLine("Démarrage :")

Dim classInstance As New ManagementClass("\N-" & strSiteServer & "\N-" & strSiteCode, "SMS_ClientOperation", Nothing)

Console.WriteLine("Déclaration des inparams :")

' Obtenir les paramètres [in] de la méthode
Dim inParams As ManagementBaseObject = classInstance.GetMethodParameters("InitiateClientOperation")

' Ajouter les paramètres d'entrée.
'inParams("TargetCollectionID") = ""
Dim arrResID() As Integer = {strResID}
inParams("TargetResourceIDs") = arrResID
inParams("Type") = 1

' Exécute la méthode et obtient les valeurs de retour.

Dim outParams As ManagementBaseObject = classInstance.InvokeMethod("InitiateClientOperation", inParams, Nothing)
Catch err As ManagementException
Console.WriteLine("Une erreur s'est produite lors de l'exécution de la méthode WMI : ")
End Try

Fin du sous-module
Fin du module

[/sourcecode]