# Installation SQLInsight Pro består af to programmer, som begge installeres hos jer (on-prem): | Del | Hvad den gør | Kører som | |---|---|---| | **SQLInsight Agent** | Overvåger SQL Server-instanserne og gemmer fund i repository-databasen | Windows-tjeneste (eller systemd på Linux) | | **SQLInsight Web** | Lokalt websted, der viser fund, trends og anbefalinger | IIS-websted **eller** selvstændig Windows-tjeneste med indbygget webserver (Kestrel) | Begge bruger en **repository-database** på en SQL Server 2016+-instans, der helst ikke er en af de overvågede. > Installationstrinene er skrevet ud fra Microsofts dokumentation for ASP.NET Core-hosting. De er endnu ikke gennemtestet på en ren Windows Server. Meld gerne afvigelser tilbage som issue. ## 1. Forudsætninger - Windows Server 2016 eller nyere (eller Linux til agenten) - [.NET 10 Runtime](https://dotnet.microsoft.com/download/dotnet/10.0) på agent-serveren; **ASP.NET Core Hosting Bundle** på webserveren, hvis IIS bruges - To tjenestekonti, gerne gMSA: én til agenten og én til web-UI'et - Til SQL Server 2000: en Windows-agent med en ODBC-driver, der understøtter 2000 (se [legacy-versions.md](legacy-versions.md)) ## 2. Repository-databasen ```sql CREATE DATABASE SQLInsight; GO USE SQLInsight; CREATE LOGIN [DOMÆNE\svc-sqlinsight-agent$] FROM WINDOWS; CREATE USER [DOMÆNE\svc-sqlinsight-agent$]; ALTER ROLE db_owner ADD MEMBER [DOMÆNE\svc-sqlinsight-agent$]; -- agenten opretter og opgraderer skemaet CREATE LOGIN [DOMÆNE\svc-sqlinsight-web$] FROM WINDOWS; CREATE USER [DOMÆNE\svc-sqlinsight-web$]; ALTER ROLE db_datareader ADD MEMBER [DOMÆNE\svc-sqlinsight-web$]; -- web-UI'et læser kun ``` Agenten opretter tabellerne selv ved første start. ## 3. Rettigheder på de overvågede instanser Kør [`db/permissions/grant-least-privilege.sql`](../db/permissions/grant-least-privilege.sql) på hver instans efter at have oprettet agentens login. Agenten bliver aldrig sysadmin. ## 4. Agenten som Windows-tjeneste ```powershell 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: ```powershell sc.exe create "SQLInsight Agent" binPath= "\"C:\Program Files\SQLInsight\Agent\SQLInsight.Agent.exe\"" obj= "DOMÆNE\svc-sqlinsight-agent$" start= delayed-auto sc.exe description "SQLInsight Agent" "Overvåger SQL Server og gemmer fund i SQLInsight-repositoriet." sc.exe start "SQLInsight Agent" ``` For en gMSA angives ingen adgangskode. Loggen kan ses i Windows' Event Viewer under *Application*. ## 5a. Web-UI'et på IIS 1. Installér **ASP.NET Core Hosting Bundle** for .NET 10, og kør `iisreset`. 2. Publicér: ```powershell dotnet publish src/SQLInsight.Web -c Release -o C:\inetpub\SQLInsight ``` Publiceringen danner en `web.config` med ASP.NET Core Module (in-process). 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"]`. ## 5b. Web-UI'et som selvstændig Windows-tjeneste (uden IIS) Web-UI'et har sin egen webserver (Kestrel) og kan køre som tjeneste på en server uden IIS. ```powershell dotnet publish src/SQLInsight.Web -c Release -r win-x64 --self-contained false -o "C:\Program Files\SQLInsight\Web" ``` Tilføj et HTTPS-endpoint i `appsettings.json` med et certifikat fra maskinens certifikatlager: ```json "Kestrel": { "Endpoints": { "Https": { "Url": "https://*:8443", "Certificate": { "Subject": "sqlinsight.domæne.local", "Store": "My", "Location": "LocalMachine" } } } } ``` Opret tjenesten og en SPN, så Kerberos-login virker: ```powershell sc.exe create "SQLInsight Web" binPath= "\"C:\Program Files\SQLInsight\Web\SQLInsight.Web.exe\"" obj= "DOMÆNE\svc-sqlinsight-web$" start= delayed-auto setspn -S HTTP/sqlinsight.domæne.local DOMÆNE\svc-sqlinsight-web$ sc.exe start "SQLInsight Web" ``` Åbn porten i Windows Firewall for de brugere, der skal se UI'et. ## Notifikationer Agenten kan give besked om nye og løste fund, og når en instans ikke kan nås. Det sættes op under `SQLInsight:Notifications` i agentens `appsettings.json`: | Kanal | Opsætning | |---|---| | E-mail | `Email:Enabled`, `Host`, `Port`, `Security` (`StartTls`, `SslOnConnect` eller `None`), `From`, `To`, eventuelt `UserName`/`Password` | | Microsoft Teams | Opret i Teams et workflow "Post to a channel when a webhook request is received", og sæt URL'en i `Teams:WebhookUrl` | | Webhook | `Webhook:Url` og eventuelt `Secret`. Så har hver request headeren `X-SQLInsight-Signature: sha256=` | Hver kanal har sin egen `MinSeverity` (standard: `High` til e-mail og Teams, `Medium` til webhook). En instans, der ikke kan nås, meldes altid. Sæt `WebUrl` til adressen på SQLInsight Web, så beskederne linker direkte til fundet. `MaxMessagesPerHour` begrænser antallet af beskeder pr. kanal. ## Azure SQL Managed Instance Tilføj instansen som en almindelig instans. Log ind med Microsoft Entra ID: ```json { "Name": "mi-prod", "Server": "mi-prod.abc123.database.windows.net", "Authentication": "EntraManagedIdentity" } ``` Mulighederne er `EntraManagedIdentity` (agentens managed identity; `UserName` kan være client id for en user-assigned identity), `EntraServicePrincipal` (`UserName` = client id, `Password` = secret, `TenantId`) og `EntraDefault`. Opret login'et med `CREATE LOGIN [navn] FROM EXTERNAL PROVIDER`, og kør derefter `grant-least-privilege.sql`. På Managed Instance håndterer Azure backup, patching, filer, tempdb og hukommelse. De regler vises derfor som "Håndteres af Azure" og ikke som fund. MI-understøttelsen er bygget ud fra Microsofts dokumentation, men er endnu ikke testet mod en rigtig Managed Instance. ## Linux (systemd) Begge programmer understøtter systemd (`Type=notify`). Windows-login på Linux kræver en Kerberos keytab; se Microsofts dokumentation for Negotiate-autentificering på Linux. ## Opdatering Se [opdatering.md](opdatering.md): regelpakken opdateres automatisk, og nye versioner kan installeres med `SQLInsight.Agent update apply` eller automatisk af en planlagt opgave. Manuelt: stop tjenesten (eller app poolen), kopiér de nye filer ind uden at overskrive `appsettings.json`, og start igen. Agenten opgraderer repository-skemaet selv.