nao Enterprise can pass each end user’s identity through to the warehouse, so queries run as the user asking them instead of as a single shared service account. This unlocks native row-level security (RLS) policies you’ve already configured on the warehouse - the agent inherits those policies automatically, with no nao-side rule duplication. Today this is supported on Amazon Redshift via Microsoft Entra ID. Other warehouses can be added on request.Documentation Index
Fetch the complete documentation index at: https://docs.getnao.io/llms.txt
Use this file to discover all available pages before exploring further.
Why per-user identity matters
When nao runs queries with one shared connection, every user sees the same rows: the warehouse can’t tell them apart. That’s fine for analytics agents inside a small team, but it doesn’t fit organizations that already enforce RLS or column-level security at the warehouse layer (sales reps see only their accounts, finance sees only their region, etc.). With per-user identity:- Each chat message is executed against the warehouse using the asking user’s access token.
- Redshift identifies the user and applies whatever native policies you’ve defined (RLS, column masking, role-based grants).
- nao does not need a parallel rules system - the warehouse stays the source of truth for who can see what.
Redshift row-level security via Entra ID
Use this when your Redshift cluster is configured to authenticate end users via Microsoft Entra ID (federated single sign-on).Prerequisites
- Microsoft SSO is configured for your nao deployment (see Authentication).
- Your Redshift cluster is set up with Microsoft Entra ID federation and your Azure app registration includes the Redshift scope.
- Your RLS policies are already defined on the Redshift side (Redshift’s native row-level security feature).
Configure the connection
Innao_config.yaml, set auth_mode: azure_entra_id on the Redshift database:
password(default) - traditional service-account auth. All queries run as the same Redshift user.azure_entra_id- per-user identity. Sync-time queries (metadata, previews, query history) use the optionaluser/passwordif provided. Runtime queries from the chat agent always flow through the end user’s Azure access token.
How it works
- The user signs in to nao with Microsoft SSO (Entra ID).
- nao stores the user’s encrypted refresh token.
- When the agent runs a query, nao silently exchanges the refresh token for an Azure access token scoped to your Redshift API.
- The query is sent to Redshift over the IAM-federated connection with that token.
- Redshift identifies the user and enforces its native RLS policies.
Verifying it works
- Sign in as a user with restricted access.
- Ask the agent a question that should hit RLS-protected data.
- The query result should reflect the user’s policy. Cross-check with the same query run directly against Redshift as that user.
- Sign in as a user with broader access and confirm the result set widens accordingly.
The sync-time
user/password credentials in azure_entra_id mode are never used at runtime - they only exist so nao sync can read schema metadata and query history. If your security policy forbids any service-account access, leave them unset and provide warehouse metadata through another sync source.