Separate by design
Sandbox and production are separate environments, each in its own Azure subscription, built from the same Terraform modules. Production is the sandbox’s shape with stronger settings, and every change reaches sandbox first.
Group cloud foundation
The whole Azure estate as code; Terraform and Bicep provisioning, GitHub Actions pipelines, Entra ID and Intune policy as code, secured zero-trust from endpoint to edge. It covers the company’s Microsoft 365 tenant as well as its Azure subscriptions: who can sign in and from what device, where each system runs, how secrets are held, and what stands between the internet and the staff tools. The intent lives in git, not in one administrator’s head or in clicks in a portal.
Sandbox first, production by approval
Sandbox and production are separate environments, each in its own Azure subscription, built from the same Terraform modules. Production is the sandbox’s shape with stronger settings, and every change reaches sandbox first.
Production keeps its logs longer and backs its database up to a second region. Services send their logs and metrics to a central workspace, with alerts on database load and application errors.
An empty-data environment on a small virtual machine, for building without touching anyone’s records. Its database password is generated on the machine at first boot and never written to git.
Servers such as the Job Adding System’s and JARVIS’s are built from Bicep; the Job Adding System keeps its sandbox and production parameters side by side. Edge settings are Terraform, one stack per application and environment, and each stack manages only its own records, so applying one can never change another.
Planned on every pull request, applied only on approval
The infrastructure pipelines in GitHub Actions sign in to Azure with OpenID Connect federation: each run gets a short-lived token, and no Azure password or key is stored in GitHub.
Further reading. How the images those pipelines build are made: Building a container image I’d trust in production.
Entra ID and Intune, as code
The tenant’s intended state is a repository: every change a pull request, and the real tenant checked against it on a schedule.
The company’s written policies, from acceptable use and data handling to shadow IT, incident response and backup, are mapped to the technical controls that implement them. That map is the reason for everything in the code and the yardstick the audit measures against.
Conditional Access, authentication strengths and groups are Terraform, planned in review and applied by an owner, so who can sign in, and how, is a reviewed change rather than a click in a portal.
Compliance policies for company computers and phones, and app-protection policies for company data on mobile apps, are kept as code and assigned by group, so a new device gets the same baseline as the last.
The audit and the changes use separate identities, each with its exact least-privilege permissions written down. The audit identity can only read, and the write path is applied by an owner, never by itself.
Where secrets live, and what faces the internet
RenewCompare’s secrets live in Azure Key Vault, reached over private networking. Its applications read them through managed identities, their configuration refers to a secret rather than holding it, and sensitive account fields are encrypted with a key that stays in the vault.
The managed database sits inside a private network with public access switched off. Scheduled jobs run inside the same network, so they reach the database without it ever being exposed.
DNS, managed firewall rules, rate limiting, single sign-on policies and tunnels are Terraform. The staff console sits behind single sign-on at the edge, reached through a tunnel its server opens outward.
The Job Adding System’s server carries an outbound firewall, audit logging and a watch on its listening ports, and its network keeps flow logs, all defined alongside the server itself.
Checked every week, reviewed in depth
Every week. Since July 2026 a read-only audit of the Microsoft 365 tenant has been scheduled in CI every week. It signs in by federation, collects the tenant’s state, ranks what it finds, and commits the report to git, so any drift in posture is visible in the history.
In depth. In July 2026 I ran a read-only security review across every RenewCompare repository and the live Azure estate. Each finding was verified before it was fixed, and every fix went through the normal pull request, pipeline and deploy path. Among them: security headers on every API response, error pages included; every third-party CI action in those repositories pinned to a commit; and services that refuse to start in production with authentication switched off.
Owned decisions. Anything that needs a decision beyond mine goes to the company’s security owner on a register, split by who owns the system. Fixes I can make, I make through the same reviewed path as everything else.