Trino User Impersonation
Overview
Trino user impersonation allows the MCP server to execute queries on behalf of authenticated users while maintaining a single set of static credentials for the Trino connection. When enabled, MCP executes queries as the actual OAuth user (via the X-Trino-User header) rather than the service account.
Benefits:
✅ Audit trails - Queries show actual user names in Trino logs
✅ Access control - Trino enforces user-specific permissions
✅ Static credentials - MCP uses one service account for all connections
✅ Security - OAuth user identity propagated securely via validated JWT tokens
Quick Start
1. Enable in MCP
export TRINO_ENABLE_IMPERSONATION=true
# Optional: Choose which JWT field to use (default: username)
export TRINO_IMPERSONATION_FIELD=email # Options: username, email, subject2. Configure Trino Access Control
Create /etc/trino/access-control.json:
Create /etc/trino/access-control.properties:
3. Restart Services
How It Works
Configuration
Query Source Attribution
By default, mcp-trino always identifies itself to Trino via the X-Trino-Source header as mcp-trino/<version>. This enables proper query attribution and monitoring in Trino.
Why this matters:
Query attribution in Trino logs and metrics
Identify which application generated queries
Debug and monitor query patterns by source
Similar to how DB clients like DBeaver identify themselves
Principal Field Selection
By default, the preferred_username JWT claim is used. You can configure which field to use:
username
preferred_username
Username from identity provider (default)
alice
subject
sub
Unique subject identifier
user-123-abc
Example: If your JWT contains:
Then:
TRINO_IMPERSONATION_FIELD=username→ Trino sees user asaliceTRINO_IMPERSONATION_FIELD=email→ Trino sees user as[email protected]TRINO_IMPERSONATION_FIELD=subject→ Trino sees user asauth0|5f8b3c4d2e1a6c0071234567
Choosing the Right Field
Use email (recommended):
Human-readable in audit logs
Matches directory services (LDAP/AD)
Works with most OAuth providers
Unique and stable
Use username:
Short names in logs
Match Unix/Linux usernames
Compatibility with existing Trino users
Note: Some OAuth providers don't include this claim
Use subject:
Maximum stability (never changes)
Works with all providers
Highest security (unique per user)
Note: Usually not human-readable
Provider-Specific Notes
Okta:
Recommendation: Use email field.
Google:
Note: No preferred_username claim. Use email field.
Azure AD:
Recommendation: Use email field.
Trino Access Control
Basic Configuration
Allow the MCP service account to impersonate any user:
Restrictive Configuration
Deny impersonation of admin users:
User Mapping
Transform usernames before Trino uses them:
Strip domain from email:
This maps [email protected] → alice in Trino.
Extract username from Auth0 subject:
This maps auth0|alice-123 → alice-123 in Trino.
Complete Setup Example
Trino access control (/etc/trino/access-control.json):
Verification
Check MCP Logs
Look for:
Check Trino Logs
Queries should show actual users:
Instead of:
Troubleshooting
Impersonation Fails
Error: "Access Denied: Cannot impersonate user"
Solution: Verify:
TRINO_ENABLE_IMPERSONATION=trueis setTrino access control allows service account to impersonate users
Target username exists or matches allowed patterns
User Not Found in Context
Error: No impersonation occurs, queries run as service account
Solution: Verify:
OAuth is enabled (
OAUTH_ENABLED=true)JWT tokens are being properly validated
The username field is present in JWT claims
Missing JWT Claim
Error: "Missing preferred_username in token"
Solution: Your OAuth provider doesn't include this claim. Use email or subject:
Access Denied in Trino
Error: "Access Denied: User not found"
Solution: The username format doesn't match Trino's expected format. Either:
Configure user mapping in Trino (recommended)
Change the impersonation field
Update Trino user definitions
Empty Principal
Error: No username is extracted
Solution: The configured field is not present in the JWT. Check your JWT claims and switch to an available field.
Security Considerations
Impersonation Rules: Trino access control must explicitly allow the service account to impersonate users
OAuth Validation: Only validated OAuth tokens can trigger impersonation
Username Extraction: Usernames extracted from validated JWT claims only
Header Security:
X-Trino-Userheader only added when impersonation is enabled and user is authenticatedAudit Trail: All impersonation attempts logged at INFO level
Implementation Details
Architecture
The impersonation feature consists of three main components:
Configuration - Reads
TRINO_ENABLE_IMPERSONATIONandTRINO_IMPERSONATION_FIELDHTTP Round Tripper - Intercepts HTTP requests to Trino and adds
X-Trino-UserheaderMCP Handlers - Extracts OAuth user and adds to query context
Request Flow
Context Management
User information flows through Go contexts:
Related Documentation
OAuth Configuration - OAuth provider setup
Deployment Guide - Production deployment
Trino Access Control - Trino documentation
Trino Impersonation - Impersonation rules
Last updated
Was this helpful?