MCP Server sind mittlerweile als Erweiterungen für Coding Agents wie Claude Code oder Cursor zu alltäglichen Tools geworden. Doch bei der Konfiguration der MCP Server gibt es oft ein Sicherheitsrisiko.
Viele MCP Server brauchen Credentials, API Tokens oder andere Secrets, um sich an externen Diensten zu authentifizieren. Oft werden die Secrets als Umgebungsvariable für den MCP Server konfiguriert und dafür direkt in Konfigurationsdateien hardcoded.
⚠️ So liegen die Secrets unverschlüsselt auf der Festplatte!
In diesem Blog-Post möchte ich vorstellen, wie Secrets sicher außerhalb von solchen Konfigurationsdateien verwaltet werden können.
Die Gefahr durch hardcoded Secrets
Dieses Vorgehen sieht man oft, zum Beispiel in der Doku zum
Perplexity MCP Server. Dort wird
beschrieben, wie der MCP Server mit folgender Konfiguration in einer claude.json Datei hinterlegt werden kann.
1{ 2 "mcpServers": { 3 "perplexity": { 4 "type": "stdio", 5 "command": "npx", 6 "args": [ 7 "-y", 8 "perplexity-mcp" 9 ], 10 "env": { 11 "PERPLEXITY_API_KEY": "your_key_here" 12 } 13 } 14 } 15}
Dass das eine reale Gefahr darstellt, zeigt sich immer wieder. Credential Stealers wie der Shai-Hulud 2.0 Worm haben in jüngster Zeit systematisch Credentials wie GitHub Tokens, npm Tokens, AWS Keys und SSH Private Keys aus Entwicklerumgebungen gestohlen.
Sichere Konfiguration mit Passwortmanager CLIs
Mit Hilfe von Kommandozeilen-Tools von Passwortmanagern lassen sich Secrets sicher und bequem an MCP Server übergeben. Hier verwenden wir 1Password als Beispiel. Andere Passwortmanager bieten ähnliche Funktionalität, zum Beispiel Bitwarden.
Die Idee: Secrets liegen oft schon sicher in 1Password. Optimalerweise kopieren wir diese nicht von dort in Klartext-Konfigurationsdateien, sondern übergeben sie aus dem Password Manager direkt an die MCP Server. Mit dem Kommandozeilen-Tool von 1Password ist genau das möglich.
Das Tool verbindet sich mit der 1Password App und hat so Zugriff auf die Secrets.
Vorher fordert es den Nutzer aber auf diesen Zugriff zu erlauben, zum Beispiel per TouchID auf Macs.
Nun können wir über die Kommandozeile auf Einträge aus 1Password Vaults zugreifen. Es gibt Befehle für
das Auflisten op item list, Erstellen op item create, und Auslesen op item get von
Einträgen. (Dokumentation)
Für die Verwendung mit MCP Servern (oder generell Anwendungen, die Secrets benötigen) ist aber der
op run Befehl am besten geeignet.
Als Parameter übergeben wir diesem den Pfad zu einer .env Datei (mehr dazu später) und einen Befehl, der ausgeführt werden soll, in
diesem
Fall
der MCP Server.
op run --env-file .env -- <command> <arg1> <arg2> …
Es werden zwei Bindestriche verwendet, um den auszuführenden Befehl von den anderen Argumenten zu trennen. Alles nach den Bindestrichen wird als Teil des auszuführenden Befehls gesehen. So ist es möglich dort Befehle mit Parametern anzugeben.
Für den Perplexity MCP Server sieht das also so aus:
op run --env-file .env -- npx -y perplexity-mcp
Diesen Befehl tragen wir jetzt in die MCP Server Konfigurationsdatei unserer Coding Agenten ein, zum Beispiel claude.json für
Claude Code:
1{ 2 "mcpServers": { 3 "perplexity": { 4 "type": "stdio", 5 "command": "op", 6 "args": [ 7 "run", 8 "--env-file", 9 "/your/full/path/.env", 10 "--", 11 "npx", 12 "-y", 13 "perplexity-mcp" 14 ] 15 } 16 } 17}
Die Umgebungsvariable muss hier nicht mehr angegeben werden, da diese von dem op Tool mit Hilfe der .env Datei
gesetzt wird.
Für die env Datei muss der volle Pfad zu der Datei, die wir als Nächstes anlegen, angegeben werden.
Der entscheidende Punkt: in die .env Datei tragen wir jetzt nicht direkt den Perplexity API-Key ein, sondern eine
Referenz zu dem Eintrag in 1Password, wo wir den Key sicher hinterlegen.
PERPLEXITY_API_KEY=op://Employee/Perplexity API Key/password
Hier nutzen wir eine 1Password Secret Reference, welche auf das Password Feld des Perplexity API-Key Eintrags zeigt. Diese Referenz lässt sich ganz bequem aus der 1Password App kopieren, sobald man die Integration für die CLI in der 1Password Anwendung aktiviert hat. Wie das geht, ist hier erklärt.
Kopieren der Secret Reference aus einem 1Password-Eintrag
Alternativ geht das auch übers Terminal:
op item get "Perplexity API Key" --format json --fields password | jq .reference
Perplexity API Key ist hierbei der Name des Eintrags in 1Password, in dem der API-Key gespeichert ist.
Das Ergebnis
Wenn ich nun Claude Code starte, wird der op Befehl ausgeführt, welcher mich zunächst fragt, ob ich den Zugriff
erlaube:
TouchID-Authentifizierung beim Zugriff auf 1Password-Secrets
Wenn ich das bestätige, liest op die in der .env Datei referenzierten Secrets aus und übergibt sie als
Umgebungsvariablen an den MCP Server.
Die Secrets sind so nur zur Laufzeit im MCP Server Prozess vorhanden.
Der MCP Server hat so aber immer noch Zugriff auf die Secrets! Es bleiben immer noch die Gefahren, die vom MCP Server selbst ausgehen. Bei der großen und immer weiter wachsenden Anzahl an verfügbaren MCP Servern, zum Beispiel auf GitHub, gibt es einige Sicherheitsrisiken und Schwachstellen.
1Password empfiehlt außerdem Service Accounts zu verwenden, um fein-granulare Permissions zu definieren und somit den Zugriff einzuschränken. Und neuerdings gibt es mit Environments noch einen anderen Weg mit 1Password Umgebungsvariablen zu verwalten.
Weitere Artikel in diesem Themenbereich
Entdecke spannende weiterführende Themen und lass dich von der codecentric Welt inspirieren.
Blog-Autor*in
Paul Severin
IT Consultant and Developer
Du hast noch Fragen zu diesem Thema? Dann sprich mich einfach an.
Du hast noch Fragen zu diesem Thema? Dann sprich mich einfach an.