Cara Amankan Credential MCP Server di mcpproxy

Kalau kamu udah pasang MCPProxy di VPS buat federasiin banyak server MCP (kayak yang dibahas di instalasi MCPProxy di Ubuntu Server), cepat atau lambat bakal ada server yang butuh credential, entah itu password database, API key, atau client secret. Masalahnya, defaultnya credential ini nangkring polos di file mcp_config.json, dan ikut nongol plaintext tiap kali ada yang query upstream_servers:list. Artikel ini bahas cara amankan credential MCP server itu tanpa perlu OS keyring, yang di VPS headless biasanya malah error.

Kenapa Perlu Amankan Credential MCP Server

MCPProxy sebenarnya punya fitur Convert to secret yang nyimpen credential ke OS keyring: Keychain di macOS, Credential Manager di Windows, Secret Service di Linux. Tapi Secret Service itu jalan lewat D-Bus dan biasanya cuma tersedia kalau ada desktop environment yang jalan. Di VPS headless, kamu bakal ketemu error failed to store secret: provider for keyring is not available on this system pas coba convert. Padahal plaintext credential yang nangkring di config itu risikonya nyata, apalagi kalau nanti ke-commit tanpa sengaja ke backup atau repository.

Opsi bikin dbus session plus gnome-keyring-daemon manual sebenarnya bisa, tapi ribet dan sering nggak stabil di lingkungan headless atau container. Udah banyak kasus serupa di tool lain yang tetap gagal walau gnome-keyring udah diinstall. Belum lagi kalau MCPProxy kamu jalan sebagai systemd service dengan hardening ketat semacam ProtectSystem=strict dan PrivateTmp=true, nyisipin dbus session ke situ berarti ngelonggarin proteksi yang udah bagus. Jadi daripada maksa keyring, ada cara lebih simpel yang tetap aman.

Cara Amankan Credential Tanpa OS Keyring

Ide dasarnya: pindahin credential keluar dari config MCPProxy, taruh di file .env terpisah yang cuma bisa dibaca user proses MCPProxy, terus panggil server-nya lewat wrapper script yang source file itu sebelum jalanin command asli. Hasilnya, MCPProxy sendiri cuma tahu nama command wrapper-nya, bukan isi credential di dalamnya, jadi respons upstream_servers:list otomatis bersih dari plaintext.

Pola ini paling pas buat server tipe stdio yang MCPProxy jalanin sebagai command lokal. Kalau ada variable yang emang bukan rahasia, misalnya host atau port yang publik, nggak masalah tetap ditaruh di env config biasa. Yang wajib dipindah cuma yang beneran sensitif: password, token, API key, atau client secret.

Langkah pertama, siapin folder khusus di dalam direktori config MCPProxy biar tetap masuk ReadWritePaths kalau service-nya di-hardening lewat systemd:

sudo mkdir -p /etc/mcpproxy/secrets /etc/mcpproxy/scripts

Buat file .env isi credential-nya, ganti sesuai kebutuhan server kamu:

sudo tee /etc/mcpproxy/secrets/nama-server.env > /dev/null <<EOF
DB_HOST="127.0.0.1"
DB_USER="app_user"
DB_PASS="passwordkamu"
EOF
sudo chown mcpproxy:mcpproxy /etc/mcpproxy/secrets/nama-server.env
sudo chmod 600 /etc/mcpproxy/secrets/nama-server.env

Terus bikin wrapper script yang source file .env itu sebelum ngejalanin command server aslinya:

sudo tee /etc/mcpproxy/scripts/run-nama-server.sh > /dev/null <<EOF
#!/bin/bash
set -a
source /etc/mcpproxy/secrets/nama-server.env
set +a
exec npx -y nama-mcp-server-package
EOF
sudo chown mcpproxy:mcpproxy /etc/mcpproxy/scripts/run-nama-server.sh
sudo chmod 750 /etc/mcpproxy/scripts/run-nama-server.sh

Edit Config MCPProxy Pakai jq

Langkah terakhir, ganti field command server itu di mcp_config.json biar nunjuk ke wrapper script, terus hapus object env-nya. Backup dulu sebelum diedit, terus pakai jq biar nggak salah ketik JSON manual:

sudo cp /etc/mcpproxy/mcp_config.json /etc/mcpproxy/mcp_config.json.bak-$(date +%s)

sudo jq '
  .mcpServers = [.mcpServers[] |
    if .name == "nama-server" then
      .command = "/etc/mcpproxy/scripts/run-nama-server.sh" | .args = [] | del(.env)
    else . end
  ]
' /etc/mcpproxy/mcp_config.json | sudo tee /etc/mcpproxy/mcp_config.json.tmp > /dev/null

sudo mv /etc/mcpproxy/mcp_config.json.tmp /etc/mcpproxy/mcp_config.json
sudo chown mcpproxy:mcpproxy /etc/mcpproxy/mcp_config.json
sudo chmod 660 /etc/mcpproxy/mcp_config.json

Jangan ganti ownership file config itu ke root. Kebanyakan install MCPProxy dari paket resmi punya ExecStartPost yang jalanin chgrp dan chmod ke file config setiap restart, dan proses itu jalan sebagai user service-nya sendiri, biasanya mcpproxy. Kalau ownership-nya keliru diubah ke root, ExecStartPost gagal, service masuk auto-restart loop, dan kamu bakal ketemu status activating (auto-restart) yang bikin bingung kalau nggak ngecek log lebih dulu.

Verifikasi Setelah Amankan Credential

Sebelum restart, cek dulu hasil edit-nya biar nggak kaget:

jq ".mcpServers[] | {name, command, args, env}" /etc/mcpproxy/mcp_config.json

Pastikan field env udah null dan command udah nunjuk ke wrapper script. Kalau udah sesuai, restart service-nya:

sudo systemctl restart mcpproxy
sudo systemctl status mcpproxy --no-pager | head -10

Status harus active (running). Cek juga dari Web UI MCPProxy atau lewat tool upstream_servers, server yang tadi diedit harus tetap healthy alias connected, dan field env-nya kosong.

Troubleshooting Umum

Ada beberapa kejadian yang sering muncul pas nerapin cara amankan credential ini. Kalau service gagal start setelah edit config, cek dulu ownership file mcp_config.json, paling sering itu penyebabnya. Kalau wrapper script-nya nggak ketemu command aslinya (muncul error semacam command not found), biasanya karena $PATH di systemd beda dari shell interaktif kamu, ganti pakai path absolut hasil which npx atau which node di dalam script.

Satu lagi yang gampang kejebak: kalau nanti mau kasih akses folder /etc/mcpproxy ke user lain lewat SFTP, jangan buru-buru pakai setfacl buat nambahin default ACL. ACL yang nabrak sama permission dasar bisa bikin semua file gagal di-stat sama sekali, muncul sebagai drwxrws---+ tapi ls -la malah error Permission denied di semua entry. Cukup masukin user itu ke grup service-nya pakai usermod -aG dan buka permission grup biasa lewat chmod -R g+rwX, nggak perlu ACL sama sekali kalau grup POSIX-nya udah cukup.

Penutup

Cara amankan credential ini emang bukan enkripsi beneran kayak OS keyring, tapi buat VPS pribadi yang cuma kamu yang pegang akses root-nya, memisahkan credential dari config MCPProxy plus permission file yang ketat udah nutup risiko utama: proses lain, atau siapa pun yang query API MCPProxy, nggak bakal ketemu plaintext-nya lagi. Kalau server MCPProxy kamu ke depannya butuh header Authorization: Bearer buat koneksi HTTP atau SSE (bukan stdio), cara wrapper script ini nggak langsung kepake, karena headers dikelola beda dari environment variable proses. Ada baiknya juga rutin ganti password dan secret secara berkala, apalagi kalau pernah ada insiden kebocoran config sebelumnya. Selengkapnya soal manajemen secret bawaan MCPProxy bisa dicek di dokumentasi CLI resminya.

Jundi Husni Mubaraq

Jundi Husni Mubaraq

Saya seorang software engineer yang sejak awal 2026 megang penuh (sendirian) tanggung jawab infrastruktur server di tempat saya kerja: deploy dan maintain server Linux Ubuntu on-premises, bangun keamanan berlapis pakai CrowdSec dan Cloudflare, kelola job scheduling dan monitoring pakai Cronicle, deploy aplikasi containerized pakai Docker, sampai ngurusin mail server korporat dari nol. Sebelumnya saya 3+ tahun jadi Software Engineer/Fullstack Developer di beberapa perusahaan, termasuk proyek skala internasional (EUDR compliance system buat Lindt & Sprungli) dan sistem rumah sakit (SIMRS, rekam medis elektronik, integrasi BPJS Kesehatan) di RS PKU Muhammadiyah Surakarta. jundi.hm ini tempat saya dokumentasiin apa yang beneran saya kerjain dan pelajarin di lapangan, bukan sekadar riset teori, S.Kom dari Universitas Duta Bangsa Surakarta jadi bekal awal, tapi yang nulis di sini adalah pengalaman langsung ngelola server production sehari-hari. Selengkapnya: https://iam.jundi.hm

Lihat Juga Nih

Selanjutnya Nih

Kasih Komentar

Email kamu gak bakal ditampilin ke publik. Kalau ada tanda ini artinya wajib diisi ya *

Rekomendasi.

Lagi Viral.