Mon objectif est d'analyser les journaux du réseau (par exemple, Apache, syslog, audit de sécurité Active Directory, etc.) à l'aide de la détection de cluster / anomalie à des fins de détection d'intrusion.
Dans les journaux, j'ai beaucoup de champs de texte comme l'adresse IP, le nom d'utilisateur, le nom d'hôte, le port de destination, le port source, etc. (au total 15-20 champs). Je ne sais pas s'il y a des attaques dans les journaux et je veux mettre en évidence les événements les plus suspects (valeurs aberrantes).
Habituellement, la détection d'anomalies marque les points avec une faible probabilité / fréquence comme des anomalies. Cependant, la moitié des enregistrements de journal contiennent une combinaison unique de champs. Ainsi, la moitié des enregistrements de l'ensemble de données auront la fréquence la plus basse possible.
Si j'utilise la détection d'anomalies basée sur le clustering (par exemple, trouver des clusters puis sélectionner des points éloignés de tous les centres de cluster), j'ai besoin de trouver la distance entre différents points. Puisque j'ai 15-20 champs, ce sera un espace multidimensionnel, où les dimensions sont le nom d'utilisateur, le port, l'adresse IP, etc. Cependant, la distance de Mahalanobis ne pouvait être appliquée qu'aux entités normalement distribuées. Cela signifie qu'il n'y a aucun moyen de trouver la distance entre les points de données et de construire des clusters ...
Par exemple, imaginons que j'ai des utilisateurs Alice, Bob, Carol, Dave, Eve et Frank dans l'ensemble de données de 20 enregistrements. Ils pourraient avoir le nombre d'occurrences suivant dans la base de données: 2,5,2,5,1,5. Si je mappe simplement les noms d'utilisateur aux nombres, par exemple
Alice --> 1
Bob --> 2
Carol --> 3
Dave --> 4
Eve --> 5
Frank --> 6
Ensuite, ma distribution de probabilité pour les noms d'utilisateur se présentera comme suit:
p (1) = 0,1, p (2) = 0,25, p (3) = 0,1, p (4) = 0,25, p (5) = 0,05, p (6) = 0,25
Bien sûr, ce n'est pas une distribution normale, et cela n'a pas beaucoup de sens, car je pourrais mapper les noms d'utilisateur de manière différente ...
Ainsi, un simple mappage de champs tels que nom d'utilisateur, action, numéro de port, adresse IP, etc., vers des numéros n'apporte rien.
Par conséquent, je voudrais demander comment les champs de texte sont traités / les fonctionnalités construites habituellement pour rendre possible la détection d'anomalies / de valeurs aberrantes non surveillée?
EDIT: structure des données.
J'ai environ 100 colonnes dans la table de base de données, contenant des informations sur les événements Active Directory. À partir de ces 100 colonnes, je sélectionne les plus importantes (de mon point de vue): SubjectUser, TargetUser, SourceIPaddress, SourceHostName, SourcePort, Computer, DestinationIPaddress, DestinationHostName, DestinationPort, Action, Status, FilePath, EventID, WeekDay, DayTime.
Les événements sont des événements Active Directory, où EventID définit ce qui a été enregistré (par exemple, création d'un ticket Kerberos, ouverture de session utilisateur, fermeture de session utilisateur, etc.).
L'échantillon de données ressemble à ceci:
+ ------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- - + | ID | SubjectUser | TargetUser | SourceIPaddress | SourceHostName | SourcePort | Ordinateur | DestinationIPaddress | DestinationHostName | DestinationPort | Action | Status | FilePath | EventID | WeekDay | DayTime | + ------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- - + | 171390673 |? |? |? |? |? | domaincontroller1.domain.com | 1.1.1.1 | domaincontroller1.domain.com |? | / Authentification / Vérifier | / Succès |? | 4624 | 1 | 61293 | + ------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- - + | 173348232 |? |? |? |? |? | domaincontroller2.domain.com | 2.2.2.2 | domaincontroller2.domain.com |? | / Authentification / Vérifier | / Succès |? | 4624 | 1 | 61293 | + ------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- - + | 180176916 |? |? |? |? |? | domaincontroller2.domain.com | 2.2.2.2 | domaincontroller2.domain.com |? | / Authentification / Vérifier | / Succès |? | 4624 | 1 | 61293 | + ------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- - + | 144144725 |? | John.Doe | 3.3.3.3 | domaincontroller3.domain.com | 2407 | domaincontroller3.domain.com | 3.3.3.4 | domaincontroller3.domain.com |? | / Authentification / Vérifier | / Succès |? | 4624 | 3 | 12345 | + ------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- - +
Au total, j'ai environ 150 millions d'événements. Différents événements ont différents champs remplis et tous les événements ne sont pas liés à la connexion / déconnexion de l'utilisateur.