Secure by Design
6 min.
12 Secure by Design Principles: A Practical Guide for Security Managers
What does Secure by Design look like beyond the buzzword? A compact overview of twelve principles, with a closer look at least privilege, fail securely, and complete mediation and the mistakes that undermine them in practice.

Most security principles sound obvious in theory. But knowing them and applying them consistently across real systems are very different things. Twelve principles shape how Secure by Design works in practice. The tricky part isn’t knowing them but applying them consistently across systems without the usual drift into exceptions, workarounds, and forgotten service accounts.
Some of these principles are about stopping attacks before they happen. Others are about making sure your defenses don’t quietly erode after deployment. The distinction blurs in practice, but it’s a useful starting point when you’re figuring out which ones your organization is already doing well and where the blind spots are.
What Secure by Design Means and Why It Matters
he eleven principles in this guide build on foundational work by Saltzer and Schroeder, whose 1975 paper The Protection of Information in Computer Systems first defined many of them, including least privilege, complete mediation, and open design. Decades later, the principles still hold.
Secure by Design embeds security into every layer of system design, from architecture and code to operations and governance. It emphasizes secure defaults, least privilege, minimal attack surfaces, and continuous assurance. The goal: systems that hold up under pressure rather than systems that need constant fixing after deployment. Where bolt-on security adds controls after risks already exist, SbD prevents vulnerabilities at their source, reducing cost, complexity, and operational friction.
Preventive Security Design Principles: Closing Attack Paths
These principles reduce the likelihood and impact of attacks by limiting what’s exposed, who can access it, and how the system behaves when something goes wrong.
Least Privilege: Who Really Needs This Access – Right Now?
Give every user, process, and system only the permissions they need and nothing more. Limiting access to the bare minimum for each task reduces the risk that mistakes, misconfigurations, or compromises cause widespread damage. This shrinks the blast radius of any breach, prevents privilege escalation, and makes audits simpler because access boundaries are clear.
In practice:
- Role-based access control (RBAC) assigns permissions to roles rather than individuals.
- Just-in-time (JIT) access grants elevated privileges temporarily for specific tasks and revokes them automatically afterward.
- Service account scoping restricts system and API accounts to only the resources they actually require.
Watch out for: Privilege creep as people change roles, which periodic access reviews and IGA tooling are designed to catch, excessive default permissions in SaaS platforms, shared admin accounts that eliminate accountability and neglected service accounts with static or hardcoded credentials.
Fail Securely: When Things Break, Do They Break Safe?
A secure system defaults to denial or containment when it fails, degrades, or encounters an error. Access is explicitly granted, never assumed because something went wrong. Failures are inevitable. Designing for secure failure prevents outages, bugs, or misconfigurations from becoming security incidents.
In practice:
- A deny-by-default policy means access is granted only after successful authentication and authorization.
- Graceful degradation keeps essential secure functions running rather than letting the system crash or open up.
- Secure exception handling catches errors cleanly and avoids exposing stack traces, tokens, or sensitive data in logs or user messages.
Watch out for: Fail-open controls like firewalls that default to “allow” when unavailable, verbose error messages that reveal implementation details, and debug modes left active in production.
Complete Mediation: Are We Authorizing Every Single Request, Every Time?
Every access to a resource gets verified every time. Authorization checks don’t happen just once at login. No user, process, or request slips past because of caching, shortcuts, or outdated trust assumptions. This is one of the foundations Zero Trust builds upon: verify continuously, not once.
In practice:
- Centralized access control routes all requests through a single policy enforcement point.
- Short-lived tokens expire and require re-issurance and active sessions are re-validated at regular intervals, rather than relying on long-lived credentials
- API gateways and service meshes apply authorization checks at every microservice boundary.
Watch out for: Relying on initial login validation alone, cached authorizations that go stale when privileges change, and shadow APIs or undocumented endpoints that skip authorization logic entirely.
Economy of Mechanism: Could a Simpler Design Do the Same Job?
Complexity is the enemy of security. Every additional component, configuration flag or code path is something that can be misconfigured, misunderstood or exploited. In addition, complex systems are nearly impossible to fully verify or audit. Favor well-understood building blocks over bespoken designs, consolidate overlapping controls instead of stacking them and aggressively retire dead code and unused features.
Minimize the Attack Surface: Where Can We Safely Turn Things Off Today?
Every open port, exposed API, or excessive permission is an opportunity for attackers. Service minimization turns off unused ports and network listeners. Network segmentation isolates sensitive systems and makes lateral movement harder. Zero Trust validates every user and device continuously. Watch for feature creep, legacy systems left running “just in case,” and shadow IT that nobody tracks.
Defense in Depth: What Layers Stop an Attack When One Control Fails?
No single control stops every threat. Multiple independent measures work together to delay, detect, and contain attacks. Multi-factor authentication protects access even if credentials are stolen. Layered network security combines perimeter firewalls, internal segmentation, and endpoint protection. The key: layers need to be genuinely independent and effective, not just numerous. But more layers aren’t automatically better. Each one adds complexity and alerts to triage, so aim for meaningful coverage of distinct attack paths rather than overlap that exhausts the team.
Sustaining Security by Design: Visibility, Accountability, and Control
Prevention alone doesn’t get you there. These six principles make sure security decisions stay transparent and effective as systems and organizations change over time.
Psychological Acceptability: Make Secure Behavior the Easy Choice
Security works best when it feels natural. When controls fit into daily routines, users stop looking for shortcuts. SSO and passwordless authentication simplify access without compromising assurance. The principle of least astonishment means interfaces and workflows behave predictably. If secure behavior is the easiest behavior, compliance follows.
Open Design: Transparent Security Beats Security-Through-Obscurity
A secure system stays secure even if everyone knows how it works. Real protection depends on well-guarded secrets like encryption keys, not on hidden mechanisms. Keep security architecture diagrams current and version-controlled, document data flows clearly, and use Infrastructure-as-Code for consistent, auditable configurations.
Separation of Duties: Which Critical Steps Need a Second Pair of Eyes?
No single person should hold end-to-end control over a sensitive process. Splitting responsibilities across different people or systems creates natural checkpoints, makes collusion necessary for abuse and gives reviewers a fair chance to catch mistakes before they cause damage.
Auditability and Traceability: Can We Prove Who Did What — and When?
Every significant action, decision, and change needs to be traceable to its source. Comprehensive logging captures authentication events, authorization decisions, and configuration changes. Immutable log storage prevents evidence tampering. Centralized log management enables correlation and real-time analysis for faster threat detection.
Continuous Assurance: How Do We Keep Controls Working All The Time?
Assurance is not a one-time audit. Continuous compliance monitoring checks alignment with frameworks like ISO 27001, NIST, or CIS Benchmarks. Security-as-Code embeds policies directly into CI/CD pipelines. Breach-and-attack simulation (BAS) tests whether defenses actually perform as designed, turning security from a periodic inspection into something that runs constantly.
Least Common Mechanism: What Should We Stop Sharing to Shrink Risk?
Every shared component (databases, caches, identity systems) creates pathways for unintended information flow or privilege escalation. Dedicated resources for critical workloads prevent cross-tenant exposure. Microservices and container isolation reduce cross-contamination risk. Per-service IAM roles and separate encryption keys maintain strong isolation even in shared infrastructure.
Applying Secure by Design Principles in Practice
Secure by Design is not a checklist you complete once. The preventive principles close attack paths at the architecture level while the sustaining principles keep those defenses visible and effective as things change. When security controls are intuitive, layered, and automated, they stop being overhead and start being how things work.




