Je zelf gehoste MCP-server beveiligen
Een zelf gehoste mcp-core-server bewaart de inloggegevens van je winkel, database en andere systemen. Hij verdient dus dezelfde zorg als die systemen zelf. Op deze pagina staat wat hem veilig houdt: een recente versie, een gesloten poort of een proxy met HTTPS, één token per persoon, strakke bestandsrechten en tool-logins die niet meer kunnen dan nodig is. Het meeste doe je één keer, in een paar minuten.
Welke versie van mcp-core moet je draaien?
Draai 2.3.3 of nieuwer. Versies vóór 2.3.1 toonden op /oauth/authorize een verbindingskiezer zonder login. Daardoor kon iedereen die de server bereikte een licentie met één connectie gebruiken. 2.3.2 zet ook de tokens van die kiezer uit, en 2.3.3 vraagt PKCE bij elke connector die je instelt. Werk bij vanuit de map van je bundel:
./mcp-update.sh
Draai het opnieuw zodra er een nieuwe versie is; mcp-core up-to-date houden legt versies en vastzetten uit. Een connector die je ooit via de oude kiezer instelde, verbind je opnieuw met de link onder AI koppelen van die connectie.
Moet mcp-core vanaf internet bereikbaar zijn?
Alleen via een reverse proxy met HTTPS, en alleen als je het nodig hebt. Het compose-bestand uit je bundel bindt de container aan 127.0.0.1, dus standaard kan niets buiten de host erbij. Claude Desktop en Claude Code op dezelfde machine werken daarmee.
Claude.ai en Claude Desktop op een andere computer hebben een openbaar HTTPS-adres nodig. Dan:
- Laat
MCP_BINDin.envop127.0.0.1staan, zodat de poort van de container zelf dicht blijft. - Zet er een reverse proxy voor (nginx, de proxyregels in Plesk, Caddy) met een geldig certificaat, en stuur alleen
/mcp,/oauth,/.well-knownen/healthdoor naarhttp://127.0.0.1:3200. - Zet
SERVER_URLin.envop het openbare adres, bijvoorbeeldhttps://mcp.example.com, en draai./mcp-update.sh. - Open in de firewall van de server alleen poort 80 en 443 (en SSH).
Zet poort 3200 nooit rechtstreeks open en serveer mcp-core nooit over gewone HTTP: het token gaat met elk verzoek mee.
Hoe ga je om met connectietokens en AI koppelen-links?
Behandel elk token als een wachtwoord. De link onder AI koppelen (https://jouw-server/mcp/<token>) bevat het token, dus de link is ook het wachtwoord.
- Geef elke persoon of elk apparaat een eigen seat (connectie). Dan kun je er één stoppen zonder de rest te raken. Zie een teamgenoot toevoegen.
- Plak tokens en links niet in chat, tickets of e-mail, en houd ze buiten git.
- Gaat iemand weg of is een link misschien uitgelekt, gebruik dan Regenerate token of Revoke op het tabblad Connecties in Mijn account → Licenties. De server ziet het bij de volgende licentiecheck; draai
./mcp-update.shom het meteen door te voeren. - Een reverse proxy schrijft opgevraagde paden in zijn access log, en de AI koppelen-link is een pad. Houd die logs alleen leesbaar voor beheerders, of laat het token weg uit het logformaat.
Welke bestanden bevatten geheimen, en wie mag ze lezen?
Deze bestanden in de bundelmap bevatten inloggegevens:
.env: je licentiesleutel, het token van de eerste connectie en tool-instellingen die je zelf toevoegde..env.registry: de login voor de image-registry. Elke licentie heeft een eigen login, en./mcp-update.shhaalt vóór elke update zelf de actuele op.state/: de ondertekende licentiecheck, het installatie-id en versleutelde kopieën van de inloggegevens die je op het portaal invulde.claude-plugin/.mcp.json: het token van de eerste connectie voor Claude Code.
Maak ze alleen leesbaar voor de eigenaar en houd ze buiten versiebeheer:
chmod 600 .env .env.registry claude-plugin/.mcp.json
chmod 700 state
Maak versleutelde back-ups van de map. Kopieer state/ niet naar een tweede server om daar nog een installatie te draaien: de licentiecheck hoort bij de installatie waarvoor hij gemaakt is, en een kopie werkt gewoon niet.
Hoeveel toegang mag elke tool-login hebben?
Niet meer dan het werk dat je Claude laat doen. Een token dat uitlekt kan alleen wat de logins erachter toestaan.
- Database: een aparte gebruiker met alleen
SELECTop de tabellen die Claude nodig heeft, en de uitsluitlijst voor de rest. Zie Database MCP instellen. - WooCommerce: een REST API-sleutel met leesrechten, tenzij Claude bestellingen of producten moet wijzigen.
- WordPress: een applicatiewachtwoord van een aparte gebruiker met de laagste rol die nog werkt, nooit je eigen beheerdersaccount.
- Plesk, Missive, Lightspeed en de andere: een sleutel of gebruiker speciaal hiervoor, zodat je hem kunt intrekken zonder iets anders te veranderen.
Geef connecties die alleen iets hoeven op te zoeken de alleen-lezen-modus. Een alleen-lezen-connectie krijgt nooit de schrijftools, wat de login erachter ook kan. Entitlements vs toolmodi legt het verschil uit.
Welke instellingen controleer je als je OAuth gebruikt?
Alleen van belang met AUTH_STRATEGY=oauth. De standaard apikey heeft dit allemaal niet nodig.
- Gebruik lange, unieke wachtwoorden voor de gebruikers in
OAUTH_USERS; bewaar alleen de bcrypt-hashes. - Zet
OAUTH_CLIENT_SECRET, zodat een gestolen inlogcode alleen niet genoeg is. - Laat
OAUTH_REDIRECT_URISleeg, tenzij je een andere client dan Claude gebruikt. Leeg staat alleen de eigen callback van Claude en lokale adressen toe. Zo kan een phishinglink een inlogcode niet ergens anders heen sturen. - Na 10 verkeerde wachtwoorden vanaf één adres of voor één gebruikersnaam wacht de login 15 minuten. Achter een reverse proxy werkt dat per bezoeker, zolang de proxy op dezelfde host of in een privénetwerk draait.
Hoe houd je de server zelf veilig?
- Installeer updates van het besturingssysteem en van Docker.
- Log via SSH in met een sleutel in plaats van een wachtwoord, en alleen als de gebruikers die het nodig hebben.
- Draai geen andere diensten op dezelfde server die je niet nodig hebt.
- Laat
LICENSE_ENDPOINTop het https-adres uit je bundel staan. mcp-core weigert een licentieadres over gewone http, zodat je licentiesleutel nooit onversleuteld over het netwerk gaat.
Wat doe je als een token of login uitlekt?
- Vernieuw het token van de betreffende connectie op het tabblad Connecties, of trek het in, en draai
./mcp-update.sh. - Wijzig de tool-logins die die connectie gebruikte: het databasewachtwoord, de API-sleutel, het applicatiewachtwoord.
- Kijk in
logs/naar verzoeken die je niet herkent (regels metToken acceptednoemen de connectie). - Is je licentiesleutel zelf uitgelekt, neem dan contact met ons op voor een nieuwe.
Is er een korte checklist?
- mcp-core 2.3.3 of nieuwer, bijgewerkt met
./mcp-update.sh. - Poort 3200 gebonden aan
127.0.0.1; toegang op afstand alleen via HTTPS. - Eén connectie per persoon of apparaat; vernieuwen of intrekken als iemand weggaat.
.env,.env.registry,state/en.mcp.jsonalleen leesbaar voor de eigenaar, niet in git.- Tool-logins met zo min mogelijk rechten, alleen-lezen-connecties waar het kan.
Hoe tokens bij elk verzoek gecontroleerd worden, lees je in MCP-authenticatie. De bestanden in de bundel staan in MCP Core-download en inhoud van de zip.
Klaar om het te proberen?