Security

It reads. It cannot write. That is the design.

A license audit needs to read licenses, users and mailboxes, and nothing else. So GlacierPoint Ledger asks for read permissions only, holds no standing access to any tenant, and has no code that writes to one. The work is done by an app on your computer, signed in as you; the portal prices and shows what the app read, encrypted at rest, for the members of your workspace.

Access

Who can touch the tenant.

Only people in your organization, with their own sign-in, and only to read.

Read-only Graph, no write permission

Every check is a read. The app asks for the five read permissions below on Microsoft's own sign-in page, and the consent card names each one. There is no write permission in the product, so there is nothing to misuse: it cannot release a license, disable a user or change a mailbox.

No vendor access

We hold no password, token, client secret or certificate for any tenant, and there is no support account or back door. Nobody at GlacierPoint Ledger can read your tenant; the app on your computer does, signed in as you.

Sign-ins stay in memory

Interactive sign-ins are held in memory by the app, never written to disk, never shown and never sent to the portal. They are discarded when you sign out or close the app.

Scheduled runs on your computer

With Watch and MSP, unattended runs use an app registration your organization owns, created by a one-time setup you see every line of, and a certificate whose private key is kept by Windows on that computer and never leaves it.

The portal never drives the app

The app only signs in, reads, seals and uploads. It takes no command from the portal and runs nothing the portal sends; the portal evaluates and renders.

Nothing installed in the tenant

No agent, no mailbox rule, no service principal with standing permissions unless you choose scheduled runs, and then one you own and can remove at any time.

Permissions, by name

What the app asks for, and why.

Asked at sign-in, with a consent card that says "Granted: N of M". Every one is a read.

PermissionWhat it readsFor which checks
Organization.Read.AllThe subscriptions: purchased, assigned, suspended and warning units, trial and end datesUnassigned licenses, subscriptions ending, the overlap map
Directory.Read.AllLicenses and service plans per user, how each was assigned, assignment statesOverlapping licenses, service plans disabled, assignment errors, add-ons without a base
User.Read.AllUsers and guests: account state, creation date, typeDisabled users, never-activated users, guests
AuditLog.Read.AllSign-in activity: the last interactive and non-interactive sign-inStale users, stale guests, never-activated users
Reports.Read.AllUsage reports; optionalContext on the report
Exchange Online administrator readShared, room and equipment mailboxes, their size, archive and litigation holdShared and resource mailboxes with licenses

Sign-in activity needs Entra ID P1 or P2 in the tenant. Without it the stale-users check says "needs Entra ID P1" and falls back to the creation date and "never signed in".

Your findings

Sealed before they leave your computer. Encrypted where they are kept.

A run holds the names of your users and what they cost. It is handled like that all the way.

  • Sealed uploads. A run is compressed and encrypted on your computer with AES-256-GCM, under a key wrapped with the portal's public key (RSA-OAEP), before it is uploaded. The portal checks the seal before it accepts the run.
  • Findings encrypted at rest. The run and the findings are stored encrypted under a data key kept outside the database, so a copy of the database alone reveals no user and no figure. The portal decrypts them on the server only while it works on them: to run the checks and price them when the run arrives, and to show, export or compare them for a member of your workspace.
  • Encrypted in transit. The portal is served over TLS 1.2 or 1.3 only, with HTTP Strict Transport Security.
  • Names never in logs. The portal's logs and the workspace's activity record hold counts, codes, the tenant's domain and the run id; never a user's name or address, and never a figure. Those are in the report, for the members of your workspace.
  • A signed price table. Microsoft's list prices ship as a data file signed with a key kept offline; the portal checks the signature at startup and refuses to start otherwise. The app never receives the table and never sees a price.
What we never store

Not on our servers, not anywhere.

If we do not hold it, it cannot leak from us.

The website and the portal

Nothing loaded from anyone else.

No trackers, no analytics, no advertising, no third-party scripts or fonts.

A strict Content-Security-Policy

Every page, this one included, may run only scripts and styles served by the portal itself, and cannot be framed by another site.

Sessions that end

A sign-in to the portal lasts twelve hours at most. Roles decide who may change settings, set prices or end a plan: owner, operator or viewer.

The operator console, limited by design

Our own operator console answers only on the server's loopback address, over an SSH tunnel, and never through the public site. It shows counts, versions and the state of the service; it cannot open a run, read a finding or see a user's name.

Found a security problem? Write to security@glacierpointtech.com with the details, and what to do to see it. Please do not test against tenants or workspaces that are not yours. /.well-known/security.txt carries the same address.