Two audit questions sound similar and require evidence of different kinds. Which session contacted this address is answerable from connection and flow records. Which person opened this page usually is not, at least not from those records. Choosing a collector before choosing the question is how a network team ends up presenting a hostname as a browsing history.

Start With the Event the Audit Must Establish

Write the question as a sentence with a subject, a verb and a time. That discipline alone exposes the gap between a session record and a page view. A session log establishes that an identity was accepted, for an interval, with an assigned address under a recorded policy, and it cannot establish which page anyone read because it never saw the request.

Label the observation before designing the collection. A field named for a visited site that actually stores a resolved name is a future error rather than a convenience. Field names outlive the people who chose them, so choose ones that describe the proof rather than the conclusion.

What Each Record Can and Cannot Support

Four record types appear in almost every audit design, and each answers a different question. Keep them separate in the report as well as in the pipeline, because mixing them is how a defensible finding becomes an embarrassing one.

The question being askedRecord that can answer itWhat that record provesWhat still needs a join
Was this address contacted?Flow recordThe connection five-tuple and when it was seenWhich session held the address at that moment
Which account held that address?Session logWhich identity authenticated and the tunnel address it receivedWhich device or person used that account
Was this name looked up?Resolver queryThat this resolver was asked for this nameWhether a page was fetched, and by whom
Was this page viewed?Proxy or application transactionThe request and identity recorded inside that application's scopeTraffic outside that application's visibility
Who was the person?None of the four on its ownAn account in use, at bestA named human, whenever accounts are shared

Read the last column as carefully as the middle one. A flow record describes addresses and ports, and a reverse lookup of an address does not reconstruct the name a browser used, because one address can host many unrelated sites. A resolver query proves a question was asked, not that a page was displayed. A hostname visible during a TLS negotiation is not the encrypted request path either.

Each of those is a real observation, and none of them is the observation people assume. A browser that insists on its own encrypted resolver sits outside the monitored scope, and analysis cannot recover what logging never saw. That gap belongs in the report as a stated limit rather than a footnote.

Speculative Lookups and Cached Answers

Browsers resolve names ahead of time, sometimes without loading anything at all. They also answer from cache without sending a fresh query to the resolver you are watching, which means the absence of a query is not the absence of a visit. Both behaviours break the naive equation between a DNS log and a browsing history.

DNS over HTTPS adds a second boundary: a browser or a guest application with its own resolver never asks the organisation's logger anything. Exact transactions only come from the application's own events or from a proxy whose logging you explicitly support. A plain HTTPS CONNECT tunnel leaves the proxy with no view of the page paths inside it. Owning the network is not permission to swap out the application's trust model quietly.

The Address Belongs to a Session, Not a Person

A flow record carrying a tunnel-range address is a starting point rather than an answer. Join that address and timestamp to the session assignment active at that moment, because that address can be reassigned to a different session an hour later. Static addressing is one way to keep that association and not the only one.

Where a translation step collapses several devices into one source address upstream of the sensor, the join can only name the shared gateway session. A shared account or a certificate used by several people limits attribution however complete the network data looks. Both belong in the report as limits rather than as caveats for later.

Record the time zone, the clock source, the observation point and every translation boundary in between. Absence deserves the same care as presence, since a missing record can mean a flow entry aged out, a sensor that never saw the packet or an application log that was switched off.

Design for the Stated Purpose, Then Prove the Pipeline

Once the question is fixed, define which fields are needed, who may read them, and how long they are kept. Collecting more because storage is cheap creates a liability that outlives the investigation. The privacy model in RFC 6973 frames correlation, misattribution and unnecessary collection as design problems rather than afterthoughts.

Guard the mapping and the records as one object, because either alone is far less sensitive than the pair. Then validate the design against activity you are permitted to generate and already understand, using the smallest query the report will rely on. A pipeline that cannot reproduce a known event will not reproduce an unknown one either. Report the event the evidence supports, in the words the evidence allows, and let the reader reach the larger conclusion without help.

Write the limits next to the finding: what was joined, what was translated, and which log stayed silent. A finding that states its own boundaries survives a review that a confident summary does not. That is the difference between evidence and a story about evidence.

Related articles