Security is decided in the architecture, not afterwards
Most incidents don’t come from a sophisticated exploit but from needless exposure: a database reachable from the internet, an admin panel protected by a single password, a test service left running on an open port. These situations almost always come from an architectural choice made by default, not from a deliberate decision.
Our starting position is simple: nothing is exposed until it needs to be, and whatever must be exposed travels a controlled, authenticated and logged path.
Publishing an application without opening a port
The conventional approach opens ports 80 and 443, publishes an IP address, and then defends that door: firewall, rate limiting, intrusion detection. It works, but it demands constant vigilance — and one badly written rule reopens the gap.
The outbound-tunnel approach inverts the logic. With Cloudflare Tunnel, a cloudflared agent establishes an encrypted outbound connection to the Cloudflare network itself. Visitors reach Cloudflare, never your server directly. What follows from that:
- no inbound port to open — a port scan finds nothing;
- the origin IP address stays private — it cannot be targeted directly;
- the WAF and DDoS protection apply upstream, before traffic reaches your infrastructure;
- TLS certificates are handled automatically, with no renewal to keep an eye on.
We add Cloudflare Access in front of sensitive interfaces — back offices, administration tools, staging environments. The user authenticates against your identity provider with MFA, and the application never sees an unauthenticated request. Someone leaving the team means immediate revocation, with no shared password to rotate.
Hardening what runs
A container image built without care often ships a full operating system, a shell, build tooling and a process running as root. We apply the same rules every time: minimal base image, unprivileged user, read-only root filesystem where the application allows it, Linux capabilities reduced to what is strictly needed, and vulnerability scanning on every build in CI.
On Kubernetes this comes with admission policies, NetworkPolicies that forbid unplanned pod-to-pod traffic, and RBAC that is genuinely restrictive — not cluster-admin handed out for convenience.
Being able to go back
No protection is absolute. So the honest question isn’t only “how do we prevent an incident?” but “how long until we’re running again, and with which data?”.
That’s why we treat backups as a security function in their own right: encrypted, stored off-site, unreachable from the production server — the condition for surviving ransomware — and above all restored regularly to prove they work. The real restore time is measured and written down, not estimated at the moment you need it.