Buen día, colegas. Recientemente, se ha hablado bastante sobre la transferencia de aplicaciones desde infraestructuras físicas, centros de datos leídos a la nube. Por ejemplo, en Microsoft Azure . Bueno, o en general, sobre cualquier otra transferencia de una o más aplicaciones de un lugar a otro. Uno de los mayores problemas en este tipo de problema es la necesidad de encontrar todas las dependencias externas de la aplicación. Esto no se refiere a dependencias en el código, sino a dependencias en sistemas externos con respecto a la aplicación. De hecho, a veces necesitamos encontrar con quién está hablando nuestra propuesta y quién está hablando con él. Cómo hacer esto si no tenemos un SIEM integral, por así decirlo, usando el SIEM para los pobres. Estrictamente hablando, para los sistemas en Windows existe la siguiente oración.
Necesitamos:
- Habilite el inicio de sesión en el Firewall de Windows en todas las máquinas, de una forma u otra asociadas con la aplicación
- Descargar en el módulo PSQuickGraph de la estación de administración
- Apile y analice registros, cree un gráfico de enlaces
En su forma más simple, el análisis de registro se ve más o menos así. Horrible, frente, pero ¿qué puedes hacer? De hecho, era demasiado vago para escribir lógica para la carrera de troncos, simplemente copié todo dos veces. Pero para nuestros propósitos, "groseramente y en la frente" también irá para mostrar la idea
$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
En realidad, en este ejemplo, simplemente analizamos el registro de Firewall de Windows usando una expresión regular, dividiéndolo en objetos: un objeto por línea. Dios la bendiga con RAM, no mueras. En este ejemplo, tenemos dos registros, de dos máquinas diferentes. Después de analizar, simplemente fusionamos todo en una gran matriz y ejecutamos una búsqueda en él, agregando vértices y bordes del gráfico. Bueno, y como resultado, muéstralo. Entonces, aproximadamente, se ve como resultado:

Espero que alguien sea útil.