Black Shard

Insights26 May 2026

Who should own the Azure tenant when someone else builds your system

Account custody decides who can revoke access and who can produce the audit trail. The accounts that matter on a custom build, what least privilege for the builder should look like, and an exit test that proves ownership in an afternoon.

A ring of brass keys resting on a steel deposit box door, lit cold cyan on dark slate

Who should own the Azure tenant, the client or the developer?

The client should hold it, and the reason is operational rather than commercial. Account custody decides who can revoke access, who can produce the audit trail, and who can answer a regulator's question about who was able to change what. A builder that holds the tenant holds all three, and the client is left with a contract describing rights it cannot exercise on its own.

Three separate things get called the same name. The Entra ID tenant is the identity directory: users, credentials, service principals, consent grants, and the root of Azure role assignments. The subscription is the billing and resource container that sits inside a tenant. Custody of the tenant decides the rest, because a Global Administrator can switch on access management for Azure resources in the directory properties and take User Access Administrator at root scope, reaching every subscription underneath it whatever yesterday's role assignments said.

Reversing the choice later is a project rather than a setting. A subscription can be moved into another directory, but identity does not travel with it: every role assignment and custom role is permanently deleted, system-assigned managed identities have to be disabled and re-enabled, user-assigned ones recreated and reattached, key vaults repointed at the new tenant id. Microsoft's transfer guidance warns the process can require downtime, and a subscription bought through a cloud solution provider cannot change directory at all, so the only exit there is a rebuild.

The compliance consequence lands on the client either way. Australian Privacy Principle 11 puts the obligation to take reasonable steps to protect personal information on the entity that holds it, and outsourcing the build does not outsource that. Section 26WH(2) of the Privacy Act allows 30 days to assess whether a suspected breach is likely to result in serious harm, and that assessment runs on sign-in, audit and application logs sitting in a directory the client cannot read. Entra keeps sign-in and audit logs for seven days on the free tier and 30 days with a premium licence, so without an export configured in advance the evidence ages out while the client is still waiting for access.

The accounts that matter, and what each one controls

Ownership is not one decision. It is about ten of them, taken at different moments by different people, usually without anyone writing them down. For each row below, name the legal entity on the account and the person at the client who could sign in today without asking the builder for anything.

The order matters. Password recovery for nearly everything under the registrar record runs through an address at that domain, so whoever controls the domain can receive a reset mail for the source control organisation, the payment account and the app store account. The cloud tenant is the exception worth engineering deliberately, since an emergency access account on the tenant's own onmicrosoft.com domain depends on neither the domain nor its mail routing.

AccountWhat it controlsRegistered toWhat the builder needs
.au domain registrarThe name, mail delivery, and every proof of domain controlThe client's legal entity as registrant, with a client mailbox as registrant contactA technical contact or delegated access, never the registrant record
Authoritative DNSWhat resolves where, plus verification records for the directory, mail and certificatesThe client's account at the DNS hostWrite access to the zones they operate
Entra ID tenantEvery user, credential, service principal and consent grant, and the root of Azure role assignmentsThe client's own tenant, on the client's domainNamed accounts holding roles that expire
Azure subscription and billingThe resources, the invoice, and the ability to move or delete eitherThe client's billing account and the client's payment instrumentResource-scoped roles rather than Owner on the subscription
Source control organisationThe code, the history, the deployment credentials, and the ability to lock everyone outAn organisation owned by the client, never a personal accountAdministrator on repositories rather than owner of the organisation
Build pipeline and artifact registryWhat reaches production, and what it was built fromThe client's organisation or subscriptionPermission to run and change pipelines
Secrets storeEvery credential the running system uses, and the ability to rotate itA vault inside the client's subscriptionAccess to the secrets they operate, logged per identity
Apple and Google developer accountsThe listings, the signing identity, and the ability to publish or withdrawThe client's legal entity, under the client's own D-U-N-S number where the store requires oneA developer or admin role, never the account holder role
Payment and merchant accountsWhere revenue settles, and who can change the settlement accountThe client's legal entity and the client's bank accountRestricted API keys with no rights over bank details
Monitoring, error tracking and mail deliveryThe operational record, and the ability to send as your domainThe client's organisation on each service, under the client's billingMember accounts, with the client holding the owner seat

The account register behind a custom build: who each account should be registered to, and what the builder actually needs

What should 'we manage it for you' actually mean?

There is a legitimate version of the arrangement. A law firm's practice manager is not going to administer conditional access policy, and pretending otherwise produces a tenant nobody looks after. What separates the sound version from the bad one is custody: the account is created in the client's legal entity name, with the client's billing instrument and the client's emergency access credentials, and the builder works inside it under identities the client can switch off.

The signs of the other version are checkable in an hour. The registrant contact on the domain is an address at the builder's domain. The subscription sits under the builder's agreement with the cloud provider, so there is no billing account for the client to sign in to. The repository lives in an individual's personal account. The app store enrolment runs under the builder's business identity, so the listings and the signing certificate belong to the builder's legal entity. The version that cannot be repaired later is the shared tenant, where the client's resources sit in a subscription carrying other clients' work: isolation is a naming convention, and there is no clean export, because the unit that moves between directories is a subscription the client owns a fraction of.

Two models let a builder work at arm's length without holding the directory. Under a reseller arrangement the client keeps its own tenant while the partner is reseller of record with delegated administrative access, and Microsoft has moved partners off standing directory-wide delegation onto granular grants that expire, so ask which of those is in place and what ends it. Azure Lighthouse is the other: the client delegates named scopes to the builder's tenant against specific roles, the builder's engineers sign in with their own credentials, the work appears in the client's own activity log, and the client can withdraw the delegation without the builder's involvement.

For an APRA-regulated client the paperwork is explicit. CPS 230 commenced on 1 July 2025, and for contracts already in place it applies from the earlier of the next renewal or 1 July 2026. Core technology services must be classified as a material service provider arrangement unless the entity can justify otherwise, which puts the builder on the register the entity submits to APRA each year, and the formal agreement has to set out ownership of assets, ownership and control of data, audit access and termination rights. Those clauses are difficult to answer honestly when the builder holds the directory.

Least privilege for the builder starts with named identities

Each of the builder's engineers gets an identity of their own in the client's directory, either as a member on the client's domain or as a guest invited from the builder's tenant. Both of those are defensible. A shared developer login with the password in the builder's password manager is not, because a log entry recording that a change was made by developer@ answers nothing when the question is which of six people made it and whether that person still works there. Guests carry a practical advantage, since the object lives in the client's directory where it can be reviewed and disabled, while authentication happens against the builder's directory, so the builder's own offboarding removes the underlying account.

The roles attached are the part worth arguing about. Standing Owner on a subscription and standing Global Administrator in the directory should never be permanent, and both can be replaced with elevation on request that expires by itself. The deployment pipeline is where standing credentials hide: a pipeline authenticating with a client secret held in the build system carries a long-lived credential the client cannot inspect, and nobody rotates it because rotating it breaks deployments. Workload identity federation removes the secret, since the app registration trusts tokens issued by the pipeline for a specific repository and branch, and the client can break that trust in one action.

Scope the pipeline's role assignments to the resource groups it deploys into, and keep the identity that deploys separate from any identity that can read production data. A named person at the client then reviews access quarterly against the actual role assignments rather than against the contract, and access is removed the week an engineer rolls off rather than at the end of the engagement. Conditional access should require phishing-resistant multi-factor authentication for the builder's accounts specifically, because a contractor's laptop sits outside the client's device management and the compliant-device signal will not be there to lean on.

Who should hold the break glass credentials?

Where the only administrators in a tenant are the builder's staff, the client's ownership stops at the paperwork. The working pattern that fixes it is two cloud-only accounts on the tenant's own onmicrosoft.com domain, depending on neither federated sign-in, nor the client's domain, nor mail delivery that may itself be the thing that has broken, and excluded from the conditional access policies that could lock them out.

Exclusion from conditional access is no longer enough on its own. Microsoft enforces multi-factor authentication on sign-ins to the Azure portal and the admin centres at the application level, outside conditional access, so an emergency account carrying only a long password fails at the moment it is needed. Register a phishing-resistant method on each one, a passkey or certificate-based authentication, and check the account is not caught by a self-service password reset policy that will demand a mobile number nobody wants attached to it.

The credentials belong to the client and are held by a named person there, ideally split so that no single person can use one alone, with the password held by one director and the hardware key by another. Where the builder holds them for safekeeping, the arrangement has quietly reversed itself. Use has to be visible without the builder's cooperation, so alert on any sign-in by either account to a client mailbox rather than only to the builder's monitoring. Test both quarterly, because untested emergency accounts fail precisely when they are needed: credentials expire, a stale-account cleanup disables them, or a new policy catches them despite the exclusion.

What has to be in a handover pack?

Most handover documents describe how the system works. The pack that matters proves who controls it, and the difference shows up in the first hour of the first incident after the builder has gone, when the live question is not how the caching layer works but which credential renews the certificate and who is on the notification list for it.

The register at the top of the list takes the least time and matters most, because it can be written at any point in the engagement and it makes the gaps visible while there is still a working relationship in which to close them. The row where the legal entity column carries the builder's company name is a conversation better had during the build.

  • An account register listing every account, the legal entity it is registered to, the sign-in identity, where the credential lives, and which named person at the client can reset it without asking anyone.
  • Evidence of ownership for each, demonstrated live rather than screenshotted: the registrant record, the billing account, the app store account holder, the source control organisation owner.
  • The current list of tenant administrators, the emergency access procedure, and the date those accounts were last tested successfully.
  • A full export of every DNS zone, annotated with what each verification record proves, because unexplained TXT records accumulate for years and nobody dares delete them.
  • Infrastructure as code where it exists, and an inventory of manually created resources where it does not, since hand-made resources are the ones that do not survive a rebuild.
  • A secrets inventory naming what each credential is for, when it was last rotated, and which of them are personal credentials belonging to one of the builder's engineers.
  • Deploy, rollback and restore runbooks that name the credential each step uses and the account it belongs to.
  • The logging configuration: where sign-in, audit and application logs are written, how long they are retained, and who can read them without the builder's help.
  • Certificate and licence expiry dates with the renewal path for each, including who holds the account any automated renewal runs through.

The exit test you can run in an afternoon

The rows in the register are worth checking rather than trusting. Book an afternoon, tell the builder you are running it, and work through the sequence below using only credentials the client already holds. Each step either passes or names precisely which asset is not yours.

Failures are not evenly weighted. Cloud resources are recoverable while you hold the tenant, because you can remove access and keep running. The assets that become leverage in a bad ending are the ones with a third party and a human process in the middle: the domain registrant record, the app store account holder, the merchant account and the code signing identity. Each of those needs the counterparty's cooperation or a formal process measured in weeks. Section 286 of the Corporations Act 2001 also requires seven years of financial records, and records held inside somebody else's account are records you are trusting somebody else to keep.

The domain is the hardest to recover. A .au name is licensed rather than owned, and the licensing rules are explicit that the licence creates no proprietary interest in the name, so there is no property to claim back. A transfer begins with a written request from the current registrant to the registrar, and the incoming registrant has to satisfy the Australian presence and eligibility rules in its own right, which means whoever occupies the registrant field decides whether the name moves at all. The .au dispute resolution policy exists, but it is a filed administrative proceeding in which the complainant has to establish rights in the name, that the registrant has no legitimate interest in it, and bad faith in the registration or the later use, and that is a harder case against a developer who registered the name at your request than against a squatter. Run the test in the first month of a build. A failed step at that point is an email to the builder, and the same failed step after the relationship has ended is a negotiation with someone who no longer needs your goodwill.

  • Sign in to the registrar with the client's own credential and confirm the registrant is the client's legal entity and the registrant contact is a client mailbox more than one person can reach.
  • Sign in with an emergency access account, confirm it still works and still holds the administrator role, then confirm the alert about that sign-in arrived in a client mailbox.
  • From that account, disable one of the builder's identities and run a deployment. It should still succeed, because a pipeline should not depend on a person. Restore the identity afterwards.
  • Open the billing account and confirm the invoice is addressed to the client's entity and the payment method is the client's.
  • Clone the repository onto a machine that has never built this project, check out the tag matching production, and build it. This step fails more often than any other, usually on an undocumented local dependency or a credential sitting on one engineer's machine.
  • Deploy that build to a non-production environment through the documented pipeline, using only client-held credentials.
  • Restore the most recent backup into an empty environment and read the data, including whatever key decrypts it, since a key held in the builder's vault makes the restore something you cannot do alone.
  • Export the last month of sign-in and audit logs yourself, without asking anyone for them.
  • Confirm the client's app store account holds the signing identity and can publish, so a security fix can ship without the builder in the loop.

How we structure access on client engagements

We work inside the client's tenant, under named identities, on accounts registered to the client, and the register gets filled in before anything is built on top of it. Retrofitting custody onto a live estate is the expensive path and the one that gets deferred indefinitely. Our engineers hold roles that expire, the client holds the emergency access credentials, and sign-ins by those accounts alert to a client mailbox.

The reasoning matches the systems we build. The operations and compliance portal we built and run for GRM LAW, a Brisbane law firm, covers intake, conflicts checks, the matter register and AML/CTF readiness over an append-only audit ledger. The staff portal we built for Stone Leaf Capital carries a compliance audit log capturing actor, action, and before and after state. Aurii, our own clinical software venture, is Australian-hosted on Azure with tamper-evident audit trails. In each case the record has to be readable by the organisation that has to answer for it.

Where an estate has already drifted, the work starts as an assessment rather than an argument. An Azure and Entra ID security review establishes who actually holds what: standing role assignments, service principals carrying credentials nobody rotates, delegated partner access, guest accounts from directories that no longer exist, and resources created outside any pipeline. It ends with the account register filled in and an exit test the client can run without us. Ask any builder, including this one, to put that register in the proposal.

Know what your code would give away.

Australia-wide, from our Brisbane head office. Someone will contact you as soon as possible.

Open a briefinfo@blackshard.com.au