Zero trust basics
The network perimeter stopped being a trust boundary the moment the first
service got popped and used to reach everything behind the firewall. Zero
trust replaces "inside the network, therefore trusted" with a per-request
question: is this specific caller, right now, allowed to do this specific
thing? The two levers are verifying identity everywhere and keeping the
credentials that prove it short-lived.
Method
- Authenticate every request, including internal ones. Require a verified
identity on service-to-service calls, not just at the edge. Give each
workload its own identity (SPIFFE/SPIRE, a signed service account, mutual
TLS certificate) so a call's origin IP or subnet grants it nothing.
- Authorize per request against explicit policy. Check identity plus the
action and resource on each call, evaluated by a policy engine (OPA, Cedar,
or your framework's equivalent) rather than a static "this service may talk
to that one" firewall rule. Default deny, and grant the least scope the
caller needs.
- Issue short-lived credentials and rotate automatically. Prefer tokens
and certificates measured in minutes to hours, minted on demand from a
broker like Vault, an OIDC provider, or a cloud instance-identity service.
A credential that lives for minutes is worth far less stolen than a static
key that never expires.
- Kill long-lived static secrets. Replace embedded API keys and shared
passwords with workload identity and dynamic credentials. Where a static
secret is unavoidable, put it in a manager with rotation and audit, never
in code, environment files committed to git, or an image layer.
- Encrypt in transit end to end. Enforce mutual TLS between services so
both ends prove identity and traffic is confidential on the internal
network too. "It is internal" is not a reason to send plaintext.
- Log and continuously verify access decisions. Emit an auditable record
of who accessed what, and factor device posture or risk signals into the
decision where you can, so trust is re-evaluated rather than granted once
at login and assumed forever.
Litmus tests
- If an attacker lands on one internal host, does its network position let it
call other services, or does each call still demand a valid identity?
- Do service credentials expire in hours or less and rotate without a human?
- Are there any static, non-expiring keys in code, env files, or images?
- Is internal service-to-service traffic mutually authenticated and encrypted?
Boundaries
Zero trust is an architecture direction, not a product you install, and it
does not remove the need for network segmentation, patching, or the specific
controls in oauth-flows and secrets-management. Migrating a legacy system is
incremental: start with the highest-value paths rather than attempting a
flag-day cutover.
1---2name: zero-trust-basics3description: Apply zero trust by authenticating and authorizing every request on its own merits and issuing only short-lived, narrowly scoped credentials. Use when designing service-to-service access, internal tooling, or any system that still trusts requests because of where they came from.4---56# Zero trust basics78The network perimeter stopped being a trust boundary the moment the first9service got popped and used to reach everything behind the firewall. Zero10trust replaces "inside the network, therefore trusted" with a per-request11question: is this specific caller, right now, allowed to do this specific12thing? The two levers are verifying identity everywhere and keeping the13credentials that prove it short-lived.1415## Method16171. **Authenticate every request, including internal ones.** Require a verified18 identity on service-to-service calls, not just at the edge. Give each19 workload its own identity (SPIFFE/SPIRE, a signed service account, mutual20 TLS certificate) so a call's origin IP or subnet grants it nothing.212. **Authorize per request against explicit policy.** Check identity plus the22 action and resource on each call, evaluated by a policy engine (OPA, Cedar,23 or your framework's equivalent) rather than a static "this service may talk24 to that one" firewall rule. Default deny, and grant the least scope the25 caller needs.263. **Issue short-lived credentials and rotate automatically.** Prefer tokens27 and certificates measured in minutes to hours, minted on demand from a28 broker like Vault, an OIDC provider, or a cloud instance-identity service.29 A credential that lives for minutes is worth far less stolen than a static30 key that never expires.314. **Kill long-lived static secrets.** Replace embedded API keys and shared32 passwords with workload identity and dynamic credentials. Where a static33 secret is unavoidable, put it in a manager with rotation and audit, never34 in code, environment files committed to git, or an image layer.355. **Encrypt in transit end to end.** Enforce mutual TLS between services so36 both ends prove identity and traffic is confidential on the internal37 network too. "It is internal" is not a reason to send plaintext.386. **Log and continuously verify access decisions.** Emit an auditable record39 of who accessed what, and factor device posture or risk signals into the40 decision where you can, so trust is re-evaluated rather than granted once41 at login and assumed forever.4243## Litmus tests4445- If an attacker lands on one internal host, does its network position let it46 call other services, or does each call still demand a valid identity?47- Do service credentials expire in hours or less and rotate without a human?48- Are there any static, non-expiring keys in code, env files, or images?49- Is internal service-to-service traffic mutually authenticated and encrypted?5051## Boundaries5253Zero trust is an architecture direction, not a product you install, and it54does not remove the need for network segmentation, patching, or the specific55controls in oauth-flows and secrets-management. Migrating a legacy system is56incremental: start with the highest-value paths rather than attempting a57flag-day cutover.