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, subject

2. 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:

Field
JWT Claim
Description
Example

username

preferred_username

Username from identity provider (default)

alice

email

email

Email address

subject

sub

Unique subject identifier

user-123-abc

Example: If your JWT contains:

Then:

  • TRINO_IMPERSONATION_FIELD=username → Trino sees user as alice

  • TRINO_IMPERSONATION_FIELD=email → Trino sees user as [email protected]

  • TRINO_IMPERSONATION_FIELD=subject → Trino sees user as auth0|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-123alice-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:

  1. TRINO_ENABLE_IMPERSONATION=true is set

  2. Trino access control allows service account to impersonate users

  3. Target username exists or matches allowed patterns

User Not Found in Context

Error: No impersonation occurs, queries run as service account

Solution: Verify:

  1. OAuth is enabled (OAUTH_ENABLED=true)

  2. JWT tokens are being properly validated

  3. 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:

  1. Configure user mapping in Trino (recommended)

  2. Change the impersonation field

  3. 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

  1. Impersonation Rules: Trino access control must explicitly allow the service account to impersonate users

  2. OAuth Validation: Only validated OAuth tokens can trigger impersonation

  3. Username Extraction: Usernames extracted from validated JWT claims only

  4. Header Security: X-Trino-User header only added when impersonation is enabled and user is authenticated

  5. Audit Trail: All impersonation attempts logged at INFO level

Implementation Details

Architecture

The impersonation feature consists of three main components:

  1. Configuration - Reads TRINO_ENABLE_IMPERSONATION and TRINO_IMPERSONATION_FIELD

  2. HTTP Round Tripper - Intercepts HTTP requests to Trino and adds X-Trino-User header

  3. MCP Handlers - Extracts OAuth user and adds to query context

Request Flow

Context Management

User information flows through Go contexts:

Last updated

Was this helpful?