Meu objetivo é analisar os logs de rede (por exemplo, Apache, syslog, auditoria de segurança do Active Directory e assim por diante) usando a detecção de cluster / anomalia para fins de detecção de intrusão.
Nos logs, tenho muitos campos de texto como endereço IP, nome de usuário, nome do host, porta de destino, porta de origem etc. (no total de 15 a 20 campos). Não sei se existem alguns ataques nos logs e quero destacar os eventos mais suspeitos (outliers).
Normalmente, a detecção de anomalias marca os pontos com baixa probabilidade / frequência como anomalias. No entanto, metade dos registros de log contém uma combinação exclusiva de campos. Portanto, metade dos registros no conjunto de dados terá a menor frequência possível.
Se eu usar a detecção de anomalias com base em cluster (por exemplo, encontrar clusters e depois selecionar pontos que estão longe de todos os centros de cluster), preciso encontrar a distância entre pontos diferentes. Como eu tenho de 15 a 20 campos, será um espaço multidimensional, onde as dimensões são nome de usuário, porta, endereço IP e assim por diante. No entanto, a distância de Mahalanobis só poderia ser aplicada a recursos distribuídos normalmente. Isso significa que não há como encontrar distância entre pontos de dados e construir clusters ...
Por exemplo, vamos imaginar que eu tenho usuários Alice, Bob, Carol, Dave, Eve e Frank no conjunto de dados de 20 registros. Eles poderiam ter o seguinte número de ocorrências no banco de dados: 2,5,2,5,1,5. Se eu simplesmente mapear nomes de usuários para números, por exemplo,
Alice --> 1
Bob --> 2
Carol --> 3
Dave --> 4
Eve --> 5
Frank --> 6
Então, minha distribuição de probabilidade para nomes de usuário terá a seguinte aparência:
p (1) = 0,1, p (2) = 0,25, p (3) = 0,1, p (4) = 0,25, p (5) = 0,05, p (6) = 0,25
Obviamente, essa não é uma distribuição normal, e isso também não faz muito sentido, pois eu poderia mapear nomes de usuários de qualquer maneira diferente ...
Assim, o mapeamento simples de campos como nome de usuário, ação, número da porta, endereço IP e assim por diante para números não traz nada.
Portanto, eu gostaria de perguntar como os campos de texto são processados / os recursos são construídos geralmente para possibilitar a detecção de anomalias / outlier não supervisionadas?
EDIT: estrutura de dados.
Eu tenho cerca de 100 colunas na tabela do banco de dados, contendo informações dos Eventos do Active Directory. Dessas 100 colunas, seleciono as mais importantes (do meu ponto de vista): SubjectUser, TargetUser, SourceIPaddress, SourceHostName, SourcePort, Computador, DestinationIPaddress, DestinationHostName, DestinationPort, DestinationPort, Ação, Status, FilePath, EventID, EventDay, WeekDay, DayTime.
Eventos são eventos do Active Directory, onde EventID define o que foi registrado (por exemplo, criação de tíquete Kerberos, logon do usuário, logoff do usuário, etc.).
A amostra de dados tem a seguinte aparência:
+ ------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- - + | ID | SubjectUser | TargetUser | SourceIPaddress | SourceHostName | SourcePort | Computador | DestinationIPaddress | DestinationHostName | DestinationPort | Ação | Status | FilePath | EventID | WeekDay | DayTime | + ------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- - + | 171390673 |? |? |? |? |? | domaincontroller1.domínio.com | 1.1.1.1 | domaincontroller1.domínio.com |? | / Autenticação / Verificar | / Sucesso |? 4624 | 1 | 61293 | + ------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- - + | 173348232 |? |? |? |? |? | domaincontroller2.domínio.com | 2.2.2.2 | domaincontroller2.domínio.com |? | / Autenticação / Verificar | / Sucesso |? 4624 | 1 | 61293 | + ------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- - + | 180176916 |? |? |? |? |? | domaincontroller2.domínio.com | 2.2.2.2 | domaincontroller2.domínio.com |? | / Autenticação / Verificar | / Sucesso |? 4624 | 1 | 61293 | + ------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- - + | 144144725 |? | John.Doe | 3.3.3.3 | domaincontroller3.domínio.com | 2407 | domaincontroller3.domínio.com | 3.3.3.4 | domaincontroller3.domínio.com |? | / Autenticação / Verificar | / Sucesso |? 4624 3 3 12345 + ------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- - +
No total, tenho cerca de 150 milhões de eventos. Eventos diferentes têm campos diferentes preenchidos e nem todos os eventos estão relacionados ao logon / logoff do usuário.