Key Vault Scan¶
The Scan reads all Azure Key Vaults across your subscriptions to inventory secrets, keys, and certificates with expiration tracking.
Overview¶
The Scan provides a centralised view of all vault contents across your Azure environment:
- Multi-subscription scanning: Scan all Key Vaults across multiple Azure subscriptions
- Complete inventory: Secrets, keys, and certificates with metadata
- Expiration tracking: Visual indicators for healthy, warning, and critical status
- Historical data: Track changes over time with scan history
- Quick scans: Skip vaults read recently, for speed on large estates
- TLS endpoints: The host names your Azure services serve over TLS and the certificate each one presents, including certificates that are not in Key Vault. See TLS Endpoints
- Enterprise Application monitoring: The rotation-discovery run inventories service-principal credentials and owners. See Enterprise Applications (monitor-only)
What Gets Scanned¶
Secrets¶
| Attribute | Description |
|---|---|
| Name | Secret identifier |
| Enabled | Active or disabled status |
| Expiry Date | When the secret expires (if set) |
| Not Before | Activation date (if set) |
| Created | Creation timestamp |
| Updated | Last modification timestamp |
| Content Type | MIME type (e.g., text/plain, application/json) |
| Tags | Azure tags for categorisation |
Keys¶
| Attribute | Description |
|---|---|
| Name | Key identifier |
| Enabled | Active or disabled status |
| Expiry Date | When the key expires (if set) |
| Key Type | RSA, EC, or symmetric |
| Key Size | Bits (e.g., 2048, 4096) |
| Key Operations | Permitted operations (encrypt, decrypt, sign, verify) |
| Tags | Azure tags |
Certificates¶
| Attribute | Description |
|---|---|
| Name | Certificate identifier |
| Enabled | Active or disabled status |
| Expiry Date | Certificate expiration |
| Issuer | Certificate authority |
| Subject | Certificate subject DN |
| Thumbprint | SHA-1 fingerprint |
| Renewal | How the certificate renews (see below) |
| Tags | Azure tags |
Certificate renewal¶
The Renewal column on the Key Vaults sub-tab shows how each certificate renews, and you can filter the list by it:
| Renewal | Meaning |
|---|---|
| Auto-renews (Key Vault) | Key Vault renews this self-signed certificate itself |
| Auto-renews via its CA | Key Vault orders the renewal from an integrated CA, such as DigiCert or GlobalSign |
| Emails contacts before expiry | Key Vault emails the certificate's contacts; nothing renews it automatically |
| Manual (external CA) | A CA outside Key Vault issued it; nothing renews it automatically |
| Will not renew | Key Vault could renew it, but nothing is set up to |
On PRO, an admin can click Turn on auto-renew on a self-signed certificate that will not renew. Key Vault then renews it itself when 80% of its life has passed, even while CertifyClouds is switched off. The button is not offered on a certificate CertifyClouds rotates for an App Registration; see Certificate Rotation for why.
On PRO, Renew certificate on a certificate's page renews it now, whoever issued it. See Certificate Renewal.
A certificate's page also flags a weak signature (MD5 or SHA-1) and whether the intermediate certificates of a CA-issued certificate are in date.
Running a Scan¶
From the UI¶
- Navigate to Assets → Scan. It has three sub-tabs: Key Vaults (vault contents), TLS Endpoints and History (past scans)
- Click Run Scan. It reads every vault from Azure.
- For a faster pass on a large estate, open the menu next to Run Scan and pick Quick scan instead. It skips any vault read within the scan cache lifetime (Settings → Advanced → Scan cache lifetime, 24 hours by default), so a change made in Azure since that vault was last read doesn't show until it is read again.
- Monitor progress in real-time
- View results when complete
Via API¶
# Start a full scan
curl -X POST http://localhost:8080/api/assets/discovery/scan \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"scanMode": "full"}'
# Start a quick scan (skips vaults read within the scan cache lifetime)
curl -X POST http://localhost:8080/api/assets/discovery/scan \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"scanMode": "delta"}'
Scan Modes¶
| Mode | Description | Speed | When to Use |
|---|---|---|---|
Full (full, Run Scan) | Reads every vault from Azure | Slower | Every scan unless speed matters more |
Quick (delta, Quick scan) | Skips vaults read within the scan cache lifetime; a vault whose last read failed is always read again | Faster | Large estates, when an unchanged vault's last read is recent enough |
The API also accepts force, which behaves exactly like full.
Expiration Status¶
CertifyClouds categorises assets by expiration status:
| Status | Criteria | Colour |
|---|---|---|
| Healthy | Expires in >30 days or no expiry set | Green |
| Warning | Expires in 8-30 days | Orange |
| Critical | Expires in ≤7 days | Red |
| Expired | Already past expiration date | Red |
Configuring Thresholds¶
Thresholds are configurable per alert rule:
- Go to Settings > Alerts
- Create or edit an expiring secrets rule
- Set your preferred threshold (e.g., 14, 30, 60 days)
Scan Results¶
Dashboard View¶
The Assets dashboard shows:
- Total Assets: Count by type (secrets, keys, certificates)
- Expiration Distribution: Donut chart of healthy/warning/critical
- Recent Scans: History with duration and counts
- Vault List: All vaults with asset counts
Asset Details¶
Click any vault to see:
- Vault Properties: Name, location, resource group, SKU
- Access Configuration: RBAC vs Access Policies
- Network Settings: Public/private access, firewall rules
- Asset List: All secrets, keys, and certificates
Export Options¶
Export scan results in multiple formats:
- JSON: For automation and integration
- CSV: For spreadsheets and reporting
- PDF: For compliance documentation
TLS Endpoints¶
Every scan also reads the host names your Azure services serve over TLS and the certificate each one presents, whether or not that certificate is in Key Vault. A scan of a corporate tenant reads that tenant's endpoints too. Open Assets → Scan → TLS Endpoints to see them. The list is available on every tier.
Covered: App Service, Application Gateway, Front Door, API Management and Container Apps.
Not covered: virtual machines, AKS ingress and sites hosted outside Azure.
It needs no new permission: the Reader role CertifyClouds already has on each subscription covers it. It reads certificate details such as subject, issuer and expiry, never private keys.
What the list shows¶
| Column | What it shows |
|---|---|
| Host | The host name, with the listener or hostname type where the service has one |
| Resource | The Azure resource that serves it |
| Certificate source | Key Vault; Uploaded (uploaded straight to the Azure service); Azure-managed (Azure issues and renews it); or Not read (the binding was found but its certificate could not be read) |
| Expires | When the certificate expires. Azure does not report an expiry for every Azure-managed certificate |
Filter by resource type, certificate source, expiry (within 7, 30 or 90 days, already expired, or not reported by Azure) and subscription, or search by host or resource. Click a row to see the certificate's subject, issuer, the names it covers, thumbprint and validity dates, with a link to the resource in the Azure portal.
On PRO the list also shows which Key Vault certificate each endpoint uses and whether it picks up a renewal on its own. See TLS endpoints and Key Vault certificates.
Expiry checks and alerts¶
Compliance rules T001 to T003 check the expiry of the certificate each endpoint serves (see Compliance rules).
A certificate uploaded straight to an Azure service is not in Key Vault, so the Key Vault checks cannot see it. CertifyClouds sends expiry alerts for it (see TLS endpoint certificates). To renew one, get a new certificate from the CA that issued it and upload it to the resource. Storing it in Key Vault instead, and pointing the resource at it without a version number, lets the resource pick up each renewal and lets CertifyClouds track its expiry in Key Vault.
A certificate an endpoint serves from Key Vault alerts through that Key Vault certificate, so it never alerts twice. Certificates Azure renews itself do not alert.
When a subscription could not be fully read¶
If a scan could not read some of a subscription's resources, the TLS Endpoints tab shows a notice naming the subscription and the resource type. The list for them may be incomplete, and TLS compliance rules that would otherwise pass show as not evaluated until a scan reads them.
- CertifyClouds' access does not include reading these resources: give CertifyClouds the Reader role on the whole subscription, then run a scan. Reader granted only on resource groups cannot be confirmed from the subscription, so the notice stays until Reader covers the subscription.
- The read failed, or CertifyClouds could not check its own access: run a scan to try again.
Scan Performance¶
Configuration¶
Tune scan performance in Settings → Advanced → Performance; Max Workers is an environment variable only:
| Setting | Default | Description |
|---|---|---|
Max Workers (DISCOVERY_MAX_WORKERS) | 5 | How many subscriptions a scan reads at the same time |
| Scan Timeout | 300s | Maximum scan duration |
| Max Retries | 1 | Retry failed vault scans |
Performance Tips¶
- Use Quick Scans on large estates: they skip vaults read within the scan cache lifetime, so changes made in Azure since then show on the next full scan
- Reduce Workers: If hitting Azure API rate limits, reduce max workers
- Subscription Filtering: Scan only needed subscriptions to reduce time
- Schedule Off-Peak: Run full scans during low-usage periods
Typical Scan Times¶
| Environment Size | Vaults | Secrets | Approximate Time |
|---|---|---|---|
| Small | 1-10 | <500 | 30-60 seconds |
| Medium | 10-50 | <2,000 | 1-3 minutes |
| Large | 50-200 | <10,000 | 5-15 minutes |
Scheduled Scanning¶
CertifyClouds can automatically run Key Vault scans on a schedule:
Configure Schedule¶
Key Vault scanning runs on a background worker. You need an admin account to change it.
- Go to Settings → Advanced → Workers
- Under Scan & Discovery Workers, find Assets Scan
- Turn on Auto-scan
- Pick how often it runs: every 30 minutes, 1, 2, 4, 6, 12 or 24 hours
The change saves as soon as you make it. There is no cron expression field. The card shows when the scan last ran and whether the worker is enabled. Non-admin users see the same card without the controls.
Scheduled runs are always full scans. Quick scan is available from the Run Scan menu and through the API, not on the schedule.
Best Practices¶
- Run at least once daily for compliance monitoring
- Monitor scan history for performance trends
Filtering and Search¶
Filter Options¶
| Filter | Description |
|---|---|
| Subscription | Filter by Azure subscription |
| Vault | Filter by specific vault |
| Asset Type | Secrets, Keys, or Certificates |
| Status | Healthy, Warning, Critical, Expired |
| Expiry Range | Assets expiring within N days |
Search¶
Search across all assets by:
- Name (partial match)
- Tags (key or value)
- Content type
- Vault name
Troubleshooting¶
"Access denied" for some vaults¶
Cause: CertifyClouds doesn't have read permissions on the vault.
Fix: Run the setup script to grant permissions:
"Network unreachable" errors¶
Cause: Key Vault has firewall enabled and CertifyClouds IP is blocked.
Fix: Add your subnet to the vault's firewall rules, or use private endpoints.
Slow scan times¶
Cause: Too many concurrent workers hitting rate limits.
Fix: Reduce DISCOVERY_MAX_WORKERS to 3 or lower.
Missing subscriptions¶
Cause: CertifyClouds doesn't have Reader role on the subscription.
Fix: Grant Reader role at subscription scope:
az role assignment create \
--assignee $PRINCIPAL_ID \
--role Reader \
--scope /subscriptions/<subscription-id>
API access¶
Scan endpoints are listed in API Endpoints; exact request and response shapes are in your deployment's /docs.
Best Practices¶
- Run Regular Scans: Schedule daily scans for continuous monitoring
- Act on Critical: Address critical expiration items immediately
- Set Up Alerts: Configure email/webhook alerts for expiring assets
- Review Compliance: Check compliance score after each scan
- Archive History: Keep scan history for audit trails