Security & trust

How rugged.sh reaches your customers' tenants

Access is app-only and scoped per customer tenant, with no standing administrator account. This page lists the mechanisms and every permission the app holds. If you need a security questionnaire answered before connecting a tenant, send it to security@rugged.sh.

  • Scoped app-only access, no standing admin

    A customer's Global Administrator approves one admin consent link, which grants one app registration the Graph application permissions listed below, plus the Owner role on that customer's Azure subscription. The app itself is never given Global Administrator, and we hold no customer admin accounts or user passwords. The consent is visible in the customer's own enterprise applications and can be revoked there.
  • Where data lives, and what it is

    Control-plane data is hosted in Azure Canada Central. We store configuration and metadata about your customers' tenants, such as tenant ids, baselines and deployment records. The app holds no permission to read their email, files or chats. On termination, your data is deleted or returned after a 90-day recovery window.
  • Scope checked in the data-access layer

    Every row and every operation carries a partner and customer-tenant scope, enforced in the store rather than in each screen, and covered by tests as a correctness invariant. A staff login can be restricted to a subset of customer tenants.
  • Secrets in Key Vault

    Application credentials, signing keys and API tokens are read from Azure Key Vault through managed identity, not from application config or source control. One component acquires tokens; the rest of the codebase asks it rather than handling credentials directly.
  • Actions are recorded

    Operator and MSP actions are written to an audit trail with the actor, the target and the time. A correlation id travels from the API call to the background job that executes it, so an action can be traced end to end. Audit rows are retained for a configurable window, one year by default.
  • Backups with point-in-time restore

    Postgres keeps continuous point-in-time backups for 35 days in the same Azure region, restorable to the second. Separately, a weekly full backup is held for three months in a geo-redundant vault replicated to a second region. In a regional outage the most recent weekly copy is the recovery point, so up to about a week of changes could be lost. The point-in-time restore path was last exercised end to end on 2026-07-17, on a throwaway server with row counts compared against live.
  • Support, and what we do not promise

    Platform support is an always-on ticket channel inside the console. We reply usually within one business day, Atlantic time. There is no contractual SLA, no overnight rota and no status page yet; we would rather say that than let you infer one. We are a small team and you will be talking to the people who wrote the code.
  • MFA and email verification

    Self-serve signup requires email verification and a second factor, TOTP or an emailed code, before the console is reachable. Sessions use secure cookies over HSTS, and mutating requests are rejected when the origin is neither the app's own host nor a configured allowlist entry.

Every Microsoft Graph permission, and why

13 application permissions on one multitenant app registration, granted when your client's admin approves the consent link. The list is kept in the codebase and this page is checked against it, so a permission cannot be added quietly.

AuditLog.Read.All
Sign-in activity, for the licence-waste and helpdesk views.
CloudPC.Read.All
Windows 365 Cloud PC inventory and health.
CloudPC.ReadWrite.All
Creating Cloud PC provisioning policies, and reprovisioning a Cloud PC.
DelegatedPermissionGrant.ReadWrite.All
After a pooled AVD deployment, grants the client's Azure Files storage app the sign-in consent FSLogix profiles need (openid, profile, User.Read), so nobody has to click it by hand.
DeviceManagementConfiguration.Read.All
Reading Intune settings for drift detection.
DeviceManagementConfiguration.ReadWrite.All
Writing an Intune baseline and remediating drift.
DeviceManagementServiceConfig.Read.All
Autopilot device and deployment-profile health.
Directory.Read.All
Directory metadata: service principals, organization branding, group names.
LicenseAssignment.ReadWrite.All
Assigning and removing licences from the helpdesk, and reclaiming them when a user is offboarded.
Organization.Read.All
The tenant's display name and domain, during onboarding.
Policy.Read.All
Reading Conditional Access policies for drift detection.
Policy.ReadWrite.ConditionalAccess
Writing a Conditional Access baseline and remediating drift.
User.ReadWrite.All
Helpdesk user actions: disable, enable, MFA reset and offboarding.

On Azure: the Owner role, per subscription

There is no standing Azure permission. During onboarding the app is given the Owner role on each client subscription you connect, and the console reads that role assignment back before the connection goes live. Owner is broad, and we say so: it is what lets the platform create a host pool and tear it down again. Disconnecting a client stops token issuance for that tenant immediately, and the client can remove the role assignment and the consent themselves at any time.

Questions before you connect a customer?

Email security@rugged.sh or open a ticket and a real person answers.