sqlinsight-pro/docs/windows-servere.md
Søren Eggert Lundsteen Olsen 4c2d5252ad Docs: Windows-servere og syntetiske tjek (1.5)
- docs/windows-servere.md: what is collected and how often, how the agent reads
  servers (WS-Man, DCOM fallback, event log over MS-EVEN6), the exact least-privilege
  rights and grant-windows-server.ps1 (never local administrator), known limits,
  "ikke målbar" with the exact reason, firewall ports, the disk forecast, event
  noise filtering, rules with their thresholds, retention, configuration and API.
- docs/syntetiske-tjek.md: the kinds, the AX logon (port, then .NET Business
  Connector in a separate process, or clearly only the port), service running but
  not answering, sealed SQL passwords, rules, firewall, configuration and API.
- Linked from installation, integration (API table) and databehandling (retention,
  nothing sent to the hub); on the website in the documentation index, and the rule
  list shows the Windows server and synthetic check rules in their own areas.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-02 14:59:22 +02:00

13 KiB
Raw Blame History

Windows-servere

Fra version 1.5 overvåger SQLInsight også selve Windows-serverne: CPU, hukommelse, diske, tjenester, hændelseslog og planlagte opgaver på SQL-, applikations-/AOS- og filservere – med varsel om, at en disk løber fuld om et antal dage, før det sker. Det findes under Servere → Windows-servere i webbrugerfladen og i API'et (se nedenfor).

  • SQL Server-hosts kommer med af sig selv. Serveren bag hver instans under Servere og databaser (se servere-og-databaser.md) bliver en Windows-server med rollen SQL Server. Den forsvinder igen, når instansen fjernes, og kan sættes på pause. Azure SQL og LocalDB springes over. Slås fra med SQLInsight:Servers:IncludeSqlHosts.
  • Andre servere tilføjes i webbrugerfladen: AOS- og applikationsservere, rapport- og filservere. Angiv servernavnet (uden instans og port), rollen og eventuelt de tjenester, der altid skal køre (fx AOS60$01, W3SVC).

SQLInsight ændrer aldrig noget på serverne: agenten læser kun. Den starter, stopper eller genstarter ingen tjenester og rydder ikke op – fundene siger, hvad der bør gøres, og en driftsansvarlig gør det.

Sådan læser agenten serverne

Agenten læser serverne som sin egen konto (den samme som til SQL Server) med CIM – det samme, PowerShell's Get-CimInstance bruger:

  1. WinRM (WS-Man), TCP 5985, som er slået til på Windows Server 2012 og nyere. Foretrækkes.
  2. DCOM (RPC), TCP 135 og dynamiske porte, hvis WinRM ikke svarer eller afviser kontoen.
  3. Agentens egen server læses lokalt, uden netværk.

SQLInsight:Servers:Protocol kan låse det til WSMan eller DCOM (standard Auto). Hændelsesloggen læses med hændelseslogtjenestens egen protokol (MS-EVEN6, over RPC), som filtrerer på serveren og derfor er hurtig; virker den ikke, bruges CIM (Win32_NTLogEvent), som er langsommere. Siden for serveren viser, hvordan den blev læst.

Kører agenten som den virtuelle konto NT SERVICE\SQLInsight Agent (standard), LocalSystem eller NETWORK SERVICE, kommer den til andre servere som computerkontoen DOMÆNE\AGENTSERVER$. En gMSA eller domænekonto er den samme overalt. Siden viser den konto, scriptet nedenfor skal give rettigheder til.

Rettigheder (aldrig lokal administrator)

Agenten skal ikke være lokal administrator. Den har brug for præcis dette, og intet andet:

Rettighed Bruges til
Lokal gruppe Performance Monitor Users Ydelsestællere: CPU, hukommelse, paging, commit
Lokal gruppe Event Log Readers System- og Application-loggen (aldrig Security-loggen)
Lokal gruppe Distributed COM Users CIM over DCOM
Lokal gruppe Remote Management Users CIM over WinRM (Windows Server 2012 og nyere)
WMI: Enable Account + Remote Enable på root\cimv2 Styresystem, oppetid, diske, tjenester
WMI: Enable Account + Remote Enable på root\Microsoft\Windows\TaskScheduler Planlagte opgaver (Windows Server 2012 og nyere)
Service Control Manager: forbinde, liste og læse (CC LC RP RC) Over netværket må ellers kun administratorer liste tjenester

Det hele gives af grant-windows-server.ps1. Webbrugerfladen viser scriptet udfyldt med agentens konto under Rettigheder og forbindelse på serverens side (kopiér eller hent som fil; API: GET /api/v1/windows-servers/{id}/grant-script). En administrator kører det på serveren:

.\grant-windows-server.ps1 -Account 'DOMÆNE\AGENTSERVER$'
.\grant-windows-server.ps1 -Account 'DOMÆNE\AGENTSERVER$' -EnableFirewall -AgentAddress 10.0.0.15   # slår også Windows' egne firewallregler til
.\grant-windows-server.ps1 -Account 'DOMÆNE\AGENTSERVER$' -Remove                                  # fjerner det hele igen

Scriptet kan køres igen uden skade og virker på Windows PowerShell 2.0 og nyere. Grupperne findes via deres SID, så det virker på dansk og engelsk Windows. Den oprindelige sikkerhed på Service Control Manager gemmes første gang i %ProgramData%\SQLInsight\scmanager-sddl-backup.txt.

Kendte begrænsninger med mindst mulige rettigheder:

  • Tjenester: en tjeneste, hvis egen sikkerhed ikke lader kontoen læse den, ses ikke. Ser agenten slet ingen tjenester, er området "ikke målbart" med årsagen.
  • Planlagte opgaver: agenten ser kun opgaver, kontoen må læse. Seneste resultat læses med Task Schedulers GetInfo (et skrivebeskyttet CIM-metodekald, som Get-ScheduledTaskInfo); WinRM tillader kun metodekald for kontoen, hvis den har Execute-ret i WinRM. Mangler den, siger fundet det; brug DCOM (SQLInsight:Servers:Protocol), eller giv retten med winrm configSDDL default.
  • Windows Server 2008 R2: WinRM-gruppen og opgave-navnerummet findes ikke; brug DCOM, og planlagte opgaver er "ikke målbare".

Når en rettighed mangler

Testen (Test forbindelsen på serverens side, eller POST /api/v1/windows-servers/{id}/test) udføres af agenten, som dens konto, og prøver hvert område én gang. Tabellen viser for hvert område Kan læses eller Ikke målbar med den præcise årsag, fx

Adgang nægtet til hændelseslog på aos01.firma.local over WS-Man: Agentens konto (FIRMA\AGENT01$) mangler Event Log Readers. Kør tildelingsscriptet (grant-windows-server.ps1) som administrator på serveren, og test igen. Agenten skal ikke være lokal administrator.

Under overvågningen gælder det samme: et område, der ikke kan læses, gør kun dets regler "ikke målbare" med årsagen (under Ikke målbart på siden), og fund fra før forbliver åbne, indtil området kan læses igen. Problemet skrives én gang i agentens log, når det opstår eller ændrer sig – ikke hvert minut. Svarer serveren slet ikke, sendes én notifikation ("kan ikke nås") og én, når den svarer igen.

Firewall

Fra agentens server til de overvågede servere:

Port Hvad Windows' indbyggede regel
TCP 5985 WinRM (WS-Man), foretrukket Windows Remote Management (HTTP-In)
TCP 135 + dynamiske RPC-porte (49152–65535) DCOM/WMI, hvis WinRM ikke bruges Windows Management Instrumentation (DCOM-In, WMI-In, ASync-In)
TCP 135 + dynamiske RPC-porte, TCP 445 Hændelsesloggen (MS-EVEN6) Remote Event Log Management (RPC, NP-In, RPC-EPMAP)

grant-windows-server.ps1 -EnableFirewall slår disse indbyggede regler til (Windows Server 2012 og nyere), eventuelt kun for agentens adresse med -AgentAddress. Syntetiske tjek bruger de porte, de tjekker (se syntetiske-tjek.md).

Hvad måles, og hvor ofte

Område Interval Hvad
CPU, hukommelse, oppetid 1 minut Gennemsnitlig CPU pr. minut (rå tællere, ikke et øjebliksbillede), ledig hukommelse, paging, commit, starttidspunkt
Diske 15 minutter Ledig plads pr. drev og monteringspunkt; prognose for, hvornår drevet er fuldt
Tjenester 5 minutter Alle tjenester med status og starttype
Hændelseslog 5 minutter Fejl og kritiske hændelser i System og Application siden sidst (første gang det seneste døgn)
Planlagte opgaver 15 minutter Opgaver uden for \Microsoft\ med seneste kørsel, resultat og næste kørsel

Intervallerne ændres under SQLInsight:Servers:Intervals (performance, disks, services, events, tasks). Højst MaxParallelServers (standard 4) servere læses ad gangen.

"Disken er fuld om ca. N dage"

Ledig plads pr. drev gemmes hvert 15. minut i SQLInsights repository. Prognosen lægger en ret linje (mindste kvadraters metode) gennem timegennemsnittene for de seneste 14 dage (Disks:ForecastHistoryDays) – kun siden drevet sidst skiftede størrelse, så et udvidet drev starter forfra. Der gives kun en prognose, når der er mindst to dages historik og 12 målinger, linjen passer rimeligt (R² mindst 0,5), drevet faktisk fyldes (mindst 0,01 GB om dagen), og den rammer inden for et år. Et backupdrev, der fyldes om natten og ryddes om morgenen, giver derfor ingen alarm. Fundet kommer, når drevet forventes fuldt inden for 30 dage (Disks:ForecastDays): Middel, inden for 7 dage Høj, inden for 2 dage Kritisk.

Hændelsesloggen

Som SQL Servers fejllog (se fejllog.md) grupperes hændelserne pr. log, kilde og hændelses-id med antal, første og seneste tidspunkt og den nyeste tekst som eksempel. Kendt støj sorteres fra (DCOM 10016/10010, Schannel-alarmer, TPM-WMI, WMI 10 m.fl.), og det samme gør SQL Servers egne kilder (MSSQLSERVER, MSSQL$…, SQLSERVERAGENT …), som SQL Server-overvågningen allerede dækker. Egen støj tilføjes under EventLog:Ignore som "Kilde:id", "Kilde" eller "Kilde*". Disk- og filsystemfejl, opbrugte ressourcer og kritiske hændelser giver fund med det samme; tjenester der går ned, programnedbrud og Dynamics AX' AOS-fejl også; almindelige fejl først, når de er set 5 gange på et døgn (EventLog:RepeatThreshold). Et fund forbliver åbent et døgn efter hændelsen sidst blev set. Eksempelteksten kan nævne brugere, computere og stier: den vises i webbrugerfladen, men er [udeladt] i API'et.

Regler

Regel Fund Tærskel (SQLInsight:Servers:…)
SQLI-WIN-001 CPU højt i længere tid Cpu:HighPercent 90 % i Cpu:SustainedMinutes 15 min.
SQLI-WIN-002 Næsten ingen ledig hukommelse under Memory:AvailablePercent 5 % og Memory:AvailableMegabytes 1024 MB (5 min.)
SQLI-WIN-003 Paging med lidt ledig hukommelse Memory:PagesPerSecond 1000 (15 min.) og under 10 % ledig
SQLI-WIN-004 Commit tæt på grænsen Memory:CommitPercent 90 %
SQLI-WIN-005 Lidt ledig plads på et drev under Disks:FreePercent 10 % (Høj under CriticalFreePercent 5 %), medmindre mindst EnoughFreeGigabytes 50 GB er ledig
SQLI-WIN-006 Drevet er fuldt om ca. N dage Disks:ForecastDays 30
SQLI-WIN-007 Automatisk tjeneste kører ikke Services:Ignore, Services:StartupGraceMinutes 15; tjenester der stopper af sig selv (sppsvc, opdateringstjenester …) giver ingen fund
SQLI-WIN-008 Overvåget tjeneste kører ikke (eller findes ikke) listen pr. server
SQLI-WIN-009 Fejl i hændelsesloggen EventLog:RepeatThreshold 5, EventLog:MaxFindings 15
SQLI-WIN-010 Serveren er genstartet (uventet: Høj; planlagt: Info i et døgn) Kernel-Power 41, EventLog 6008, BugCheck 1001
SQLI-WIN-011 Ikke genstartet i lang tid UptimeDays (standard 0 = slået fra)
SQLI-WIN-012 Planlagt opgave fejlede Tasks:IncludeMicrosoftTasks, Tasks:Ignore, Tasks:MaxWatched 50
SQLI-WIN-013 Planlagt opgave kørte ikke som planlagt Tasks:LateMinutes 60

Hver regel har sit eget script i SQL Scripts/ (fx SQLI-WIN-006.sql) med de præcise CIM/WQL-forespørgsler og en skrivebeskyttet PowerShell-linje, der efterprøver dem.

Fund på servere vises på serverens side, under Aktive fund på servere og syntetiske tjek på siden Windows-servere, sendes som notifikationer (med link til fundet) og findes i API'et. De sendes ikke til SQLInsight Hub.

Opbevaring

Data Standard Indstilling
CPU og hukommelse pr. minut 14 dage SQLInsight:Servers:SampleDays
Ledig plads pr. drev 35 dage (mindst prognosens historik) SQLInsight:Servers:DiskHistoryDays
Grupperede hændelser 90 dage SQLInsight:Servers:EventDays
Løste fund 365 dage SQLInsight:Retention:ResolvedFindingDays

En server med 5 drev fylder omkring 1.440 rækker om dagen for CPU/hukommelse og 480 for diskene. Agenten sletter i små portioner hver time.

Konfiguration

Alle tærskler, intervaller og opbevaringstider står i agentens appsettings.json under SQLInsight:Servers. Ændringer kræver en genstart af agenten. Servere, roller og tjenestelister ændres i webbrugerfladen og bruges inden for et minut.

API

Kald Svar
GET /api/v1/windows-servers Servere med status, styresystem, protokol og områdernes målbarhed
POST /api/v1/windows-servers Tilføj (host, name, role, watchedServices, ignoredServices); 201 med serverTestRequestId
GET, PATCH, DELETE /api/v1/windows-servers/{id} Én server; pause, rolle og tjenestelister; fjern (409 for SQL Server-hosts)
POST, GET /api/v1/windows-servers/{id}/test Test forbindelse og rettigheder (202, følg GET /api/v1/agent-requests/{id}); seneste test med manglende områder
GET /api/v1/windows-servers/{id}/grant-script Scriptet udfyldt med agentens konto
GET /api/v1/windows-servers/{id}/performance?hours=24 CPU og hukommelse pr. minut
GET /api/v1/windows-servers/{id}/disks Drev med ledig plads og prognose
GET /api/v1/windows-servers/{id}/services Tjenester og serverens lister
GET /api/v1/windows-servers/{id}/events?days=1 Grupperede hændelser (eksemplet er [udeladt])
GET /api/v1/windows-servers/{id}/tasks Overvågede planlagte opgaver
GET /api/v1/windows-servers/{id}/rule-states Reglernes udfald med årsag
GET /api/v1/server-findings?status=&scope=server&id= Fund på servere og syntetiske tjek
GET /api/v1/server-findings/{id} Ét fund

At ændre kræver scope config:write (API-token) eller medlemskab af SQLInsight:Web:AdminGroups (Windows-brugere), som for Servere og databaser.