FundamentalsCIAconfidentialityintegrityavailabilityauthenticityaccountability

Confidentiality, Integrity, Availability — Practically

Three questions that classify any security failure: who can read it, who can change it, and can legitimate users still work — plus the three that modern systems need alongside them: authenticity, accountability and privacy.

▶ Run the labFollow the failure

Frame the problem

Security starts with a concrete asset, attacker capability and trust crossing.

Asset
Any data or capability the business depends on — here, a customer database with accounts, orders and payment references.
Attacker & capability
Whoever can reach the data through any path: an unauthenticated request, a stolen session, a misconfigured backup, or a script with a database role that is broader than its job.
Trust boundary
The boundary between "identity that is allowed this operation on this record" and "identity that is not".
AssetThreatAttack SurfaceTrust BoundaryVulnerabilityExploit PathImpactMitigationDefense in DepthResidual Risk

The same database, three different disasters

The triad earns its keep as a *classifier*, not a definition. When something goes wrong, naming which of the three broke tells you who to call, what to check, and whether the damage is reversible. Consider one customer database and three incidents that look nothing alike.

A confidentiality failure is a copy escaping: a public object-storage bucket, a debug endpoint returning full rows, a GET /users/124 that answers for a user who is not you. Copies are irreversible. Once data is out, no amount of remediation puts it back, which is why confidentiality controls must be preventive and why the response is notification rather than repair.

An integrity failure is a write that should not have happened: an unauthorized UPDATE, a tampered webhook that marks an unpaid order as paid, a poisoned cache entry. Integrity failures are often *reversible* if you have audit logs and backups — and completely unrecoverable if you do not, because you cannot even tell which rows are wrong. This is why integrity work is mostly about being able to answer "which records changed, by whom, and when".

An availability failure is legitimate users unable to work: a flood of requests, a decompression bomb exhausting memory, a certificate expiring at 02:00, a rate limiter misconfigured to block real customers. It is a security property even when nothing was stolen, and it is the one most likely to be caused by your own defenses.

One asset, three failure classes
ConfidentialityIntegrityAvailability
QuestionWho can read it?Who can change it?Can legitimate users still use it?
Example failureBackup bucket readable by anyone with the URLUnauthorized UPDATE orders SET status='paid'Login service down under a request flood
Reversible?No — a copy is permanentUsually, with audit logs and backupsYes, once the cause is removed
Primary controlAccess control + encryption + classificationAuthorization + audit trail + validationRate limits, quotas, capacity, isolation
Detection signalUnusual read volume, new egress destinationWrites from an unexpected identity or pathError rate and latency on the user-facing path

The three the triad leaves out

Authenticity asks whether a message really came from who it claims. A webhook that says "payment succeeded" is a claim, not a fact, until a signature proves the sender held the shared secret — see Secure Webhooks. Authenticity is what Digital Signatures provide and what makes a spoofed request different from a tampered one.

Accountability — and its stronger relative, non-repudiation — asks whether you can say afterwards who did what. In practice this means an audit log the actor cannot edit, with enough context to answer questions nobody thought to ask at write time. Non-repudiation in the strict cryptographic sense (a signature only one party could produce) is rare in application systems and worth reserving for cases that genuinely need it, such as signed approvals for high-value transactions.

Privacy is distinct from confidentiality and often confused with it. Confidentiality asks whether an unauthorized party can read the data. Privacy asks whether *collecting, retaining, combining or exporting* it is appropriate at all — a question that survives even a perfectly access-controlled system. A support tool where every agent can read every message is confidential against outsiders and a privacy failure inside. Sensitive Data Classification is where the two meet.

  • Authenticity: is this really from who it says? → signatures, mutual TLS, verified webhooks.
  • Accountability: can we say afterwards who did it? → append-only audit logs with actor, resource, time, source and result.
  • Privacy: should we have this data, this long, in this place, visible to these people? → classification, retention limits, minimisation, purpose binding.
  • Safety: for systems that act in the world — agents, payments, deployments — can an authorized action still be the wrong one? → approval gates and blast-radius limits, see Human Approval for High-Risk Agent Actions.

Where the three conflict

The triad is not a set of goals you maximise independently; the properties trade against each other, and pretending otherwise produces controls that get switched off. Aggressive rate limiting protects availability against abuse and destroys availability for a legitimate customer doing a bulk import. Strict fail-closed authorization protects confidentiality and integrity and takes the whole product down when the policy service is unreachable — see Fail Open vs Fail Closed.

Encrypting a column protects confidentiality and removes your ability to index or search it, which pushes teams toward decrypting more rows than needed. Long log retention supports accountability and creates a new confidentiality liability, because logs are a copy of the data with weaker access control than the database it came from.

The engineering skill is naming the trade explicitly and choosing per asset rather than globally. Availability usually wins for a public content endpoint; integrity usually wins for a ledger; confidentiality usually wins for health records. A system that applies one answer everywhere is misconfigured somewhere by construction.

Key points

  • Use the triad to classify a failure fast: read, write, or "users cannot work" — each has a different owner and a different response.
  • Confidentiality failures are irreversible; integrity failures are reversible only if you can tell which records changed.
  • Availability is a security property, and your own rate limits and fail-closed checks are a common cause of losing it.
  • Add authenticity, accountability and privacy: modern systems fail on all three in ways the classic triad does not name.
  • The properties conflict. Choose per asset, write down which one wins, and expect the control to be bypassed where you chose wrong.

Boundary control exercise

This lesson uses the shared boundary-control exercise.

Boundary control check
Untrusted input / identity
Trust boundary
Privileged asset
Prevention may fail silently.

Follow the attack

Safe conceptual simulation: capability → missing control → crossed boundary → asset impact.

  1. 1
    Attacker → surface: find any path that touches the asset — an API, an export job, a backup, a replica, a log aggregator, a support tool.
  2. 2
    Surface → property: pick the weakest of the three. Reading is usually easiest, so confidentiality goes first.
  3. 3
    Property → leverage: a read gives credentials or tokens; those give writes; writes give persistence.
  4. 4
    Leverage → availability: destructive action last, because it is the only one the defender notices immediately.
Blast radius
  • Confidentiality: permanent exposure of every record in the reachable set, plus everything derived from it in caches, exports and search indexes.
  • Integrity: silent corruption whose extent cannot be bounded without an audit trail, forcing a conservative "assume all" remediation.
  • Availability: revenue and trust lost per minute, plus the second-order damage of emergency changes made without review.

Defend, detect, recover

One prevention is a single point of security failure. Layer it and make failure observable.

Prevent
  • • Classify assets first (see [[data-classification]]); the class decides which of the three dominates.
  • • Enforce authorization on every read *and* every write, at the same layer, so confidentiality and integrity do not have separate coverage gaps.
  • • Bound resource consumption per identity — request rate, payload size, decompressed size, query cost — so availability is not a function of attacker generosity.
  • • Sign anything that crosses an organisational boundary so authenticity is checkable rather than assumed.
Detect
  • • Confidentiality: read-volume anomalies per identity, unusual export or egress destinations, access to records outside a user's normal set.
  • • Integrity: writes from unexpected identities or code paths, checksum or ledger-balance mismatches, audit entries with no corresponding request id.
  • • Availability: error rate and latency on the *user-facing* path, plus rejection counts from your own limiters (a spike often means you are blocking customers).
Respond & recover
  • • Confidentiality: scope which records were readable, preserve access logs, notify per obligation. Do not delete the evidence while cleaning up.
  • • Integrity: freeze the affected write path, reconstruct from the audit log, reconcile against an independent source (the payment provider, the event log) rather than trusting your own table.
  • • Availability: shed load deliberately — degrade features, queue writes, serve stale reads — rather than letting the system fail unpredictably.
Residual risk
  • • Derived copies (analytics warehouses, search indexes, caches, exports) frequently have weaker controls than the source and are rarely in the model.
  • • Audit logs are themselves sensitive; protecting accountability creates a new confidentiality asset.
  • • Availability controls are attacker-visible and can be used as an oracle to map limits and thresholds.

Misconceptions

Claim
“Availability is an SRE concern, not a security one.”
Reality
Denial of service is an attack with an attacker and a motive, and defensive controls (rate limits, quotas, fail-closed checks) are among the most common causes of self-inflicted outages. It belongs in both places.
Claim
“Encryption solves confidentiality.”
Reality
Encryption protects data from parties without the key. It does nothing about an authorized application that reads rows it should not, which is where nearly all real data exposure comes from. See [[encryption-rest-transit]].