sqlinsight-pro/docs/regler.md
Claude 7f640e74e5
Some checks are pending
CI / Build og unit tests (push) Waiting to run
CI / Integration (mcr.microsoft.com/mssql/server:2017-latest) (push) Blocked by required conditions
CI / Integration (mcr.microsoft.com/mssql/server:2019-latest) (push) Blocked by required conditions
CI / Integration (mcr.microsoft.com/mssql/server:2022-latest) (push) Blocked by required conditions
CI / Integration (mcr.microsoft.com/mssql/server:2025-latest) (push) Blocked by required conditions
Fase 4: community and local rules written as SQL
Rules can now be data: a JSON file with one read-only SELECT where every
row is a finding, with {column} templates, server or per-database scope,
minimum version, sensitive columns and references. Community rules live
in rules/community (reviewed via pull request), ship with every build
and with the signed rule pack; local rules are read from the agent's
data folder every five minutes. Queries are checked for anything that
could write, run with the least-privilege login, and a missing
permission makes the rule not measurable rather than failing. The
rule engine picks up catalog changes without a restart. Authors get
'rules validate' and 'rules test --instance'. Four example community
rules (sa active, orphaned database owners, default trace off,
untrusted foreign keys).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E3EExwndy8Z22EK2Qpt6BK
2026-09-29 10:23:01 +00:00

76 lines
5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Egne regler og community-regler
De indbyggede regler er skrevet i C#. Derudover kan regler skrives som **data**: en skrivebeskyttet SQL-forespørgsel, hvor hver række, den returnerer, bliver til et fund. Det kræver ingen programmering og ingen ny version af SQLInsight Pro.
| | Community-regler | Lokale regler |
|---|---|---|
| Id | `COM-OMRÅDE-123` | `LOCAL-OMRÅDE-123` |
| Hvor | `rules/community/` i repositoriet | `rules`-mappen i agentens datamappe (`%ProgramData%\SQLInsight\rules` eller `/var/lib/sqlinsight/rules`) |
| Hvem | Alle, via pull request. Reviewes før de kommer med | Kunden selv, fx interne standarder |
| Levering | Følger med hver version og med den signerede regelpakke | Læses af agenten hvert 5. minut |
Fundene vises, sendes (notifikationer, Hub, API) og indgår i rapporter som alle andre fund. Forklaringen afsluttes med "(Community-regel af …)" eller "(Lokal regel.)", så det er tydeligt, hvor reglen kommer fra.
## Format
Én regel eller en liste af regler pr. `.json`-fil. Kommentarer (`//`) og afsluttende kommaer er tilladt.
```json
{
"id": "LOCAL-SEC-001",
"title": "Login'et sa er aktivt",
"severity": "Medium",
"scope": "Server",
"minimumVersion": "10.0",
"query": "SELECT name AS [login] FROM sys.sql_logins WHERE principal_id = 1 AND is_disabled = 0",
"subject": "login: {login}",
"findingTitle": "Det indbyggede login '{login}' er aktivt",
"explanation": "sa er det login, angribere prøver først …",
"recommendation": "Deaktivér sa: ALTER LOGIN [sa] DISABLE …",
"evidence": [ "login" ],
"sensitiveColumns": [ "login" ],
"references": [ { "title": "Choose an authentication mode", "url": "https://learn.microsoft.com/…" } ],
"author": "Dit navn"
}
```
| Felt | |
|---|---|
| `id` | `COM-` eller `LOCAL-`, et område på 2–10 store bogstaver og tre cifre |
| `title` | Reglens navn, som det vises i reglistingen |
| `severity` | `Info`, `Low`, `Medium`, `High` eller `Critical` |
| `scope` | `Server` (køres én gang i master) eller `Database` (køres i hver online brugerdatabase; kolonnen `database` tilføjes automatisk) |
| `minimumVersion` | Ældste SQL Server-version, forespørgslen virker på: `9.0` = 2005 (standard), `10.0` = 2008, `11.0` = 2012, `13.0` = 2016, `14.0` = 2017, `15.0` = 2019, `16.0` = 2022. På ældre versioner er reglen "ikke målbar" |
| `query` | Én `SELECT` (eller `WITH … SELECT`). Hver række er et fund. Højst 100 rækker pr. regel |
| `subject` | Hvad fundet handler om. Bruges til at genkende det samme fund fra gang til gang. Standard: første kolonnes værdi |
| `findingTitle`, `explanation`, `recommendation` | Teksterne. `{kolonne}` erstattes med rækkens værdi |
| `evidence` | Kolonner, der vises som målinger. Standard: alle |
| `sensitiveColumns` | Kolonner med kundedata (logins, værtsnavne, forespørgselstekst). De sendes ikke til Hub, medmindre kunden har slået det til, og vises som `[udeladt]` i API'et |
| `references`, `author` | Valgfri |
## Sikkerhed
Forespørgslen skal være én `SELECT` og må ikke indeholde fx `INSERT`, `UPDATE`, `DELETE`, `EXEC`, `INTO`, `DROP`, `ALTER`, `DBCC`, `OPENROWSET`, `WAITFOR` eller `sp_`/`xp_`-procedurer. Det er et ekstra værn. Det egentlige værn er, at agentens login kun har læserettigheder (`db/permissions/grant-least-privilege.sql`). Mangler login'et en rettighed, som reglen kræver, vises reglen som "ikke målbar" med SQL Servers fejlbesked. En forespørgsel med fejl vises som "fejl" og påvirker ikke de andre regler.
Hold forespørgslerne lette: de køres hvert 15. minut på hver instans (og i hver database for `Database`-regler) med en timeout på 30 sekunder.
## Afprøv en regel
```powershell
# Kontrollér format og forespørgsel, uden at forbinde
& "C:\Program Files\SQLInsight\Agent\SQLInsight.Agent.exe" rules validate C:\regler\sa.json
# Kør den mod en instans fra appsettings.json, med agentens rettigheder, og se fundene
& "C:\Program Files\SQLInsight\Agent\SQLInsight.Agent.exe" rules test C:\regler\sa.json --instance prod-sql01
```
Når reglen virker, kopieres filen til `rules`-mappen i agentens datamappe. Den tages i brug inden for 5 minutter. En regel slås fra med `SQLInsight:CustomRules:Disabled` (liste af id'er). Community-reglerne kan slås helt fra med `SQLInsight:CustomRules:Community: false`.
## Bidrag med en community-regel
1. Læg reglen i en fil under `rules/community/` (en fil pr. område, fx `security.json`). Id'et er `COM-OMRÅDE-nnn`; tag næste ledige nummer.
2. Afprøv den med `rules test` mod de versioner, `minimumVersion` lover. Nævn i pull requesten, hvilke versioner du har testet på.
3. Skriv forklaringen til en driftsansvarlig, der ikke er DBA: hvorfor er det et problem, hvad sker der, hvis man lader være, og hvad gør man konkret.
4. Opret en pull request på [git.seosoft.dk/seo/sqlinsight-pro](https://git.seosoft.dk/seo/sqlinsight-pro). Testen `Community_rules_in_the_repository_are_valid_and_ship_with_the_build` fanger format- og sikkerhedsfejl.
Efter review kommer reglen med i næste version og i næste regelpakke, så eksisterende installationer får den uden opdatering af programmet.