← Back to Security

Secure System Design

Secure system design through trust boundaries, least privilege, and layered controls.

SecuritySecurity DesignSystems Atlas

A secure system starts with a blunt assumption: every exposed boundary will be tested, and some internal boundary will eventually fail. Attackers do not need a complete break. They need one weak credential, one over-privileged service account, one forgotten admin endpoint, or one backup copied to the wrong place. Security design is therefore less about a single protective feature and more about shaping the system so one mistake does not become a full compromise.

Start with assets and trust boundaries

List the things that matter before choosing controls. That usually means customer data, payment flows, secrets, signing keys, internal admin actions, and the infrastructure that can change production state. Then mark the trust boundaries between browsers, mobile apps, edge services, application services, message brokers, databases, and operator access paths.

This step matters because controls differ by boundary. Input from a browser is hostile by default. Traffic from another internal service is only trustworthy if the calling identity is verified on every request. Backups are a separate security domain because they often outlive the production system and carry the same sensitive data.

Make identity explicit

Authentication answers who is calling. Authorisation answers what that identity may do. Many systems are weak here because they stop at user login and treat everything behind the API gateway as trusted. A safer design gives every user, job, and service its own identity and checks permissions close to the protected resource.

Use short-lived credentials where possible. A stolen session that expires in minutes is less dangerous than a token valid for months. Give services the minimum access they need, and separate read, write, and admin capabilities. For internal workflows, prefer machine identities and signed service-to-service requests over shared static secrets.

Treat secrets and keys as a control plane

Encryption at rest and in transit is table stakes. The hard part is key management. Decide where keys live, who may request them, how they rotate, and how access is audited. If application servers can freely export raw database snapshots and decrypt them locally, the encryption story is mostly cosmetic.

The same applies to secrets. Store them in a dedicated secret manager, scope them narrowly, rotate them without redeploying the entire estate, and ensure logs never print them. Emergency access procedures should exist, but they must be explicit and reviewable, not hidden in personal notebooks or shell history.

Reduce blast radius inside the system

Segmentation is about limiting what an attacker can reach after the first foothold. Put admin surfaces on separate paths. Restrict east-west traffic between services. Deny unnecessary egress so a compromised node cannot freely call out to arbitrary hosts. Harden defaults for containers, hosts, and CI runners, because build systems and deployment pipelines are part of the production attack surface.

Data design matters too. Validate input early, store only the data you truly need, and isolate highly sensitive fields from lower-risk operational data. Tokenisation or field-level encryption can reduce impact, but only if the decryption path is more tightly controlled than the primary datastore.

Design for detection and recovery

A secure system is observable. Audit logs should answer who did what, from where, using which identity, and whether the action changed data or permissions. Centralise those logs, make them hard to tamper with, and keep enough retention for investigations. Security telemetry should cover failed logins, unusual privilege changes, secret access, configuration drift, and data export behaviour.

Recovery needs equal attention. Backups must be restorable. Credential rotation must work under pressure. Incident response should include isolation steps, not just notification steps. If a node is suspected to be compromised, the team should know how to revoke its credentials, drain traffic, and rebuild it from a known-good source.

When this approach fits

This model fits any system where compromise has real cost: customer platforms, internal business systems, data pipelines, and operational tooling. The details differ, but the design question stays the same: if one layer fails, what stops the next move? Good security architecture gives a precise answer at each boundary.