# 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.