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
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
76 lines
5 KiB
Markdown
76 lines
5 KiB
Markdown
# 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.
|