Mi objetivo es analizar los registros de red (p. Ej., Apache, syslog, auditoría de seguridad de Active Directory, etc.) utilizando la detección de agrupamiento / anomalías para fines de detección de intrusos.
De los registros tengo muchos campos de texto como dirección IP, nombre de usuario, nombre de host, puerto de destino, puerto de origen, etc. (en total 15-20 campos). No sé si hay algunos ataques en los registros, y quiero resaltar los eventos más sospechosos (valores atípicos).
Por lo general, la detección de anomalías marca los puntos con baja probabilidad / frecuencia como anomalías. Sin embargo, la mitad de los registros contienen una combinación única de campos. Entonces, la mitad de los registros en el conjunto de datos tendrá la frecuencia más baja posible.
Si uso la detección de anomalías basada en la agrupación (por ejemplo, encontrar grupos y luego seleccionar puntos que están lejos de todos los centros de grupos), necesito encontrar la distancia entre los diferentes puntos. Como tengo 15-20 campos, será un espacio multidimensional, donde las dimensiones son nombre de usuario, puerto, dirección IP, etc. Sin embargo, la distancia de Mahalanobis solo se puede aplicar a entidades distribuidas normalmente. Esto significa que no hay forma de encontrar la distancia entre los puntos de datos y construir grupos ...
Por ejemplo, imaginemos que tengo usuarios Alice, Bob, Carol, Dave, Eve y Frank en el conjunto de datos de 20 registros. Podrían tener el siguiente número de ocurrencias en la base de datos: 2,5,2,5,1,5. Si simplemente mapeo nombres de usuario a números, por ejemplo
Alice --> 1
Bob --> 2
Carol --> 3
Dave --> 4
Eve --> 5
Frank --> 6
Entonces, mi distribución de probabilidad para los nombres de usuario será la siguiente:
p (1) = 0.1, p (2) = 0.25, p (3) = 0.1, p (4) = 0.25, p (5) = 0.05, p (6) = 0.25
Por supuesto, esta no es una distribución normal, y esto tampoco tiene mucho sentido, ya que podría asignar nombres de usuario de cualquier manera diferente ...
Por lo tanto, la asignación simple de campos como nombre de usuario, acción, número de puerto, dirección IP, etc. a los números no aporta nada.
Por lo tanto, me gustaría preguntar, ¿cómo se procesan los campos de texto / características construidas generalmente para hacer posible la detección de anomalías / valores atípicos sin supervisión?
EDITAR: estructura de datos.
Tengo alrededor de 100 columnas en la tabla de la base de datos, que contiene información de eventos de Active Directory. De estas 100 columnas, selecciono la más importante (desde mi punto de vista): AsuntoUsuario, DestinoUsuario, SourceIPaddress, SourceHostName, SourcePort, Computadora, DestinationIPaddress, DestinationHostName, DestinationPort, Acción, Estado, FilePath, EventID, WeekDay, DayTime.
Los eventos son eventos de Active Directory, donde EventID define lo que se registró (por ejemplo, creación de un ticket Kerberos, inicio de sesión de usuario, cierre de sesión de usuario, etc.).
La muestra de datos tiene el siguiente aspecto:
+ ------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- - + | ID | SubjectUser | TargetUser | SourceIPaddress | SourceHostName | SourcePort | Computadora | DestinationIPaddress | DestinationHostName | DestinationPort | Acción | Estado | FilePath | EventID | WeekDay | DayTime | + ------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- - + | 171390673 |? |? |? |? |? | domaincontroller1.domain.com | 1.1.1.1 | domaincontroller1.domain.com |? | / Autenticación / Verificar | / Éxito |? | 4624 | 1 | 61293 | + ------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- - + | 173348232 |? |? |? |? |? | domaincontroller2.domain.com | 2.2.2.2 | domaincontroller2.domain.com |? | / Autenticación / Verificar | / Éxito |? | 4624 | 1 | 61293 | + ------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- - + | 180176916 |? |? |? |? |? | domaincontroller2.domain.com | 2.2.2.2 | domaincontroller2.domain.com |? | / Autenticación / Verificar | / Éxito |? | 4624 | 1 | 61293 | + ------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- - + | 144144725 |? | John.Doe | 3.3.3.3 | domaincontroller3.domain.com | 2407 | domaincontroller3.domain.com | 3.3.3.4 | domaincontroller3.domain.com |? | / Autenticación / Verificar | / Éxito |? | 4624 | 3 | 12345 | + ------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- - +
En total, tengo alrededor de 150 millones de eventos. Los diferentes eventos tienen diferentes campos completados, y no todos los eventos están relacionados con el inicio / cierre de sesión del usuario.