Docs: Servere og databaser (1.3)
New docs/servere-og-databaser.md (on the community site too): adding servers, who may change it (AdminGroups), connection test and GRANT script run by the agent, database choice, configuration file servers, how SQL login passwords are sealed and why, the repository grants, and the API. Installation, integration (scope config:write) and data processing (AX findings to the hub are off by default) point to it; AdminGroups in the web's appsettings.json. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
f3ef0cbec7
commit
5ad9355130
7 changed files with 100 additions and 6 deletions
|
|
@ -27,6 +27,10 @@ Kun når `SQLInsight:Hub:Enabled` er `true` og der er en gyldig licens. Agenten
|
|||
|
||||
Der sendes aldrig tabeldata, forespørgselsresultater, adgangskoder eller forbindelsesstrenge.
|
||||
|
||||
**Dynamics AX** (fra 1.3): fund fra AX-reglerne (`COM-AX-…`) og deres resultater sendes som standard ikke. Kunden kan slå det til for én AX-database ad gangen under *Servere og databaser* (se [servere-og-databaser.md](servere-og-databaser.md#dynamics-ax-fund-og-sqlinsight-hub)).
|
||||
|
||||
**Adgangskoder til SQL-logins**, der indtastes i webbrugerfladen, gemmes i kundens repository krypteret med agentens offentlige nøgle, så kun agenten kan læse dem. De forlader aldrig kundens netværk.
|
||||
|
||||
**Supportsager** (Professional og Enterprise, se [support.md](support.md)): når en bruger opretter en sag i webbrugerfladen, sendes titel, beskrivelse, kontaktpersonens navn, e-mail og eventuelt telefonnummer samt brugerens Windows-brugernavn til hubben. Det er personoplysninger, som SEOSoft bruger til at besvare sagen. Beskrivelsen indeholder kun det, brugeren selv skriver; følsomme målinger sættes ikke automatisk ind.
|
||||
|
||||
Kunden kan se præcis det, der er sendt, under **System** i webbrugerfladen ("Det sendes til SQLInsight Hub").
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@ msiexec /i SQLInsight-Pro-1.0.0-x64.msi /qn /l*v install.log `
|
|||
| Egenskab | Standard | |
|
||||
|---|---|---|
|
||||
| `REPOSITORY_CONNECTION` | (ingen) | Forbindelsesstreng til repository-databasen. Uden den installeres tjenesterne, men startes ikke |
|
||||
| `MONITOR_SERVER` | (ingen) | Første instans, der skal overvåges. Flere tilføjes i `appsettings.json` |
|
||||
| `MONITOR_SERVER` | (ingen) | Første instans, der skal overvåges. Flere tilføjes i webbrugerfladen under *Servere og databaser* (se [servere-og-databaser.md](servere-og-databaser.md)) eller i `appsettings.json` |
|
||||
| `AGENT_ACCOUNT` | `NT SERVICE\SQLInsight Agent` | Tjenestekonto til agenten. Den virtuelle konto når andre servere som computerkontoen (`DOMÆNE\SERVER$`), så det er den, der skal have login og rettigheder på de overvågede instanser. En gMSA angives som `DOMÆNE\navn$` |
|
||||
| `WEB_ACCOUNT` | `NT SERVICE\SQLInsight Web` | Tjenestekonto til web. Skal have `db_datareader` på repositoriet |
|
||||
| `WEB_PORT` | `5080` | Port til webbrugerfladen. Installeren åbner den i Windows Firewall |
|
||||
|
|
@ -94,7 +94,7 @@ Kør [`db/permissions/grant-least-privilege.sql`](../db/permissions/grant-least-
|
|||
dotnet publish src/SQLInsight.Agent -c Release -r win-x64 --self-contained false -o C:\Program Files\SQLInsight\Agent
|
||||
```
|
||||
|
||||
Ret `C:\Program Files\SQLInsight\Agent\appsettings.json`: `SQLInsight:Repository:ConnectionString` og listen `SQLInsight:Instances`. Opret derefter tjenesten:
|
||||
Ret `C:\Program Files\SQLInsight\Agent\appsettings.json`: `SQLInsight:Repository:ConnectionString` og eventuelt listen `SQLInsight:Instances` (servere kan også tilføjes i webbrugerfladen, se [servere-og-databaser.md](servere-og-databaser.md)). Opret derefter tjenesten:
|
||||
|
||||
```powershell
|
||||
sc.exe create "SQLInsight Agent" binPath= "\"C:\Program Files\SQLInsight\Agent\SQLInsight.Agent.exe\"" obj= "DOMÆNE\svc-sqlinsight-agent$" start= delayed-auto
|
||||
|
|
@ -115,7 +115,7 @@ For en gMSA angives ingen adgangskode. Loggen kan ses i Windows' Event Viewer un
|
|||
3. Opret en **application pool** med *.NET CLR version = No Managed Code*, og sæt dens identitet til `DOMÆNE\svc-sqlinsight-web$`.
|
||||
4. Opret et websted, der peger på `C:\inetpub\SQLInsight`, med en **HTTPS-binding** og et certifikat fra jeres interne CA.
|
||||
5. Under *Authentication*: slå **Windows Authentication** til og **Anonymous Authentication** fra.
|
||||
6. Ret `appsettings.json`: `SQLInsight:Repository:ConnectionString` (Integrated Security, så app pool-identiteten bruges), eventuelt `SQLInsight:Web:AllowedGroups`, fx `["DOMÆNE\\SQL-Admins"]`.
|
||||
6. Ret `appsettings.json`: `SQLInsight:Repository:ConnectionString` (Integrated Security, så app pool-identiteten bruges), eventuelt `SQLInsight:Web:AllowedGroups`, fx `["DOMÆNE\\SQL-Brugere"]`, og `SQLInsight:Web:AdminGroups`, fx `["DOMÆNE\\SQL-Admins"]` (må ændre, hvilke servere og databaser der overvåges).
|
||||
|
||||
## 5b. Web-UI'et som selvstændig Windows-tjeneste (uden IIS)
|
||||
|
||||
|
|
@ -182,4 +182,4 @@ Se [opdatering.md](opdatering.md): regelpakken opdateres automatisk, og nye vers
|
|||
|
||||
## Menuen i webbrugerfladen
|
||||
|
||||
Menuen er delt i grupper, der kan foldes ud og sammen: **Overvågning**, **Analyse**, **Konfiguration og sikkerhed**, **Rapporter**, **Dynamics AX** (kun når en database er genkendt som AX), **Support**, **System** og **Community**. Gruppen med den side, man står på, er åben. Sider, der findes pr. instans (fx Analyse af tidsrum og Konfiguration), åbner et valg af instans; er der kun én instans, går de direkte til den. På en smal skærm (mobil) folder hele menuen sig sammen bag knappen **Menu**. Alt virker uden JavaScript.
|
||||
Menuen er delt i grupper, der kan foldes ud og sammen: **Overvågning** (med *Servere og databaser*, se [servere-og-databaser.md](servere-og-databaser.md)), **Analyse**, **Konfiguration og sikkerhed**, **Rapporter**, **Dynamics AX** (kun når en database er genkendt som AX), **Support**, **System** og **Community**. Gruppen med den side, man står på, er åben. Sider, der findes pr. instans (fx Analyse af tidsrum og Konfiguration), åbner et valg af instans; er der kun én instans, går de direkte til den. På en smal skærm (mobil) folder hele menuen sig sammen bag knappen **Menu**. Alt virker uden JavaScript.
|
||||
|
|
|
|||
|
|
@ -86,6 +86,7 @@ Alt, hvad webbrugerfladen viser, kan hentes som JSON under `/api/v1/` med de sam
|
|||
| `GET /api/v1/instances/{navn}/replication` | Replikering set fra distributøren: hver distributionsagents status, seneste kørsel og forsinkelse, og fejl det seneste døgn |
|
||||
| `GET /api/v1/instances/{navn}/index-usage?days=30` | Læsninger og skrivninger pr. index summeret over dagene (1–400), på tværs af genstarter, mindst læste først |
|
||||
| `POST /api/v1/support-cases`, `GET /api/v1/support-cases[/{id}]`, `POST /api/v1/support-cases/{id}/close` | Supportsager: se [support.md](support.md) (kræver scope `support:write` for at skrive) |
|
||||
| `GET`/`POST /api/v1/monitored-instances`, `…/{id}`, `…/{id}/connection-test`, `…/{id}/discovery`, `…/{id}/databases`, `…/{id}/grant-script`, `POST /api/v1/instance-discovery`, `GET /api/v1/agent-requests/{id}` | Hvilke servere og databaser der overvåges, forbindelsestest, søgning og GRANT-script: se [servere-og-databaser.md](servere-og-databaser.md#api) (kræver scope `config:write` for at ændre) |
|
||||
| `GET /metrics` | Prometheus-format |
|
||||
|
||||
**Følsomme data:** forespørgselstekster, logins, personnavne, værts- og programnavne og tjenestekonti vises som `[udeladt]`, medmindre `SQLInsight:Web:ApiIncludesSensitiveEvidence` er `true`. Det gælder både fund, rapporter i JSON og sidernes data. PDF-rapporterne indeholder de samme data som i webbrugerfladen.
|
||||
|
|
@ -96,7 +97,7 @@ Alt, hvad webbrugerfladen viser, kan hentes som JSON under `/api/v1/` med de sam
|
|||
"ApiTokens": { "itsm": { "hash": "sha256:…", "scopes": [ "read", "support:write" ] } }
|
||||
```
|
||||
|
||||
og oprettes med `SQLInsight.Web.exe new-api-token itsm --scope read,support:write`. Windows-brugere med adgang til webbrugerfladen må det samme som i webbrugerfladen.
|
||||
og oprettes med `SQLInsight.Web.exe new-api-token itsm --scope read,support:write`. Windows-brugere med adgang til webbrugerfladen må det samme som i webbrugerfladen. Scopes: `read`, `support:write` (supportsager) og `config:write` (hvilke servere og databaser der overvåges; for Windows-brugere kræver det medlemskab af `SQLInsight:Web:AdminGroups`).
|
||||
|
||||
PowerShell:
|
||||
|
||||
|
|
|
|||
87
docs/servere-og-databaser.md
Normal file
87
docs/servere-og-databaser.md
Normal file
|
|
@ -0,0 +1,87 @@
|
|||
# Servere og databaser
|
||||
|
||||
Fra version 1.3 tilmeldes SQL Servere i webbrugerfladen: **Overvågning → Servere og databaser**. Man tilføjer en server, agenten tester forbindelsen og finder alle de databaser, den kan se, og man sætter flueben ved dem, der skal overvåges. Alt kan også gøres gennem API'et (se [nedenfor](#api)).
|
||||
|
||||
## Hvem må ændre opsætningen
|
||||
|
||||
Alle med adgang til webbrugerfladen kan **se** opsætningen. Kun medlemmer af en gruppe i `SQLInsight:Web:AdminGroups` kan **ændre** den:
|
||||
|
||||
```json
|
||||
"SQLInsight": {
|
||||
"Web": {
|
||||
"AllowedGroups": [ "DOMÆNE\\SQL-Brugere" ],
|
||||
"AdminGroups": [ "DOMÆNE\\SQL-Admins" ]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Er `AdminGroups` tom, kan ingen ændre noget i webbrugerfladen; siden viser så, hvor gruppen sættes. Genstart tjenesten `SQLInsight Web` efter en ændring.
|
||||
|
||||
## Tilføj en server
|
||||
|
||||
Angiv serveren som `server` eller `server\instans`, og eventuelt en port (så bruges porten, og SQL Server Browser er ikke nødvendig). Navnet er det, serveren hedder i SQLInsight (fund, rapporter, SQLInsight Hub); standard er servernavnet, og det kan ikke ændres bagefter.
|
||||
|
||||
- **Godkendelse:** *Windows* er standard og at foretrække: agenten forbinder med sin egen tjenestekonto, og der gemmes ingen adgangskode. *SQL-login* kan bruges, hvor Windows-godkendelse ikke er mulig.
|
||||
- **Kryptering:** *Påkrævet* er standard. *Valgfri* er kun til gamle instanser, der ikke kan TLS 1.2 (fx SQL Server 2005); agenten falder selv tilbage til ODBC-driveren for SQL Server 2000 og 2005 (se [legacy-versions.md](legacy-versions.md)).
|
||||
- **Overvåg automatisk nye databaser:** databaser, der oprettes på serveren senere, overvåges med det samme. Ellers vises de på listen og overvåges først, når de vælges.
|
||||
|
||||
**Find instanser** beder agenten spørge SQL Server Browser på en computer (UDP 1434) og, på agentens egen computer, registreringsdatabasen. Instanser, der er skjult, eller hvor en firewall blokerer, findes ikke; dem tilføjer man manuelt.
|
||||
|
||||
## Forbindelsestest og rettigheder
|
||||
|
||||
Forbindelsestesten og søgningen efter databaser udføres af **agenten**, med agentens identitet, fordi det er agenten, der forbinder i drift. Webbrugerfladen lægger en anmodning i repositoriet (`insight.AgentRequests`); agenten tager den op inden for få sekunder og skriver resultatet tilbage, og siden opdaterer sig selv, mens der ventes. Kører agenten ikke, står anmodningen som ventende og fejles efter 30 minutter med en forklaring.
|
||||
|
||||
Testen viser version, udgave, hvilken driver der blev brugt, og det login, agenten ankom som. Derefter vises hver rettighed fra [`grant-least-privilege.sql`](../db/permissions/grant-least-privilege.sql), og om agenten har den: *Har*, *Mangler* eller *Valgfri, mangler* (ALTER TRACE). Er agenten sysadmin, siges det tydeligt: det virker, men er langt mere, end den har brug for. På SQL Server 2000 kan rettighederne ikke aflæses (der er ingen `HAS_PERMS_BY_NAME`).
|
||||
|
||||
Under **Rettigheder til agentens login** står scriptet udfyldt med det rigtige login: det login, testen så, eller ellers det login, agentens konto får på serveren (en virtuel konto som `NT SERVICE\SQLInsight Agent` ankommer til en anden server som computerkontoen `DOMÆNE\COMPUTER$`). For Windows-logins opretter scriptet login'et, hvis det mangler. SQLInsight kører aldrig scriptet selv: en sysadmin kører det på instansen, og det kan køres igen uden skade.
|
||||
|
||||
## Databaser
|
||||
|
||||
Agenten finder alle databaser på serveren, når serveren tilføjes, og derefter hver time. For hver database vises tilstand, størrelse, recovery model, compatibility level, om agenten kan åbne den, og om den er en Dynamics AX-database (AX 3.0 eller 4.0 og nyere, genkendt på AX' systemtabeller som AX-reglerne). Søgningen læser kun metadata og skifter aldrig database.
|
||||
|
||||
Valget styrer de **databasespecifikke** tjek: indstillinger, backup, CHECKDB, VLF'er, indexes, Query Store og community-regler. Instansdækkende målinger (ventetyper, CPU, blokeringer, job, fejllog, rettigheder) gælder altid hele instansen, og systemdatabaserne (master, model, msdb, tempdb) overvåges altid. Fravælges en database, løses dens åbne fund ved næste runde.
|
||||
|
||||
### Dynamics AX-fund og SQLInsight Hub
|
||||
|
||||
AX-fund sendes som standard **ikke** til SQLInsight Hub. Kolonnen *AX-fund til SQLInsight Hub* slår det til for én AX-database ad gangen. Det har kun betydning, når deling med hubben er slået til (`SQLInsight:Hub:Enabled`, se [databehandling.md](databehandling.md)).
|
||||
|
||||
## Servere fra konfigurationsfilen
|
||||
|
||||
Servere under `SQLInsight:Instances` i agentens `appsettings.json` eller `sqlinsight.ini` (fx `MONITOR_SERVER` fra installeren) virker som før: ved hver start spejler agenten dem ind i repositoriet, hvor de vises som **fra konfigurationsfil**. Forbindelsen (og en eventuel adgangskode) bliver i filen; den kopieres aldrig til repositoriet. Her kan de sættes på pause, og databaserne kan vælges, men de rettes og fjernes i filen. Som standard overvåges alle deres databaser, også nye, præcis som i 1.2. Bruges samme navn både i filen og i webbrugerfladen, vinder filen.
|
||||
|
||||
Ændringer i webbrugerfladen (nye servere, pause, fjernelse, valg af databaser) bruges af agenten inden for et minut, uden genstart. Ændringer i konfigurationsfilen kræver stadig en genstart af agenten.
|
||||
|
||||
## SQL-login-adgangskoder
|
||||
|
||||
En adgangskode krypteres i webbrugerfladen, i det øjeblik den modtages, med **agentens offentlige nøgle** (RSA-OAEP-SHA256 om en AES-256-GCM-nøgle). Kun agenten har den private nøgle, så hverken webbrugerfladen, API'et eller nogen, der kan læse repositoriet, kan få adgangskoden tilbage. Den vises aldrig igen og returneres aldrig af API'et (kun `hasPassword`).
|
||||
|
||||
- Agentens nøglepar ligger i `C:\ProgramData\SQLInsight\keys`, beskyttet med DPAPI (LocalMachine) og en mappe, kun SYSTEM, Administrators og agentens konto har adgang til. Den offentlige nøgle står i `insight.AgentKeys`.
|
||||
- Den krypterede adgangskode er bundet til server, port og login. Ændres en af dem, skal adgangskoden indtastes igen, så den aldrig kan sendes til en anden server, end den blev indtastet til.
|
||||
- Geninstalleres agentens server (eller slettes nøglen), laves en ny nøgle. Gemte adgangskoder kan så ikke længere bruges; siden viser det, og de indtastes igen. Windows-godkendelse berøres ikke.
|
||||
|
||||
Hvorfor ikke ASP.NET Data Protection eller DPAPI alene: agent og web kan ligge på forskellige servere og køre som forskellige konti, og webbrugerfladen skal aldrig kunne læse en adgangskode. Med et nøglepar har webbrugerfladen kun den offentlige nøgle.
|
||||
|
||||
## Rettigheder i repositoriet
|
||||
|
||||
Webbrugerfladens login har stadig kun `db_datareader` og ellers præcis det, den skal bruge: `INSERT` på `insight.ConfiguredInstances` og `insight.AgentRequests` og `UPDATE` på navngivne kolonner af `insight.ConfiguredInstances` og `insight.ConfiguredDatabases` (migrering 0016). Den kan ikke slette (en server fjernes ved at markere den), ikke ændre navn eller kilde, og ikke skrive det, agenten registrerer. SQLInsight skriver aldrig til de overvågede databaser.
|
||||
|
||||
## API
|
||||
|
||||
Alt på siden findes i API v1 (se [integration.md](integration.md#json-api)). Læsning kræver scope `read`; ændringer kræver scope `config:write` for tokens eller medlemskab af `AdminGroups` for Windows-brugere. Opret et token med `SQLInsight.Web.exe new-api-token automation --scope read,config:write`.
|
||||
|
||||
| Endpoint | |
|
||||
|---|---|
|
||||
| `GET /api/v1/monitored-instances` | Overvågede servere |
|
||||
| `POST /api/v1/monitored-instances` | Tilføj (body: `name`, `server`, `port`, `authentication` = `Windows`/`SqlLogin`, `userName`, `password`, `encryption`, `trustServerCertificate`, `monitorNewDatabases`). Svar `201` med `connectionTestRequestId` |
|
||||
| `GET /api/v1/monitored-instances/{id}` | Én server |
|
||||
| `PATCH /api/v1/monitored-instances/{id}` | `paused`, `monitorNewDatabases` |
|
||||
| `PUT /api/v1/monitored-instances/{id}/connection` | Ret forbindelsen (kun servere fra webbrugerfladen) |
|
||||
| `DELETE /api/v1/monitored-instances/{id}` | Stop overvågningen; det indsamlede bevares. `409` for servere fra konfigurationsfilen |
|
||||
| `POST /api/v1/monitored-instances/{id}/connection-test` | Test forbindelsen fra agenten (`202` med anmodningens id) |
|
||||
| `GET /api/v1/monitored-instances/{id}/connection-test` | Seneste test med `missingPermissions` |
|
||||
| `POST /api/v1/monitored-instances/{id}/discovery` | Søg efter databaser (`202`) |
|
||||
| `GET /api/v1/monitored-instances/{id}/databases` | Fundne databaser og valg |
|
||||
| `PUT /api/v1/monitored-instances/{id}/databases` | `{ "monitorNewDatabases": true, "databases": [ { "name": "AX30", "monitored": true, "sendDynamicsAxToHub": false } ] }`. Databaser, der ikke nævnes, beholder deres valg |
|
||||
| `GET /api/v1/monitored-instances/{id}/grant-script` | GRANT-scriptet til agentens login |
|
||||
| `POST /api/v1/instance-discovery` | Find instanser på en computer (`{ "host": "sql01" }`, tom = agentens egen) |
|
||||
| `GET /api/v1/agent-requests/{id}` | Status (`Pending`, `Running`, `Done`, `Failed`) og resultat af en anmodning |
|
||||
|
|
@ -53,7 +53,7 @@
|
|||
"ResolvedFindingDays": 365
|
||||
},
|
||||
"Instances": [
|
||||
// Eksempel (se docs/installation.md):
|
||||
// Servere tilføjes nemmest i webbrugerfladen (Servere og databaser). Her kan de også stå, fx (se docs/installation.md):
|
||||
// { "Name": "prod-sql01", "Server": "sql01.domæne.local", "Authentication": "Windows", "Provider": "Auto", "Encryption": "Mandatory" }
|
||||
]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -24,6 +24,7 @@ public sealed class DocsService
|
|||
("rapporter", "Driftsrapport til ledelse og revision som PDF, også som månedlig mail."),
|
||||
("analyse", "Hvad skete der i et bestemt tidsrum: belastning, ventetider mod normalen, tungeste forespørgsler, blocking og deadlocks."),
|
||||
("regler", "Skriv egne regler i SQL, og bidrag med community-regler."),
|
||||
("servere-og-databaser", "Tilmeld servere i webbrugerfladen, vælg databaser, test forbindelsen og få GRANT-scriptet."),
|
||||
("support", "Opret supportsager hos SEOSoft fra webbrugerfladen og følg deres status."),
|
||||
("databehandling", "Hvilke data der behandles, hvor de ligger, og hvad der deles."),
|
||||
("legacy-versions", "SQL Server 2000, 2005 og 2008: hvad der kan måles, og hvordan der forbindes."),
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@
|
|||
"Web": {
|
||||
"Authentication": "Windows",
|
||||
"AllowedGroups": [],
|
||||
"AdminGroups": [],
|
||||
"TimeZone": "Europe/Copenhagen"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue