Security review pack
SecurityInsight -- Security review pack
| Product | SecurityInsight |
|---|---|
| Version | 3.0.79 |
| Date | |
| Published at | invardia.com/products/securityinsight/security/ |
| Questions | info@invardia.com |
This pack is for the CISO and the security team who must approve SecurityInsight Pro before it is installed. It describes SecurityInsight 3.0 and its security design, not one customer's environment.
1. Architecture
SecurityInsight turns your Microsoft security data into one ranked list of what to fix first: every asset in Defender XDR, Entra ID and Azure is profiled, merged into one configuration item (CI) per real asset, given a privilege tier, and every finding is scored by consequence, probability and the business criticality of the asset it sits on. It runs entirely in your own Azure subscription, in a resource group you choose. Invardia does not host the product, your data or its runtime.
Components (all in your subscription)
- Engine jobs -- Azure Container Apps jobs: the collections (endpoint, identity, Azure, public IP, the privilege-tier classifier), correlation (the CI build), Risk Analysis, the data sync, the connectors (vulnerability close-loop, CMDB hand-off, ServiceNow), verification and data health, asset tagging (opt-in), and the pipeline job that runs them in order every day.
- Web app -- an ASP.NET Core Container App: findings, collection views, tier board, exemptions, management views, settings, access, jobs, guards, data health.
- MCP server -- a separate Container App that answers MCP clients with the same curated read-only tools as the web app's chat, to callers that present an Entra token with a SecurityInsight app role.
- Updater job -- pulls signed releases from Invardia, builds the image inside your registry, applies the database changes, rolls the jobs and apps, verifies and rolls back.
- Azure SQL -- the Pro database (settings and their history, templates, exemptions, access, the CIs, vulnerability state, the copies of findings the web app reads) and the identity ledger (object identifiers only). Entra-only authentication, Standard tier.
- Log Analytics workspace -- the SecurityInsight tables (profiles, Risk Analysis, trend, run health), the container logs and the SQL audit.
- Key Vault -- the licence, the install key, connector secrets and optional keys (Azure OpenAI, Shodan, SMTP). Purge protection on.
- Storage account and container registry -- run logs, staging and the work queue; the image built in your subscription. Shared-key access and the registry's admin user are off.
What Invardia hosts
- invardia.com: the guided install's wizard, the standalone setup scripts, the documentation, licences, the signed update manifests and releases, and the receiver of the status reports (chapter 4). None of these is needed for the product to keep running: the engines run without any call to Invardia.
- Invardia never hosts your directory data, your findings, your database or your runtime.
Network exposure options
- The web app: from the internet behind Entra sign-in (add Conditional Access), or from your network only (internal ingress). Your choice at install. Every page except a health probe requires a signed-in user with an app role.
- The network shape is your choice at install. *Public* (the default): Entra-only public endpoints for SQL, Key Vault, storage and the registry; the SQL server admits Azure services, because a Container Apps environment without a virtual network has no fixed outbound address, and accepts Entra identities only. *Private*: the guided install builds a virtual network with private endpoints and private DNS for SQL, Key Vault, storage and the registry, turns public network access off and makes the web app internal.
- Outbound only. Nothing connects in to your environment. The engines call Microsoft Graph, Defender, Azure Resource Manager and Log Analytics, optionally your Azure OpenAI resource and Shodan, and -- the updater only -- Invardia's update and licence endpoints.
The design rules a reviewer can hold us to
- Read only towards your tenant; the one writer (asset tagging) has its own identity and writes only after you switch writing on.
- One identity per role; no secrets in settings; no identity shared between components with different jobs.
- The engine is one-way: the web app writes requests, the engine pulls and verifies them before it acts.
- Damage that does not heal is stopped before it happens (guards), and nothing leaves SecurityInsight while its own data is not healthy.
2. Identities
Every identity SecurityInsight creates or uses. No runtime identity holds a secret or a certificate. Installs made before the current naming keep their names (Azure cannot rename a managed identity); the earlier name is given in brackets.
| Identity | Kind | Purpose | Credential | Lifetime |
|---|---|---|---|---|
| id-si-engine (earlier: id-si-<ring>-<edition>-<hosting>) | User-assigned managed identity | Every engine job: collection, correlation, Risk Analysis, data sync, connectors, verification, data health, the pipeline | None (managed identity) | As long as the install |
| id-si-web (earlier: uami-si-management) | User-assigned managed identity | The web app: reads the database, writes people's decisions, starts named jobs | None (managed identity) | As long as the install |
| id-si-mcp (earlier: uami-si-mcp) | User-assigned managed identity | The MCP server: read-only answers | None (managed identity) | As long as the install |
| id-si-updater (earlier: uami-si-updater) | User-assigned managed identity | The updater: licence, signed releases, image build, database schema, rolling the jobs | None (managed identity) | As long as the install |
| id-si-tagging (earlier: uami-securityinsight-tagging) | User-assigned managed identity | Asset tagging, opt-in; the only identity that writes to your tenant | None (managed identity) | Until asset tagging is removed |
| Templates job identity | User-assigned managed identity | Writes the template tables only, so the engine role carries no template writes | None (managed identity) | As long as the install |
| SecurityInsight (earlier display name: SecurityInsight Management) | Entra app registration and enterprise application | Users' sign-in to the web app; bearer tokens for the MCP server. App roles SuperAdmin, Admin, Reader, Wallboard, Department. Assignment required. | No secret, no certificate: the web app's managed identity is its federated credential | As long as the install |
| grp-si-sql-admins (shown as SecurityInsight SQL admins) | Role-assignable Entra security group | The SQL server's Entra administrator. After setup it holds the Invardia Support app only (when you chose support) or no one. People get in just in time, for example through PIM for Groups. | n/a | As long as the install |
| Invardia Support | Entra app registration you create in your tenant | Optional vendor support at a level you choose (chapter 5) | A client secret stored at Invardia, renewed under your control in Invardia's customer portal | Until you disable or remove it |
| The person who installs | Your own account | Runs the guided install; becomes the first SuperAdmin of the web app | Your sign-in (browser, your MFA and Conditional Access) | A member of the SQL admin group only for the length of the install |
| Break glass | Classification, not an identity | SecurityInsight creates no break-glass account. It recognises your break-glass accounts in its analysis so they are reported as such, never as ordinary findings. | n/a | n/a |
3. Permissions with justification
Every permission, where it is held, why, and what stops working without it. The engines check their own permissions at the start of every run: a missing one is shown in Get Started > Permissions and on the run's health record with the command that fixes it, and every other part of the run goes on.
Least-privilege alternatives considered
- Defender for Endpoint Machine.ReadWrite.All on the engine -- refused: collection is read only (Machine.Read.All). Tag writes belong to asset tagging's own identity, opt-in.
- A tenant-wide Microsoft Graph Mail.Send -- refused: SecurityInsight sends from one shared mailbox with Exchange RBAC for Applications scoped to that mailbox, and the setup script removes a tenant-wide Mail.Send it finds.
- Reader at the tenant root -- not the default: the guided install defaults to one subscription; a management group or the tenant root only when you choose it.
- db_datareader / db_datawriter / db_owner on the whole database -- replaced by one custom role per component (chapter 7).
- db_securityadmin on the updater -- replaced by EXECUTE on one certificate-signed grant procedure.
- Container Apps Jobs Contributor on the web app -- replaced by Container Apps Jobs Operator on the named jobs: the web app can start a job but never change it.
- A client secret for the web app's sign-in -- replaced by a federated credential (the web app's managed identity).
| Identity | Type | Permission | Scope | Why it is needed | What breaks without it | Optional |
|---|---|---|---|---|---|---|
| id-si-engine | Microsoft Graph application permission | User.Read.All | Tenant (read only) | Every user, its account state and attributes | Identity profiling and every user report | No |
| id-si-engine | Microsoft Graph application permission | Group.Read.All | Tenant (read only) | Groups and transitive members, for privilege tiers and ownership | Group-based privilege tiers | No |
| id-si-engine | Microsoft Graph application permission | Directory.Read.All | Tenant (read only) | Directory objects, deleted objects, the tenant's name | Object resolution; the tenant name in the header | No |
| id-si-engine | Microsoft Graph application permission | Device.Read.All | Tenant (read only) | Entra-registered and joined devices | Device identities in the CI build | No |
| id-si-engine | Microsoft Graph application permission | Application.Read.All | Tenant (read only) | Applications, service principals, app role assignments, consent grants | Application and service principal risk | No |
| id-si-engine | Microsoft Graph application permission | AuditLog.Read.All | Tenant (read only) | Last sign-in and authentication-method registration reports | Stale-account and MFA findings | No |
| id-si-engine | Microsoft Graph application permission | Policy.Read.All | Tenant (read only) | The policies that protect an identity, as risk factors | Policy-based risk factors | No |
| id-si-engine | Microsoft Graph application permission | RoleManagement.Read.All, RoleManagement.Read.Directory | Tenant (read only) | Directory role assignments | Privilege tiers of identities | No |
| id-si-engine | Microsoft Graph application permission | RoleManagementPolicy.Read.Directory, RoleEligibilitySchedule.Read.Directory, RoleAssignmentSchedule.Read.Directory | Tenant (read only) | Eligible and active PIM roles and their policies | PIM-aware privilege tiers | No |
| id-si-engine | Microsoft Graph application permission | PrivilegedAccess.Read.AzureADGroup | Tenant (read only) | PIM for Groups | Group-based just-in-time access in the tiers | No |
| id-si-engine | Microsoft Graph application permission | IdentityRiskyUser.Read.All, IdentityRiskEvent.Read.All, IdentityRiskyServicePrincipal.Read.All | Tenant (read only) | Identity risk | Identity-risk factors | No |
| id-si-engine | Microsoft Graph application permission | ThreatHunting.Read.All | Tenant (read only) | Advanced hunting through Graph: Defender device tables and the Exposure Graph | Endpoint profiling and most Risk Analysis reports | No |
| id-si-engine | Microsoft Graph application permission | UserAuthenticationMethod.Read.All | Tenant (read only) | Which accounts are passwordless-only | That detail of identity findings | No |
| id-si-engine | Microsoft Graph application permission | DeviceManagementManagedDevices.Read.All | Tenant (read only) | Intune serial numbers and MAC addresses | Those asset details | No |
| id-si-engine | Microsoft Graph application permission | DeviceManagementConfiguration.Read.All | Tenant (read only) | Compliance policies a device does not meet; its update ring | Those asset details | No |
| id-si-engine | Microsoft Graph application permission | AccessReview.Read.All | Tenant (read only) | The last access review of a privileged role, group or application | That detail of privileged findings | No |
| id-si-engine | Microsoft Graph application permission | SecurityAlert.Read.All | Tenant (read only) | Open alerts per device | Alert context on devices | No |
| id-si-engine | Microsoft Threat Protection application permission | AdvancedHunting.Read.All | Tenant (read only) | Advanced hunting queries for Risk Analysis | Risk Analysis reports | No |
| id-si-engine | Defender for Endpoint application permission | Machine.Read.All | Tenant (read only) | The device list (never Machine.ReadWrite.All) | Endpoint collection | No |
| id-si-engine | Defender for Endpoint application permission | Vulnerability.Read.All | Tenant (read only) | Exploit details of a CVE | That detail of vulnerability findings | No |
| id-si-engine | Defender for Endpoint application permission | SecurityRecommendation.Read.All | Tenant (read only) | Exposure impact and active alert of a recommendation | That detail of recommendation findings | No |
| id-si-engine | Azure RBAC | Reader | One subscription (default), a management group or the tenant root group -- your choice | Enumerate Azure resources (Resource Graph) | Azure collection | No |
| id-si-engine | Azure RBAC | Log Analytics Reader | SecurityInsight's workspace; your Sentinel / Defender workspace when named | Query the SecurityInsight tables and sign-in logs | Risk Analysis, trend, correlation | No (the Sentinel workspace is optional) |
| id-si-engine | Azure RBAC | Monitoring Metrics Publisher | The resource group of SecurityInsight's data collection rules | Send rows to Log Analytics | Every table write | No |
| id-si-engine | Azure RBAC | Storage Blob, Queue and Table Data Contributor | SecurityInsight's storage account | Run logs, staging, the work queue | Runs in parts; run logs | No |
| id-si-engine | Azure RBAC | AcrPull | SecurityInsight's registry | Pull the image (no registry password) | Every job | No |
| id-si-engine | Azure RBAC | Key Vault Secrets User | SecurityInsight's Key Vault | The licence and the keys of switched-on features | Pro features; optional features | No |
| id-si-engine | Azure RBAC | Container Apps Jobs Contributor | The install's resource group | The pipeline starts its steps and gives a job stopped at its run limit the longest limit | The daily pipeline | No |
| id-si-engine | SQL role | si_engine | The Pro database | Schema rights where the engine owns the data, object rights elsewhere, a DENY on Admin overrides; no DDL or security right | Every Pro engine | No |
| id-si-engine | Exchange RBAC for Applications | Application Mail.Send | One shared mailbox (a management scope) | Send SecurityInsight's mail as that mailbox only | Mail (an SMTP relay is the alternative) | Yes |
| id-si-web | Azure RBAC | AcrPull | SecurityInsight's registry | Pull its image | The web app | No |
| id-si-web | Azure RBAC | Log Analytics Reader | SecurityInsight's workspace | The jobs' console logs on the Jobs page | Job logs in the web app | No |
| id-si-web | Azure RBAC | Container Apps Jobs Operator | The named SecurityInsight jobs | Run now (start a job); never change a job | Run now | No |
| id-si-web | Azure RBAC | Cognitive Services OpenAI User | Your Azure OpenAI resource | The chat | The chat | Yes |
| id-si-web | Azure RBAC | Key Vault Secrets User | SecurityInsight's Key Vault | The magic-link signing key | Magic links (off by default) | Yes |
| id-si-web | Microsoft Graph application permission | GroupMember.Read.All, User.ReadBasic.All | Tenant (read only); not granted by setup | The searchable people picker on the admin pages | Only the picker (addresses can be typed) | Yes |
| id-si-web | SQL roles | si_web, si_audit_writer | The Pro database | Read the views; write only the tables people's decisions go to; add audit rows | The web app | No |
| id-si-mcp | Azure RBAC | AcrPull, Log Analytics Reader | SecurityInsight's registry and workspace | Pull its image; answer questions on the reports | The MCP server | Yes (the MCP server is optional) |
| id-si-mcp | SQL role | si_mcp | The Pro database | Read what its tools serve; never the web app's sign-in keys | The MCP server | Yes |
| id-si-updater | Azure RBAC | Contributor | The install's resource group and registry | Build the image in your registry, roll the jobs and apps, raise job and database sizes, turn Key Vault purge protection on (one-way) | Updates | No |
| id-si-updater | Azure RBAC | Key Vault Secrets Officer | SecurityInsight's Key Vault | Keep the licence, the install key, the update state; store secrets the web app hands over | Licence renewal, updates | No |
| id-si-updater | Azure RBAC | Key Vault Crypto Officer | SecurityInsight's Key Vault | The non-exportable key of the secret hand-over | Pasting a secret in the web app | No |
| id-si-updater | SQL role | si_updater | The Pro database | DDL to apply a release's schema; EXECUTE on the signed grant procedure; no security right | Database changes of a release | No |
| id-si-updater | Microsoft Graph application permission | PrivilegedAssignmentSchedule.ReadWrite.AzureADGroup, PrivilegedAssignmentSchedule.Read.AzureADGroup, RoleManagementPolicy.Read.AzureADGroup, GroupMember.Read.All, Application.Read.All | Tenant; the write right is used only on SecurityInsight's SQL admin group (role-assignable); granted by setup, never by the updater itself | Make and renew the database setup job's active PIM-for-Groups membership of the SQL admin group, read the group's PIM policy and read the membership back; never RoleManagement.ReadWrite.Directory | The database setup job loses its database admin rights when its membership ends | No |
| id-si-tagging | Microsoft Graph application permission | ThreatHunting.Read.All, User.Read.All, Application.Read.All | Tenant (read only) | Evaluate the tagging rules | Asset tagging | Yes (opt-in) |
| id-si-tagging | Microsoft Graph application permission | CustomSecAttributeAssignment.ReadWrite.All | Tenant -- only when writing is on | Set Entra custom security attributes | Attribute writes | Yes |
| id-si-tagging | Defender for Endpoint application permission | Machine.ReadWrite.All | Tenant -- only when writing is on | Set machine tags | Machine tag writes | Yes |
| id-si-tagging | Azure RBAC | Reader; Tag Contributor only when writing is on | The tagging scope | Evaluate Resource Graph rules; set Azure resource tags | Azure tag writes | Yes |
| id-si-tagging | Azure RBAC | Log Analytics Reader, Monitoring Metrics Publisher, Storage Blob Data Contributor, AcrPull, Key Vault Secrets User | SecurityInsight's own resources | Its rules, activity rows, run log, image, licence | Asset tagging | Yes |
| SecurityInsight (sign-in app) | Delegated permissions | openid, profile, offline_access, User.Read | Signed-in user | Sign-in only | Sign-in | No |
| The person who installs | Azure RBAC | Contributor + Role Based Access Control Administrator on the resource group (or Owner on the subscription); Owner or User Access Administrator where SecurityInsight reads | Install time | Create the resources and grant the identities | Each grant you cannot make ends as a warning with the command for someone who can | No |
| The person who installs | Entra role | Privileged Role Administrator (or Global Administrator) | Install time | Grant the read-only API permissions; create the role-assignable SQL admin group | Those steps end as a warning with the command | Yes |
| Invardia Support | See chapter 5 | Per the level you choose | Your tenant | Vendor support | Support only | Yes |
4. Data
What is read
Microsoft Graph (directory, roles, PIM, identity risk, Intune device details, access reviews, alerts), Defender XDR and Defender for Endpoint (devices, advanced hunting, vulnerabilities, recommendations), Azure Resource Graph and Resource Manager (resources, Defender for Cloud assessments), your Sentinel / Defender Log Analytics workspace when named (sign-in and security logs), and optionally Shodan for your own public IP addresses. All read only (chapter 3).
What is stored, where, how long
- Log Analytics (your workspace): the profiles, Risk Analysis results, trend, run health, tag activity, container logs and the SQL audit. 90 days when setup creates the workspace; an existing workspace keeps its own retention. SecurityInsight never sets a table's retention, except the SQL audit table (at least 90 days).
- The Pro database (your subscription): settings and their history, templates and your overrides, exemptions (ended, never deleted), access mappings, the CIs, vulnerability state, the identity ledger, and the copies of findings the web app reads. Copied collections and assets no longer seen: 90 days (setting). The audit trail: forever by default, at least 13 months when you set a retention; the database refuses any other change or deletion.
- Storage (your subscription): run logs 30 days (setting), staging shards 7 days when the lifecycle rule is applied, exports until you delete them.
- Key Vault: the licence, the install key, the update state, secrets you supplied. Purge protection on.
- Azure SQL backups: Azure SQL's defaults; SecurityInsight changes none.
Encryption and residency
Everything is stored in Azure services in your subscription, in the region you chose. At rest: Azure SQL Transparent Data Encryption and storage service encryption with Microsoft-managed keys by default, or, as an option at install, customer-managed keys held in your own Key Vault. In transit: TLS on every call, HTTPS only. Storage uses Entra identities only (shared keys off); SQL uses Entra identities only.
Sent out
- To Invardia: the status reports below (on by default;
SI_Telemetry_Enabled = falseturns every report off), the licence request (product, version, the tenant from the identity's own token, an install id, optionally an edition and a contact address) and the update pull (the licence and the install key). Nothing else about your estate. - To your own outputs, only those you configure: mail, ServiceNow, your CMDB, your SQL targets, Excel and JSON files in your storage.
- To Azure OpenAI, only when you switch AI on, to your own resource.
- To Shodan, only when you switch it on: your own public IP addresses.
Deletion on uninstall
Delete the resource group: every resource, the database and the data in them go with it (a Key Vault is kept soft-deleted for its retention days, then purged by Azure). The workspace keeps data you sent to an existing workspace until its retention ends. See chapter 10.
| Record | Fields | Mode |
|---|---|---|
| Heartbeat (daily) | Product, edition, version, hosting, the kind of sign-in identity, licence state; the environment name; the guard mode, the pre-release wave and the release-mode period when they apply | Identified (install key) |
| Release-mode report (every 30 minutes for 12 hours after a release that changed engine code) | The heartbeat's fields with counts only: users, guests, devices | Identified |
| Run (every engine run) | Job, outcome, duration, the failed stage, an error class, a count; the tenant, the host and the error text shortened to 8 KB with secrets removed | Identified |
| Guard (a safety check trips) | Which check, its outcome and severity, the numbers against the limit, the held count, first and last seen; the strict and configured limit in a stricter period | Identified |
| Health (each data health cycle) | The state, the cycle, per source and per report: sampled, found, missing, mismatched, the margin and the verdict; which data-out channels are held or overridden (by role, never a person). Never a record's name, id or value. | Identified |
| Any record of an install without an install key | A random install id, no tenant, no host, no error text; counts only as ranges | Anonymous |
5. Access by the vendor
Invardia (the vendor) can reach your install only through the Invardia Support app: an app registration you create in your own tenant with Invardia's published script, at the level you choose. Without it Invardia has no access. Most installs never create it: SecurityInsight updates and repairs itself without contact.
The levels
- Troubleshoot -- read only: read-only Microsoft Graph permissions; Reader and Log Analytics Reader on SecurityInsight's resource group; Key Vault Reader (metadata, never a secret value); a read-only database role (database admin only just in time, during a support session you asked for).
- Setup -- runs SecurityInsight's setup scripts to install, repair and upgrade: Contributor on SecurityInsight's resource group with role assignment limited to the roles SecurityInsight's own identities use (to service principals only); Key Vault Secrets Officer; a read-only database role, with database admin only just in time (at most 8 hours, at most this level); the Graph permissions the setup scripts need.
The exact permission list per level is on the documentation page of Invardia's script: https://invardia.com/docs/invardia/scripts/New-InvardiaSupportApp/.
When it is used
Only when you ask for help, and for release spot checks on rings 0-2 (read only, counts only, only while your environment's switch "release spot checks allowed" is on -- on by default for rings 0-2; chapter 6).
How it is controlled and audited
- Its client secret is stored at Invardia. In Invardia's customer portal you set it Enabled or Disabled, its lifetime (1-730 days) and its renewal: Automatic (default on rings 0-2), Approval required (default on ring 3) or Off. Automatic renewal adds a new secret, proves a sign-in with it and only then removes the old one. A secret with a lifetime under 7 days is never renewed. A disabled or removed app is never renewed.
- A Conditional Access policy for this app only, blocking its sign-in from anywhere but Invardia's support address, is created with it -- switched off, for you to switch on.
- Every support session starts with a recorded reason or ticket. Every SQL statement goes through Invardia's audited call: the audit row (server, database, the statement's SHA-256, the purpose) is written before it runs. Every Azure call goes through the session's recording commands. You see them in your activity log at Invardia; the SQL audit also lands in your own workspace.
- Changes to an install are made only with SecurityInsight's published scripts, each with a plan first and a rollback record (chapter 11).
How you remove it
Grant-SISupportAccess -Remove takes SecurityInsight's part away (Key Vault role, the database user and consent, any group membership or ownership left from an earlier release); disable or remove the app in the customer portal, or delete the app registration in Entra ID.
What the vendor cannot do
Reach your install without the app; read a secret value at the Troubleshoot level; use the engine identity; change SecurityInsight's code outside a signed release; keep what it read during a spot check (counts and verdicts only).
6. Supply chain
Signed releases
- The vendor publishes each release to Invardia; Invardia signs, per update ring, a manifest that names the release and its SHA-256 (RS256).
- Your updater accepts a manifest only when its signature verifies against Invardia's update-signing public keys that ship inside SecurityInsight (a key list fetched over the network is never trusted on its own; keys are rotated by shipping old and new side by side), the product, the kind and your ring match, its sequence is not lower than the one applied, and the download's size and SHA-256 match. A failed check applies nothing.
- The image is built inside your own registry from the verified source. No prebuilt image is shipped. A failed roll goes back to the previous image.
Rings, waves and approval
- Rings 0 Dev, 1 Test, 2 Design partners, 3 Broad, in that order. SecurityInsight decides which version goes to which ring.
- A release to rings 2 and 3, and every early-release wave, needs the APPROVED state, set only by the vendor's release owner, with a reason, recorded; Invardia refuses the release without it. A setup-only release (no engine code) is the exception, shown and logged on the release.
- A version is not promoted while an install that took it turned Unhealthy (data health, chapter 7) or stopped reporting for 48 hours.
- After a release that changed engine code: 24 hours of halved safety-check limits, 12 hours of 30-minute counts to Invardia, and every changed component is Testing until 3 good daily runs.
Who can release
Only the vendor, signed in to Invardia as its publisher application with a certificate; ring 2 and 3 releases additionally need the release owner's APPROVED. Invardia relays and signs; it does not change the content.
How you pin or delay updates
Stay on ring 3 (the default) to take releases last; a release that needs a manual step is held until you accept it on the updater job; template packs that would change templates in force wait for an Admin's release, per detection method; *Pro updates from Invardia* can be switched off.
Source availability and dependencies
- The source of each release is delivered to your install (the image is built from it in your registry) and can be read there.
- No PowerShell modules and no Azure CLI in anything that ships: Azure, Graph, SQL and Log Analytics are called over REST with SecurityInsight's own code. The web app and MCP server are .NET, built in your registry.
- A software bill of materials (SBOM) comes with every signed release, so you can check every component and dependency it contains.
- Every script is listed with its SHA-256 in
SHA256SUMS.txt(chapter 11).
7. Change control and audit
In the web app
- Tier moves, documents (exclusions, weights, rules) and settings are staged and written only on Review & commit, each in one transaction with an audit row. Nothing is deleted; an exemption is ended.
- Governed exemptions: owners and approvers per security domain and per department, request -> approve / reject with a comment, standard periods, a monthly owner review, mail.
- Signed requests: a decision that leads to a change outside SecurityInsight (connector settings, exemptions, asset tagging, data-out decisions) carries the signed Entra token of the person who made it and of the approver; the engine verifies signature, issuer, audience, lifetime, user and role before it acts, and refuses what it cannot verify.
- A change a job carries out names the person who asked for it and the approver, under one correlation id from the web request to the job's rows.
The audit trail
cfg.AuditEventandcfg.ChangeLogrefuse UPDATE and DELETE to every database user (a DENY to public, enforced by the database). No runtime identity holds DDL or ownership, so it binds all of them. The one way rows leave is the retention procedure (never younger than 13 months, recorded).- SQL auditing of the server to your Log Analytics workspace, 90 days.
- Run health of every engine run, container logs and run transcripts in your workspace and storage.
Guards (safety checks)
- On by default: the CI retire brake (a run or hand-off batch is held when far more CIs would disappear than allowed; a CI retires only after 7 days unseen), the duplicates brake (a connector that could read its target only in part writes nothing), the asset-drop check, and two review checks. Every other check can be switched on.
- Integrity stops are not switchable: a database change that could remove data, a failed database update, a collection that could not be read in full.
- Guard modes: for 24 hours after a release that changed engine code, every numbered limit is halved from the configured value; a SuperAdmin may end it early with a recorded reason.
- Every event is written in plain words (what happened, why, consequence, what to do), mailed at most once a day while it repeats, shown on Operations > Guards and reported to Invardia.
Data health
Every day SecurityInsight samples 10 % (at least 50) of each source's records at random, asks the source again and compares. After three anomalous days the data is Unhealthy and every data-out channel is held (vulnerability closes, CMDB hand-off, ServiceNow, tagging, outputs) until one good cycle; a SuperAdmin can let one channel through with a recorded reason until the data is healthy again.
Undo and backup
Nothing is deleted in the web app; template releases can be rolled back per detection method; every cut-over script writes a rollback record; Azure SQL keeps its point-in-time backups (Azure defaults).
One deviation report
Every override, exemption, exclusion, disabled detection, tier move and changed setting with its owner, reason and expiry.
8. Threat model and hardening
The top risks of running SecurityInsight, the control for each, and the residual risk with the choice you have. Then a hardening checklist you can apply.
| Threat | Control | Residual risk and your choice |
|---|---|---|
| Privilege escalation through the engine identity | Read-only Graph and Defender permissions; no write permission on the tenant; Reader only where you chose; asset tagging on its own identity, writes opt-in; the least-privilege SQL role si_engine with no DDL or security right | The engine can read your whole directory and security data by design; keep the collection scope as small as your need |
| A compromised web app or web administrator | Entra sign-in with assignment required, your MFA and Conditional Access; a fixed 8-hour session with code flow and PKCE; four server-checked roles; staging and approvals; the one-way engine (the web app can start, never change, a job); signed requests verified by the engine; an append-only audit trail | An administrator signed in within the token's lifetime can act within their role; your Conditional Access decides how they sign in |
| A compromised database administrator | The admin group is a role-assignable group holding only the Support app; people enter just in time; SQL auditing records every statement to your workspace; the audit trail refuses changes to every runtime identity | The database owner is not bound by a DENY; that is why the group stays reserved and every statement is audited |
| Update tampering | Signed manifests verified against embedded keys; ring, sequence, size and SHA-256 checks; an SBOM with every release; the image built in your registry; roll-back; the APPROVED gate for rings 2-3; the health gate | Ring 3 takes releases last |
| A defective release doing mass damage | Halved guard limits for 24 hours, 30-minute counts for 12 hours, Testing / Stable per component, waves, the health gate, rings | A SuperAdmin may end the stricter period early, with a recorded reason |
| Incomplete or wrong source data closing tickets or retiring CMDB items | Absence is never remediation; failed sources are frozen; collections are complete-or-nothing; guards; data health holds every data-out channel | A SuperAdmin may let one channel through, with a recorded reason, until the data is healthy |
| Secret theft | Managed identities everywhere; no secrets in settings or environment; Key Vault with purge protection; the web app never writes a secret; registry admin user off; storage shared keys off; customer-managed keys as an option | Secrets you add for optional features (an SMTP password, an API key) live in your Key Vault |
| Misuse of vendor access | Customer-created Support app at a chosen level; customer-controlled secret state, lifetime and renewal; a Conditional Access policy for the app; audited SQL; recorded sessions; the activity log | You decide whether the app exists, its level, and when its Conditional Access policy is on |
| A privileged person running a tampered or misunderstood script | SHA256SUMS; a documentation page per script with every right and change; plan / -WhatIf first; transcripts; no second-stage downloads; save-then-run commands | Verify the signature before you run a script |
| Data leaving through the chat or MCP | Fixed read-only tools; the role decides; an Entra token with an app role on every MCP call | Magic links bypass Conditional Access by design; they are off unless you switch them on |
| Network exposure | Entra sign-in on every page; internal ingress; Entra-only SQL; outbound only; the private shape with private endpoints and public access off | The public shape admits Azure services to SQL; choose the private shape for strict networks |
| # | Action | Why |
|---|---|---|
| 1 | Choose web access from your network only, or add Conditional Access (MFA, compliant device, named locations) to the SecurityInsight enterprise application | The web app shows your security posture |
| 2 | Keep the collection scope as small as your need (one subscription is the default) | Least privilege for the engine |
| 3 | Leave asset tagging writes off unless you use them | The only tenant writes |
| 4 | Keep magic links off | They bypass Conditional Access |
| 5 | Choose the private network shape at install | Private endpoints; public network access off |
| 5a | Choose customer-managed keys at install if your policy requires your own keys | Encryption at rest under your key |
| 6 | Keep the SQL admin group empty; reach it just in time through PIM for Groups | No standing database owner |
| 7 | If you create the Invardia Support app: switch its Conditional Access policy on, choose Approval required, use short secret lifetimes, disable it when not needed | Vendor access only when you want it |
| 8 | Stay on ring 3 if you need change windows; accept manual steps deliberately | Updates on your terms |
| 9 | Review the deviation report and the guard events monthly | Overrides and exemptions do not drift |
| 10 | Set an audit-trail retention (at least 13 months) and export the workspace to long-term storage per your policy | Evidence for audits |
| 11 | Compare a downloaded script's SHA-256 with SHA256SUMS.txt and read its documentation page before you run it | Scripts run with high privilege |
| 12 | Keep the default guards on; switch on further checks you want to be told about | Damage stopped before it happens |
| 13 | Decide on status reports to Invardia (on by default; one setting turns them off) | Your data policy |
9. Compliance mapping
How SecurityInsight supports your own controls. This is support for your controls, not a certification: SecurityInsight and Invardia do not hold ISO 27001, SOC 2 or similar certification for the product.
| Framework | Control | How SecurityInsight supports it |
|---|---|---|
| ISO/IEC 27001:2022 Annex A | 5.9 Inventory of information and other associated assets | One CI per real asset across Defender, Entra ID and Azure, with owner, department and business service |
| ISO/IEC 27001:2022 Annex A | 5.15 Access control / 8.2 Privileged access rights | Privilege tiers of every identity, PIM-aware, with findings on standing and excessive privilege |
| ISO/IEC 27001:2022 Annex A | 8.8 Management of technical vulnerabilities | Every recommendation as a vulnerability, ranked by business impact; the close-loop to your ticketing with closes only on complete data |
| ISO/IEC 27001:2022 Annex A | 8.9 Configuration management | Defender for Cloud recommendations per resource; the deviation report of every override |
| ISO/IEC 27001:2022 Annex A | 5.23 Information security for use of cloud services | Runs in your own subscription; vendor access only through your Support app |
| ISO/IEC 27001:2022 Annex A | 8.15 Logging / 8.16 Monitoring activities | Append-only audit trail; SQL audit; run health; guard events; data health |
| ISO/IEC 27001:2022 Annex A | 8.32 Change management | Review & commit, approvals, signed requests, template releases per ring |
| ISO/IEC 27001:2022 Annex A | 8.20 Networks security | Public IP exposure of Tier 0/1 assets (optional Shodan) |
| NIS2 Article 21(2) | (a) Risk analysis and information system security policies | Daily risk analysis across endpoints, identities, Azure and public IPs |
| NIS2 Article 21(2) | (d) Supply chain security | Signed releases, rings with approval, builds in your registry, no module dependencies |
| NIS2 Article 21(2) | (e) Vulnerability handling | Prioritised vulnerabilities with the close-loop and exemptions with owners and expiry |
| NIS2 Article 21(2) | (i) Access control policies and asset management | Asset inventory and privilege tiers |
| CIS Controls v8 | 1 Inventory and control of enterprise assets | The CI build across sources |
| CIS Controls v8 | 5 Account management / 6 Access control management | Identity profiling, stale accounts, privilege tiers |
| CIS Controls v8 | 7 Continuous vulnerability management | Daily vulnerability ranking and close-loop |
| CIS Controls v8 | 8 Audit log management | Audit trail, SQL audit, run health in your workspace |
10. Uninstall and exit
Remove everything SecurityInsight created
- If you created the Invardia Support app: run
Grant-SISupportAccess -Remove, then remove the app with Invardia's script (-Action Remove) or delete it in Entra ID. - Delete the SecurityInsight resource group. This removes the jobs, the web app, the MCP server, the updater, the identities, the registry, the storage account, the database server with both databases, the Key Vault (kept soft-deleted for its retention days, 90 by default, then purged by Azure -- purge protection prevents an earlier purge) and a workspace setup created.
- Remove the role assignments SecurityInsight's identities had outside the resource group (Reader where it collected, Log Analytics Reader on your Sentinel workspace) -- Azure removes assignments of a deleted identity's principal, but lists them as unknown until then.
- Delete the enterprise applications' API permissions (they go with the deleted managed identities) and the sign-in app registration *SecurityInsight*.
- Delete the SQL admin group
grp-si-sql-admins. - If SecurityInsight sent mail from a shared mailbox: remove the Exchange management scope and role assignment, and the mailbox if it was created for SecurityInsight.
- If asset tagging wrote tags: they stay on your devices, resources and identities (they are yours); remove them if you want.
What remains
Data SecurityInsight wrote to an existing Log Analytics workspace stays until that workspace's retention removes it. Tickets, CMDB records and files SecurityInsight handed to your systems stay there. Invardia keeps your licence and the status reports it received under its own retention; nothing of your directory or findings.
11. Scripts
Scripts are run by highly privileged people, so every script a person runs follows the same rules:
- A documentation page per script at https://invardia.com/docs/si/scripts/<Script>/: purpose, when to run it, the rights it needs, every change it makes (create / update / grant / remove, the object, the permission and scope, why, how to undo it), its parameters, what it only reads, every host it calls, what its preview shows, how to undo the whole script, its version and SHA-256. The page shows the manifest only while it matches the published script exactly.
- Preview first: every script supports
-WhatIfor plans by default; under a preview it reads and prints what it WOULD change and writes nothing. The product's tests run every script this way with every outside call replaced and fail on any write. - A transcript of every run on the machine it ran on (no secret is ever printed or written); the last line printed is its path.
- No second download: a standalone script carries everything it runs, each part checked against its SHA-256; nothing is fetched and executed at run time.
- Save, then run -- never pipe into PowerShell. Every command shown is two lines: download the file, run it. Verification is described next to the block.
- No secrets in, no secrets out: browser sign-in or a managed identity; secret parameters are secure strings or Key Vault secret names.
- Listed: every published script is listed with its SHA-256 in
SHA256SUMS.txtnext to it. Compare the file with that list before you run it; the documentation page shows how. - Cut-over scripts for existing installs (
Set-SISecurityBaseline,Move-SIEngineToLeastPrivilege,Install-SIGrantProcedure) run only inside a recorded Invardia support session, send every SQL statement through Invardia's audited call, write a rollback record, add before they remove, and remove broad rights only in a second, later run after a green pipeline.
| Script | Purpose | Rights needed to run it | Changes it makes | Preview | Integrity |
|---|---|---|---|---|---|
| Grant-SISupportAccess | Give or remove the Invardia Support app's access to SecurityInsight | Owner or User Access Administrator (the SecurityInsight Key Vault); Entra admin of the Pro SQL server (member of the SQL admin group) (the Pro database); Privileged Role Administrator (the SecurityInsight SQL admin group, role-assignable -- only with -Remove or -LegacyStandingAccess); Application Administrator or owner of the app (the SecurityInsight app registrations -- only with -Remove or -LegacyStandingAccess) | grant: the Support app's service principal [Key Vault Reader (troubleshoot) / Key Vault Secrets Officer (setup)]; create: the just-in-time support grant in each product database (signed procedures, the Support app's own read-only database user, the consent -- never db_owner); grant: Storage Queue Data Message Sender on the support grant's queue (the queue starts the support grant job; no right on any job); remove: Container Apps Jobs Operator on the support grant job, given by an earlier release; LEGACY ONLY (-LegacyStandingAccess, off): a standing SQL admin group membership and app ownership; remove: with -Remove only: the database user, the consent, a membership or ownership | Prints every grant / membership / ownership it would add or remove; adds or removes nothing. | SHA-256 in SHA256SUMS.txt |
| Set-SISqlAdminGroup | Make one role-assignable group the Pro SQL server's Entra admin | Privileged Role Administrator (or Global Administrator) (the tenant); SQL Server Contributor (or Contributor / Owner) (the SQL server); Microsoft Graph RoleManagement.ReadWrite.Directory with Group.ReadWrite.All (when an app runs it instead of a person) (the tenant) | create: grp-si-sql-admins (role-assignable security group); update: members: the Invardia Support app (when -MemberObjectIds names it) -- never a SecurityInsight runtime identity; update: the Entra admin = grp-si-sql-admins, recorded by the server as a group | Prints the group it would create, the members it would add and the admin it would set; changes nothing. | SHA-256 in SHA256SUMS.txt |
| Grant-SIIdentity | Grant a managed identity everything SecurityInsight reads with | Owner or User Access Administrator (each scope it grants on); Privileged Role Administrator (or Global Administrator) (the tenant); Microsoft Graph AppRoleAssignment.ReadWrite.All (when an app runs it instead of a person) (the tenant) | grant: the managed identity [Key Vault Secrets User]; grant: the managed identity [Reader]; grant: the managed identity [Monitoring Metrics Publisher]; grant: the managed identity [Log Analytics Reader]; grant: the managed identity [Storage Blob Data Contributor, Storage Queue Data Contributor, Storage Table Data Contributor]; grant: the managed identity [AcrPull]; grant: the managed identity's service principal [Microsoft Graph User.Read.All, Group.Read.All, Directory.Read.All, Device.Read.All, Application.Read.All, AuditLog.Read.All, Policy.Read.All, RoleManagement.Read.All, RoleManagement.Read.Directory, RoleManagementPolicy.Read.Directory, RoleEligibilitySchedule.Read.Directory, RoleAssignmentSchedule.Read.Directory, PrivilegedAccess.Read.AzureADGroup, IdentityRiskyUser.Read.All, IdentityRiskEvent.Read.All, IdentityRiskyServicePrincipal.Read.All, ThreatHunting.Read.All, UserAuthenticationMethod.Read.All, DeviceManagementManagedDevices.Read.All, DeviceManagementConfiguration.Read.All, AccessReview.Read.All, SecurityAlert.Read.All; Microsoft Threat Protection AdvancedHunting.Read.All; WindowsDefenderATP Machine.Read.All, Vulnerability.Read.All, SecurityRecommendation.Read.All]; grant: the asset-tagging identity [Tag Contributor; Machine.ReadWrite.All; CustomSecAttributeAssignment.ReadWrite.All (write grants, opt-in)]; grant: the SecurityInsight identity [Monitoring Contributor]; grant: the SecurityInsight identity [Log Analytics Contributor] | The plan: every grant listed as present / missing; nothing is granted (same as running without -Apply). | SHA-256 in SHA256SUMS.txt |
| Validate-SIPermissions | Check, or grant, a service principal's permissions for SecurityInsight | Privileged Role Administrator (or Global Administrator) (the tenant); Owner or User Access Administrator (the scopes it grants on) | grant: the service principal [the read-only collection set (User.Read.All, Group.Read.All, Directory.Read.All, Device.Read.All, Application.Read.All, AuditLog.Read.All, Policy.Read.All, RoleManagement.Read.*, Identity risk read, ThreatHunting.Read.All, UserAuthenticationMethod.Read.All, DeviceManagementManagedDevices.Read.All, DeviceManagementConfiguration.Read.All, AccessReview.Read.All, SecurityAlert.Read.All, AdvancedHunting.Read.All, Machine.Read.All, Vulnerability.Read.All, SecurityRecommendation.Read.All)]; grant: the service principal [Reader (+ Tag Contributor with -IncludeTagContributor), Monitoring Metrics Publisher, Log Analytics Reader]; create: the service principal when it does not exist | Report only: present / missing per permission and role; nothing is granted or created. | SHA-256 in SHA256SUMS.txt |
| Validate-SIOpenAI | Create or check the Azure OpenAI account for the AI features | Contributor (or Cognitive Services Contributor) (the resource group) | create: an Azure OpenAI (Cognitive Services) account; create: a model deployment on that account | Check only (as -ValidateOnly): what exists and what would be created; nothing is created and no model dump files are written. | SHA-256 in SHA256SUMS.txt |
| Set-SIStorageSharedKey | Show, or switch off, shared-key access on SecurityInsight's storage account | Storage Account Contributor (or Contributor) (the storage account) | update: allowSharedKeyAccess = false, defaultToOAuthAuthentication = true (-Disable) / allowSharedKeyAccess = true (-Enable) | The report, plus "would switch shared-key access OFF / ON"; nothing is changed. | SHA-256 in SHA256SUMS.txt |
| Switch-SIJobOrchestration | Switch between the daily job flow and one timer per job | Contributor (or Container Apps Contributor) (the install's resource group) | update: each job's trigger (schedule / manual) | The plan: every job's trigger before / after; no job is changed (same as without -Apply). | SHA-256 in SHA256SUMS.txt |
| Test-SIInstall | Health check of a SecurityInsight install (read-only) | Reader (and Log Analytics Reader on the workspace) (the install's resource group) | The same check -- it changes nothing in any case. | SHA-256 in SHA256SUMS.txt | |
| Invoke-SIJobsOnce | Run every SecurityInsight job once, in pipeline order | Container Apps Jobs Operator (or Contributor) (the install's resource group) | create: one execution of each job | The plan (as -PlanOnly): which jobs would run in which order; no job is started. | SHA-256 in SHA256SUMS.txt |
| Set-SILicense | Install a SecurityInsight Pro licence | Key Vault Secrets Officer (the SecurityInsight Key Vault) | update: SI-License | Checks the licence and shows where it would be written; nothing is written. | SHA-256 in SHA256SUMS.txt |
| Request-SILicense | Ask Invardia for this install's Pro licence, and install it | Key Vault Secrets Officer (the SecurityInsight Key Vault) | create: a licence request for this tenant / install; update: SI-LicenceRequest-State, and SI-License once approved | Shows the licence request state only (as -Status); nothing is requested and no licence is installed. | SHA-256 in SHA256SUMS.txt |
| Set-SIServiceNowCredential | Store the ServiceNow connection in the Key Vault | Key Vault Secrets Officer (the SecurityInsight Key Vault) | update: the ServiceNow instance URL, user and password secrets | Shows which secrets it would set; nothing is written. | SHA-256 in SHA256SUMS.txt |
| Set-SIMail | Set up how SecurityInsight sends mail | Exchange Administrator (narrowest: Mail Recipient Creation + Role Management) (Exchange Online); Privileged Role Administrator or Cloud Application Administrator (the tenant) | create: the shared mailbox (-CreateMailbox, on by default); create: service principals for SecurityInsight's identities (New-ServicePrincipal); create: management scope SecurityInsight-Sender (only that mailbox); grant: per identity: Application Mail.Send on that scope [Application Mail.Send]; remove: a tenant-wide Microsoft Graph Mail.Send on those identities [Mail.Send]; update: SI-Smtp-Password | The plan: what would be created, granted and removed, with the commands; nothing is changed (same as without -Apply). | SHA-256 in SHA256SUMS.txt |
| Set-SIInstallRing | Record this install's update ring | the install identity (service principal + certificate) (the Pro database) | update: cfg.InstallState: Ring, channel, set by | Says which ring would be recorded where; the database is not opened. | SHA-256 in SHA256SUMS.txt |
| Set-SIInstallTenant | Record the tenant's name for the web app's header | any signed-in account of the tenant (an application needs Directory.Read.All or Organization.Read.All) (the tenant); the install identity (service principal + certificate) (the Pro database) | update: cfg.InstallState: Tenant (name, domain, set by) | Says what would be read and where it would be recorded; neither Microsoft Graph nor the database is opened. | SHA-256 in SHA256SUMS.txt |
| Clear-SIGuardEvents | Acknowledge every open guard event | the install identity (service principal + certificate) (the Pro database) | update: each open guard event: acknowledged, by, reason | The preview: the open events it would acknowledge; nothing is acknowledged (same as without -Apply). | SHA-256 in SHA256SUMS.txt |
| Grant-SIUpdaterDatabase | Let the product updater apply database changes (one time) | member of the SQL admin group (the server's Entra admin) (the Pro database) | create: a contained database user for the updater's managed identity; grant: the updater's user [the role si_updater: DDL, and EXECUTE on cfg.ApplyComponentGrants]; create: the component roles and the certificate-signed grant procedure (see Install-SIGrantProcedure), when missing | Prints every statement it would run; nothing is changed without -Apply. | SHA-256 in SHA256SUMS.txt |
| Initialize-SIDataSql | Prepare the Pro database for the data backend | the install identity (service principal + certificate) with db_ddladmin (the Pro database) | create: schema sidata (tables, indexes, views) and the CMDB sync schema | Checks the schema is additive and says what it would apply; the database is not opened. | SHA-256 in SHA256SUMS.txt |
| Initialize-SIVulnTargetSql | Prepare a database as the vulnerability close-loop's target | the SI engine identity (service principal + certificate) with db_ddladmin (the target database) | create: schema vuln (VulnerabilityItem, VulnerabilityEvent) | Says what it would apply; the database is not opened. | SHA-256 in SHA256SUMS.txt |
| Script | Purpose | Rights needed to run it | Changes it makes | Preview | Integrity |
|---|---|---|---|---|---|
| Get-SIDeviationReport | What have we switched off, changed or exempted? | read access to the install folder (the SecurityInsight folder) | create: the CSV file (only with -AsCsv) | Returns the report rows; with -AsCsv it says where it would write the CSV and writes nothing. | SHA-256 in SHA256SUMS.txt |
| Grant-SISupportAppDatabase | The Invardia Support app reaches the databases through the database admin group only (one time per install) | the Pro SQL server's Entra admin (a member of the SQL admin group), or the Invardia Support app in a support session (the Pro database and the identity ledger); Privileged Role Administrator (the admin group is role-assignable) (the SecurityInsight SQL admin group); Contributor (the Pro SQL server (only when the server does not record the admin group as a group)) | update: the SecurityInsight SQL admin group: the Support app as a member; update: the server's Entra admin: the admin group, recorded as a group -- only when the server names the group under another kind, or the Support app itself is still the admin; remove: a database user of the Invardia Support app's own, made by an earlier version -- only after the admin group was read back as the Support app's way in; update: the install's record of the Support app's client id | The plan: what is there and what would be changed; nothing is changed and no database connection is opened (same as without -Apply). | SHA-256 in SHA256SUMS.txt |
| Grant-SITaggingDatabase | Let asset tagging read its settings (Pro, once) | the SQL server's Entra admin (or a member of its admin group) (the Pro database); Reader (the resource group of the identity) | grant: a database user for asset tagging's identity [read of asset tagging's settings (its own role)] | Prints the T-SQL it would run; nothing is run. | SHA-256 in SHA256SUMS.txt |
| Import-SICmdbCsv | Import a v2.2 CMDB.csv once (Pro) | the install's identity (db_datawriter on the Pro database) (the Pro database) | create: the services (SVC-0001, ...) and their asset links from the CSV, and the record of the one-time import | Reads, checks and counts the file; nothing is imported. | SHA-256 in SHA256SUMS.txt |
| Import-SIProSettings | Move an install's configuration into the Pro database | the install's identity (db_datawriter; db_ddladmin with -CreateSchema) (the Pro database) | create: the cfg schema and the default templates (only with -CreateSchema); create: settings, documents, configuration items and connectors imported from the files, each with its change-log row; update: the imported custom files moved aside (only with -RetireFiles); create: OUTPUT\Import-SIProSettings.report.json, the import report | Prints the plan and what needs review; nothing is written to the database, no file is retired and the report file is not written. | SHA-256 in SHA256SUMS.txt |
| Install-SecurityInsight | Install SecurityInsight (guided install) | Owner (or Contributor + User Access Administrator) (the subscription SecurityInsight is installed in); Privileged Role Administrator (or Global Administrator) -- optional (the tenant) | create: the SecurityInsight resource group, Log Analytics workspace (90 days when created), data collection endpoint and rules, storage account (shared keys off), Key Vault (purge protection on), container registry (admin user off) and the image built from the signed source, Container Apps environment and the engine jobs; create: one user-assigned managed identity per role: the engine, the web app, the MCP server, the updater and (opt-in) asset tagging; grant: the engine identity [Reader, Log Analytics Reader, Monitoring Metrics Publisher, Storage Blob / Queue / Table Data Contributor, AcrPull, Key Vault Secrets User, Container Apps Jobs Contributor]; grant: the web app's, MCP server's and updater's identities [web: AcrPull, Log Analytics Reader, Container Apps Jobs Operator on the named jobs; MCP: AcrPull, Log Analytics Reader; updater: Contributor on the resource group and registry, Key Vault Secrets Officer, Key Vault Crypto Officer]; grant: the engine identity [the read-only application permissions of Microsoft Graph, Microsoft Threat Protection and Defender for Endpoint (see Grant-SIIdentity)]; create: the role-assignable group grp-si-sql-admins as the SQL server's Entra admin; the person installing is a member for the length of the install only; the Invardia Support app is a member when support was chosen; create: the web app's sign-in application "SecurityInsight": app roles, assignment required, the web app's identity as its federated credential (no secret, no certificate); create: the Entra-only server, the Pro database and the identity ledger, their tables, templates and settings; one contained user and one role per component (si_engine, si_web, si_mcp, si_updater); the certificate-signed grant procedure; update: server auditing to the install's workspace, the audit table kept 90 days; create: the licence, the install key and the keys a switched-on feature needs (Azure OpenAI, Shodan, SMTP password -- asked for, never from config.json); create: the web app, the MCP server and the updater job; grant: Invardia Support access (only when chosen in the wizard) | Runs the checks only (as -PreflightOnly): nothing is created, changed or written. | SHA-256 in SHA256SUMS.txt |
| Install-SIFlowTask | Run the engines as one daily flow (VM install) | local Administrator (the VM) | create: the task \SecurityInsight\SecurityInsight (flow), running as SYSTEM every 5 minutes; update: the per-engine SecurityInsight tasks the flow replaces: disabled, not deleted; create: data\flow\replaced-tasks.json -- the record of the disabled tasks | Prints what -Apply (or -Remove) would do; no task is registered, enabled or disabled and no file is written. | SHA-256 in SHA256SUMS.txt |
| Install-SIGrantProcedure | Install the certificate-signed grant procedure on an existing install | the Invardia Support app at the Setup level, in a recorded Invardia support session for that environment (the install's environment); member of the SQL admin group (the Pro database) | update: the rollback record (cfg.InstallState GrantProcedureBefore: the updater's roles before, whether a procedure was there), written once; create: every component role SecurityInsight compiles in (si_engine, si_web, si_audit_writer, si_mcp, si_updater and the reserved ones); create: the procedure cfg.ApplyComponentGrants (only when missing or another version); create: a new in-database certificate (expiry 2099-12-31, random password never returned), the procedure signed with it, the private key removed; grant: the certificate's user [CONTROL on SecurityInsight's schemas, ALTER ANY USER, ALTER on the component roles]; grant: si_updater [EXECUTE and VIEW DEFINITION on the procedure; DENY ALTER on it]; update: the updater's database user: a member of si_updater; remove: db_securityadmin from the updater's user (-RemoveSecurityAdmin, a separate later run, refused without the updater's own record of an update through the procedure with no failed row) | Plans by default: reads the state (read only) and prints every statement it would send. Nothing is changed without -Apply. | SHA-256 in SHA256SUMS.txt |
| Install-SIUpdaterJob | Create or update the updater job (Pro) | Contributor (the resource group and the container registry); User Access Administrator (or Owner) -- with -GrantSpnRoles (the resource group, the registry and the Key Vault); member of the SQL admin group -- with -GrantSql (the Pro database) | create: the image si-updater:v<version>; create: the updater's user-assigned identity (when missing); grant: the updater's identity (with -GrantSpnRoles) [AcrPull, Key Vault Secrets User; Contributor; Key Vault Secrets Officer; Key Vault Crypto Officer]; remove: the web app's identity (with -GrantSpnRoles) [Key Vault Secrets Officer]; create: the job caj-si-updater (or an update of it): daily at 03:00 UTC, image, ring, the install's resource names (SI_UPDATER_WEB_APP, SI_UPDATER_MCP_APP, SI_UPDATER_JOB_NAME); legacy feed settings removed; grant: the updater's database user (with -GrantSql) [the role si_updater: DDL to apply a release's schema and EXECUTE on the certificate-signed grant procedure; never db_securityadmin] | Shows the plan by default; no image is built, no identity, role or job is created or changed without -Apply. | SHA-256 in SHA256SUMS.txt |
| Invoke-SIContainerUpdate | Bring a container install up to the code of a release | Contributor (the install's resource group and container registry) | create: the new engine image, built from the verified release; update: every SecurityInsight engine job: the new image; CPU and memory raised to the tenant-sized default; the run limit raised to the longest Azure accepts (never lowered; a value you set is kept); update: the Pro database raised to the default size (never lowered, never above it); update: the default templates (template pack); remove: a database user the Invardia Support app had from an earlier version -- only after this run read back that the admin group is the server's administrator and the app is its member | Plans by default (and with -DetectOnly): prints every change it would make; nothing is built or changed without -Apply. | SHA-256 in SHA256SUMS.txt |
| Move-SIEngineToLeastPrivilege | Move an existing install's engine identity to its least-privilege database role | the Invardia Support app at the Setup level, in a recorded Invardia support session for that environment (the install's environment); member of the SQL admin group (the Pro database); Reader (the install's resource group) | create: the role si_engine and its grants (idempotent) [schema: SELECT, INSERT, UPDATE, DELETE on the engine's data schema; SELECT, INSERT, UPDATE on the vulnerability, CMDB sync and ServiceNow hand-off schemas; object grants in cfg; DENY INSERT, UPDATE, DELETE on sidata.CiOverride]; update: the engine's database user: a member of si_engine (the broad roles stay in this run); remove: db_datareader and db_datawriter from the engine's user (step remove-broad-roles, a separate later run, only when the proof is green); update: the in-database rollback record (cfg.InstallState EngineSqlAccessBefore: the user's roles before), written once; create: the rollback record (JSON) of this run | Plans by default: prints the install's shape, the proof (the role's grants against every engine statement) and what each step WOULD do. Nothing is changed without -Apply -Steps. | SHA-256 in SHA256SUMS.txt |
| New-SIServiceNowTestPack | Write the ServiceNow test pack | write access to the folder (the pack folder (-OutDir)) | create: the test pack files in -OutDir (sql\*.csv, rest\*.json, columns.csv, servicenow-test-pack.json, HOW-TO-TEST.md) | Compares only (as -Check); nothing is written. | SHA-256 in SHA256SUMS.txt |
| Publish-SITemplates | Publish configuration templates into the Pro database | the install's identity (db_datawriter; db_ddladmin with -CreateSchema) (the Pro database) | update: the templates in force, the template release record, the fingerprint and the audit trail; create: the cfg schema (only with -CreateSchema / -InstallDefault); create: a staged template pack for the web app (only with -Stage) | Prints the plan (what would be inserted, updated, retired); nothing is written -- also with -InstallDefault, -InstallCurrent or -Stage. | SHA-256 in SHA256SUMS.txt |
| Set-SIProSetting | Set or reset one Pro setting | the install's identity (db_datawriter on the Pro database) (the Pro database) | update: one setting row and its change-log row | Prints what it would write; the setting is not written. | SHA-256 in SHA256SUMS.txt |
| Set-SISecurityBaseline | Apply the security baseline to an existing install (registry admin user off, Key Vault purge protection, SQL auditing) | the Invardia Support app at the Setup level, in a recorded Invardia support session for that environment (the install's environment); Contributor (the install's resource group (registry, Key Vault, SQL server and Log Analytics workspace)); member of the SQL admin group (read only here) (the Pro database) | update: the registry's admin user: off; update: purge protection: on; update: server auditing on, to the install's Log Analytics workspace (Azure's default action groups); create: a diagnostic setting that sends the SQL security audit to the workspace (only when none sends it there already); update: the retention of the table SQLSecurityAuditEvents: at least 90 days; update: the install's record of the cut-over (cfg.InstallState SecurityBaselineCutover); create: the rollback record (JSON) of this run | Plans by default: prints the install's shape, the read-only proof and what each step WOULD change. Nothing is changed without -Apply -Steps. | SHA-256 in SHA256SUMS.txt |
| Upgrade-SIToPro | Upgrade a container install to Pro updates | Contributor (and User Access Administrator with -GrantSpnRoles) (the install's resource group, registry and Key Vault) | create: the updater job and its identity (Install-SIUpdaterJob -Apply); update: config\SecurityInsight.custom.ps1: the updater job recorded in the saved container hosting | Prints the plan, including anything missing; the updater job is not installed and nothing is recorded. | SHA-256 in SHA256SUMS.txt |
| Validate-SILogAnalytics | Provision the Log Analytics workspace, DCE and DCR | Owner (or Contributor + User Access Administrator) (the subscription (or the resource groups)) | create: the resource groups, the Log Analytics workspace, the data collection endpoint, the table SI_IdentityAssets_CL and its data collection rule; grant: the SecurityInsight app [Monitoring Metrics Publisher, Monitoring Contributor, Log Analytics Contributor] | Every create and every role assignment is printed as [WHATIF] and not done; the reads still run. | SHA-256 in SHA256SUMS.txt |
Published scripts and their checksums
Every SecurityInsight script Invardia publishes at invardia.com/support/si/, with its documentation page (what it does, the rights it needs, every change it makes, -WhatIf and undo) and the SHA-256 of the exact published file, computed when this page was built.
Always check the SHA-256 before you run a script.
| Script | Version | SHA-256 | Documentation |
|---|---|---|---|
| Clear-SIGuardEvents | 3.0.79 | a96f87d07a7ef6cdfe089e9aaed2d2af2ae3f298dee9441d4e4ec74a157a7d5e | Current |
| Grant-SIIdentity | 3.0.79 | 1ebe1979307757bb4a89d5f492dd67240ad84f8336a5439b4ea8d2e8b3ee3d49 | Current |
| Grant-SISupportAccess | 3.0.79 | 583a312bd49990ff9973c890ef3a817d03e6be6884f5f433ec889aad11786586 | Current |
| Grant-SIUpdaterDatabase | 3.0.79 | 0582875258567ed5887cd8ddc79430a2c38b4fc58301586e55cfbc6e37476f7e | Current |
| Initialize-SIDataSql | 3.0.79 | d921e88ed720ad0ae2179b6fd2a2317e66f6af6903e2bbb7b04c6f0bd6967d85 | Current |
| Initialize-SIVulnTargetSql | 3.0.79 | 82302f319c79e6897fd4a640119c294a2148bb5d458050ea971d7ab9edb0ec28 | Current |
| Install-SecurityInsight | 3.0.79 | e49ec3564732c3c406225997f5fb5ff1ef88b5378baf4a0ea33e3bae05f45417 | Current |
| Invoke-SIJobsOnce | 3.0.79 | 11f207f10fd71a93d9923dc2896847a43f3905f98e968a6b4bfed9cef2ca6599 | Current |
| New-SIManagementAppRegistration | 3.0.79 | 7d027ab9917951e4bffd6bcdf1eebbb0783801c7ec6420a809e84acfc6670f70 | Current |
| Request-SILicense | 3.0.79 | f21c496bb3f4508c60e755e5342851aa05ddb280e99d20b8baef010c69edca42 | Current |
| Reset-SIData | 3.0.79 | 878055bb756a8230635b229887a1a5c5970d777cf5b5e8a32cb4b96db8d6da36 | Current |
| Set-SICiCutoff | 3.0.79 | 0ee990c58e3966680e3c5cfbb006e1593ab7e225cf9cac755422791dd4a5c98e | Current |
| Set-SIDisplayNames | 3.0.79 | c2aef19176138d533120e8a61a31fc7f074c1f223d0aef5425bca4a1e3efa412 | Current |
| Set-SIInstallRing | 3.0.79 | 61748c3c2fbbcd75cd1942e175b83e4575b481252cd684220d76811a4b707d77 | Current |
| Set-SIInstallTenant | 3.0.79 | 00d3eb62e9e5a28c0e64450892f207362b48c588ad0bcfbd55f003d8e888a862 | Current |
| Set-SILicense | 3.0.79 | 32a3318e9477c2af9d431f4328351d49ac36e8947895a154974a778b9aa2ffa9 | Current |
| Set-SIMail | 3.0.79 | 4c2ed24e8a8c1632827b444381a9bbb68c017aa13b5610389200f63684212923 | Current |
| Set-SIServiceNowCredential | 3.0.79 | c6222f2894d6a34992e97bb77c2e17565d56d6101602d90556dbcfa46f8fcdb4 | Current |
| Set-SISqlAdminGroup | 3.0.79 | 09f7a8cfde9cf9962ad520c03256876dce8aa5f0350a11f5ccff8beb3e05f93b | Current |
| Set-SIStorageSharedKey | 3.0.79 | 5cab51a5b9c204f44b2f2be02eef50e3c4d578a7b4c90b39416ccdbd0f1f39cc | Current |
| Stop-SIRunAndUpdate | 3.0.79 | 7e2ada7a574b08758a6dd8bcd7c6529fa10460f634c225b3e4ee1b084baa43ad | Current |
| Switch-SIJobOrchestration | 3.0.79 | 26480ce53e166fe3f586237da6c621b744694844ce2690e63dd81e795f39243f | Current |
| Test-SIInstall | 3.0.79 | 058362deb5579c67f0be91e65cf6eca691dbe05efbd37d456b3c24fbd4d5a664 | Current |
| Validate-SIOpenAI | 3.0.79 | e1b9a106b815044a2f2191e7748b8c0d054891ef7a06a8f874ea132df96143f1 | Current |
Download, read, run
Never pipe a script into Invoke-Expression. Download it to a file (line 1), read it, preview with -WhatIf (line 2), then run the same line without -WhatIf:
Invoke-WebRequest https://invardia.com/support/si/<Script>.ps1 -OutFile <Script>.ps1
.\<Script>.ps1 -WhatIfTo check a download, compare its SHA-256 (Get-FileHash) with the publishedSHA256SUMS.txt or the table above.
Each script's page shows these commands with its own name. All scripts: SecurityInsight scripts · Every setting explained: SecurityInsight settings