Skip to main content

HTTP DNS

The HTTP DNS method authenticates an agent by verifying it controls a given hostname. The agent advertises a hostname and port to the Trust Domain Server; the server issues a nonce challenge and then makes an outbound HTTP request to confirm the agent's endpoint is serving that nonce.

This method proves network-level control of a hostname without requiring cloud provider credentials or hardware.

Attestation Flow

Attributes available for SVID issuance

AttributeDescription
http_dns.hostnameThe hostname the agent advertised
http_dns.portThe port the agent advertised

All attributes have the origin http_dns.

Example SPIFFE ID template:

/agents/{{http_dns.hostname}}

How to Deploy

Step 1 — Update cluster configuration (Server)

Configure the allowed hostnames and, optionally, allowed ports in the AgentAttestation policy:

section: AgentAttestation
schema: v1
spec:
policies:
- name: my_policy
requiredAttestors:
- type: http_dns
config:
allowedHostnames:
- "*.example.com"
allowedPorts:
- 7777
- 8888

Apply it using spirlctl:

spirlctl config set cluster --id <cluster-id> attestation-policy.yaml

Or using Terraform:

resource "spirl_cluster_config" "agent_attestation" {
cluster_id = spirl_cluster.my_cluster.id
sections = {
AgentAttestation = <<-YAML
section: AgentAttestation
schema: v1
spec:
policies:
- name: my_policy
requiredAttestors:
- type: http_dns
config:
allowedHostnames:
- "*.example.com"
allowedPorts:
- 7777
- 8888
YAML
}
}

Once a configuration document passes validation and is stored, the Defakto control plane syncs it to your Trust Domain Servers automatically. No server or agent restart is required.

Server Configuration Reference

FieldRequiredDescription
allowedHostnamesYesList of hostnames the agent is allowed to advertise. Wildcards are supported in the leftmost segment (e.g., *.example.com). IP addresses are not allowed.
allowedPortsNoList of ports the agent is allowed to advertise. When omitted, any port is accepted.

Step 2 — Configure the Agent

Configure the hostname and listening port in the agent's attestation methods.

agent:
auth:
clusterId: c-xxxxxx
attestors:
- type: http_dns
config:
hostname: p2.example.com # defaults to system hostname if omitted
port: 80 # required; must be a privileged port (≤1024)
advertisedPort: 8080 # optional; advertised port if behind a proxy or NAT

Agent Configuration Reference

FieldRequiredDefaultDescription
hostnameNoSystem hostnameThe hostname the agent advertises to the server.
portYesThe port the agent listens on. Must be a privileged port (≤1024).
advertisedPortNoportThe port the agent advertises. Useful when behind an HTTP proxy or NAT.

Step 3 — Verify

Server logs — look for these in order:

  1. "Login started with multi-attestation support" — confirms the agent offered providedMethods: ["http_dns"]
  2. "Authorization received and verified" — includes agentAttestationAttributes with the confirmed hostname:
    {
    "msg": "Authorization received and verified",
    "agentAttestationAttributes": [
    "http_dns:http_dns.hostname=\"p2.example.com\"",
    "http_dns:http_dns.port=\"80\""
    ]
    }
  3. "Connected to agent" — session is fully established

Agent logs — enable debug logging to see "Sending Login" with attestors: ["http_dns"]. At the default log level, "Connected to server" confirms the session is live.

Metrics — confirm proofs are succeeding:

spirl_attestation_signer.proof{attestor_type="http_dns",outcome="success"}
spirl_attestation_agent.proof{attestor_type="http_dns",outcome="success"}

Alert on outcome="failed" to detect hostname verification failures.

Common errors:

ErrorLikely cause
no cluster policy authorizes the provided attestorsAgent's http_dns method doesn't match any policy in the cluster's AgentAttestation config
hostname H is not in the allowed listAdvertised hostname doesn't match allowedHostnames — check system hostname or configured hostname field
Attestor rejected proof, policy failedTrust Domain Server couldn't reach the agent's HTTP endpoint to verify the nonce — check network connectivity and port

Security Considerations

HTTP DNS proves the agent controls a specific hostname on the network at attestation time. It does not prove the hardware or cloud identity of the host.

  • The Trust Domain Server makes an outbound HTTP request to the agent's hostname and port. Ensure the server has network access to the agent's advertised endpoint.
  • Use wildcard hostnames (*.example.com) only when you can verify that your DNS zone is under exclusive organizational control.
  • Privileged port requirement (port ≤1024) ensures the agent process has root or CAP_NET_BIND_SERVICE privileges — arbitrary unprivileged processes cannot bind these ports.
  • This method should be combined with a second attestation method in environments requiring stronger identity guarantees.

Troubleshooting

hostname H is not in the allowed list — The agent advertised a hostname not in allowedHostnames. If using the system hostname (no hostname configured in the agent), verify the hostname output of the host matches an allowed pattern. If using a custom hostname, confirm it matches a pattern in the policy.

port P is not allowed — The agent advertised a port not in allowedPorts. If using advertisedPort, verify it's in the allowed list. Otherwise, verify the agent's listening port is allowed.