{
    "componentChunkName": "component---src-templates-handbook-tsx",
    "path": "/handbook/security",
    "result": {"data":{"markdownRemark":{"html":"<p>Security at nerdgeschoss is a handful of habits we all share, written down so nobody has to guess. This page is our official security policy, but really it's just how we work. Jens (CTO) owns the topic, deliberately opposite Christian (CEO), so security always has its own seat at the table.</p>\n<h2 id=\"passwords\" style=\"position:relative;\"><a href=\"#passwords\" aria-label=\"passwords permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Passwords</h2>\n<p>Don't invent passwords. Generate them in the password manager (12 characters minimum, enforced in our systems wherever they allow it, though anything you never type might as well be 40). We don't force password rotation: the BSI agrees that scheduled changes just produce weaker passwords. Change a password when there's an actual reason, like a suspected leak.</p>\n<p>Turn on multi-factor authentication everywhere. We enforce it wherever technically possible and audit the rest once a year. If a service offers passkeys, use those instead. That's where we're headed anyway.</p>\n<h2 id=\"credentials\" style=\"position:relative;\"><a href=\"#credentials\" aria-label=\"credentials permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Credentials</h2>\n<p>Credentials live in exactly two places: the password manager (one vault per project, access only while you actually work on it) or the encrypted credentials file inside a project. Every environment has its own keys, so a leaked dev key can't open production.</p>\n<p>Sharing happens only through expiring secure links from the password manager, even with customers. Email, chat, and anything else still readable next week are off limits.</p>\n<p>If a credential ever lands anywhere else (a Slack message, a screenshot, a commit), it's burned. We rotate it and everything it touches, immediately. Nobody gets blamed for this. When a dev master key once showed up in an internal screenshot, everything was rotated within twelve hours and the customer knew before anyone had to ask. Speak up, rotate, move on.</p>\n<h2 id=\"your-mac\" style=\"position:relative;\"><a href=\"#your-mac\" aria-label=\"your mac permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Your Mac</h2>\n<p>Every company Mac is managed through Apple Business Manager, so we can centrally verify that disk encryption, the firewall, and security updates are on, and remotely wipe a lost device. macOS ships with always-on malware protection (XProtect, Gatekeeper) that users can't switch off, and MDM lets us verify exactly that. Losing your laptop is a security incident. Tell us right away.</p>\n<p>Beyond that: full autonomy. You're an adult. Install what you like; all projects run in dev containers, so nothing leaks between projects or into your system. Private use is fine on a separate macOS account. And if you're stuck on sketchy public wifi, use the company VPN.</p>\n<h2 id=\"access\" style=\"position:relative;\"><a href=\"#access\" aria-label=\"access permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Access</h2>\n<p>You get the access your work needs, nothing more. GitHub is organized in per-project teams: maintain by default, admin only for the team lead and CTO. Deployments run automatically from CI. Production is SSH-only through our server tooling, so revoking a key removes access everywhere at once. Day to day, developers don't hold production credentials at all.</p>\n<p>When someone leaves, an offboarding checklist covers every system, and their SSH keys disappear from all servers automatically.</p>\n<h2 id=\"code-and-customer-data\" style=\"position:relative;\"><a href=\"#code-and-customer-data\" aria-label=\"code and customer data permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Code and customer data</h2>\n<p>Nothing reaches main without peer review and QA. Brakeman, bundler-audit and their Node friends run in CI, Dependabot watches our dependencies, and a central inventory of every project's Ruby, Rails and Node versions tells us within minutes which projects a fresh vulnerability affects.</p>\n<p>Customer data on our infrastructure lives on German servers at Hetzner. Development happens against anonymized sandbox data: same shape as production, all personal information replaced with random values. Real production data doesn't land on laptops (rare exceptions go through department leads).</p>\n<h2 id=\"backups\" style=\"position:relative;\"><a href=\"#backups\" aria-label=\"backups permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Backups</h2>\n<p>Encrypted backups go from our servers to separate S3 storage with its own credentials, plus regular offline copies onto a hard drive in a safe place. Even ransomware can't reach a disconnected disk. Restores are tested by hand; automating that is on our list.</p>\n<h2 id=\"when-something-goes-wrong\" style=\"position:relative;\"><a href=\"#when-something-goes-wrong\" aria-label=\"when something goes wrong permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>When something goes wrong</h2>\n<p>Something smells off? A phishing mail, a weird login, a lost device? Tell the CTO immediately, even if the attempt failed. We assess its severity, contain, fix, and learn. Customers affected by an incident hear from us within 24 hours on workdays.</p>\n<h2 id=\"when-jens-gets-hit-by-a-bus\" style=\"position:relative;\"><a href=\"#when-jens-gets-hit-by-a-bus\" aria-label=\"when jens gets hit by a bus permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>When Jens gets hit by a bus</h2>\n<p>Everything one person can access, a second person can too: Christian for devices, the head of backend has root on every server. The founders never take vacation at the same time. And losing a server stays a solvable annoyance: code is in GitHub, infrastructure is reproducible, backups are off-site.</p>\n<h2 id=\"staying-sharp\" style=\"position:relative;\"><a href=\"#staying-sharp\" aria-label=\"staying sharp permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Staying sharp</h2>\n<p>Once a year we walk through this page together in a 30-minute all-hands (which is also how the page itself stays reviewed). New nerds get the same session in their second week. Our apps have been externally pentested without security-relevant findings, and if you find something anyway, tell us. We'll fix it fast and we won't be weird about it.</p>\n<p>The short version: we believe in actual security. It happens in what you do every day, and this page just writes it down.</p>\n<p><em>Last reviewed: August 2026 · Jens (CTO)</em></p>","frontmatter":{"title":"Security at nerdgeschoss","shortTitle":"Security","breadcrumbs":[{"title":"Handbook","path":"/handbook"}]},"headings":[{"value":"Passwords","depth":2},{"value":"Credentials","depth":2},{"value":"Your Mac","depth":2},{"value":"Access","depth":2},{"value":"Code and customer data","depth":2},{"value":"Backups","depth":2},{"value":"When something goes wrong","depth":2},{"value":"When Jens gets hit by a bus","depth":2},{"value":"Staying sharp","depth":2}]}},"pageContext":{}},
    "staticQueryHashes": ["63159454"]}