Delen via


Toewijzingsgegevens opvragen vanuit VM Insights

Wanneer u processen en afhankelijkheden inschakelt, worden in VM-inzichten, computer- en procesinventarisgegevens verzameld ter ondersteuning van de kaartfunctie. Naast het analyseren van deze gegevens met de kaart, kunt u deze rechtstreeks opvragen met Log Analytics. In dit artikel worden de beschikbare gegevens beschreven en worden voorbeeldquery's geboden.

VM Insights verzamelt metrische gegevens over prestaties en verbindingen, computer- en procesinventarisgegevens en statusgegevens en stuurt deze door naar de Log Analytics-werkruimte in Azure Monitor. Deze gegevens zijn beschikbaar voor query's in Azure Monitor. U kunt deze gegevens toepassen op scenario's met migratieplanning, capaciteitsanalyse, detectie en prestatieproblemen op aanvraag.

Belangrijk

U moet processen en afhankelijkheden hebben ingeschakeld voor VM-inzichten voor de tabellen die in dit artikel worden besproken om te worden gemaakt.

Records toewijzen

Er wordt één record per uur gegenereerd voor elke unieke computer en het proces, naast de records die worden gegenereerd wanneer een proces of computer wordt gestart of wordt toegevoegd aan VM Insights. De velden en waarden in de tabel VMComputer worden toegewezen aan velden van de machineresource in de Azure Resource Manager-API van ServiceMap. De velden en waarden in de TABEL VMProcess worden toegewezen aan de velden van de procesresource in de Azure Resource Manager-API van ServiceMap. Het _ResourceId veld komt overeen met het naamveld in de bijbehorende Resource Manager-resource.

Er zijn intern gegenereerde eigenschappen die u kunt gebruiken om unieke processen en computers te identificeren:

  • Computer: gebruik _ResourceId om een computer in een Log Analytics-werkruimte uniek te identificeren.
  • Proces: gebruik _ResourceId om een proces in een Log Analytics-werkruimte uniek te identificeren.

Omdat er meerdere records kunnen bestaan voor een opgegeven proces en computer in een opgegeven tijdsbereik, kunnen query's meerdere records retourneren voor dezelfde computer of hetzelfde proces. Als u alleen de meest recente record wilt opnemen, voegt u deze toe | summarize arg_max(TimeGenerated, *) by ResourceId aan de query.

Verbindingen en poorten

VMConnection en VMBoundPort bieden informatie over de verbindingen voor een machine (inkomend en uitgaand) en de serverpoorten die hierop zijn geopend/actief zijn. Metrische verbindingsgegevens worden ook weergegeven via API's die de middelen bieden voor het verkrijgen van een specifieke metriek tijdens een tijdvenster. TCP-verbindingen die het gevolg zijn van het accepteren van een listening-socket, zijn binnenkomend, terwijl verbindingen die zijn gemaakt door verbinding te maken met een bepaald IP-adres en een bepaalde poort uitgaand zijn. De Direction eigenschap vertegenwoordigt de richting van een verbinding, die kan worden ingesteld op of outboundinbound .

Records in deze tabellen worden gegenereerd op basis van gegevens die worden gerapporteerd door de afhankelijkheidsagent. Elke record vertegenwoordigt een observatie gedurende een tijdsinterval van 1 minuut. De TimeGenerated eigenschap geeft het begin van het tijdsinterval aan. Elke record bevat informatie voor het identificeren van de betreffende entiteit, dat wil gezegd, verbinding of poort en metrische gegevens die aan die entiteit zijn gekoppeld. Op dit moment wordt alleen netwerkactiviteit gerapporteerd die gebruikmaakt van TCP via IPv4.

Voor het beheren van kosten en complexiteit vertegenwoordigen verbindingsrecords geen afzonderlijke fysieke netwerkverbindingen. Meerdere fysieke netwerkverbindingen worden gegroepeerd in een logische verbinding, die vervolgens wordt weergegeven in de respectieve tabel. Records in VMConnection de tabel vertegenwoordigen een logische groepering en niet de afzonderlijke fysieke verbindingen die worden waargenomen. Fysieke netwerkverbinding die dezelfde waarde deelt voor de volgende kenmerken tijdens een bepaald interval van één minuut, worden samengevoegd in één logische record in VMConnection.

Metrische gegevens

VMConnection en VMBoundPort bevatten metrische gegevens met informatie over het volume gegevens dat is verzonden en ontvangen op een bepaalde logische verbinding of netwerkpoort (BytesSent, BytesReceived). Ook opgenomen is de reactietijd. Dit is hoe lang de beller wacht totdat een aanvraag die via een verbinding wordt verzonden, wordt verwerkt en beantwoord door het externe eindpunt (ResponseTimeMax, ResponseTimeMin, ). ResponseTimeSum De gerapporteerde reactietijd is een schatting van de werkelijke reactietijd van het onderliggende toepassingsprotocol. Het wordt berekend met behulp van heuristieken op basis van de observatie van de gegevensstroom tussen het bron- en doeleinde van een fysieke netwerkverbinding. Conceptueel is het verschil tussen de tijd dat de laatste byte van een aanvraag de afzender verlaat en het tijdstip waarop de laatste byte van het antwoord terugkomt. Deze twee tijdstempels worden gebruikt om aanvraag- en reactie-gebeurtenissen op een bepaalde fysieke verbinding af te bakenen. Het verschil tussen deze twee vertegenwoordigt de reactietijd van één aanvraag.

Dit algoritme is een benadering die kan werken met verschillende mate van succes, afhankelijk van het daadwerkelijke toepassingsprotocol dat wordt gebruikt voor een bepaalde netwerkverbinding. De huidige benadering werkt bijvoorbeeld goed voor protocollen op basis van aanvraagreacties, zoals HTTP(S), maar werkt niet met protocollen op basis van eenrichtings- of berichtenwachtrij.

Enkele belangrijke aandachtspunten zijn:

  1. Als een proces verbindingen accepteert op hetzelfde IP-adres, maar via meerdere netwerkinterfaces, wordt een afzonderlijke record voor elke interface gerapporteerd.
  2. Records met jokerteken-IP bevatten geen activiteit. Ze zijn opgenomen om aan te geven dat een poort op de computer is geopend voor binnenkomend verkeer.
  3. Om de uitgebreidheid en het gegevensvolume te verminderen, worden records met jokerteken-IP weggelaten wanneer er een overeenkomende record (voor hetzelfde proces, dezelfde poort en protocol) is met een specifiek IP-adres. Wanneer een jokerteken-IP-record wordt weggelaten, wordt de IsWildcardBind recordeigenschap met het specifieke IP-adres ingesteld om aan te True geven dat de poort wordt weergegeven via elke interface van de rapportcomputer.
  4. Poorten die alleen zijn gebonden aan een specifieke interface, zijn IsWildcardBind ingesteld op False.

Naamgeving en classificatie

Voor het gemak is het IP-adres van het externe einde van een verbinding opgenomen in de RemoteIp eigenschap. Voor binnenkomende verbindingen RemoteIp is hetzelfde als SourceIp, terwijl voor uitgaande verbindingen hetzelfde is als DestinationIp. De RemoteDnsCanonicalNames eigenschap vertegenwoordigt de DNS-canonieke namen die door de computer zijn gerapporteerd.RemoteIp De RemoteDnsQuestions eigenschap vertegenwoordigt de DNS-vragen die door de computer RemoteIpzijn gerapporteerd. De RemoveClassification eigenschap is gereserveerd voor toekomstig gebruik.

Schadelijk IP-adres

Elke RemoteIp eigenschap in de VMConnection tabel wordt gecontroleerd op basis van een set IP-adressen met bekende schadelijke activiteiten. Als de RemoteIp id schadelijk is, worden de volgende eigenschappen ingevuld. Als het IP-adres niet als schadelijk wordt beschouwd, zijn de eigenschappen leeg.

  • MaliciousIp
  • IndicatorThreadType
  • Description
  • TLPLevel
  • Confidence
  • Severity
  • FirstReportedDateTime
  • LastReportedDateTime
  • IsActive
  • ReportReferenceLink
  • AdditionalInformation

Voorbeeld van kaartquery's

Een lijst weergeven van alle bekende machines

VMComputer | summarize arg_max(TimeGenerated, *) by _ResourceId

Wanneer is de VM voor het laatst opnieuw opgestart

let Today = now(); VMComputer | extend DaysSinceBoot = Today - BootTime | summarize by Computer, DaysSinceBoot, BootTime | sort by BootTime asc

Samenvatting van Virtuele Azure-machines op installatiekopieën, locatie en SKU

VMComputer | where AzureLocation != "" | summarize by Computer, AzureImageOffering, AzureLocation, AzureImageSku

De fysieke geheugencapaciteit van alle beheerde computers weergeven

VMComputer | summarize arg_max(TimeGenerated, *) by _ResourceId | project PhysicalMemoryMB, Computer

Computernaam, DNS, IP en besturingssysteem vermelden

VMComputer | summarize arg_max(TimeGenerated, *) by _ResourceId | project Computer, OperatingSystemFullName, DnsNames, Ipv4Addresses

Alle processen zoeken met 'sql' in de opdrachtregel

VMProcess | where CommandLine contains_cs "sql" | summarize arg_max(TimeGenerated, *) by _ResourceId

Een machine (meest recente record) zoeken op resourcenaam

search in (VMComputer) "m-4b9c93f9-bc37-46df-b43c-899ba829e07b" | summarize arg_max(TimeGenerated, *) by _ResourceId

Een machine (meest recente record) zoeken op IP-adres

search in (VMComputer) "10.229.243.232" | summarize arg_max(TimeGenerated, *) by _ResourceId

Alle bekende processen op een opgegeven computer weergeven

VMProcess | where Machine == "m-559dbcd8-3130-454d-8d1d-f624e57961bc" | summarize arg_max(TimeGenerated, *) by _ResourceId

Een lijst weergeven van alle computers waarop SQL Server wordt uitgevoerd

VMComputer | where AzureResourceName in ((search in (VMProcess) "*sql*" | distinct Machine)) | distinct Computer

Een lijst weergeven van alle unieke productversies van curl in mijn datacenter

VMProcess | where ExecutableName == "curl" | distinct ProductVersion

Verzonden en ontvangen bytes

VMConnection | summarize sum(BytesSent), sum(BytesReceived) by bin(TimeGenerated,1hr), Computer | order by Computer desc | render timechart

Welke Virtuele Azure-machines de meeste bytes verzenden

VMConnection | join kind=fullouter(VMComputer) on $left.Computer == $right.Computer | summarize count(BytesSent) by Computer, AzureVMSize | sort by count_BytesSent desc

Statustrends koppelen

VMConnection | where TimeGenerated >= ago(24hr) | where Computer == "acme-demo" | summarize dcount(LinksEstablished), dcount(LinksLive), dcount(LinksFailed), dcount(LinksTerminated) by bin(TimeGenerated, 1h) | render timechart

Trend van verbindingsfouten

VMConnection | where Computer == "acme-demo" | extend bythehour = datetime_part("hour", TimeGenerated) | project bythehour, LinksFailed | summarize failCount = count() by bythehour | sort by bythehour asc | render timechart

Afhankelijke poorten

VMBoundPort
| where TimeGenerated >= ago(24hr)
| where Computer == 'admdemo-appsvr'
| distinct Port, ProcessName

Aantal geopende poorten op computers

VMBoundPort
| where Ip != "127.0.0.1"
| summarize by Computer, Machine, Port, Protocol
| summarize OpenPorts=count() by Computer, Machine
| order by OpenPorts desc

Scoreprocessen in uw werkruimte op het aantal poorten dat ze hebben geopend

VMBoundPort
| where Ip != "127.0.0.1"
| summarize by ProcessName, Port, Protocol
| summarize OpenPorts=count() by ProcessName
| order by OpenPorts desc

Gedrag aggregeren voor elke poort

Deze query kan vervolgens worden gebruikt om poorten te scoren op activiteit, bijvoorbeeld poorten met het meeste inkomend/uitgaand verkeer of poorten met de meeste verbindingen.

VMBoundPort
| where Ip != "127.0.0.1"
| summarize BytesSent=sum(BytesSent), BytesReceived=sum(BytesReceived), LinksEstablished=sum(LinksEstablished), LinksTerminated=sum(LinksTerminated), arg_max(TimeGenerated, LinksLive) by Machine, Computer, ProcessName, Ip, Port, IsWildcardBind
| project-away TimeGenerated
| order by Machine, Computer, Port, Ip, ProcessName

De uitgaande verbindingen van een groep computers samenvatten

// the machines of interest
let machines = datatable(m: string) ["m-82412a7a-6a32-45a9-a8d6-538354224a25"];
// map of ip to monitored machine in the environment
let ips=materialize(VMComputer
| summarize ips=makeset(todynamic(Ipv4Addresses)) by MonitoredMachine=AzureResourceName
| mvexpand ips to typeof(string));
// all connections to/from the machines of interest
let out=materialize(VMConnection
| where Machine in (machines)
| summarize arg_max(TimeGenerated, *) by ConnectionId);
// connections to localhost augmented with RemoteMachine
let local=out
| where RemoteIp startswith "127."
| project ConnectionId, Direction, Machine, Process, ProcessName, SourceIp, DestinationIp, DestinationPort, Protocol, RemoteIp, RemoteMachine=Machine;
// connections not to localhost augmented with RemoteMachine
let remote=materialize(out
| where RemoteIp !startswith "127."
| join kind=leftouter (ips) on $left.RemoteIp == $right.ips
| summarize by ConnectionId, Direction, Machine, Process, ProcessName, SourceIp, DestinationIp, DestinationPort, Protocol, RemoteIp, RemoteMachine=MonitoredMachine);
// the remote machines to/from which we have connections
let remoteMachines = remote | summarize by RemoteMachine;
// all augmented connections
(local)
| union (remote)
//Take all outbound records but only inbound records that come from either //unmonitored machines or monitored machines not in the set for which we are computing dependencies.
| where Direction == 'outbound' or (Direction == 'inbound' and RemoteMachine !in (machines))
| summarize by ConnectionId, Direction, Machine, Process, ProcessName, SourceIp, DestinationIp, DestinationPort, Protocol, RemoteIp, RemoteMachine
// identify the remote port
| extend RemotePort=iff(Direction == 'outbound', DestinationPort, 0)
// construct the join key we'll use to find a matching port
| extend JoinKey=strcat_delim(':', RemoteMachine, RemoteIp, RemotePort, Protocol)
// find a matching port
| join kind=leftouter (VMBoundPort 
| where Machine in (remoteMachines) 
| summarize arg_max(TimeGenerated, *) by PortId 
| extend JoinKey=strcat_delim(':', Machine, Ip, Port, Protocol)) on JoinKey
// aggregate the remote information
| summarize Remote=makeset(iff(isempty(RemoteMachine), todynamic('{}'), pack('Machine', RemoteMachine, 'Process', Process1, 'ProcessName', ProcessName1))) by ConnectionId, Direction, Machine, Process, ProcessName, SourceIp, DestinationIp, DestinationPort, Protocol

Volgende stappen