A DBA should be able to review every statement SQLInsight sends to a monitored server before granting it access. "SQL Scripts/<rule-id>.sql" holds, per rule (82 built-in, 16 community), a Danish header (what and why, how C# judges the data, thresholds with config keys, severity, exact GRANTs, versions, collector file and member) and the collector's SQL verbatim, every version variant as its own batch. "_collectors/<Collector>.sql" holds each collector's queries once. The only statement that is not strictly read-only is documented in the scripts: the deadlock collector's session temp table (#system_health). Inline SQL in the collectors moved to internal constants and Build*Sql methods (no text changed), so SqlScriptTests can check that the scripts still contain the SQL the code sends, that every rule has a script, that every collector query is registered, and that nothing writes. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
3.8 KiB
3.8 KiB
Bidrag til SQLInsight Pro
Tak fordi du vil hjælpe. De mest værdifulde bidrag er SQL Server-ekspertise: problemer du har set i produktion, hvordan de måles, og hvordan de løses. Opret dem som et issue med skabelonen Forslag til regel.
Byg og test
Du skal bruge .NET 10 SDK og, til integrationstests, Docker.
dotnet build
dotnet test --filter "Category!=Integration" # unit tests, ingen afhængigheder
dotnet test tests/SQLInsight.IntegrationTests # starter SQL Server 2022 i Docker
SQLINSIGHT_MSSQL_IMAGE=mcr.microsoft.com/mssql/server:2019-latest \
dotnet test tests/SQLInsight.IntegrationTests # anden version
Warnings behandles som fejl, og .NET-analyzers kører på niveauet latest-recommended.
Struktur
| Mappe | Indhold |
|---|---|
src/SQLInsight.Core |
Domænemodel: versioner, capabilities, findings |
src/SQLInsight.Connectivity |
Forbindelser (SqlClient + ODBC-fallback) og registrering af instansen |
src/SQLInsight.Rules |
Regelmotor og regler |
src/SQLInsight.Agent |
Windows Service / systemd-agent |
src/SQLInsight.Web |
On-prem web-UI (Fase 1) |
src/SQLInsight.Contracts |
Wire-kontrakt mellem agent og Hub |
src/SQLInsight.Hub |
Centralt API til findings, PostgreSQL (Fase 3) |
db/permissions |
Least-privilege-script til agentens login |
SQL Scripts |
Ét script pr. regel med præcis den SQL, SQLInsight kører, til gennemgang af en DBA (se SQL Scripts/README.md) |
tests/ |
Unit og integrationstests |
Sådan skriver du en regel
- Implementér
IRuleisrc/SQLInsight.Rules. Giv den et nyt, fast id (SQLI-<OMRÅDE>-<NR>). Et id genbruges aldrig. - Angiv i
RequiredCapabilitiesalt, hvad reglen kræver. Motoren rapporterer den som ikke målbar på versioner, der mangler noget. Reglen må aldrig selv returnerePassed, når den ikke har kunnet måle. - Et finding skal have evidens (de konkrete tal), forklaring (hvorfor det er et problem) og anbefaling (hvad man gør). Fix-scripts vises for brugeren og køres aldrig automatisk.
- Skriv unit tests for alle udfald: fundet, ikke fundet, grænseværdier og versioner, hvor reglen ikke kan måles.
- Registrér reglen i
BuiltInRules. - Tilføj
SQL Scripts/<id>.sqlmed den danske header (hvad, vurdering, grænser, alvor, rettigheder, versioner, collector) og collectorens SQL, ordret og med en-- Kilde:-linje pr. variant. Brug en eksisterende fil som skabelon.SqlScriptTestsfejler, hvis filen mangler, eller hvis SQL'en ikke længere er den, koden sender.
Uden C#: community-regler
Mange regler kan skrives som en SQL-forespørgsel i en JSON-fil under rules/community/. De kræver ingen C# og kan afprøves direkte mod en instans med SQLInsight.Agent rules test. Se docs/regler.md. Også en community-regel skal have sin SQL Scripts/<id>.sql med forespørgslen ordret (se fx SQL Scripts/COM-SEC-001.sql).
Queries mod overvågede servere
- De skal være read-only og kunne køre med rettighederne fra
db/permissions/grant-least-privilege.sql. Kræver de mere, skal scriptet ogLeastPrivilegeTestsopdateres i samme ændring. - De skal være billige: ingen
DETAILED-scans, grænser på antal rækker og intet, der kan tage låse på brugerdata. - Tjek, hvilke versioner DMV'en og kolonnerne findes i, og angiv det som capabilities.
- Læg SQL'en i en
internal consteller eninternal static Build…Sql-metode i collectoren, ikke inline iCollectAsync, og registrér den itests/SQLInsight.Collectors.Tests/SqlScripts/SqlScriptSources.cs. OpdatérSQL Scripts/_collectors/<Collector>.sqlog regelfilerne, der bruger collectoren.SqlScriptTestsfejler ellers.
Commits
Små, fokuserede commits med en besked, der forklarer hvorfor.