Skip to content
InvardiaInvardia
Why InvardiaProductsFeaturesPricingCommunity
Docs
All documentation
Product documentationPIM ManagerSecurityInsight
SettingsPIM Manager settingsSecurityInsight settingsEntra Policy Suite settings
ScriptsPIM Manager scriptsSecurityInsight scriptsEntra Policy Suite scriptsInvardia scripts
Error codesPIM Manager error codesSecurityInsight error codes
API and MCPPIM Manager APIPIM Manager MCP toolsSecurityInsight APISecurityInsight MCP tools
SecurityPIM Manager security packSecurityInsight security packEntra Policy Suite security pack
Network and designPIM Manager network guidesPIM Manager command wizardNetwork egressDesign your installationCalculate your cost
SupportSetup scriptsRemote support access
Search the docs
SupportAboutContactBook a demoCustomer portalDesign your installationFree Pro trial
← Entra Policy SuiteOpens the print dialog - choose "Save as PDF".
Invardia Entra Policy SuiteInvardia Entra Policy Suite

Security review pack

Entra Policy Suite - Security review pack

ProductEntra Policy Suite
Version2.0.107
Date2026-11-09
Published atinvardia.com/products/entrapolicysuite/security/
Questionsinfo@invardia.com

This pack is for the CISO and the security team who must approve Entra Policy Suite before it is installed. It describes the product and this version, not one customer's environment. It sets out Entra Policy Suite's security design: architecture, identities and every permission, data, vendor access, supply chain, change control, the threat model, the compliance mapping, exit and the scripts a person runs. The facts in it are read from the code of this release.

Contents

  1. Architecture
  2. Identities
  3. Permissions with justification
  4. Data
  5. Access by the vendor
  6. Supply chain
  7. Change control and audit
  8. Threat model and hardening
  9. Compliance mapping
  10. Uninstall and exit
  11. Scripts
  • Published scripts and their checksums

1. Architecture

Entra Policy Suite gives every user and device the tags your Conditional Access policies and dynamic groups depend on, from rules you control. It watches those tags for changes it did not make, reports the accounts that need attention (identity report), and documents and manages Conditional Access. It runs entirely in your own Azure subscription, in one resource group you choose. Invardia does not host the product, your data or its runtime.

Components (all in your subscription)

  • Scheduler - the engine's Container Apps job, run every 5 minutes as the engine identity. It works out which job is due and asks for it by putting a message on that job's own queue.
  • Work jobs - Container Apps jobs, each started by a message on its own queue. They run the same container image and differ only by the job they are told to run.
  • Web app - one Container App with two containers: the shared sign-in front (version 1.4.5, pinned by this release) on the HTTPS ingress, and the web app itself on the container's loopback address behind it. People sign in with Microsoft Entra ID.
  • Azure SQL Database - every rule, setting, run, tag change, snapshot and audit row. Microsoft Entra authentication only.
  • Storage account - one queue per work job, through which the scheduler asks for runs. Shared keys are off.
  • Container registry - the engine image and the sign-in front image, built inside your registry from the release.
  • Key Vault - one key that protects the web app's sign-in sessions; and, when Invardia has issued one, the per-install key of the Invardia uplink.
  • Log Analytics - the container logs.
  • Hybrid worker (optional) - a scheduled task on a domain-joined Windows Server that writes the tags of AD-synced users in Active Directory and reads AD users and groups. It connects out to the database; nothing connects in to it.

How a change flows

  1. A person changes a rule, a setting or a schedule in the web app, or asks for a run. The web app records the request with the person's identity and reason. It cannot change the directory or the configuration itself.
  2. The engine picks up the request, verifies the person's sign-in proof and checks their role at that moment, then carries it out.
  3. Every tagging run builds a plan first. In Preview it records the plan only; in Apply it writes it. A run whose plan is far larger than usual is held for an admin's approval.
  4. Every step is written to the run log and the audit trail.

Network

  • Public install (default): the web app has a public HTTPS endpoint behind Microsoft Entra sign-in. The jobs reach Microsoft Graph, Exchange Online, the database, the queues and the Key Vault over HTTPS (TLS 1.2 or later).
  • Private install (option): the install puts everything in your virtual network. Azure SQL, the Key Vault, the job queues and the registry are created with public network access off and reached through private endpoints; the Container Apps environment is internal (no public address). The install proves the result from inside the network before it reports success, and reads public access back as Disabled at the end.
  • Private DNS zones a private install uses: privatelink.database.windows.net, privatelink.vaultcore.azure.net, privatelink.queue.core.windows.net, privatelink.azurecr.io.
  • Outbound hosts a private install reaches (your firewall decides): graph.microsoft.com, login.microsoftonline.com, outlook.office365.com, management.azure.com, invardia.com, mcr.microsoft.com (the base images of the build).
The jobs
JobDefault scheduleHow it startsIdentityResourcesLongest run
Support read (one named read when the Support app asks)on requestA message on its own queue; at most 1 at a timeSupport read job0.25 CPU, 0.5Gi0.2 h
Schedulerevery 5mOn a schedule (*/5 * * * *, every 5 minutes)Engine0.25 CPU, 0.5Gi0.5 h
User taggingdaily 01:00A message on its own queue; at most 1 at a timeEngine2 CPU, 4Gi168 h
Device taggingdaily 01:30A message on its own queue; at most 1 at a timeEngine2 CPU, 4Gi168 h
Identity reportdaily 02:00A message on its own queue; at most 1 at a timeEngine2 CPU, 4Gi168 h
Named locations from Azure service tags (only the Azure.Network.ServiceTag.* locations)daily 06:00A message on its own queue; at most 1 at a timeEngine2 CPU, 4Gi168 h
Tamper monitorevery 15mA message on its own queue; at most 1 at a timeEngine2 CPU, 4Gi1 h
CA Policy AnalyzermanualA message on its own queue; at most 10 at a timeEngine2 CPU, 4Gi168 h
Configuration (applies the changes people ask for in the web app)manualA message on its own queue; at most 1 at a timeEngine2 CPU, 4Gi168 h
Invardia uplinkevery 4hA message on its own queue; at most 1 at a timeEngine2 CPU, 4Gi168 h
Update check (which version is approved for this install - it installs nothing in this release)daily 03:00A message on its own queue; at most 1 at a timeEngine2 CPU, 4Gi168 h
Backup (every night: the Conditional Access policies and the tagging configuration - it only reads the tenant)daily 00:30A message on its own queue; at most 1 at a timeEngine2 CPU, 4Gi168 h
Policy options from Microsoft Graph (monthly: the values each Conditional Access field allows and the tenant's strengths, locations and roles - it only reads)monthly 1 04:00A message on its own queue; at most 1 at a timeEngine2 CPU, 4Gi168 h
What the install creates, in order (public install)
#Step
1Resource group
2Managed identities (engine, web, the database setup job)
3Log Analytics workspace
4Container registry (Basic) + AcrPull for the identities
5The engine image, built in the registry
6The SQL admin group (grp-eps-sql-admins) with the database setup job's identity in it
7Azure SQL (Entra-only) + database
8Container Apps environment
9The database, set up by the database setup job as its own identity: schema, one least-privilege role per identity, the sign-in front's state, you as the first SuperAdmin
10The job queues (storage, no shared key): the tick may only send, the engine read
11The web sign-in registration (no secret; assignment required; you assigned)
12The tick + work jobs
13The tick may NOT start jobs (an older install's job-starter role removed)
14The engine's Graph permissions
15The engine's Exchange permission + role
16Key Vault for the sign-in front's wrap key
17The sign-in front image (the pinned version), built in the registry
18The web app: the sign-in front + the GUI in one revision
19Verify: read everything back, run the tick once
20An older install's separate scheduler identity removed - the scheduler runs as the engine
What the install creates, in order (private install)
#Step
1Resource group
2Network: the spoke, the apps subnet (Container Apps) and the endpoints subnet
3Private DNS zones (SQL, Key Vault, queues, registry), linked to the spoke
4Managed identities (engine, web, the database setup job)
5Log Analytics workspace
6Container registry (Premium, public access off) + AcrPull for the identities
7Private endpoint + DNS records: the registry (login server and data endpoint)
8The SQL admin group (grp-eps-sql-admins) with the database setup job's identity in it
9Azure SQL (Entra-only, public access off) + database
10Private endpoint + DNS record: Azure SQL
11The job queues (storage, no shared key, public access off)
12Private endpoint + DNS record: the job queues
13The web sign-in registration (no secret; assignment required; you assigned)
14Key Vault for the sign-in front's wrap key (public access off)
15Private endpoint + DNS record: Key Vault
16Container Apps environment inside the network (internal: no public address)
17The environment's own DNS zone (@, *, *.internal), linked to the spoke
18Hub peering / zone links to the hub (only with -PeerToHub / -LinkZonesToHub)
19The network hand-off list (and the hub owner's script)
20DNS check from this machine: every private name resolves to its endpoint
21The registry's build pool inside the network
22The engine image, built in the registry
23The database, set up by the database setup job as its own identity: schema, one least-privilege role per identity, the sign-in front's state, you as the first SuperAdmin
24The tick + work jobs
25The tick may NOT start jobs (an older install's job-starter role removed)
26The engine's Graph permissions
27The engine's Exchange permission + role
28The sign-in front image (the pinned version), built in the registry
29The web app: the sign-in front + the GUI in one revision
30Verify: read everything back, run the tick once
31Inside check: from inside the network - private DNS, the web app, every job queue
32Public -> private: the old public environment removed (after the inside check)
33An older install's separate scheduler identity removed - the scheduler runs as the engine
34Lockdown: public access read back as Disabled on SQL, Key Vault, storage and the registry

2. Identities

Every identity the product creates or uses, with its purpose. The runtime identities are managed identities: there is no client secret and no certificate to create, store or rotate. Each part has its own identity and only the rights of chapter 3.

People in the web app

People sign in with their Entra account to the web app's own registration (single tenant, assignment required). A sign-in session lasts at most 8 hours. In Entra Policy Suite each person has one of 3 roles; the roles are kept in the database and checked on every request. A role is bound to the person's account, so a new account with the same name does not inherit it. Every grant and removal of access is in the audit trail.

Identities created or used
IdentityKindPurposeCredentialLifetime
EngineUser-assigned managed identityRuns the scheduler and every work job: works out every 5 minutes which job is due, reads the tenant, writes the tags, applies the changes people ask for in the web app, sends alert mail and the Invardia uplinkNone (managed identity)As long as the install's resource group
Web appUser-assigned managed identityRuns the web app and its sign-in front; it is also the client credential of the web sign-in registration (a federated credential). It holds no Microsoft Graph, Exchange or Azure management rightNone (managed identity)As long as the install's resource group
Database setup jobUser-assigned managed identityRuns only the database setup job, started by the install, and the support-access job every 5 minutes: the schema, one role per identity and their database users, and the Support app's database access at the level your organization set in the Invardia customer portal (none; read; or read plus admin only during an open support session of at most 8 hours). It is the only member the install puts in the SQL admin group grp-eps-sql-admins, so no person needs database admin rights. It holds no Microsoft Graph, Exchange or Azure management rightNone (managed identity)As long as the install's resource group
UpdaterUser-assigned managed identityUsed only by the update job, to install a release that Invardia approved for your update ring: it builds the new image in your own container registry, runs the database setup job and moves the jobs and the web app to the new image. On every run it also keeps the database setup identity a member of the SQL admin group and renews that membership before it ends. It holds Contributor on the install's resource group, four Microsoft Graph rights for that one group membership (chapter 3), and no Exchange or database rightNone (managed identity)As long as the install's resource group
Support read jobUser-assigned managed identityRuns only the support read job: when Invardia's Support app asks (a message on its own queue) it runs ONE read from the list this release ships - recent runs, job schedules, settings, the license state (never its text), the hybrid workers, the update runs - writes the result to its own log and records it in the audit. It reads only those tables and writes only the auditNone (managed identity)As long as the install's resource group
Hybrid workerThe managed identity of the worker machine (Azure VM or Azure Arc-enabled server)Signs in to the database to take its own work and report it backNone (managed identity)As long as the worker machine
Web sign-in registrationApp registration + enterprise application, single tenantPeople sign in to the web app with it. Assignment is required: only people and groups you assign can sign inNone: no client secret and no certificate (the web app identity is its federated credential)Until you delete it
Hybrid worker (Active Directory)Group managed service account (gMSA) you nameWrites the tag attributes of AD-synced users, only in the OUs you delegateManaged by Active Directory (no password to handle)As long as you keep it
The person who installsYour own Entra account, signed in in a browserCreates the resources and grants listed in chapter 3. Becomes the first SuperAdmin of the web appYour own sign-in; the installer stores nothingOnly while the install runs
Roles in the web app
RoleCan
ReaderSees every page, the run logs and the audit trail. Changes nothing.
AdminEdits rules, tag types, conditions, scopes and settings; asks for runs; commits the commit queue; accepts or restores tamper events.
SuperAdminEverything an Admin can, plus the access list, the protection settings and the Conditional Access stage moves. The last SuperAdmin cannot be removed.

3. Permissions with justification

Every permission the product grants or requires, per identity, read from the install code of this version. Azure rights are given to managed identities only, at the narrowest scope Azure offers: a single queue, a single Key Vault key, a single Key Vault item, a single mailbox.

Least-privilege choices made in code

  • The web app holds no Microsoft Graph, Exchange or Azure management right. It records requests; the engine carries them out after it checks the person's role.
  • The scheduler may only put a message on a job's queue. It cannot start a job, change what a job runs, or read the queues.
  • The engine's Graph rights are read only except the tag writes on users and devices, and the one Conditional Access stage move a SuperAdmin asks for.
  • Any of the engine's Graph permissions can be left out at install (-ExcludeGraphRole). A permission that is left out is never granted, and the feature that needs it reports its data as unavailable.
  • Mail is sent from one shared mailbox through Exchange role-based access for applications - never a tenant-wide right to send mail.
  • In the database, each part has its own role with object-level grants on the tables it uses. No part is owner, reader or writer of everything (no db_owner, db_datareader or db_datawriter); a re-run of the install takes such a membership away. The audit trail is INSERT and SELECT only for every role.
  • The install converges: a re-run grants what is listed and revokes any other table permission a role holds.
Permission table (per identity)
IdentityTypePermissionScopeWhy it is neededAccessCan be left out
EngineMicrosoft Graph applicationUser.Read.AllTenantRead users for the rules, the identity report, the CA Policy Analyzer and the tamper monitorRead onlyYes: the feature that needs it reports its data as unavailable
EngineMicrosoft Graph applicationDevice.Read.AllTenantRead devices for the rules and the identity reportRead onlyYes: the feature that needs it reports its data as unavailable
EngineMicrosoft Graph applicationGroupMember.Read.AllTenantRead group members for the rule conditions and the identity reportRead onlyYes: the feature that needs it reports its data as unavailable
EngineMicrosoft Graph applicationOrganization.Read.AllTenantRead the tenant's license plans for the license conditions and the identity reportRead onlyYes: the feature that needs it reports its data as unavailable
EngineMicrosoft Graph applicationAuditLog.Read.AllTenantRead the directory audit log to name who changed a watched tag (tamper monitor), and the last sign-in time of users (identity report)Read onlyYes: the feature that needs it reports its data as unavailable
EngineMicrosoft Graph applicationPolicy.Read.AllTenantRead Conditional Access policies and named locations (Conditional Access page, CA Policy Analyzer)Read onlyYes: the feature that needs it reports its data as unavailable
EngineMicrosoft Graph applicationRoleManagement.Read.DirectoryTenantRead directory role assignments (CA Policy Analyzer, the identity report's privileged accounts)Read onlyYes: the feature that needs it reports its data as unavailable
EngineMicrosoft Graph applicationDeviceManagementManagedDevices.Read.AllTenantRead Intune managed devices for the identity reportRead onlyYes: the feature that needs it reports its data as unavailable
EngineMicrosoft Graph applicationApplication.Read.AllTenantRead application names for the Conditional Access documentationRead onlyYes: the feature that needs it reports its data as unavailable
EngineMicrosoft Graph applicationPolicy.ReadWrite.ConditionalAccessTenantChange one Conditional Access policy (a stage move, an edit, a copy, a template deployed or a version promoted) when a SuperAdmin asks for it, after the change is shown to them; create the denied-countries and trusted named locations on request; and, when switched on, keep the Azure.Network.ServiceTag.* named locations up to date daily. Only the engine makes these writesWrite (on request; the service-tag locations daily)Yes: the feature that needs it reports its data as unavailable
EngineMicrosoft Graph applicationGroup.ReadWrite.AllTenantCreate the groups the Conditional Access policies use, set a dynamic pilot group's rule for the policy's stage, and change the members of the pilot and exclude groups - only when a SuperAdmin asks for it, after the change is shown to them, and only for the groups Entra Policy Suite managesWrite (its own groups, on request)Yes: the feature that needs it reports its data as unavailable
EngineMicrosoft Graph applicationAdministrativeUnit.ReadWrite.AllTenantCreate the three administrative units of the Conditional Access groups and place those groups in them, when a SuperAdmin asks for itWrite (on request)Yes: the feature that needs it reports its data as unavailable
EngineMicrosoft Graph applicationPolicy.ReadWrite.AuthenticationMethodTenantCreate the two authentication strengths v1 creates (FIDO2 + Temporary Access Pass with 11 named key models, Windows Hello for Business + Temporary Access Pass), when a SuperAdmin asks for it; an existing strength is never changedWrite (on request)Yes: the feature that needs it reports its data as unavailable
EngineMicrosoft Graph applicationUser.ReadWrite.AllTenantWrite the tag attributes of your tag types on users (user tagging, the tamper monitor's restore); with Pro, disable (and enable again) a stale account a SuperAdmin approvedWriteYes: only while user tagging, the tamper monitor or (Pro) the stale identity clean-up's disable action (ProStale.DisableEnabled) is on - the install removes it otherwise
EngineMicrosoft Graph applicationDevice.ReadWrite.AllTenantWrite the tag attributes of your tag types on devices (device tagging)WriteYes: only while device tagging is on - the install removes it otherwise
UpdaterMicrosoft Graph applicationPrivilegedAssignmentSchedule.ReadWrite.AzureADGroupTenant (used for the SQL admin group only)Keep the database setup identity a member of the SQL admin group (a role-assignable group) through a Privileged Identity Management for Groups assignment, and renew a time-limited one before it ends. It can change who is a member of role-assignable groups, so it is a highly privileged right; Entra Policy Suite uses it only for that one membershipWrite (one membership)No: the SQL admin group is role-assignable, so only these rights can keep the database setup identity in it
UpdaterMicrosoft Graph applicationPrivilegedAssignmentSchedule.Read.AzureADGroupTenant (used for the SQL admin group only)Read that assignment back, and when it endsRead onlyNo: the SQL admin group is role-assignable, so only these rights can keep the database setup identity in it
UpdaterMicrosoft Graph applicationRoleManagementPolicy.Read.AzureADGroupTenant (used for the SQL admin group only)Read the SQL admin group's Privileged Identity Management policy: how long an assignment may lastRead onlyNo: the SQL admin group is role-assignable, so only these rights can keep the database setup identity in it
UpdaterMicrosoft Graph applicationGroupMember.Read.AllTenant (used for the SQL admin group only)Read the membership back after it is made or renewed (the update job checks that the database setup identity is in the group)Read onlyNo: the SQL admin group is role-assignable, so only these rights can keep the database setup identity in it
UpdaterMicrosoft Graph applicationApplication.Read.AllTenant (used for the SQL admin group only)Read the database setup identity (a service principal) and its group memberships back from its own side (memberOf)Read onlyNo: the SQL admin group is role-assignable, so only these rights can keep the database setup identity in it
UpdaterMicrosoft Graph applicationApplication.ReadWrite.OwnedByTenant (used for the SQL admin group only)Keep the web app's own sign-in registration as it should be (its address, sign-in addresses, the web identity's credential): ONLY the registration it owns - no other app in the tenantOnly what it ownsNo: the SQL admin group is role-assignable, so only these rights can keep the database setup identity in it
EngineExchange Online applicationExchange.ManageAsAppTenantRead recipient types for the Exchange rule conditions; write a mail-enabled user's custom attribute where Graph does notRead, and the custom attributesYes: only while user tagging, the identity report or a rule with a mailbox condition is on (the install grants or removes it)
EngineEntra directory roleExchange Recipient AdministratorTenantNeeded with Exchange.ManageAsApp for the Exchange calls aboveRecipientsYes: only while user tagging, the identity report or a rule with a mailbox condition is on (the install grants or removes it)
EngineExchange Online (RBAC for applications)Application Mail.SendThe one sender mailbox onlySend alert mail from that mailbox. No tenant-wide right to send mail is granted; a tenant-wide Graph Mail.Send on the identity is removedSend as one mailboxYes: set up only when you run Initialize-EpsMailSender.ps1
EngineAzure roleAcrPullThe container registryPull the engine imageRead onlyNo
Web appAzure roleAcrPullThe container registryPull the web app's imagesRead onlyNo
Database setup jobAzure roleAcrPullThe container registryPull the engine image for the database setup jobRead onlyNo
Database setup jobAzure roleKey Vault Secrets UserThe one Key Vault item 'uplink-key' only, and only when Invardia has put it thereAsk Invardia for the support access level your organization set (the support-access job)Read onlyNo
UpdaterAzure roleAcrPullThe container registryPull the engine image for the update jobRead onlyNo
UpdaterAzure roleContributorThe install's resource group onlyInstall a release Invardia approved for this ring: build the image in the registry, run the database setup job, move the jobs and the web app to the new imageUseNo
EngineAzure roleStorage Queue Data Message SenderEach job queueThe scheduler (part of the engine job, as the engine identity) asks for a job run by putting a message on that job's queueUseNo
EngineAzure roleStorage Queue Data Message ProcessorEach job queueA job takes and deletes its own messageUseNo
EngineAzure roleStorage Queue Data ReaderEach job queueThe queue trigger counts the messages as the engine identityRead onlyNo
EngineAzure roleKey Vault Secrets UserThe one Key Vault item 'uplink-key' only, and only when Invardia has put it thereRead the per-install key for the Invardia uplink at send timeRead onlyNo
Support read jobAzure roleAcrPullThe container registryPull the engine image for the support read jobRead onlyNo
Support read jobAzure roleStorage Queue Data Message ProcessorIts own queue onlyTake and delete the one message that names a support readUseNo
Support read jobAzure roleStorage Queue Data ReaderIts own queue onlyThe queue trigger counts its messagesRead onlyNo
Invardia's Support appAzure roleStorage Queue Data Message SenderThe support read job's queue only, and only when you gave the install its idAsk for ONE named read from the list this release ships - no other right on the job, the database or the networkUseNo
EngineAzure roleReaderThe web app's container app onlyReport to Invardia which version of the sign-in front the web app runs (read only; owner 2026-11-06)Read onlyNo
Web appAzure roleKey Vault Crypto Service Encryption UserThe one Key Vault key 'signin-front' onlyWrap and unwrap the keys that protect sign-in sessionsUseNo
Web sign-in registrationMicrosoft Graph delegated (admin consent)openid, profile, offline_access, User.ReadThe signed-in personSign the person in and keep the session freshThe person's own profileNo
Web sign-in registrationIts own delegated scopeuser_impersonationThe web app onlyThe web app checks that the person's sign-in was made for itThe web appNo
EngineDatabase roleeps_engineThe Entra Policy Suite databaseObject-level grants on the tables this part uses, nothing more (table below)69 tablesNo
Support read jobDatabase roleeps_supportreadThe Entra Policy Suite databaseObject-level grants on the tables this part uses, nothing more (table below)6 tablesNo
EngineDatabase roleeps_tickThe Entra Policy Suite databaseObject-level grants on the tables this part uses, nothing more (table below)6 tablesNo
Web appDatabase roleeps_webThe Entra Policy Suite databaseObject-level grants on the tables this part uses, nothing more (table below)61 tablesNo
Hybrid workerDatabase roleeps_workerThe Entra Policy Suite databaseObject-level grants on the tables this part uses, nothing more (table below)8 tablesNo
Hybrid worker (gMSA)Active DirectoryWriteProperty on each named extensionAttribute, inherited by descendant user objectseach OU namedWrite the tag attributes of AD-synced usersWrite, named attributes onlyYes: only with the hybrid worker
Database grants (per role and table)
RoleUsed byTablePermissions
eps_engineEngineAdGroupMemberSELECT
eps_engineEngineAdGroupSnapshotInfoSELECT, INSERT, UPDATE
eps_engineEngineAdminUnitSELECT, INSERT, UPDATE
eps_engineEngineAdUserSnapshotSELECT
eps_engineEngineAdUserSnapshotInfoSELECT, INSERT, UPDATE
eps_engineEngineAuditEventSELECT, INSERT
eps_engineEngineBreakGlassAccountSELECT, INSERT, UPDATE
eps_engineEngineCaAdoptionSELECT, INSERT, UPDATE
eps_engineEngineCaAnalysisSELECT, INSERT
eps_engineEngineCaAnalysisResultSELECT, INSERT
eps_engineEngineCaBackupSELECT, INSERT, DELETE
eps_engineEngineCaBackupItemSELECT, INSERT, DELETE
eps_engineEngineCaDirectoryNameSELECT, INSERT, DELETE
eps_engineEngineCaFindingSELECT, INSERT, UPDATE
eps_engineEngineCaGraphOptionSELECT, INSERT, UPDATE, DELETE
eps_engineEngineCaMonitorSELECT, INSERT, UPDATE, DELETE
eps_engineEngineCaPersonaSELECT, INSERT, UPDATE, DELETE
eps_engineEngineCaPolicySELECT, INSERT, DELETE
eps_engineEngineCaStageMoveSELECT, INSERT
eps_engineEngineCaTemplateTakenSELECT, INSERT, UPDATE
eps_engineEngineCaVersionPairSELECT, INSERT, UPDATE
eps_engineEngineConditionTypeSELECT, INSERT, UPDATE, DELETE
eps_engineEngineConfigBackupSELECT, INSERT, DELETE
eps_engineEngineConfigBackupItemSELECT, INSERT, DELETE
eps_engineEngineConfigChangeSELECT, INSERT
eps_engineEngineDeviceTagRuleSELECT, INSERT, UPDATE, DELETE
eps_engineEngineDeviceTagRuleConditionSELECT, INSERT, DELETE
eps_engineEngineGroupPinSELECT, INSERT
eps_engineEngineGroupRuleOverrideSELECT, INSERT, DELETE
eps_engineEngineIdentityActionSELECT, INSERT, UPDATE, DELETE
eps_engineEngineIdentityLaRunSELECT, INSERT
eps_engineEngineIdentityRowSELECT, INSERT
eps_engineEngineIdentitySnapshotSELECT, INSERT, DELETE
eps_engineEngineIdentityViewMemberSELECT, INSERT
eps_engineEngineJobRequestSELECT, INSERT, UPDATE(Status, StatusText, RunId, UpdatedAtUtc, the request content)
eps_engineEngineJobScheduleSELECT, INSERT, UPDATE
eps_engineEngineLicenseSELECT, INSERT, UPDATE
eps_engineEngineLicensePullSELECT, INSERT, UPDATE
eps_engineEngineManagedGroupSELECT, INSERT, DELETE
eps_engineEngineMonitorStateSELECT, INSERT, UPDATE
eps_engineEngineOnboardingCheckSELECT, INSERT, DELETE
eps_engineEnginePendingChangeSELECT, UPDATE
eps_engineEngineProLicensePriceSELECT
eps_engineEngineProPasskeyProgressSELECT, INSERT, UPDATE, DELETE
eps_engineEngineProPasskeyTargetSELECT, UPDATE
eps_engineEngineProPolicyCodeSyncSELECT, INSERT
eps_engineEngineProStaleDecisionSELECT, UPDATE
eps_engineEngineRefreshChangedStatsEXECUTE
eps_engineEngineRunSELECT, INSERT, UPDATE
eps_engineEngineRunLogSELECT, INSERT, DELETE
eps_engineEngineScopeSELECT, INSERT, UPDATE, DELETE
eps_engineEngineServiceTagLocationSELECT, INSERT
eps_engineEngineServiceTagPrefixSELECT, INSERT, DELETE
eps_engineEngineSettingSELECT, INSERT, UPDATE
eps_engineEngineSupportAccessSELECT
eps_engineEngineSupportEventSELECT, INSERT, UPDATE
eps_engineEngineTagChangeSELECT, INSERT
eps_engineEngineTagRuleHitSELECT, INSERT, DELETE
eps_engineEngineTagTypeSELECT, INSERT, UPDATE, DELETE
eps_engineEngineTagValueSELECT, INSERT, UPDATE, DELETE
eps_engineEngineTamperEventSELECT, INSERT, UPDATE
eps_engineEngineTargetGroupSELECT, INSERT, UPDATE
eps_engineEngineUplinkStateSELECT, INSERT, UPDATE
eps_engineEngineUserTagRuleSELECT, INSERT, UPDATE, DELETE
eps_engineEngineUserTagRuleConditionSELECT, INSERT, DELETE
eps_engineEngineWatchedValueSELECT, INSERT, UPDATE
eps_engineEngineWebAccessSELECT, INSERT, UPDATE, DELETE
eps_engineEngineWorkerHeartbeatSELECT
eps_engineEngineWorkPackageSELECT, INSERT
eps_supportreadSupport read jobAuditEventSELECT, INSERT
eps_supportreadSupport read jobJobScheduleSELECT
eps_supportreadSupport read jobLicenseSELECT(Id, ClaimAction, ClaimMessage, ClaimAtUtc, RequestStatus, RequestAtUtc, NextPollUtc, SupersededBy, UsersInScope, UsageState)
eps_supportreadSupport read jobRunSELECT, INSERT
eps_supportreadSupport read jobSettingSELECT
eps_supportreadSupport read jobWorkerHeartbeatSELECT
eps_tickEngineCaMonitorSELECT, UPDATE
eps_tickEngineJobRequestSELECT(RequestId, Job, Mode, RequestedBy, Status, RequestedAtUtc, UpdatedAtUtc), UPDATE(Status, StatusText, UpdatedAtUtc)
eps_tickEngineJobScheduleSELECT, INSERT, UPDATE
eps_tickEngineLicenseSELECT(Id, the license text)
eps_tickEngineRunSELECT, INSERT, UPDATE
eps_tickEngineSettingSELECT
eps_webWeb appAdminUnitSELECT
eps_webWeb appAdUserSnapshotInfoSELECT
eps_webWeb appAuditEventSELECT, INSERT
eps_webWeb appBreakGlassAccountSELECT
eps_webWeb appCaAdoptionSELECT
eps_webWeb appCaAnalysisSELECT
eps_webWeb appCaAnalysisResultSELECT
eps_webWeb appCaBackupSELECT
eps_webWeb appCaBackupItemSELECT
eps_webWeb appCaDirectoryNameSELECT
eps_webWeb appCaFindingSELECT
eps_webWeb appCaGraphOptionSELECT
eps_webWeb appCaMonitorSELECT
eps_webWeb appCaPersonaSELECT
eps_webWeb appCaPolicySELECT
eps_webWeb appCaStageMoveSELECT
eps_webWeb appCaTemplateTakenSELECT
eps_webWeb appCaVersionPairSELECT
eps_webWeb appConditionTypeSELECT
eps_webWeb appConfigBackupSELECT
eps_webWeb appConfigBackupItemSELECT
eps_webWeb appConfigChangeSELECT
eps_webWeb appDeviceTagRuleSELECT
eps_webWeb appDeviceTagRuleConditionSELECT
eps_webWeb appGroupRuleOverrideSELECT
eps_webWeb appIdentityActionSELECT
eps_webWeb appIdentityLaRunSELECT
eps_webWeb appIdentityRowSELECT
eps_webWeb appIdentitySnapshotSELECT
eps_webWeb appIdentityViewMemberSELECT
eps_webWeb appJobRequestSELECT, INSERT
eps_webWeb appJobScheduleSELECT
eps_webWeb appLicenseSELECT, UPDATE
eps_webWeb appManagedGroupSELECT
eps_webWeb appOnboardingCheckSELECT
eps_webWeb appPendingChangeSELECT, INSERT, UPDATE
eps_webWeb appProLicensePriceSELECT, INSERT, UPDATE
eps_webWeb appProPasskeyProgressSELECT
eps_webWeb appProPasskeyTargetSELECT, INSERT, UPDATE
eps_webWeb appProPolicyCodeSyncSELECT
eps_webWeb appProStaleDecisionSELECT, INSERT, UPDATE
eps_webWeb appRunSELECT
eps_webWeb appRunLogSELECT
eps_webWeb appSavedViewSELECT, INSERT, UPDATE, DELETE
eps_webWeb appSchemaVersionSELECT
eps_webWeb appScopeSELECT
eps_webWeb appServiceTagLocationSELECT
eps_webWeb appSettingSELECT
eps_webWeb appSupportEventSELECT
eps_webWeb appTagChangeSELECT
eps_webWeb appTagRuleHitSELECT
eps_webWeb appTagTypeSELECT
eps_webWeb appTagValueSELECT
eps_webWeb appTamperEventSELECT, UPDATE(Status, ResolvedBy, ResolvedAtUtc)
eps_webWeb appTargetGroupSELECT
eps_webWeb appUplinkStateSELECT
eps_webWeb appUserTagRuleSELECT
eps_webWeb appUserTagRuleConditionSELECT
eps_webWeb appWebAccessSELECT
eps_webWeb appWorkerHeartbeatSELECT
eps_webWeb appWorkPackageSELECT
eps_workerHybrid workerAdGroupMemberSELECT, INSERT, DELETE
eps_workerHybrid workerAdGroupSnapshotInfoSELECT, INSERT, UPDATE
eps_workerHybrid workerAdUserSnapshotSELECT, INSERT, DELETE
eps_workerHybrid workerAdUserSnapshotInfoSELECT, UPDATE
eps_workerHybrid workerSettingSELECT
eps_workerHybrid workerTagChangeSELECT, UPDATE(Status, Error, Via, AtUtc)
eps_workerHybrid workerWorkerHeartbeatSELECT, INSERT, UPDATE
eps_workerHybrid workerWorkPackageSELECT, UPDATE(Status, ClaimedBy, ClaimedAtUtc, Attempts, Error, DoneAtUtc, Result)
Rights a person needs to run each script
ScriptRightScopeWhy
Install-EntraPolicySuite.ps1Ownerthe subscriptioncreates the resource group and resources and the role assignments
Install-EntraPolicySuite.ps1Global Administrator or Privileged Role Administratorthe tenantgrants the engine identity Graph and Exchange app roles and the Exchange Recipient Administrator role; creates the web sign-in registration and gives its admin consent
Deploy-EpsAzureMonitorAlerts.ps1Contributor (Monitoring Contributor is enough for the rules and the action group)the Entra Policy Suite resource groupcreates the action group and the scheduled query rules
Deploy-EpsAzureMonitorAlerts.ps1Security Administrator or Global Administratorthe tenantcreates the Entra diagnostic setting that sends AuditLogs and the sign-in logs to Log Analytics (only if none does yet)
Deploy-EpsAzureMonitorAlerts.ps1an Admin or SuperAdmin of the web appthe Entra Policy Suite web appdownloads the alarm inputs file (Tamper > Download the alarm inputs) - the script reads no database
Grant-EpsEnginePermissions.ps1Privileged Role Administrator (or Global Administrator)the tenantgrants application permissions and the Exchange Recipient Administrator role to a managed identity
Grant-EpsEnginePermissions.ps1Readerthe Entra Policy Suite resource groupfinds the engine identity
Grant-EpsHybridWorkerAccess.ps1Contributor (or any role that may start a Container Apps job)the install's resource groupstarts the database setup job, which creates (or removes) the database user and reads it back - no database right needed (installs made since 2.0.59)
Grant-EpsHybridWorkerAccess.ps1the SQL server's Entra admin - only for an install made before 2.0.59the Entra Policy Suite databasecreates the database user directly
Grant-EpsUpdaterPermissions.ps1Privileged Role Administrator (or Global Administrator)the tenantgrants application permissions to a managed identity
Grant-EpsUpdaterPermissions.ps1Readerthe Entra Policy Suite resource groupfinds the update identity
Import-EpsV1Data.ps1read access to the v1 folderthe v1 DATA folderthe CSV files and configs are read
Initialize-EpsHybridWorkerAd.ps1an AD admin who may change the permissions of the OUsthe OUs namedadds the ACEs
Initialize-EpsLogAnalytics.ps1Contributor + User Access Administrator (or Owner)the workspace's resource group (and the data collection resource group, if another)creates the table, the endpoint and the rule, and the engine's two role assignments
Initialize-EpsLogAnalytics.ps1Contributor (or any role that may start a Container Apps job)the install's resource groupstarts the database setup job, which stores the target (audited) - no database right needed
Initialize-EpsMailSender.ps1Exchange Administrator (and Global Administrator for the Graph grant check)the tenantcreates the mailbox, the Exchange service principal, the scope and the role assignment
Initialize-EpsMailSender.ps1Contributor (or any role that may start a Container Apps job)the install's resource groupstarts the database setup job, which stores the mail settings (audited) - no database right needed (installs made since 2.0.59); an older install: the SQL server's Entra admin stores them directly
Install-EpsHybridWorker.ps1local Administrator on the workerthe worker machinecopies the code, sets ACLs, user rights and a scheduled task
Set-EpsWebAccess.ps1Contributor (or any role that may start a Container Apps job)the install's resource groupstarts the database setup job, which names the SuperAdmin when there is none - no database right needed (installs made since 2.0.59)
Set-EpsWebAccess.ps1the Entra Policy Suite SQL server's Entra admin - only for an install made before 2.0.59 (no database setup job)the Entra Policy Suite databasewrites the access list directly
Set-EpsWebAccess.ps1any user who can read users (Directory Readers is enough)the tenantchecks the person exists and pins their object id
Start-EpsInstall.ps1the rights Install-EntraPolicySuite.ps1 needssee its pagethis script only downloads and starts it

4. Data

Data read from your tenant

  • Users and devices: their properties, the tag attributes, group memberships, license plans and last sign-in time (for the rules and the identity report).
  • Conditional Access policies, named locations, directory role assignments and application names (Conditional Access page and CA Policy Analyzer).
  • Intune managed devices (identity report) and the directory audit log entries for watched tags (tamper monitor).
  • Exchange recipient types (Exchange rule conditions).
  • On-premises AD users and groups (hybrid worker only).

Data written to your tenant

  • The tag attributes of your tag types on users and devices (Entra ID through Microsoft Graph; AD-synced users in Active Directory through the hybrid worker).
  • A mail-enabled user's custom attribute through Exchange Online, where Graph does not write it.
  • One adopted Conditional Access policy moved one stage, only when a SuperAdmin asks for it.

Data stored

All in your Azure SQL database (table list below), your Log Analytics workspace and your Key Vault. Values whose name marks them as a credential are removed before an audit row is written. Encryption at rest and in transit is Azure's: Azure SQL with TLS 1.2 or later, the storage account with TLS 1.2 or later and HTTPS only.

Data sent to Invardia (the uplink)

The engine reports to Invardia only when Invardia has issued a key for this install and that key is in the install's Key Vault. Without it, nothing is sent. With it, the uplink job sends a heartbeat every 4 hours and a record of each finished run, over HTTPS to invardia.com, at most 100 records per cycle. Each record carries only the fields listed below; any other field is dropped before it leaves the install. Free text (an error line) has mail addresses, user names, object ids, security ids and quoted values removed first, so the uplink carries counts and states, not who. A SuperAdmin can switch the uplink off (Uplink.Enabled); the security findings record is off by default (Uplink.Alerts.Enabled).

The update check

Every night the update job asks invardia.com which Entra Policy Suite version is approved for this install's update ring. That question carries no key and nothing about your tenant: only the ring. The job checks that the answer is genuine and complete before it uses it, and records the result in its own run. With the per-install key it also asks whether Invardia has asked for an update now, and reports once per new version that it is available (the running version, the new version and the ring). In this release it installs nothing.

The license (Pro and the trial)

Entra Policy Suite runs as Community without a license; nothing is sent for a license then. An install made with the Pro install line, or one that holds a Pro license, asks Invardia for its license from the update job: the product name, the running version, the tenant id, the install's own id and - when a license is already held - its id, end date and SHA-256. Invardia answers with a request number; the job collects the license later. The license file is signed by Invardia and names the tenants it is for: the job checks it against the public certificates built into the release, the product, the tenant and the dates before it keeps anything, and every part of the product checks it again whenever it reads it. With a valid Pro license the job asks Invardia once for the per-install key (sending the license and the tenant id). The license and that key are kept in the install's own Key Vault; the license also in the database. Nobody pastes or uploads a license. The heartbeat then carries the edition, the license's state and its id. Pro and the 60-day trial are ordered at invardia.com.

Database tables and who writes or reads them
TableWritten byRead by
AdGroupMemberHybrid workerEngine, Hybrid worker
AdGroupSnapshotInfoEngine, Hybrid workerEngine, Hybrid worker
AdminUnitEngineEngine, Web app
AdUserSnapshotHybrid workerEngine, Hybrid worker
AdUserSnapshotInfoEngine, Hybrid workerEngine, Web app, Hybrid worker
AuditEventEngine, Support read job, Web appEngine, Support read job, Web app
BreakGlassAccountEngineEngine, Web app
CaAdoptionEngineEngine, Web app
CaAnalysisEngineEngine, Web app
CaAnalysisResultEngineEngine, Web app
CaBackupEngineEngine, Web app
CaBackupItemEngineEngine, Web app
CaDirectoryNameEngineEngine, Web app
CaFindingEngineEngine, Web app
CaGraphOptionEngineEngine, Web app
CaMonitorEngine, EngineEngine, Engine, Web app
CaPersonaEngineEngine, Web app
CaPolicyEngineEngine, Web app
CaStageMoveEngineEngine, Web app
CaTemplateTakenEngineEngine, Web app
CaVersionPairEngineEngine, Web app
ConditionTypeEngineEngine, Web app
ConfigBackupEngineEngine, Web app
ConfigBackupItemEngineEngine, Web app
ConfigChangeEngineEngine, Web app
DeviceTagRuleEngineEngine, Web app
DeviceTagRuleConditionEngineEngine, Web app
GroupPinEngineEngine
GroupRuleOverrideEngineEngine, Web app
IdentityActionEngineEngine, Web app
IdentityLaRunEngineEngine, Web app
IdentityRowEngineEngine, Web app
IdentitySnapshotEngineEngine, Web app
IdentityViewMemberEngineEngine, Web app
JobRequestEngine, Engine, Web appEngine, Engine, Web app
JobScheduleEngine, EngineEngine, Support read job, Engine, Web app
LicenseEngine, Web appEngine, Support read job, Engine, Web app
LicensePullEngineEngine
ManagedGroupEngineEngine, Web app
MonitorStateEngineEngine
OnboardingCheckEngineEngine, Web app
PendingChangeEngine, Web appEngine, Web app
ProLicensePriceWeb appEngine, Web app
ProPasskeyProgressEngineEngine, Web app
ProPasskeyTargetEngine, Web appEngine, Web app
ProPolicyCodeSyncEngineEngine, Web app
ProStaleDecisionEngine, Web appEngine, Web app
RefreshChangedStats--
RunEngine, Support read job, EngineEngine, Support read job, Engine, Web app
RunLogEngineEngine, Web app
SavedViewWeb appWeb app
SchemaVersion-Web app
ScopeEngineEngine, Web app
ServiceTagLocationEngineEngine, Web app
ServiceTagPrefixEngineEngine
SettingEngineEngine, Support read job, Engine, Web app, Hybrid worker
SupportAccess-Engine
SupportEventEngineEngine, Web app
TagChangeEngine, Hybrid workerEngine, Web app, Hybrid worker
TagRuleHitEngineEngine, Web app
TagTypeEngineEngine, Web app
TagValueEngineEngine, Web app
TamperEventEngine, Web appEngine, Web app
TargetGroupEngineEngine, Web app
UplinkStateEngineEngine, Web app
UserTagRuleEngineEngine, Web app
UserTagRuleConditionEngineEngine, Web app
WatchedValueEngineEngine
WebAccessEngineEngine, Web app
WorkerHeartbeatHybrid workerEngine, Support read job, Web app, Hybrid worker
WorkPackageEngine, Hybrid workerEngine, Web app, Hybrid worker
Retention
DataWhereKept
Rules, tag types, values, condition types, settings, scopes and their version historyYour databaseUntil you change or delete them; the history stays
Runs, run logs and tag changesYour databaseIn your database until you delete them
Identity report snapshotsYour databaseThe newest 7 by default (setting IdentityReport.KeepRuns)
Tamper eventsYour databaseIn your database, with the decision made on each
Audit trailYour databaseAppend-only: the database refuses to change or delete an audit row
Container logsYour Log Analytics workspace30 days
Sign-in sessions of the web appYour database (the sign-in front's own schema)At most 8 hours per session
Invardia uplink - exact fields per record
RecordFields
heartbeatSchema, Kind, Product, Version, Edition, Hosting, RuntimeIdentity, ClaimedTenantId, LastSeenUtc, Ring, Outcome, Counts, EnvironmentName, Jobs, Update, Mail, SignIn, Database, SetupSteps, Endpoints, Pipeline, SupportAccess, BuildPool, UplinkBacklog, LicenceState, LicenceId
runSchema, Kind, Product, Version, Edition, Hosting, RuntimeIdentity, ClaimedTenantId, LastSeenUtc, Job, Outcome, DurationMs, ErrorClass, FixKind, ErrorText, Counts
alertSchema, Kind, Product, Version, Edition, ClaimedTenantId, LastSeenUtc, AlertId, Severity, Measured, FirstSeenUtc, Count, Area, Job, ActionText, Link

5. Access by the vendor

Entra Policy Suite is installed and run by you. The install creates no account, application, role, group or database user for Invardia, and Invardia has no access to your tenant, subscription or database.

What reaches Invardia

  • Only the uplink of chapter 4, and only when Invardia has issued a key for this install. The key is kept in the install's own Key Vault; only the engine identity may read that one item, at send time. It is never written to a log, a job's settings or the database.
  • The uplink only sends. Invardia's answer to a heartbeat may carry a support state (a support case open or closed). Entra Policy Suite records that state, shows it, and writes it to the audit trail. It grants nothing from it.

Support

  • Community: questions and problems go to the Entra Policy Suite GitHub repository. You never share access to your environment; share run logs only after you remove identifying data.
  • Pro: support from Invardia (the support service, the Support app and just-in-time database access - each optional). The Support app is in both editions and off until you create it; Community uses it optionally. Pro adds API and MCP access, always as the signed-in person, with their own role. Pro and the 60-day trial are ordered at invardia.com.

The license gives Invardia no access

A Pro license switches Pro features on in your install; it grants Invardia nothing. Every security control of Community - the roles, the commit queue, the guards, the audit trail, least privilege - is the same in Community and Pro: no security control exists only in Pro. The update job writes exactly two Key Vault items Invardia issues (the license and the per-install key), through Azure as its own identity, which may write them and cannot read any item back.

6. Supply chain

How code reaches your environment

  • Entra Policy Suite is published as releases on GitHub. The install is two lines in PowerShell 7: line 1 downloads the launcher Start-EpsInstall.ps1, line 2 runs it. The launcher downloads the release, checks it against the SHA-256 digest GitHub publishes for it, and deletes it and stops when it does not match.
  • The container images are built inside your own container registry from the release, by the registry's own build. No pre-built vendor image is pulled. The base images come from the Microsoft Container Registry, pinned by digest.
  • Every script a person runs is REST and .NET only: no PowerShell module and no Azure CLI, in the install, the jobs or the hybrid worker. People sign in in a browser; no script asks for or stores a password.
  • An update is a new release, installed the same way: the install is idempotent and resumes or converges an existing install.
  • Pro: the Pro install line downloads the same launcher from invardia.com. It takes the Pro package from Invardia - never from GitHub - after the person signs in to the tenant it installs into; the package's description is signed by Invardia and checked against the keys built into the launcher (product, edition, update ring, version, size and SHA-256) before anything runs. A Pro install's updates come the same way (signed, the same checks). The Pro package is the Community release plus the Pro features' own folder.

The image

The facts below are read from the image's build file of this release.

The container image
ItemValueNote
Base image (sqldriver)mcr.microsoft.com/dotnet/sdk:8.0Pinned by digest sha256:5ef85cc12cb25be6ec319a7392d1e9efd53c3bc8abb971c53d8058a473f09053
Base image (src)mcr.microsoft.com/powershell:7.4-ubuntu-22.04Pinned by digest sha256:62300a213a9293916333df2b014cd3a8f22fb0b0b65f2bb446aaf436bcf8c868
Base image (runtime)mcr.microsoft.com/powershell:7.4-ubuntu-22.04Pinned by digest sha256:62300a213a9293916333df2b014cd3a8f22fb0b0b65f2bb446aaf436bcf8c868
Runs asUser 10001:10001A non-root user; the image writes only to its temp folder
SQL driverMicrosoft.Data.SqlClient 5.2.2A pinned .NET assembly, not a PowerShell module
Left out of every layertests, internal, output, docs, CLAUDE.mdRemoved in a build stage before the runtime image is made
PowerShell modulesNoneThe gallery tooling is removed; the build fails if a banned module or the Azure CLI is still in the image
Sign-in frontVersion 1.4.5Pinned by this release; built in your registry from its source

7. Change control and audit

Every change is checked, staged and recorded

  • Rule, tag type, tag value and condition type changes are checked, then staged in the commit queue (on by default: true). An admin commits them; a change to something edited in the meantime fails. A second approver can be required.
  • A change asked for in the web app is carried out by the engine, which first verifies the person's sign-in proof and checks their role at that moment. The web app's own identity cannot change the directory or the configuration.
  • Every setting, schedule and access change needs a reason. The protection settings below need a SuperAdmin.
  • Every rule, tag type, setting and scope keeps its version history; an earlier version can be put back as a new change.

Runs plan before they write

  • A tagging job's mode is Preview after the install: it records its plan and writes nothing until an admin chooses Apply. Every feature is off after the install.
  • A run can be limited to a saved test scope.
  • The mass-change guard holds a run whose plan changes far more objects than usual, with a lower limit for overwriting an existing tag than for filling an empty one. Nothing is applied until an admin approves; the hold is recorded and sent as an alert.
  • Break-glass accounts you list are never targeted.

Audit trail

One writer for every part (web app, jobs, setup) and a closed list of actions (below): an action not on the list is not written, and the release's tests fail. The audit table is append-only: no role may update or delete a row, and the database refuses it. Each row has who, when, from where (web, job or setup), the target, the reason, the outcome, and before and after. Refused requests and guard holds are recorded too. Exports of audited data are themselves audited.

Protection settings and who may change them
SettingWhereLeast roleWhat it does
Jobs run (master switch)Settings > GeneralSuperAdminAll jobs stop at once
Commit queue for rule changesSettings > Commit queueSuperAdminRule changes wait for a commit
Second approverSettings > Commit queueSuperAdminA second person must approve a commit
Guard: most new tag changes per runSettings > User taggingAdminA limit of the mass-change guard: a run whose plan exceeds it is held for approval
Guard: most new tag changes (percent of users)Settings > User taggingAdminA limit of the mass-change guard: a run whose plan exceeds it is held for approval
Guard: most new overwrites per runSettings > User taggingAdminA limit of the mass-change guard: a run whose plan exceeds it is held for approval
Guard: most new overwrites (percent of users)Settings > User taggingAdminA limit of the mass-change guard: a run whose plan exceeds it is held for approval
Guard: most new tag changes per runSettings > Device taggingAdminA limit of the mass-change guard: a run whose plan exceeds it is held for approval
Guard: most new tag changes (percent of devices)Settings > Device taggingAdminA limit of the mass-change guard: a run whose plan exceeds it is held for approval
Guard: most new overwrites per runSettings > Device taggingAdminA limit of the mass-change guard: a run whose plan exceeds it is held for approval
Guard: most new overwrites (percent of devices)Settings > Device taggingAdminA limit of the mass-change guard: a run whose plan exceeds it is held for approval
Tamper monitorSettings > Tamper monitorSuperAdminWatched tags are compared with what Entra Policy Suite wrote
Known writers (allow list)Settings > Tamper monitorSuperAdminWriters whose changes are not tamper events
High-severity tag valuesSettings > Tamper monitorAdminTag values whose change is a high-severity event
Alert mailSettings > Alert mailSuperAdminWhether alert mail is sent
Sender mailboxSettings > Alert mailSuperAdminThe one mailbox the engine may send from
Alert recipientsSettings > Alert mailSuperAdminWho receives alert mail
SMTP serverSettings > Alert mailSuperAdminThe SMTP relay alert mail goes through, when alert mail is sent by SMTP
SMTP portSettings > Alert mailSuperAdminThe port of that relay
SMTP with TLSSettings > Alert mailSuperAdminWhether the connection to that relay is encrypted
SMTP from addressSettings > Alert mailSuperAdminThe address mail through that relay comes from
SMTP password (Key Vault secret)Settings > Alert mailSuperAdminWhere the relay password is kept (a Key Vault secret; the password itself is never stored)
Conditional Access monitor (adopted policies)Settings > Conditional AccessSuperAdminAdopted Conditional Access policies are compared with the recorded state
Send the report to Log Analytics (and read the exposure lists)Settings > Identity reportSuperAdminWhether the identity report's user rows go to Log Analytics
Log Analytics target (workspace, endpoint, rule)Settings > Identity reportSuperAdminThe one workspace, endpoint and rule the user rows go to
Send telemetry to InvardiaSettings > Invardia telemetrySuperAdminWhether the Invardia uplink sends
Send security findings to InvardiaSettings > Invardia telemetrySuperAdminWhether security findings are sent to Invardia
Install new versionsSettings > UpdatesSuperAdminWhether the update job checks for new versions
Allow the clean-up to disable approved accountsSettings > Pro: stale identitiesSuperAdminWhether the stale identity clean-up may disable (and enable again) accounts a SuperAdmin approved - the engine holds User.ReadWrite.All for it only while this is on
Back up every nightSettings > BackupsSuperAdminWhether the policies and the tagging configuration are backed up every night
Git providerSettings > Pro: policy as codeSuperAdminPro policy as code: the Git provider (GitHub or Azure DevOps) the policies are pushed to and read from
Git repositorySettings > Pro: policy as codeSuperAdminPro policy as code: the Git repository the policies are pushed to and read from
Git branchSettings > Pro: policy as codeSuperAdminPro policy as code: the branch a push commits to and a read takes by default
Folder in the repositorySettings > Pro: policy as codeSuperAdminPro policy as code: the folder in the repository that holds the policies
Git access key (Key Vault secret)Settings > Pro: policy as codeSuperAdminPro policy as code: where the Git access key is kept (a Key Vault secret; the key itself is never stored)
The closed list of audited actions
ActionArea
auth.request.refusedSign-in
support.readSupport access
access.grantAccess list
access.revokeAccess list
job.run.requestJobs
job.test.requestJobs
job.golive.requestJobs
config.requestConfiguration
job.schedule.changeJobs
queue.stageCommit queue
queue.commitCommit queue
queue.discardCommit queue
queue.discard-allCommit queue
mail.test.requestMail
setting.changeSettings
license.claim.againLicense
rule.createRules
rule.updateRules
rule.deleteRules
rule.moveRules
rule.batchRules
rule.batch.checkRules
rule.import.planRules
rules.exportRules
tagtype.changeTag types
tagtype.deleteTag types
tagvalue.changeTag types
tagvalue.removeTag types
condition.changeCondition types
condition.deleteCondition types
scope.changeScopes
scope.deleteScopes
ca.analyze.requestConditional Access
ca.exportConditional Access
ca.monitor.changeConditional Access
ca.monitor.deleteConditional Access
ca.template.takeConditional Access
ca.persona.changeConditional Access
ca.persona.deleteConditional Access
ca.policy.adoptConditional Access
ca.policy.releaseConditional Access
identity.action.setIdentity report
onboarding.checkGet started
breakglass.changeBreak-glass accounts
onboarding.strengthsGet started
onboarding.deniedcountriesGet started
onboarding.trustedGet started
onboarding.breakglassGet started
ca.policy.stageConditional Access
ca.policy.editConditional Access
ca.policy.cloneConditional Access
ca.policy.edit.checkConditional Access
ca.directory.searchConditional Access
ca.policy.deployConditional Access
ca.policy.newversionConditional Access
ca.policy.promoteConditional Access
ca.policy.rollbackConditional Access
ca.policy.removeoldConditional Access
ca.group.checkConditional Access
ca.group.createConditional Access
ca.group.ruleConditional Access
ca.group.membersConditional Access
ca.group.forceupdateConditional Access
ca.group.auConditional Access
ca.group.editruleConditional Access
ca.group.validateConditional Access
ca.policy.restoreConditional Access
ca.policy.restore.checkConditional Access
ca.policy.undoConditional Access
job.run.undoJobs
backup.ca.exportBackups and undo
ca.policy.removeConditional Access
ca.policy.remove.checkConditional Access
ca.object.restoreConditional Access
ca.object.restore.checkConditional Access
config.exportConfiguration
config.import.checkConfiguration
ca.documentation.exportConditional Access
identity.run.requestIdentity report
identity.exportIdentity report
view.saveIdentity report
view.deleteIdentity report
tamper.event.acceptTamper monitor
tamper.event.restore.requestTamper monitor
tamper.event.restoreTamper monitor
audit.exportExports
changes.exportExports
runs.exportExports
web.request.refusedWeb requests
guard.tripGuards
support.state.changeSupport access
support.session.refusedSupport access
v1import.planImport from v1
v1import.applyImport from v1
support.access.changeSupport access
auth.signinSign-in
identity.viewIdentity report
ca.analysis.viewConditional Access
tamper.alarm-inputs.exportTamper monitor
setup.database.applyDatabase setup
update.applyUpdates
pro.licenseopt.exportPro features
pro.licenseprice.changePro features
pro.policycode.exportPro features
pro.policycode.pushPro features
pro.policycode.importPro features
worker.test.requestHybrid worker
worker.retryHybrid worker
pro.passkey.targetPro features
pro.stale.decidePro features
pro.stale.approvePro features
pro.stale.reenablePro features
api.useAPI for scripts (Pro)
mcp.toolMCP server (Pro)

8. Threat model and hardening

The top risks for a product that writes the attributes your Conditional Access policies depend on, and the controls that answer each one. Every control below is part of the design: it is built into the product, applied by the install and kept in place by every re-run of it. The checklist after it lists what you can add in your own tenant.

Threats and controls
ThreatControlsHardening by design
Someone changes tags to move users between Conditional Access policiesChanges go through the commit queue (optional second approver); runs plan first (Preview); the mass-change guard holds unusual runs; every change is audited with who and whyCommit queue on by default; tagging in Preview after the install
A tag is changed outside Entra Policy SuiteThe tamper monitor compares watched tags with what Entra Policy Suite wrote, names the writer from the audit log, raises an event and can restore the valueHigh-severity values (for example break-glass) are flagged
Misuse of the engine identityManaged identity (no credential to steal); it also runs the schedule check, so no separate scheduler identity exists; Graph rights read only except the tag writes and one Conditional Access stage move a SuperAdmin asks for; any Graph right can be left out at installRights granted at install, listed in chapter 3 and read back
A web app session is misusedThe web app holds no directory right; the engine verifies the person's sign-in proof and checks their role at the moment it acts; sessions end after a fixed timeAssignment required on the sign-in registration; your Conditional Access applies to the sign-in
Data is read or changed in the databaseEntra authentication only; one role per part with object-level grants; the audit table is append-onlyNo part is db_owner, db_datareader or db_datawriter
A tampered release or imageThe launcher checks the release against the SHA-256 digest GitHub publishes; images are built in your registry from base images pinned by digest; no modules; non-root userBuild fails if a banned module is present
Data leaves the tenantNothing is sent to Invardia without a per-install key; the uplink carries listed fields only and removes names and ids from free textThe uplink can be switched off by a SuperAdmin
Exposure from the internetPrivate install option: data services with public access off, private endpoints, internal environment, proven from inside the networkShared keys are off on the storage account in every install
An attempt to lock everyone outThe last SuperAdmin cannot be removed (a guard); every access change is auditedName more than one SuperAdmin
Hardening checklist you can apply
#ActionWhy
1Name at least two SuperAdminsAccess never depends on one person
2Assign only the people and groups who need the web app to its enterprise applicationOnly assigned people can sign in
3Apply your Conditional Access policies (MFA, compliant device) to the web app's sign-inThe sign-in is an ordinary Entra sign-in
4List your break-glass accounts in the productThey are never targeted
5Turn on the second approver for the commit queueFour eyes on every rule change
6Turn on the tamper monitor and alert mailChanges made outside Entra Policy Suite are reported
7Keep the SQL admin group (grp-eps-sql-admins, or your own with -SqlAdminGroupId) to the database setup job's identityNo person holds standing database admin rights
8Deploy the Azure Monitor alarm (Deploy-EpsAzureMonitorAlerts.ps1)Alerts that work independently of the product
9Use the private install where your policy asks for itNo public endpoint for data services or the web app
10Leave out any Graph permission your approver does not approve (-ExcludeGraphRole)Only approved rights are granted

9. Compliance mapping

How Entra Policy Suite's controls can support your own controls. This is not a certification and does not make your organization compliant; you remain responsible for your controls and their evidence.

Mapping (supports the customer's control)
FrameworkControlHow Entra Policy Suite supports it
ISO/IEC 27001:2022 Annex A5.15 Access control / 5.18 Access rightsUsers and devices are tagged from rules you control, so Conditional Access and dynamic groups follow role and status consistently
ISO/IEC 27001:2022 Annex A5.16 Identity managementThe identity report finds inactive, orphaned and unclassified accounts every day
ISO/IEC 27001:2022 Annex A8.2 Privileged access rightsPrivileged accounts are identified and their protection is reported; break-glass accounts are listed and never targeted
ISO/IEC 27001:2022 Annex A8.15 LoggingAppend-only audit trail of every change and refused request, with who, when, why, before and after
ISO/IEC 27001:2022 Annex A8.32 Change managementCommit queue with optional second approver; Preview before Apply; mass-change guard
NIS2 (EU 2022/2555) Article 21(i) access control policies, (j) multi-factor authenticationConditional Access targeting kept in line with your rules; accounts without strong authentication reported
DORA (EU 2022/2554) Article 9Protection and prevention: identity and access managementTagging from rules, reviewed changes, and an audit trail you keep in your own database
CIS Controls v85 Account management / 6 Access control managementInactive and unclassified accounts found; access follows tags set from rules

10. Uninstall and exit

Removing the product

  • The Azure side: delete the resource group the product was installed in. That removes the jobs, the web app, the Container Apps environment, the database (all stored data), the queues, the registry, the Log Analytics workspace, the Key Vault and the managed identities. With the managed identities go their Microsoft Graph and Exchange permissions and their directory role.
  • The Key Vault stays recoverable for 90 days after it is deleted (purge protection); it holds no data of yours.
  • Outside the resource group: delete the web sign-in registration in Entra ID, and undo the optional parts with the scripts that made them (table below).
  • What stays: the tags already written on your users and devices; remove them with your own tooling if you want them gone. Your Conditional Access policies are yours and are not removed.
  • Exit is complete: nothing runs outside your subscription, so nothing remains at Invardia beyond the uplink records it already received.
How to undo what each script made
ScriptUndo
Install-EntraPolicySuite.ps1Delete the resource group, and the engine identity's app role and Exchange role assignments (they go with the identity when the resource group is deleted).
Deploy-EpsAzureMonitorAlerts.ps1Delete ag-eps-alarm and the eps-* rules; delete the diagnostic setting eps-entra-logs if it was created by this script.
Grant-EpsEnginePermissions.ps1Run again with -Remove (or without it, to grant back).
Grant-EpsHybridWorkerAccess.ps1Run again with -Remove.
Grant-EpsUpdaterPermissions.ps1Run again with -Remove (or without it, to grant back).
Import-EpsV1Data.ps1Nothing to undo: the script writes nothing. An import made on the Import v1 page is journaled in the change history and its rules can be removed as a set; the v1 install is never changed, so v1 keeps running until it is switched off.
Initialize-EpsHybridWorkerAd.ps1Run again with -Remove -Apply.
Initialize-EpsLogAnalytics.ps1Switch 'Send the report to Log Analytics' off; remove the two role assignments, the rule, the endpoint and (if wanted) the table.
Initialize-EpsMailSender.ps1Remove the role assignment, the scope, the Exchange service principal and (if created) the mailbox; set Mail.Mode to none.
Install-EpsHybridWorker.ps1-Remove: both tasks, the group membership and the code; then Initialize-EpsHybridWorkerAd.ps1 -Remove and Grant-EpsHybridWorkerAccess.ps1 -Remove.
Set-EpsWebAccess.ps1A SuperAdmin removes the person on the app's Access page.
Start-EpsInstall.ps1Nothing to undo here; see Install-EntraPolicySuite.ps1.

11. Scripts

Scripts are run by highly privileged people, so they are listed one by one with the rights needed, the changes made and how to preview them. Every script is:

  • self-contained, REST and .NET only - no PowerShell module and no Azure CLI;
  • signed in to in a browser as the person running it - no password, no client secret and no certificate in or out;
  • able to show its plan first (-WhatIf, or no -Apply) without changing anything;
  • shown as two lines, download then run - never piped into Invoke-Expression;
  • listed in SHA256SUMS.txt next to it, for whoever verifies a download.

The install

  1. Download the launcher: Invoke-WebRequest https://github.com/KnudsenMorten/EntraPolicySuite/releases/latest/download/Start-EpsInstall.ps1 -OutFile Start-EpsInstall.ps1
  2. Run it (add -WhatIf first to see the plan; nothing is created): ./Start-EpsInstall.ps1 -TenantId <tenant id> -SubscriptionId <subscription id>

The launcher checks the release and runs its Install-EntraPolicySuite.ps1 with the same parameters; that script is part of the release package and is listed separately below.

Every other script

  1. Invoke-WebRequest https://invardia.com/support/eps/<Script>.ps1 -OutFile <Script>.ps1
  2. ./<Script>.ps1 -WhatIf, then without -WhatIf.
Published scripts (invardia.com/support/eps/)
ScriptPurposeRights needed to run itChanges it makesPreview
Start-EpsInstall.ps1Download Entra Policy Suite 2.0 and start the installthe rights Install-EntraPolicySuite.ps1 needs (see its page)this computer: create a temporary folder with the release zip and its contentsDownloads and checks the release, then runs the installer with -WhatIf (its plan; nothing is changed in Azure).
Deploy-EpsAzureMonitorAlerts.ps1Deploy Entra Policy Suite's external alarm in Azure MonitorContributor (Monitoring Contributor is enough for the rules and the action group) (the Entra Policy Suite resource group); Security Administrator or Global Administrator (the tenant); an Admin or SuperAdmin of the web app (the Entra Policy Suite web app)Entra: create diagnostic setting eps-entra-logs (AuditLogs, SignInLogs, NonInteractiveUserSignInLogs -> the install's Log Analytics workspace), unless one already sends AuditLogs; Azure: create action group ag-eps-alarm (mail + SMS); Azure: create scheduled query rules eps-* (up to 10); Azure: remove eps-* rules no longer wanted (e.g. the AD rules when no AD break-glass account remains)Every resource it would create, update or remove; nothing is changed.
Grant-EpsEnginePermissions.ps1Give the Entra Policy Suite engine a missing permission, or take one awayPrivileged Role Administrator (or Global Administrator) (the tenant); Reader (the Entra Policy Suite resource group)Entra: create app role assignments on the engine identity; Entra: create directory role assignment Exchange Recipient Administrator (with -Exchange)What the engine has, and what would be granted or removed; nothing is changed.
Grant-EpsHybridWorkerAccess.ps1Give the hybrid worker's managed identity access to the Entra Policy Suite databaseContributor (or any role that may start a Container Apps job) (the install's resource group); the SQL server's Entra admin - only for an install made before 2.0.59 (the Entra Policy Suite database)SQL: create database user eps-hybrid-workerThe T-SQL it would run; nothing is run.
Grant-EpsUpdaterPermissions.ps1Give the Entra Policy Suite update identity a missing permission, or take one awayPrivileged Role Administrator (or Global Administrator) (the tenant); Reader (the Entra Policy Suite resource group)Entra: create app role assignments on the update identityWhat the update identity has, and what would be granted or removed; nothing is changed.
Import-EpsV1Data.ps1See what a v1 install's rules and settings become in Entra Policy Suite 2.0read access to the v1 folder (the v1 DATA folder)The script always only reads and shows; -WhatIf changes nothing about that.
Initialize-EpsHybridWorkerAd.ps1Delegate the Entra Policy Suite hybrid worker's gMSA in Active Directoryan AD admin who may change the permissions of the OUs (the OUs named)Active Directory: grant the gMSAWithout -Apply (or with -WhatIf): every ACE it would add or remove and the ones already there.
Initialize-EpsLogAnalytics.ps1Send Entra Policy Suite's identity report to Log Analytics and read the exposure listsContributor + User Access Administrator (or Owner) (the workspace's resource group (and the data collection resource group, if another)); Contributor (or any role that may start a Container Apps job) (the install's resource group)Azure: create the table EntraUsersMetadata_CL (or its missing columns; existing columns and their types are kept); Azure: create the data collection endpoint (default dce-entrapolicysuite) and the rule dcr-entra-EntraUsersMetadata_CL; Azure: grant the engine identity; Azure: grant the engine identity; SQL: update setting IdentityReport.LogAnalytics.TargetEvery step it would take; nothing is changed.
Initialize-EpsMailSender.ps1Set up Entra Policy Suite's mail: a shared mailbox, sent from by the engine onlyExchange Administrator (and Global Administrator for the Graph grant check) (the tenant); Contributor (or any role that may start a Container Apps job) (the install's resource group)Exchange Online: create the shared mailbox (if it does not exist; no license); Exchange Online: create service principal for the engine identity, management scope <sender>-SendScope; Exchange Online: grant the engine identity; Entra: remove a tenant-wide Graph Mail.Send app role on the engine identity, if present; SQL: update settings Mail.Mode, Mail.Sender, Mail.Recipients (Platform.EnvironmentName)Every step it would take and the settings it would store; nothing is changed.
Install-EpsHybridWorker.ps1Install the Entra Policy Suite hybrid worker on a domain-joined serverlocal Administrator on the worker (the worker machine)the worker: create a folder on the machine (the worker code; the current and the previous version), the junction a folder on the machine pointing at the current one, a folder on the machine (the database, the worker name, the gMSA - no secret), a folder on the machine; the worker: update the ACL of a folder on the machine; the worker: grant the gMSA; the worker: grant the gMSA; the worker: create scheduled task 'EntraPolicySuite Hybrid Worker' (every 5 minutes, as the gMSA); the worker: create scheduled task 'EntraPolicySuite Hybrid Worker Update' (daily 05:30, as SYSTEM)Every step it would take; nothing is copied, granted or registered.
Set-EpsWebAccess.ps1Name who may use the Entra Policy Suite web app (the first SuperAdmin)Contributor (or any role that may start a Container Apps job) (the install's resource group); the Entra Policy Suite SQL server's Entra admin - only for an install made before 2.0.59 (no database setup job) (the Entra Policy Suite database); any user who can read users (Directory Readers is enough) (the tenant)SQL: update eps.WebAccess (one row); SQL: create eps.AuditEvent (one row, access.grant)The person, the role and who grants it; nothing is changed.
The installer in the release package (run by the launcher)
ScriptPurposeRights needed to run itChanges it makesPreview
Install-EntraPolicySuite.ps1Install Entra Policy Suite 2.0 in your own Azure subscriptionOwner (the subscription); Global Administrator or Privileged Role Administrator (the tenant)26 changes in Azure, Entra, SQL, this computer - every one is in chapters 1 to 3Every step, what exists and what it would create - nothing is created, registered or granted.

Published scripts and their checksums

Every Entra Policy Suite script Invardia publishes at invardia.com/support/eps/, 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.

ScriptVersionSHA-256Documentation
Deploy-EpsAzureMonitorAlerts2.0.10766a3e55b5c377bf32de1d4f7419eebba92138d983185e661925e7be9e7457253Out of date
Grant-EpsEnginePermissions2.0.1075fa791d09dc3068c9d0a3276281c0f545c8903189d580715d7749687c7544085Out of date
Grant-EpsHybridWorkerAccess2.0.107c4c115d536a91e3476fa8f515ebbc1788c904d5f67eb03f153942a1d666604c8Out of date
Grant-EpsUpdaterPermissions2.0.107c9e39f34b8c5157d6616a9762b34827a029d642e8325d8983a09781dbbb744dfOut of date
Import-EpsV1Data2.0.1071cec1791c598795aef44700cf4d0a8efc89508a99f252e8b4aa3dd8be5e39235Out of date
Initialize-EpsHybridWorkerAd2.0.107a1814facb242131b3ce96d823d8ed27e4cb8e4ecc11b397aabf86e630f1d2105Out of date
Initialize-EpsLogAnalytics2.0.107de9c9671013bd168f42929ca4e3f9c46965cde6d84c87e7e943e06bb94449522Out of date
Initialize-EpsMailSender2.0.10716338c80463d598a4cccf2ff04adcd18f3ab7f03cd407e6fd55fd75121993c5fOut of date
Install-EpsHybridWorker2.0.107774d7b427b26a4d0093ef917345642316baca4c1c19aa2a30f236051a39863a0Out of date
Set-EpsWebAccess2.0.107463b67c29bffd5019447e850fda7aaf382af74c418bc31148ac1921eb21ec765Out of date
Start-EpsInstall2.0.107f93eb5d9ec76d281555a21089043917480bed01841592a6fcf6582a4114af875Out of date

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/eps/<Script>.ps1 -OutFile <Script>.ps1
.\<Script>.ps1 -WhatIf

To 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: Entra Policy Suite scripts · Every setting explained: Entra Policy Suite settings

Entra Policy Suite is published by Invardia. Questions about this pack: info@invardia.com. Community support: the Entra Policy Suite GitHub repository. This pack describes how the product supports your own controls; it is not a certification, and Entra Policy Suite does not hold ISO 27001, SOC 2 or similar certification.

Entra Policy Suite 2.0.107 · security review pack dated 2026-11-09 · written by the Entra Policy Suite team, published by Invardia.

InvardiaInvardia

See the risk. Control the access.

Products

PIM ManagerSecurityInsightEntra Policy SuiteAll featuresPricingFree 60-day Pro trialBook a demoWhy Invardia

Docs

DocumentationSearch the docsPIM Manager settingsSecurityInsight settingsPIM network guidesCommand wizardNetwork egressPIM Manager design configuratorSecurityInsight design configuratorDesign your installationCalculate your cost

Company

AboutContactCustomer portalSupportHow support worksHow updates reach youSupport in numbersSetup scriptsRemote support accessContact: info@invardia.com

Legal

Terms of saleLicence termsData processingPrivacyCookiesCompany information
© 2026 Invardia – a brand of 2LINKIT, founded and owned by Morten Knudsen · Strandvejen 21A, 6000 Kolding, Denmark · VAT DK39208032 · Contact: info@invardia.com