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 outbound
inbound
.
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:
- Als een proces verbindingen accepteert op hetzelfde IP-adres, maar via meerdere netwerkinterfaces, wordt een afzonderlijke record voor elke interface gerapporteerd.
- 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.
- 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 teTrue
geven dat de poort wordt weergegeven via elke interface van de rapportcomputer. - Poorten die alleen zijn gebonden aan een specifieke interface, zijn
IsWildcardBind
ingesteld opFalse
.
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 RemoteIp
zijn 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
- Ga aan de slag met het schrijven van logboekquery's in Azure Monitor door te bekijken hoe u Log Analytics gebruikt.
- Meer informatie over het schrijven van zoekquery's.