Topic
Security and privacy, in practice
Attacking my own features and reading the protocols underneath them — secrets delivery, response headers, a published address for bad news, a cookie banner that sets no cookies, and what an auth flow is actually protecting you from.
19 posts
·
124 min total
·
updated 1 Nov 2026
A pentest agent fleet against my own site: what the architecture got right
I pointed PentestCode, an open-source multi-agent pentest harness, at everything I run under zakaria.lu. The interesting part was not the 40 findings but how a coordinator, shared state and a critic killed two false HIGHs before they reached the report.
1 Nov 2026
·
6 min read
·50 views
Adding Claude Haiku to my CV builder: sign-in first, a spend cap, and a fallback
BuildCV ran entirely in the browser. Here is how I added four opt-in Claude Haiku 5.5 actions on my own API credit: behind LinkedIn sign-in, capped three ways, falling back to built-in coaching when the money runs out, plus what the first real calls got wrong.
31 Oct 2026
·
8 min read
·42 views
Hiding the Keycloak admin console from the internet with an SSH tunnel
For a month my Keycloak admin console was one HTTPS request from anyone. How I closed it at the Traefik edge, opened a loopback-only door over SSH, and the details that decide whether the tunnel works or locks you out.
9 Oct 2026
·
6 min read
·93 views
How to Redirect Keycloak to One Identity Provider
My Keycloak broker showed a username/password form beside LinkedIn even though LinkedIn was the only supported recruiter identity. Here is how I replaced that ambiguous page with a fail-closed browser flow.
14 Sep 2026
·
5 min read
·114 views
A honeypot that only listens (and fail2ban that bites)
A logging-only honeypot on my Hetzner box: an unprivileged user, a systemd sandbox with one non-obvious trap that silences it, and fail2ban to turn every knock into a self-expiring firewall ban.
30 Aug 2026
·
5 min read
·115 views
Keycloak part 1: reading the login URL, parameter by parameter
I froze the redirect Spring sends you through and read it parameter by parameter. Three lookalike strings turned out to close three different attacks, and PKCE was already on without me asking for it.
9 Aug 2026
·
5 min read
·140 views
Why /.well-known/security.txt matters, and how to serve it properly
RFC 9116 answers the one question a stranger needs answered about your site: who do I tell about a vulnerability. What the file must contain, why the expiry date belongs in a test, and the routing trap that makes an SPA host serve it as HTML at 200.
2 Aug 2026
·
8 min read
·208 views
I didn't need an MCP gateway, I needed a smaller credential
I put an MCP server on the public internet so an AI client could file todos onto my private kanban board. The interesting part wasn't the protocol — it was making the dangerous call unrepresentable.
1 Aug 2026
·
7 min read
·132 views
A fourth host on the same jar: taking my kanban board off localhost
My kanban board had no authentication at all and handed its entire database to any caller. Putting it on focus.zakaria.lu meant a fourth host on the jar that was already running - plus a disclosure bug caught in review, and one cookie dot that 500'd every sign-in.
30 Jul 2026
·
8 min read
·99 views
The most honest cookie banner sets no cookies
I added a privacy notice to my site and refused to make it a cookie banner — because the only cookie I set is a functional one. Here's the reasoning, and why the dismiss flag lives in localStorage, not a cookie.
16 Jul 2026
·
5 min read
·165 views
Four security headers, and the CSP I deferred on purpose
The cheapest security win on a single-container stack lives at the reverse proxy. Here's the four-header Traefik middleware I shipped, the two things I deliberately held back, and the report-only CSP rollout I'm lining up next.
8 Jul 2026
·
6 min read
·128 views
Docker secrets: the delivery channel is the whole game
Five ways to hand a secret to a Docker container, ranked by who can read it back out. The source is just plumbing - environment variable vs file is what actually decides your exposure.
20 Jun 2026
·
5 min read
·141 views