How to build an inventory of internet-facing assets
An inventory of internet-facing assets lists every registered domain, hostname, public IP address, TLS certificate and vendor-hosted service under the company domain, with a named owner and a current reason to exist against each entry. The list is built by reconciling records the business already holds: registrar accounts, DNS zones, certificate logs, cloud subscriptions, single sign-on application lists and expense records. Attack surface management tests that inventory for change and weakness through scheduled scanning, and each finding is matched to an owner who decides whether to fix the system or retire it.
How internet-facing assets end up without an owner
Assets lose their owner when the person or supplier who created them moves on. A marketing agency stands up a campaign site on a subdomain. A vendor asks for a CNAME record so its helpdesk can sit under the company domain. A domain goes on a staff member's personal card because that was quicker than a purchase order.
The person leaves or the contract ends, and the DNS record, virtual machine or registration keeps running. Expiry notices go to a mailbox nobody reads, and nobody left has the authority to switch the asset off.
Unowned assets create two problems. A forgotten host misses patches, so known vulnerabilities stay open. A CNAME that still points at a deleted cloud resource or a closed vendor account can be claimed by another customer of the same platform, who then serves content on your subdomain. Microsoft's guidance on preventing dangling DNS entries and subdomain takeover describes this for Azure resource types, and the same risk applies on any platform that lets a customer claim a name without proving control of the DNS zone.
Both the Essential Eight and ISO/IEC 27001 call for the inventory. The ASD Essential Eight Maturity Model, under patch applications at Maturity Level One, asks for an automated method of asset discovery used at least fortnightly to support vulnerability scanning. Annex A control 5.9 in ISO/IEC 27001:2022 covers an inventory of information and other associated assets, including their owners.
Which records show what the business exposes
In Azure, Resource Graph lists public IP addresses across every subscription the signed-in account can read:
``` az graph query -q "Resources | where type =~ 'microsoft.network/publicipaddresses' | project name, subscriptionId, resourceGroup, ip = properties.ipAddress, attachedTo = properties.ipConfiguration.id" ```
A public IP list undercounts. App Service, storage accounts and other platform services answer on default hostnames without a public IP resource, so query those resource types as well and read the hostnames each one serves. For web apps:
``` az graph query -q "Resources | where type =~ 'microsoft.web/sites' | project name, subscriptionId, hosts = properties.enabledHostNames" ```
Publicly trusted certificate authorities log the certificates they issue to the public CT logs. Search a log search service for each registered domain, including the wildcard form. A hostname that appears in the logs and nowhere in your DNS zone export is a retired name, a live host managed elsewhere (a vendor, a second DNS provider or an account you have not found yet), or a name that was issued a certificate and never went live. Resolve the name to tell which.
For vendor-hosted subdomains, check that every CNAME target still resolves:
``` dig +short CNAME help.example.com dig help.example.com ```
NXDOMAIN on a name that carries a CNAME means the target is gone. Some platforms answer with a generic "site not found" page instead, so open the hostname in a browser as well.
| Source | What it proves | What it misses |
|---|---|---|
| Registrar accounts and DNS zones | Which domains the business holds, and where every published record points | Domains in someone else's account, zones at a second DNS provider, subdomains delegated to a vendor |
| Certificate issuance logs | Hostnames a publicly trusted certificate has been issued for, including ones nobody recorded | Hosts under a wildcard certificate, services with no TLS, systems reached only by IP address |
| Cloud subscriptions and public IPs | Resources with public addresses in the subscriptions you can see | Platform services on a default hostname with no public IP resource, subscriptions under another tenant or a personal account |
| Enterprise applications in Entra ID | SaaS products staff sign in to with company identity, and the permissions granted to each | Services signed up to with a local password, free tiers outside single sign-on |
| Expense and card records | What someone paid for: hosting, domains, website builders, SaaS | Free tiers, services paid for by an agency or vendor, and what the paid service exposes |
| Vendor contracts and onboarding records | Which third parties were given a CNAME or verification TXT record under the company domain | Records added outside a contract, and whether the vendor account behind each record still exists |
Which records show what the business exposes
Naming an owner for every host, domain and certificate
An owner is a named person in a role who can approve a change to the asset and its retirement. A team or supplier goes in a contact field. When an owner leaves, their assets pass to their manager until someone else is named.
Keep the inventory as a register with the same fields for every entry:
Each asset type carries its own duties. The domain owner holds the registrar account, keeps auto-renew and registrar lock on, and puts multi-factor sign-in and a shared role mailbox on the account so renewal notices do not go to a departed employee. The certificate owner knows whether renewal is automated or manual and receives expiry notices. The host owner receives scan findings and decides on patching.
In Azure, record the owner as a tag and enforce it with Azure Policy. The built-in policy 'Require a tag on resource groups', assigned with the tag name set to owner, denies a new resource group without that tag. Assign 'Inherit a tag from the resource group if missing' as well so resources carry the tag, and check tag values at each review, since the policy tests that the tag exists, not that the person still works there.
Anything nobody claims gets a temporary owner, usually the IT manager, and a deadline to be claimed with a purpose or scheduled for retirement.
| Field | What goes in it |
|---|---|
| Asset | Hostname, domain, IP address or certificate subject |
| Type | Domain, host, platform service, certificate or vendor-hosted subdomain |
| Owner | Named person and role |
| Purpose | The business process or customer it serves |
| Where it runs | Subscription, registrar account or vendor account |
| How it was found | Registrar, DNS zone, certificate log, cloud query, Entra ID, expense record or vendor record |
| Renewal or expiry | Domain renewal date, certificate expiry, contract end |
| Last confirmed | Date the owner last confirmed it is still needed |
Naming an owner for every host, domain and certificate
How to retire a host, domain or certificate
Deleting a cloud resource before its DNS record leaves the record pointing at a name another customer can claim. Work through retirement in this sequence:
Domains need separate treatment. Once the registry releases a lapsed domain, another party can register it and receive its mail. Keep any domain that sent email or appeared in customer correspondence registered, and publish a null MX record, an SPF record that authorises no senders and a DMARC policy of p=reject. Let a domain lapse only when it was never used for mail or customer contact.
- Confirm with the owner that the asset is no longer needed, and check its access logs for traffic that shows a dependency nobody mentioned.
- Export any data the business must keep.
- Remove the DNS records that point at it, including CNAME, A and TXT verification records.
- Remove its enterprise application or single sign-on configuration, and rotate any secret, key or connection string the asset held.
- Delete the resource and release its public IP address.
- Close the vendor account or subscription and stop the payment.
- Revoke the certificate if its private key sat on a system leaving your control.
- Mark the entry retired in the register with the date and who approved it.
What makes the inventory go stale between reviews
Normal business activity moves the inventory out of date:
Each source of drift has a control that updates the register at the point of change. Make a register entry part of every DNS change request, including the records a vendor asks for at onboarding. Add registrar, DNS and cloud accounts to the offboarding checklist. Set Azure Monitor activity log alerts on the `Microsoft.Network/publicIPAddresses/write` and `Microsoft.Web/sites/write` operations. Watch certificate logs for your domains, since a new certificate is often the first public sign of a campaign or event site. Review expense lines for hosting, domains and SaaS each quarter.
- DNS changes made directly at the provider with no change record.
- Vendor onboarding that adds verification TXT records and CNAMEs.
- Developers creating resources in the portal outside infrastructure as code.
- Marketing campaigns and events with sites of their own.
- Staff departures that orphan registrar, DNS and SaaS accounts.
Running the inventory pass and choosing what to monitor
Run a full reconciliation pass, then repeat it each quarter. Automated discovery between passes runs at least fortnightly where the business works to Essential Eight Maturity Level One. The pass works through these steps:
Once the register is complete, set the monitoring scope by the registered domains and public address ranges, so hosts under them are in scope, including assets still waiting on an owner or scheduled for retirement. Scheduled external scans then look for new hosts, exposed services, vulnerable software, TLS problems and weak email authentication across that scope. A host that turns up in a scan with no register entry means a drift control failed, and it needs an entry and an owner alongside any finding on the host itself.
Get advice when a CNAME target fails to resolve, when certificate logs show live hosts nobody can place, or when the estate spans tenants and registrar accounts the business cannot reach.
Black Shard runs the monitoring as a managed service. Assay scans the agreed footprint on a schedule and diffs each scan against the last, and Black Shard engineers read the change list against what the business runs and write what to fix first. The attack surface management page covers what the scans check and how scope and cadence are agreed.
- Export every DNS zone and list every registrar account, including accounts held by agencies and former staff.
- Search certificate logs for each registered domain.
- Query every cloud tenant and subscription for public IP addresses and platform service hostnames.
- Export Entra ID enterprise applications with their sign-in activity.
- Pull card and expense records for hosting, domain and SaaS spend over the last financial year.
- Resolve every CNAME target and flag the ones that fail.
- Record each asset in the register with every field filled in.
- Schedule retirement for anything still unclaimed at the deadline.