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

PIM Manager guides

  1. PIM Manager on a private network: your options for DNS, routing, segmentation and policy
  2. Install PIM Manager in private (internal) mode from scratch
  3. Convert a public (external) PIM Manager environment to private (internal)
  4. Give PIM Manager your own address (custom host name)
  5. Deploy the PIM Manager hybrid worker (PIM for Active Directory) in Azure
  6. Deploy the PIM Manager hybrid worker (PIM for Active Directory) on your own server with Azure Arc

Command wizard

PIM Manager on a private network: your options for DNS, routing, segmentation and policy

Written by the PIM Manager team for PIM Manager 2.4.579 · 2026-10-10

This chapter describes the decisions you make before you run PIM Manager in private (internal) mode. Both step-by-step guides refer to it: Install PIM Manager in private mode and Convert a public environment to private.

It uses the same terms as the Architecture and Security presentation:

  • Public (external) mode. The PIM Manager has a public HTTPS address with Entra sign-in in front of it.
  • Private (internal) mode. The PIM Manager has a private IP address in your virtual network. People reach it only through your private path: VPN, ExpressRoute, Entra Private Access, or a jump host.

The topology names are Single (one tenant), Managing tenant (a provider that manages other tenants) and Managed tenant (a customer tenant managed by a provider).

We do not configure your network for you. The PIM scripts build only what lives inside the PIM resource group: the Container Apps environment, the private endpoints for PIM’s own registry and database, and their private DNS zones. They can also create the peering to a hub and link DNS zones to it, but only when you ask them to and only when the identity running them has rights on the hub. Your firewall, routing, DNS forwarding, the NAT gateway, NSGs and Azure Policy stay under your control. For every decision below, this chapter lists the options, what PIM needs from you, and what the scripts do.


0. Who does what

Area PIM scripts do it (script and parameter) You do it
Container Apps environment, internal-only The infra step of Invoke-PimDeployAll.ps1 -Exposure internal Choose this before the first install. It cannot be changed later. Converting means rebuilding (see the conversion guide).
Container Apps subnet and its delegation New-PimHostingPrerequisites.ps1 -VnetName -SubnetName -VnetAddressPrefix -SubnetAddressPrefix. Delegates the subnet to Microsoft.App/environments. Provide the address ranges from your IP plan. The scripts never choose a range inside your network.
Private-endpoint subnet -PrivateEndpointSubnetName (default pim-endpoints) and -PrivateEndpointSubnetAddressPrefix Provide the range (a /26 is enough).
Registry: Premium SKU, private endpoint, build pool -AcrSku Premium -AcrPublicAccess false -AcrAgentPoolName <name>. Invoke-PimDeployAll -Exposure internal defaults the SKU to Premium. Accept the cost of Premium and the build pool.
SQL private endpoint -SqlPrivateEndpoint. This is on by default with Invoke-PimDeployAll -Exposure internal. Turn the SQL server’s public network access off yourself, or with Azure Policy, once the private endpoint works. Not yet automated: no single-tenant script turns it off.
SQL reached through the subnet (no private endpoint) The deploy’s sqlaccess step runs on every deploy. It adds the Microsoft.Sql service endpoint on the Container Apps subnet and a VNet rule on the server. Nothing.
Private DNS zone for the environment’s default domain Created and linked automatically for internal mode, unless you pass -SkipPrivateDns. You can choose where it goes with -PrivateDnsResourceGroup. Forward it from your own DNS (section 1.3).
privatelink.azurecr.io / privatelink.database.windows.net Created in the PIM resource group, or in -PrivateDnsResourceGroup in the same subscription, and linked to the PIM VNet Link them to your hub, or forward to them. If your zones live in a central subscription, see option C in section 1.2 (not yet automated: attaching PIM’s endpoints to existing central zones).
Hub peering Both sides, when you pass -HubVnetName -HubVnetResourceGroup [-HubVnetSubscriptionId] and the identity running it has Network Contributor on the hub Or pass -SkipPeering and create the peering yourself. New-PimHubPrepareScript.ps1 (a standalone script, section 6) writes a script for the hub owner.
Gateway transit and forwarded traffic on the peering Not set. The scripts create the peering with VNet access only. Turn on use remote gateways / allow gateway transit / allow forwarded traffic if your admins come in through a hub gateway or firewall.
Outbound path (NAT gateway, UDR, firewall) Nothing All of it. The allow-list is in section 2.3.
NSGs on the PIM subnets Nothing. The one exception is the RFA broker’s own subnet (section 3). All of it (section 5.1).
Admins’ private path to the PIM Manager Nothing. In internal mode the setup prints an Entra Private Access checklist. VPN, ExpressRoute, Entra Private Access, a jump host or Azure Bastion.
Custom name for the PIM Manager Set-PimManagerCustomHost.ps1 Provide the certificate and own the DNS zone.

Prerequisites

Regions

You choose the region (PIM 2.4.577+); data residency is your decision. The guided install, Invoke-PimDeployAll.ps1 and Invoke-PimMspBuild.ps1 check in their preflight, before anything is created, that every service PIM Manager needs is available in that region for your subscription (Container Apps, Azure SQL S0, registry, Key Vault, storage, Log Analytics, managed identity). If one is missing, the preflight names it and suggests the nearest region that has all of them. If your Azure Policy has an allowed locations list, it must include the region you pick.

Address plan

Subnet Size the scripts accept Recommended Notes
Container Apps (infrastructure) subnet /27 or larger. New-PimHostingPrerequisites refuses anything smaller and warns that /27 leaves little room. /24 or /23 Delegated to Microsoft.App/environments, so it cannot hold anything else. The Invardia guided install asks for a /23 (stricter than the script).
Private-endpoint subnet Any range inside the VNet /26 Holds the registry and SQL private endpoints, plus the registry’s build pool when you use one. It cannot be the Container Apps subnet.
RFA broker subnet (only when you deploy the access-request portal) /16 to /27 /27 Its own subnet, delegated to Microsoft.App/environments (section 3).

The PIM VNet must not overlap with your hub or any network it peers with. The peering plan refuses overlapping ranges.

Roles for the person (or Invardia support session) running the install

These are the same roles the guided install documents:

  • Owner, or Contributor + User Access Administrator, on the PIM subscription.
  • In Entra ID: Privileged Role Administrator (Graph permissions for the managed identities, and the role-assignable SQL admin group) and Application Administrator (the PIM Manager’s sign-in app). Exchange Administrator only if the install should create the notification mailbox.
  • Owner or User Access Administrator at the tenant root management group. This is recommended: it gives the engine Reader there so Discovery can see Azure. If it is missing, the install ends with a warning and the command to run later.
  • Network Contributor on the hub VNet, only if the scripts should create the hub side of the peering. Add Private DNS Zone Contributor on the DNS resource group if the environment’s zone goes next to the hub. If you do not want to grant these, use -SkipPeering and hand the hub owner the script written by New-PimHubPrepareScript.ps1.

Resource providers

New-PimHostingPrerequisites registers these itself: Microsoft.App, Microsoft.ContainerRegistry, Microsoft.OperationalInsights, Microsoft.Network, Microsoft.Sql, Microsoft.Storage and Microsoft.KeyVault.

Where you run the scripts from

In private mode the deploy host does not need a route into the VNet for most steps:

  • the database schema, the database users and the feature switches are applied inside the environment by the bootstrap job ca-pim-dbinit;
  • the image build runs on the registry’s build pool.

Three things do need a host inside your network, or one that can reach the private SQL endpoint:

  • the end-of-install check, Confirm-PimInstall.ps1;
  • registering a licence file, Set-PimLicense.ps1 (an enrollment key is refused when SQL is private);
  • the first sign-in test of the PIM Manager.

1. DNS resolution

1.1 What must resolve, and for whom

Name Resolves to Who needs it Created by
<unique-name>.<region>.azurecontainerapps.io: zone apex @, wildcard *, and *.internal The environment’s static private IP in the Container Apps subnet Admins’ browsers (the PIM Manager), and jobs inside the VNet The infra step of Invoke-PimDeployAll.ps1, in internal mode, linked to the PIM VNet and the hub. Rebuild-PimEnvInternal.ps1 does the same after a conversion.
<registry>.azurecr.io and <registry>.<region>.data.azurecr.io (zone privatelink.azurecr.io) The registry’s private endpoint The Container Apps platform (image pull) and the build pool New-PimHostingPrerequisites.ps1 -AcrPublicAccess false, through a DNS zone group, so both records are written. A missing data record gives a login that succeeds and a pull that hangs.
<server>.database.windows.net (zone privatelink.database.windows.net) The SQL private endpoint The PIM Manager, the engine job, the updater, the bootstrap job; anyone running a check from inside New-PimHostingPrerequisites.ps1 -SqlPrivateEndpoint
<store>.blob.core.windows.net (zone privatelink.blob.core.windows.net) The managing tenant’s bundle-store private endpoint Managing tenant / Managed tenant only, when the policy bundle is reached over a private endpoint Managing tenant: the privateendpoint step of Invoke-PimMspBuild.ps1 -Role Master. Managed tenant: its privatedns step (-Role Slave). Both run over REST, with no Azure CLI.
A custom name, for example pim.contoso.local The environment’s static private IP Admins Set-PimManagerCustomHost.ps1 -Dns PrivateDnsZone: writes the record only into an Azure private zone that already exists, and otherwise prints what to create. Or -Dns AdDns: PIM prints the record for you to add.
<vault>.vault.azure.net (privatelink.vaultcore.azure.net) Only if you put Key Vault behind a private endpoint The engine and the PIM Manager, when a feature keeps a secret in Key Vault (SMTP relay password, emergency passphrase, Managing tenant signing key) Not created by any PIM script. The setup’s private-link checklist names the zone.

1.2 Who hosts the zones: options

Option How Trade-offs
A. In the PIM resource group (default) Pass nothing. The zones are created next to PIM and linked to the PIM VNet. The environment’s zone is also linked to the hub when you pass -HubVnetName. Simple and self-contained, and removed with the environment. On the other hand: a second privatelink.azurecr.io / privatelink.database.windows.net zone next to the hub’s own zone means a VNet linked to both sees only one of them. Avoid linking PIM’s privatelink zones to a hub that already has its own zones.
B. A shared DNS resource group in the PIM subscription -PrivateDnsResourceGroup <rg> on Invoke-PimDeployAll / New-PimHostingPrerequisites / Rebuild-PimEnvInternal Keeps DNS together. It only works within the same subscription.
C. Central zones in a hub / connectivity subscription (Azure landing-zone style) The environment’s zone: if you give -HubVnetResourceGroup and no -PrivateDnsResourceGroup, the infra step creates it in the hub’s subscription and resource group. The privatelink zones: not yet automated (the scripts can place them only in the PIM subscription). Use your own deploy-if-not-exists private-DNS policy to register the endpoints in the central zones, or create the A records yourself. Skip the PIM zones by not linking them. Matches most enterprise designs. You own the records the policy does not create.
D. Your Active Directory DNS Internal mode: Invoke-PimDeployAll -DnsServer <dc>. For a custom name: Set-PimManagerCustomHost -Dns AdDns [-AdDnsServer <dc>]. PIM prints the record for you to add. It does not write to your AD DNS. Works without Azure private zones for domain-joined clients. No module is needed. For a custom name, PIM prints the single A record (name, zone, address), lines you can paste into DNS PowerShell or dnscmd, and a Resolve-DnsName check to run afterwards. It never adds a wildcard and never creates a zone in your DNS. In internal mode it prints the environment’s records (in the environment’s own azurecontainerapps.io domain).

1.3 On-premises clients and custom DNS servers

A VNet whose DNS servers are your own, such as domain controllers or a DNS appliance, does not resolve Azure private zones by itself. You need one of these:

  1. Azure DNS Private Resolver (recommended). Put an inbound endpoint in the hub and link the zones to the hub. Then add conditional forwarders on your on-premises DNS:

    • the environment’s default domain (<unique-name>.<region>.azurecontainerapps.io);
    • privatelink.database.windows.net and privatelink.azurecr.io, if anyone outside Azure must reach them (usually only admins running checks);
    • your custom name’s zone, if it is an Azure private zone.

    Point the forwarders at the resolver’s inbound IP.

  2. A DNS forwarder VM in the hub that forwards those names to 168.63.129.16. That address answers only from inside an Azure VNet.

  3. AD DNS records (option D above). Remember to update them after every rebuild, because the default domain changes.

A hosts-file entry pointing at the static IP is acceptable for a first test only.

1.4 Default name or custom name

  • The default Container Apps name (ca-pim-manager.<unique-name>.<region>.azurecontainerapps.io) needs no certificate. Its weakness: it changes every time the environment is rebuilt. That includes the conversion from public to private. Bookmarks, mail links and the sign-in app’s reply address all move with it.
  • A custom name (Set-PimManagerCustomHost.ps1 -HostName pim.contoso.com|pim.contoso.local) survives rebuilds. The script adds the name to the app and binds your certificate. It then creates the DNS record, adds the name to the PIM Manager’s mail links (PIM_MANAGER_HOSTNAMES), and adds the reply address to the sign-in app.
    • Private environment: you must bring the certificate, from Key Vault (-KeyVaultName -KeyVaultCertName) or as a PFX (-PfxPath -PfxPassword). A free managed certificate cannot be validated on a private environment, and the script refuses it.
    • Private-only top-level names (.local, .lan, .internal, .intranet, .corp, .home, .localdomain, .private) are refused on a public environment and allowed on a private one.
    • The conversion script does not take a custom name (not yet automated: a custom name with your own certificate during the conversion). Run Set-PimManagerCustomHost.ps1 right after the conversion.

2. Routing

2.1 Hub and spoke

New-PimHostingPrerequisites creates the PIM VNet isolated. A private PIM Manager in an isolated VNet has no route from any client, while every resource check still reports success. The deploy warns about this when you give no hub.

Option Parameters Notes
The scripts peer to your hub (both directions) -HubVnetName -HubVnetResourceGroup [-HubVnetSubscriptionId] on Invoke-PimDeployAll The identity needs Network Contributor on both VNets. The peering is created with allow virtual network access only. If your admins come in through the hub’s VPN or ExpressRoute gateway, turn on allow gateway transit (hub side) and use remote gateways (PIM side) yourself. If traffic goes through a hub firewall, turn on allow forwarded traffic.
You create the peering -HubVnetName -HubVnetResourceGroup -SkipPeering The DNS zone is still created and linked to the hub. To hand the hub owner a ready script, run New-PimHubPrepareScript.ps1 -SpokeSubscriptionId -SpokeResourceGroup -SpokeVnetName -HubResourceGroup -HubVnetName [-HubSubscriptionId] [-DeployPrincipalObjectId] [-DnsResourceGroup] (-HubSubscriptionId is optional: leave it out when the hub is in the PIM subscription). The file it writes is one self-contained script: the hub owner runs it with PowerShell 7 on any machine, first without -Apply to see the plan, then with -Apply (browser sign-in as the hub owner; no Azure CLI, no modules).
No hub (Entra Private Access connector or jump host inside the PIM VNet) Omit the hub parameters The PIM Manager is reachable only from inside the PIM VNet. The setup prints an Entra Private Access checklist.

2.2 The outbound path

The PIM engine, the PIM Manager and the updater only make outbound calls. Nothing calls into the engine in any mode. PIM’s Container Apps environment uses a workload profiles environment (the Consumption profile), which is the kind that supports user-defined routes and a NAT gateway.

Option What you build Trade-offs
A. NAT gateway on the Container Apps subnet NAT gateway plus a public IP, attached to the subnet A stable egress IP that partners can allow-list. No inspection. This is the deck’s “NAT gateway (or firewall)”.
B. Forced tunnelling to Azure Firewall / an NVA in the hub A route table on the Container Apps subnet (0.0.0.0/0 to the firewall), plus firewall rules for the list in 2.3 Full inspection and logging. You must keep the allow-list current. Also add the platform rules Microsoft documents for Container Apps behind a firewall: system images, managed identity, and so on.
C. Forced tunnelling to on-premises over ExpressRoute or VPN The same route through your gateway Possible, but every call to Microsoft Graph and Azure Resource Manager makes a round trip through your datacentre. Expect slower engine runs.
D. Default outbound access Nothing Works today, but Microsoft is retiring default outbound access for new networks, and it gives you no fixed IP or control. Not recommended for private mode.

SQL and the outbound path.

  • With a SQL private endpoint, database traffic stays inside the VNet.
  • Without one, the deploy’s sqlaccess step authorises the subnet (the Microsoft.Sql service endpoint plus a VNet rule), so the database does not depend on your egress IP. Service-endpoint traffic goes straight to Azure SQL, not through your 0.0.0.0/0 route.
  • A NAT gateway changes the source address for everything else. A storage account elsewhere that admits PIM by an IP rule must then admit the new IP or the subnet.

SQL ports. The default connection policy from inside Azure is Redirect: port 1433, then 11000–11999 to the database node. If your firewall allows only 1433, install with -SqlConnectionPolicy Proxy (on Invoke-PimDeployAll and New-PimHostingPrerequisites). Otherwise connections authenticate and then hang.

2.3 Outbound allow-list (derived from the code)

Runtime: the PIM Manager, the engine job, the updater and the other jobs (TCP 443 unless noted)

Destination Port Component Why When
login.microsoftonline.com 443 All. The PIM Manager also fetches the token signing keys. Sign-in, token validation, Easy Auth Always
graph.microsoft.com 443 Engine, PIM Manager, RFA, updater Directory, PIM, Intune / Defender role management, mail (/sendMail) Always
management.azure.com 443 Engine (Discovery, Azure roles), PIM Manager (“Run now” starts the engine job), updater (rolls the apps, runs the registry build) Azure Resource Manager Always
<server>.database.windows.net 1433 (+11000–11999 with Redirect) All components The PIM store Always (private endpoint IP when private)
<registry>.azurecr.io, <registry>.<region>.data.azurecr.io 443 Container Apps platform Image pull Always (private endpoint IP when private)
*.blob.core.windows.net (a storage account owned by the registry build service) 443 Updater Uploads the build context for the nightly image build Updater installed (Pro, or a Community install with a published source)
invardia.com 443 Engine (heartbeat and telemetry, licence request and pickup, install-key claim), updater (signed release manifest and the release archive) Licence, updates, status Pro / trial. Telemetry is on by default.
<vault>.vault.azure.net 443 Engine, PIM Manager SMTP password, emergency passphrase, Managing tenant signing key Only when such a feature is used
outlook.office365.com 443 Engine Exchange Online admin REST (mailbox features) Mail features
<rfa-store>.table.core.windows.net 443 Engine (rfa-sync job) Pulls access requests from the RFA store Pro: access-request portal
<bundle-store>.blob.core.windows.net 443 Managing tenant publish job / Managed tenant pull job Signed policy bundle Managing tenant / Managed tenant only
api.powerbi.com, api.businesscentral.dynamics.com, service.powerapps.com, api.bap.microsoft.com, vssps.dev.azure.com 443 Engine Workload connectors Only the connectors you enable
Your SMTP relay 587 (STARTTLS; 465 is refused) Engine, PIM Manager Mail Only in SMTP mail mode
Teams / webhook endpoints 443 Engine, PIM Manager Alert channel Only if configured
Log Analytics ingestion (Azure Monitor) 443 Container Apps platform Container logs Always (platform-side)

Where updates are downloaded from.

  • Pro / trial (the in-cloud updater ca-pim-update): only https://invardia.com. The updater asks POST https://invardia.com/api/updates/pim-manager/manifest for its ring’s signed manifest and downloads the release from the link in that answer, which Invardia serves as https://invardia.com/api/updates/pim-manager/code/<version>/archive (streamed from Invardia’s own storage, so there is no separate storage host to allow). The updater accepts the archive only if its SHA-256 and size match the signed manifest, and only over https. The download link is decided by Invardia’s answer, not fixed in the product; Invardia has confirmed that every Pro download is on invardia.com, and will announce any change on its egress page first: <https://invardia.com/docs/egress/> (the full list of hosts PIM Manager reaches, split into always / only when used / your own Azure / the admin machine during setup).
  • Community: releases come from GitHub: github.com and objects.githubusercontent.com (on the deploy host that runs Update-PimCommunity.ps1, and on the updater if your Community install has one).
  • Microsoft endpoints the updater itself uses: login.microsoftonline.com (its managed identity’s tokens), management.azure.com (the registry build, rolling the apps), *.blob.core.windows.net (the build context is uploaded to the registry build service’s storage; the exact account is returned at run time), your registry and your SQL server (over their private endpoints when private).
  • Mirroring releases to your own storage is a support-led setup; ask Invardia support.

The registry build pool (private registry only). The build pool runs in the private-endpoint subnet and fetches the base images and packages: mcr.microsoft.com, *.data.mcr.microsoft.com and api.nuget.org. It also needs the outbound access Microsoft documents for dedicated build agent pools.

The deploy host (setup only)

Destination Why
management.azure.com, graph.microsoft.com, login.microsoftonline.com All setup calls
invardia.com Enrollment / licence, and the signed release package (Pro)
github.com, objects.githubusercontent.com Community: the release (Update-PimCommunity.ps1)
api.ipify.org Detects the host’s public IP for the temporary SQL setup rule. Pass -SetupHostIp to skip the lookup.
Your SQL server (public endpoint, temporary AllowSetupHost rule) Only when SQL is not private. The deploy removes the rule at the end of the run.

3. Segmentation: the access-request (RFA) portal

3.1 What it is

RFA (“request for authorization”) lets a disabled administrator, typically a consultant, ask for their account to be enabled for a period:

  1. They sign in with a one-time PIN.
  2. The request is approved automatically or by the department’s owners.
  3. The engine enables the account, and disables it again when the window ends. Roles are still activated through normal PIM with MFA.

External systems such as ServiceNow can submit requests through the access-request API.

RFA is Pro only (features rfa.portal and api.broker, hard-enforced).

Part Faces Runs as Rights
RFA broker ca-pim-rfa (portal and API) End users and external systems. It is the only public surface of PIM. Its own managed identity No PIM rights: no SQL, no Graph directory rights, no Key Vault. Only Storage Table Data Contributor on the RFA store, and permission to send as the RFA mailbox.
RFA store (one storage account, Azure Tables) Both sides — Shared keys off, TLS 1.2, no public blob access
Engine job rfa-sync PIM and Entra The engine’s managed identity Pulls new requests, decides everything again itself (nothing the public side says is trusted), enables and disables accounts, and writes the status back
PIM Manager, “Access requests” page Approvers (internal) — Decisions are written to the PIM store. The PIM Manager never talks to the broker.

The broker and the engine never talk to each other. Their only link is the RFA store, and the engine pulls.

3.2 Placement options (Deploy-PimRfaBroker.ps1 -Placement)

Placement Network Trade-offs
Shared (default) Its own subnet (-SubnetName, default snet-pim-rfa, -SubnetPrefix) inside the PIM VNet, in its own Container Apps environment. An NSG denies outbound traffic from that subnet to every PIM subnet you list in -PimSubnetPrefixes. One VNet and one subscription. The NSG keeps the public side out of the private side. Caution: with -ExistingEnvironmentName the broker joins an existing public environment and gets no subnet or NSG of its own.
Island (“two VNets”) Its own subscription (-RfaSubscriptionId, which must differ from PIM’s), its own resource group (-RfaResourceGroup, default rg-pim-rfa) and a new VNet (default vnet-pim-rfa). No peering, by design. The strongest separation: the public side cannot reach the private side at all. Never deployed live yet. The broker pulls its image from PIM’s registry, so a registry with public access disabled cannot serve an Island broker (not yet automated: a separate registry or pull path for an Island broker).

In both placements the broker’s environment is public. The deploy refuses an internal environment, because the portal exists to be reached by people who are not on your network. To limit it to known systems, use -ApiAllowedIps. That applies to the whole broker app, so the PIN portal then stops being public. It is the API-only shape.


4. Routing between the segments

There is exactly one flow between the RFA segment and the PIM segment:

PIM engine job (private VNet)  --HTTPS 443, outbound-->  RFA store  <--HTTPS 443--  RFA broker (public)
Option What it takes Scripted?
Engine reaches the RFA store’s public endpoint (as built today) Allow <rfa-store>.table.core.windows.net:443 on your egress path (NAT gateway or firewall). For Island this is the only rule: PIM subnet to the RFA store, TCP 443, nothing inbound. Yes. The store is created with default public network access; Entra authentication only, shared keys off.
Store firewall: allow the broker’s subnet (service endpoint) and the PIM subnet or egress IP Storage network rules Not yet automated. Deploy-PimRfaBroker.ps1 does not set storage network rules; add them yourself.
Private endpoint for the RFA store in the PIM VNet (engine side private, broker side public or service endpoint) A storage private endpoint plus privatelink.table.core.windows.net in the PIM VNet Not yet automated. You can add it yourself. The broker must still reach the store, over its public endpoint or its own service endpoint.
Peering the two VNets — Deliberately not offered. It would open a route from the public side to the private side.

5. Policies and firewall rules

5.1 NSGs

The PIM scripts create no NSG on the Container Apps or private-endpoint subnets. The RFA broker subnet is the one exception. If you add NSGs:

Subnet Inbound Outbound
Container Apps subnet Allow TCP 443 (and 80 if you want the redirect) from your admin / PAW / VPN / Private Access ranges to the subnet. Also add the platform rules Microsoft documents for workload-profile environments (Azure Load Balancer, in-subnet traffic). Deny the rest. The allow-list in 2.3 (or route it to your firewall). Allow traffic to the private-endpoint subnet: SQL 1433 (+11000–11999 with Redirect), registry 443.
Private-endpoint subnet From the Container Apps subnet (SQL, registry). From your admin ranges only if admins run checks against SQL. Build pool: the base-image and package hosts in 2.3
RFA broker subnet (Shared) The NSG Deploy-PimRfaBroker creates denies outbound to the PIM subnets. It adds no inbound rule and no read-back of its own rules. Check them yourself. Deny to the PIM subnets (created); the RFA store and Graph (sendMail)

5.2 Azure Policy effects that commonly break the deploy

Policy What breaks What to do
Container registries should disable public network access / should not allow unrestricted network access (Deny) A Basic registry: Basic and Standard have no network controls at any setting. Use -AcrSku Premium -AcrPublicAccess false -PrivateEndpointSubnetAddressPrefix <cidr> -AcrAgentPoolName <name>. Internal mode defaults to Premium.
Azure SQL should disable public network access (Deny) The deploy host cannot apply the schema from outside, and setup rules are refused. Use internal mode with -SqlPrivateEndpoint: the schema and users are then applied in-cloud by ca-pim-dbinit. The policy may be displayed as a “SQL Databases” policy.
Container Apps environments should use network injection / should disable public network access A public environment Internal mode is the compliant shape.
Allowed locations A region outside the list Pick a region from your list; the preflight then checks that PIM Manager’s services are available there.
Allowed SKUs Premium registry, SQL S0 (-SqlServiceObjective), the build pool tier (`-AcrAgentPoolTier S1 S2
Require a tag (Deny) Resource creation: the scripts set only their own tags (not yet automated: a parameter for your own tags) Use Modify / inherit tag from resource group policies instead of Deny, or an exemption for the PIM resource group.
Storage accounts should prevent shared key access / public blob access The Managing tenant bundle store in the default public-but-signed mode (anonymous read of one blob from named networks) Use the private-endpoint mode (baseline.access = privateEndpoint) for Managing tenant / Managed tenant pairs on private networks. The RFA store already has shared keys and public blob access off.
Deploy-if-not-exists: private DNS zone groups to central zones (landing zones) Usually nothing. It can register PIM’s private endpoints in your central zones. Let it. This is the recommended way to use central zones, which the scripts cannot target yet.
Deny private DNS zones outside the connectivity subscription The PIM privatelink.* zones and the environment’s zone in the PIM resource group Set -PrivateDnsResourceGroup to an allowed group in the PIM subscription, or skip the environment’s zone (-SkipPrivateDns) and create its records yourself. For the privatelink zones, use the deploy-if-not-exists policy above (not yet automated: zones outside the PIM subscription).

5.3 Firewalls on the PaaS services

Service Options What PIM does
Azure SQL (Entra-only authentication, TLS 1.2) (1) Private endpoint plus public access disabled: most private. (2) Public endpoint that admits only the PIM subnet (VNet rule over the service endpoint): no private endpoint and no DNS work, but the public name still answers. The Managing tenant / Managed tenant build uses this by default, with a short “build window” for its host. (3) Public with firewall rules: not recommended for private mode. Creates the VNet rule on every deploy. Creates the private endpoint with -SqlPrivateEndpoint. Creates the AllowAzureServices rule only when no subnet path exists, and never re-opens it once the subnet path works. Adds and removes the temporary AllowSetupHost rule around a deploy. Does not turn public access off (not yet automated for a single tenant).
Container registry Premium with a private endpoint, public access off, and a build pool in the VNet Creates all of it (New-PimHostingPrerequisites). On an existing registry it upgrades the SKU (never downgrades) and adds the endpoint, and turns public access off only on the conversion script’s -LockRegistry. That switch is refused while no private endpoint exists.
Storage (RFA store, Managing tenant bundle store) Public endpoint with Entra authentication / named networks / private endpoint RFA: public endpoint, Entra only. Bundle store: public-but-signed (default) or a private endpoint (the privateendpoint step of Invoke-PimMspBuild.ps1 -Role Master, with baseline.access = privateEndpoint).
Key Vault Private endpoint (yours) Nothing network-related.

5.4 Inbound for admins: how people reach the PIM Manager

The PIM Manager is the only thing people connect to. The engine never accepts inbound connections.

Option Notes
Site-to-site VPN / ExpressRoute through the hub Peering with gateway transit (section 2.1), DNS forwarding (section 1.3), and NSG inbound from on-premises admin ranges
Entra Private Access (Global Secure Access) No VPN. Publish the PIM Manager’s private name or IP on port 443 as a Private Access application, assign it to the admin group, and put a connector in the hub or the PIM VNet. The setup prints this checklist in internal mode.
Jump host / Azure Bastion / PAW subnet Admins browse from a host inside a peered network
Point-to-site VPN Small teams

Sign-in still works in private mode. The browser is sent to login.microsoftonline.com and comes back to the private address. The admin’s browser needs internet access to Entra, and the environment needs outbound access to login.microsoftonline.com (section 2.3). Conditional Access applies as usual.

Use the default name, or a custom name with the same reply address. The reply address is the PIM Manager’s own address. The deploy’s easyauth step and Set-PimManagerCustomHost.ps1 keep it in step.


6. The scripts named in these guides, and how you run them

Every script below has its own documentation page at https://invardia.com/docs/pim/scripts/<Script>/ (what it does, the rights it needs, every change it makes, -WhatIf and undo). Every script previews its changes with -WhatIf (or runs as a plan without -Apply), prints its name, version and documentation page as its first line, and writes a local log.

Standalone support scripts. One self-contained file each, published at https://invardia.com/support/pim/<Script>.ps1 with a checksum list https://invardia.com/support/pim/SHA256SUMS.txt. Two lines: line 1 downloads the file, line 2 runs it (never pipe a download into Invoke-Expression). Whoever wants to verify first compares Get-FileHash with the file’s line in SHA256SUMS.txt – never as lines in the shown command:

Invoke-WebRequest https://invardia.com/support/pim/New-PimHubPrepareScript.ps1 -OutFile New-PimHubPrepareScript.ps1
.\New-PimHubPrepareScript.ps1 -WhatIf
Script Used for
New-PimHubPrepareScript.ps1 Writes the hub owner’s preparation script (section 2.1)
Grant-PimEnginePermissions.ps1 Gives the engine identity a missing permission (the PIM Manager shows the exact command)
Initialize-PimSqlAdminGroup.ps1 Makes grp-pim-sql-admins the SQL server’s admin
Initialize-PimMailSender.ps1, Set-PimSmtpRelayPassword.ps1 The notification mailbox, or the SMTP relay password
Set-PimSqlTier.ps1 The database tier

Package scripts. These load the engine libraries next to them, so they run only from the PIM Manager release package, never as a single downloaded file:

  • Pro / trial: Install-Invardia downloads the signed release package for your installation and runs the guided install from it. For a consultant-led step (private mode, a managing tenant, the access-request portal), open PowerShell in that downloaded package folder and run the script as .\tools\setup\<Script>.ps1.
  • Community: the public repository at the release tag; run the script from its folder in the same way.
Script Used for
Install-PimManager.ps1 The guided install (Invardia runs it for you)
Invoke-PimDeployAll.ps1 The single-tenant deploy, public or private
Invoke-PimMspBuild.ps1 Managing tenant / Managed tenant builds
New-PimHostingPrerequisites.ps1 Re-running the prerequisites with private options (conversion guide, Step 3)
Rebuild-PimEnvInternal.ps1, Rebuild-PimEnvExternal.ps1 Converting an environment between public and private
Remove-PimContainerStack.ps1 Removing only the Container Apps part, keeping the data
Set-PimLicense.ps1 Registering a licence file
Grant-PimSupportAccess.ps1 Giving your Invardia Support app access
Confirm-PimInstall.ps1 The end-of-install check
Set-PimManagerCustomHost.ps1 A custom name for the PIM Manager
Deploy-PimRfaBroker.ps1 The access-request portal
Update-PimCommunity.ps1 Community updates from the deploy host

None of these scripts needs the Azure CLI or a PowerShell module, and neither does the file that New-PimHubPrepareScript.ps1 writes for the hub owner (section 2.1): it signs in through the browser and calls Azure Resource Manager directly.

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