Waarom een server opzetten niet hetzelfde is als een hostingplatform

Een website die bereikbaar is, zegt weinig over de kwaliteit van de hosting eronder. Wat betekent dat in de praktijk voor security, onderhoud en doorontwikkeling?

Jasper
Auteur Jasper Datum
Hosting
Cybersecurity
Development
Open-source
Infrastructuur
Bereikbaar is niet hetzelfde als onder controle

Hosting begint bij inzicht in de hele stack

Als een site online is, lijkt de basis vaak “goed genoeg”. Er staat een server. Packages zijn geïnstalleerd. Nginx antwoordt. Klaar.

Tot er iets misgaat. Of tot er een CVE binnenkomt. Of tot je een tweede project op dezelfde machine zet en merkt dat alles dezelfde rechten deelt.

Een webapplicatie is meer dan de applicatiecode. Er draait PHP, een database, een webserver, een Linux-basis, certificaten, backups, logs en monitoring. Securitymeldingen landen ergens in die keten. Soms in Composer. Soms in een Ubuntu-package. Soms in de manier waarop processen op de host mogen werken.

Daarom behandelen wij hosting niet als iets wat je na livegang “even regelt”. Als je niet weet wat er draait, hoe projecten van elkaar zijn gescheiden, of hoe je dezelfde inrichting opnieuw kunt uitrollen, wordt beheer al snel reactief. Dan patch je op gevoel. Of je durft niet te patchen, omdat niemand meer precies weet wat er kapot kan gaan.

Een server is geen platform

Een VPS bestellen is eenvoudig. Het lastige is herhaalbaarheid: weten wat er draait, projecten uit elkaar houden, en dezelfde inrichting morgen opnieuw kunnen neerzetten.

Saai is reproduceerbaar. Unieke servers zijn spannend tot degene die ze kent op vakantie is.

Server

  • Handmatige SSH-fixes die niemand documenteert
  • Elke host een eigen inrichting
  • Projecten delen gebruiker, rechten en processen
  • Patchen op gevoel of juist niet durven
  • “Het werkt al jaren” als onderbouwing

Platform

  • Wijzigingen via Ansible, reviewbaar
  • Zelfde fundament op elke server
  • Isolatie per project en omgeving
  • Triage met context, dan actie
  • Opnieuw uitrollen is onderdeel van het ontwerp
Wat wij met “platform” bedoelen

Elke server start vanaf hetzelfde fundament

Met platform bedoelen we: elke server start vanaf hetzelfde fundament. Elk project krijgt een eigen, voorspelbare plek. Wijzigingen gaan via Ansible, niet via een SSH-sessie die niemand documenteert.

Onze basis is Ubuntu Server LTS. Daarop staat een vaste set defaults voor firewall, SSH, updates, logging, PHP, nginx en database. Staging en productie gebruiken dezelfde bouwstenen. Staging precies hetzelfde. Maar dan nog meer afgeschermd van de buitenwereld (allowlist, basic auth).

Als omgevingen dezelfde bouwstenen delen, kun je triage en patching structureel doen. Is elke host anders, dan is elke securitymelding opnieuw detectivewerk.

Een server opzetten is eenvoudig. Honderd keer hetzelfde veilig en voorspelbaar doen, dat is het platform.

Keuzes die steeds terugkomen

Je keuzes kunnen uitleggen en verdedigen

Een paar principes die bij ons niet optioneel zijn:

  • Processen krijgen alleen de rechten die ze nodig hebben
  • Eén beveiligingslaag is nooit genoeg
  • Servers en projecten staan in code, zodat je kunt zien wat er is veranderd
  • Updates horen erbij, maar niet blind: eerst context, dan actie
  • Zonder metrics en logs gok je
  • Backups horen bij de standaarduitrol, niet bij “dat regelen we later”

Keuzes die je kunt uitleggen als iemand vraagt waarom een project zo is ingericht.

Isolatie van omgevingen

Projecten mogen elkaar niet “per ongeluk” raken.

Op half-beheerde of shared setups delen apps vaak te veel: dezelfde systeemgebruiker, dezelfde PHP-processen, ruime filesystem-rechten. Dat werkt tot één app een fout heeft, of tot een compromis verder reikt dan nodig. Goed isoleren vna projecten zorgt er voor dat er niet een grote blast radius is als er toch iets mis gaat. Het blijft dan bij een klein onderdeel en zorgt er voor dat andere projecten of omgevingen niet tot weinig impact ervaren.

Dit is configuratiewerk vooraf, maar ook precies wat je wilt als het misgaat.

Wat we uit elkaar zetten

Gebruiker & processen

Eigen Linux-gebruiker per project/omgeving. Processen draaien niet onder een gedeeld systeemaccount, zodat een fout niet meteen de hele host meeneemt.

PHP-runtime

Webserver & TLS

Database

Baseline op elke host

Meer dan “poort 80/443 open en klaar”. Defense in depth klinkt als buzzword; in de praktijk doen firewall, toegang, updates en audit elk iets anders. Samen maken ze misbruik duurder en opsporing realistischer.

Firewall

Inkomend verkeer default-deny. Alleen wat nodig is, mag erin.

Toegang

Geen root-login via SSH. Fail2ban op SSH en relevante web-auth.

Updates

Unattended upgrades voor security, met mail als er iets fout gaat.

Audit & logs

Auditd op kritieke wijzigingen. Nginx- en PHP-logs per project.

Patches

OS automatisch, applicatie met triage

Op OS-niveau houden unattended upgrades de basis bij. Linux-packages krijgen CVE’s, net als frameworks.

Op applicatieniveau werken we zoals in ons CVE-verhaal: een score is input, geen automatisch besluit. Eerst kijken of de component echt draait, of de functionaliteit bereikbaar is, of configuratie/isolation al iets mitigeert, en wat een update doet met maatwerk en koppelingen.

Blind alles tegelijk updaten klinkt daadkrachtig. Het is vooral een manier om twee problemen tegelijk te krijgen: een half begrepen CVE en een half begrepen regressie.

"Infrastructure as code" is niet zomaar een hype

Het is je active geheugen. Zelfdocumenterend

We rollen servers en projecten uit met Ansible. “Infrastructure as Code” klinkt zeker mooi, het is ook gewoon heel praktisch. Handwerk schaalt niet. En is ook niet makkelijk te reviewen. Zeker niet als je losse commando's over SSH uitvoert. In de praktijk betekent dit dus. Een nieuwe server is gebruikmaken van een gestandaardiseerd playbook. Een nieuw project, gebruiken van het gestandaardiseerde deploy playbook die alles volgens onze wensen configureert(domeinen, PHP, databases). Alle secrets zijn encrypted en dus nooit plaintext in git.

Staging gebruikt de exact zelfde methodes. Maar dan nog iets meer authenticatie ervoor zodat we deze projecten kunnen testen zonder dat deze al open staan voor het hele internet.

Die speciaal opgezette servers die alleen één persoon snapt zijn in de praktijk een security- en availability-risico. Een verbeteringsstap op één machine is geen verbetering van het platform; het is een uitzondering die je later weer vergeet, niet goet uitwerkt, of geen rekening mee houdt.

Als het antwoord vooral “het werkt al jaren” is, heb je waarschijnlijk een server. Nog geen platform.

Wat is jouw uitdaging?

Vragen of advies over het opzetten van een server?

Beschermd door reCAPTCHA. Privacyverklaring en Algemene Voorwaarden.