Um pouco mais sobre gráficos ou sobre como detectar dependências entre seus aplicativos

Bom dia, colegas. Recentemente, houve muita discussão sobre a transferência de aplicativos de infraestruturas físicas, leitura de data centers e para a nuvem. Por exemplo, no Microsoft Azure . Bem, ou em geral, sobre qualquer outra transferência de um ou mais aplicativos de um lugar para outro. Um dos maiores problemas desse tipo de problema é a necessidade de encontrar todas as dependências externas do aplicativo. Isso se refere não a dependências no código, mas a dependências em sistemas externos com relação ao aplicativo. De fato, às vezes precisamos encontrar com quem nossa proposta está falando e quem está falando com ele. Como fazer isso se não tivermos um SIEM abrangente, por assim dizer, usando o SIEM para os pobres. De fato, para sistemas no Windows, há a seguinte frase.


Precisamos de:


  • Habilitar o logon no Firewall do Windows em todas as máquinas, de uma forma ou de outra associada ao aplicativo
  • Faça o download no módulo PSQuickGraph da estação de administração
  • Empilhe e analise logs, crie um gráfico de links

Na sua forma mais simples, a análise de log se parece com isso. Horrível, testa, mas o que você pode fazer. Na verdade, eu estava com preguiça de escrever a lógica para a corrida de toras, apenas copiei tudo duas vezes. Mas, para nossos propósitos, "grosseiramente e na testa" também será usado para mostrar a idéia


$f = gc "C:\Temp\pfirewall_public.log" $regex = '^(?<datetime>\d{4,4}-\d{2,2}-\d{2,2}\s\d{2}:\d{2}:\d{2})\s(?<action>\w+)\s(?<protocol>\w+)\s(?<srcip>\b(?:\d{1,3}\.){3}\d{1,3}\b)\s(?<dstip>\b(?:\d{1,3}\.){3}\d{1,3}\b)\s(?<srcport>\d{1,5})\s(?<dstport>\d{1,5})\s(?<size>\d+|-)\s(?<tcpflags>\d+|-)\s(?<tcpsyn>\d+|-)\s(?<tcpack>\d+|-)\s(?<tcpwin>\d+|-)\s(?<icmptype>\d+|-)\s(?<icmpcode>\d+|-)\s(?<info>\d+|-)\s(?<path>.+)$' $log = $f | % { $_ -match $regex | Out-Null if ($Matches) { [PSCustomObject]@{ action = $Matches.action srcip = [ipaddress]$Matches.srcip dstport = $Matches.dstport tcpflags = $Matches.tcpflags dstip = [ipaddress]$Matches.dstip info = $Matches.info size = $Matches.size protocol = $Matches.protocol tcpack = $Matches.tcpac srcport = $Matches.srcport tcpsyn = $Matches.tcpsyn datetime = [datetime]$Matches.datetime icmptype = $Matches.icmptype tcpwin = $Matches.tcpwin icmpcode = $Matches.icmpcode path = $Matches.path } } } $f = gc "C:\Temp\pfirewall_public2.log" $log2 = $f | % { $_ -match $regex | Out-Null if ($Matches) { [PSCustomObject]@{ action = $Matches.action srcip = [ipaddress]$Matches.srcip dstport = $Matches.dstport tcpflags = $Matches.tcpflags dstip = [ipaddress]$Matches.dstip info = $Matches.info size = $Matches.size protocol = $Matches.protocol tcpack = $Matches.tcpac srcport = $Matches.srcport tcpsyn = $Matches.tcpsyn datetime = [datetime]$Matches.datetime icmptype = $Matches.icmptype tcpwin = $Matches.tcpwin icmpcode = $Matches.icmpcode path = $Matches.path } } } $l = $log + $log2 $g = new-graph -Type BidirectionalGraph $l | ? {$_.srcip -and $_.dstip} | % { Add-Edge -From $_.srcip -To $_.dstip -Graph $g | out-null } Show-GraphLayout -Graph $g 

Na verdade, neste exemplo, simplesmente analisamos o log do Firewall do Windows usando uma expressão regular, dividindo-o em objetos - um objeto por linha. Deus a abençoe com RAM, não morra. Neste exemplo, temos dois logs, de duas máquinas diferentes. Após a análise, simplesmente mesclamos tudo em uma matriz grande e fazemos uma pesquisa nela, adicionando vértices e arestas do gráfico. Bem, e como resultado - exibi-lo. Então, aproximadamente, parece como resultado:


appLinks


Espero que alguém venha a calhar.

Source: https://habr.com/ru/post/pt425235/


All Articles