Overview
SMKRV MCP Studio implements multiple layers of security. This document covers the security architecture, configuration, and best practices.Network Architecture
Port Exposure
Only the frontend nginx container exposes ports to the host network:| Container | Exposed Ports | Network |
|---|---|---|
| frontend | 3000, 443 | Host + frontend-net |
| backend | 8000 | backend-net only |
| mcp | 8080 | backend-net only |
| agent-mcp | 8090 | backend-net only |
| redis | 6379 | backend-net only |
Docker Network Isolation
| Network | Containers | Purpose |
|---|---|---|
frontend-net | frontend, backend | Nginx-to-backend API proxy |
backend-net | backend, mcp, agent-mcp, redis | Internal services communication |
Encryption at Rest
What Is Encrypted
Sensitive data is encrypted at rest using symmetric encryption:- Database connection passwords
- API tokens (MCP bearer token)
- DNS provider credentials (for SSL certificate issuance)
- Sensitive
extra_paramsfields (e.g., BigQuerycredentials_json) - TOTP 2FA secrets
- OAuth2 client credentials and introspection secrets
STUDIO_ENCRYPTION_KEY environment variable. See Configuration for key management and rotation.
Sensitive Extra Params
Cloud database connections store credentials in theextra_params JSON column. Sensitive fields are selectively encrypted:
| DB Type | Field | Encrypted? |
|---|---|---|
| BigQuery | credentials_json | Yes |
| BigQuery | project_id, dataset | No |
| Snowflake | account, warehouse, schema, role | No |
| Cassandra | keyspace | No |
| Supabase | project_ref | No |
- Encrypted on create/update
- Decrypted only for connection test, SQL preview, and code generation
- Masked as
••••••in all API responses and exports
Admin Authentication
Single-Admin Auth
SMKRV MCP Studio uses a single-admin authentication model:- First-time onboarding — when no admin exists, the app shows a setup screen to create the admin account
- Login — all access requires authentication via username/password
- Session — secure httpOnly cookie (SameSite=Lax, 24h expiry, Secure flag when SSL enabled)
- Password storage — securely hashed (never stored in plaintext)
Two-Factor Authentication (TOTP)
Optional TOTP-based 2FA:- QR code for provisioning with any authenticator app (Google Authenticator, Authy, 1Password, etc.)
- TOTP secret is encrypted in the database
- 10 single-use recovery codes generated on setup
- Separate rate limiter for 2FA attempts (5 per 15 min)
Rate Limiting
Login attempts are rate-limited per IP address:- 5 failed attempts within 15 minutes triggers a lockout
- Lockout lasts until the 15-minute window expires
- 2FA verification has a separate rate limiter
Password Reset
Password reset is only available via Docker CLI:Agent MCP Authentication
Temporary Tokens
Short-lived access (15 min to 3 hours) for AI agents. Tokens are securely hashed before storage.OAuth2 Client Credentials
For persistent agent access with automatic token refresh. Client secrets are securely hashed, sessions use sliding window expiry.Service-to-Service Auth
The agent-mcp container communicates with the backend using a shared service token that is only available over the internal Docker network.MCP Authentication
The generated MCP server supports four authentication modes:| Mode | Description |
|---|---|
| None | No authentication — suitable for development |
| Bearer Token | Static token authentication |
| OAuth2 Client Credentials | Self-contained OAuth2 provider with /oauth/token endpoint |
| OAuth2 Introspection | Validates tokens against an external RFC 7662 endpoint |
Container Security
All containers run as non-root users with the principle of least privilege:| Container | Hardening |
|---|---|
| backend | Non-root user |
| mcp | Non-root, dropped capabilities, read-only filesystem, memory/CPU limits |
| agent-mcp | Non-root, dropped capabilities, read-only filesystem, memory/CPU limits |
| redis | Password-protected, persistent storage |
MCP Sandbox
The MCP container runs generated code in a hardened environment with no Linux capabilities, immutable root filesystem, and resource limits.Nginx Security Headers
| Header | Value |
|---|---|
X-Frame-Options | DENY |
X-Content-Type-Options | nosniff |
Referrer-Policy | strict-origin-when-cross-origin |
Permissions-Policy | camera=(), microphone=(), geolocation=() |
Content-Security-Policy | Configured per deployment |
Strict-Transport-Security | max-age=31536000; includeSubDomains; preload (SSL only) |
Self-Hosted Security Checklist
Before deploying to production:Environment Configuration
-
STUDIO_ENCRYPTION_KEYis set to a strong encryption key (not auto-generated) -
STUDIO_JWT_SECRETis set to a strong random string (not auto-generated) -
REDIS_PASSWORDis set to a strong, unique password -
STUDIO_AGENT_SERVICE_TOKENis set to a strong random token -
.envfile has restricted file permissions (chmod 600 .env)
Network
- Only ports 3000 and/or 443 are exposed to the host
- Backend, Redis, MCP, and Agent MCP ports are not exposed
- Firewall rules restrict access to necessary ports only
SSL/TLS
- SSL is enabled for production deployments
- A valid domain name is configured
- Let’s Encrypt certificates are issued and auto-renewing
- HTTP-to-HTTPS redirect is configured
Authentication
- Admin account has a strong password (min 8 chars)
- 2FA (TOTP) is enabled for the admin account
- MCP auth token is set if the MCP server is network-accessible
- Agent tokens use appropriate expiry (max 3 hours)
- Unused agent tokens and OAuth clients are revoked
CORS
- CORS origins are set to specific domains (no wildcard)
- Only trusted origins are listed
See Also
- Configuration Reference — environment variables, encryption key management, CORS settings
- SSL/HTTPS Setup — certificate provisioning and domain configuration
- Agent MCP — agent token management and OAuth2 setup
- Connections — database credentials and encrypted extra params
- Troubleshooting — diagnosing auth, CORS, and SSL issues