Skip to content
tempkey ← Back to blog

Tempkey Blog

Snowflake Access Management for Contractors: Who Can Read Your Data, and for How Long?

Learn how to give contractors scoped Snowflake access, keep it time-boxed, and prove it was removed — without handing out shared logins or permanent roles.

Effective snowflake access management for contractors requires establishing precise database boundaries, enforcing time-boxed credentials, and verifying that privileges vanish the day a contract concludes. When outside data analysts, dbt specialists, or third-party engineering agencies join your project, managing external data access demands a clear separation between internal identity lifecycle workflows and external role grants inside your data warehouse.

Most organizations stumble not on day one, but on day sixty. A contractor is hired to optimize data models or build dashboards. They receive direct privileges, execute their scope of work, and submit their final invoice. Weeks later, their credentials remain active because Snowflake has no internal calendar mechanism to expire a role assignment automatically. Left unmonitored, external access accumulates silently, expanding your attack surface and complicating compliance reviews.

This guide breaks down how Snowflake's access model operates for external workers, where contractor permissions routinely leak, how to design time-boxed grants, and how to verify complete offboarding with auditable proof.

How Snowflake access actually works for an outside user

Snowflake does not grant permissions directly to individuals. Instead, access operates through a strict multi-layered hierarchy: a user account is assigned one or more roles, a role is granted specific privileges on warehouse compute resources, and that same role receives defined rights over database and schema objects. For a contractor to execute a single query, every layer of this chain must align properly.

According to Snowflake's access control documentation, privileges attach strictly to roles, and roles are granted to users or other roles. This architecture underpins snowflake role-based access control (RBAC). In practice, an outside contributor should always receive a discrete, dedicated role tailored to their statement of work, rather than inheriting a shared team role.

Administrative roles represent a major vulnerability when onboarding external teams. Standard system-defined roles such as SECURITYADMIN or ACCOUNTADMIN should remain off-limits to external personnel. Granting ACCOUNTADMIN to an outside agency—often done as a shortcut to bypass privilege errors during pipeline setups—gives an external entity total control over your billing, user provisioning, and warehouse configuration. Reviewing your active grant logs to catch administrative roles assigned to non-employees is an essential security baseline.

When selecting authentication options for contractors, three patterns predominate:

  • Username and Password with MFA: Best for human operators logging into the Snowsight interface to build dashboards or run manual audits. Snowflake allows administrators to mandate multi-factor authentication per user, as detailed in the Snowflake MFA documentation.
  • Key-Pair Authentication: Standard for external engineers running client-side transformation tools such as dbt Core or headless ingestion scripts. This bypasses browser-based MFA while maintaining cryptographic integrity.
  • Federated SSO: Used when your organization provisions external identities within your primary corporate identity provider, allowing centralized credential deactivation.

For a typical analytics contractor, avoid broad grants. The minimum necessary footprint consists of:

  1. Usage privilege on a single, cost-capped virtual warehouse (for example, TRANSFORM_WH_XS).
  2. Usage privilege on the specific database and target schema.
  3. Read-only (SELECT) access to curated reporting views rather than raw ingestion tables containing personally identifiable information (PII).

Where contractor access leaks in Snowflake

Access leakage in modern warehouses rarely stems from sophisticated exploits. It is almost often the result of administrative drift and compounding operational oversights. When managing contractors, five specific leak paths routinely undermine security postures:

1. Role Reuse

When an agency developer departs, teams often hand their existing Snowflake role to a arrived freelancer to save setup time. This practice destroys auditability. If an incident occurs, tracking query logs back to a single human becomes impossible, and historical role grants become hopelessly muddled with obsolete permissions.

2. Role Hierarchy Inheritance

As documented in the Snowflake access control considerations guide, role hierarchy and inheritance can quietly widen effective privileges beyond the directly granted role. Granting a contractor role to a parent operational role can inadvertently pass along warehouse administration, stage read-write access, or unmasked table access that was never intended for an external contractor.

3. Forgotten Secondary Grants

Contractors often request ad-hoc access during a project: temporary rights to an external cloud stage, permission to trigger an ingestion task, or ownership of a transient table. While administrators might revoke the primary role at the end of the contract, these secondary grants often linger unnoticed.

4. Shared Credentials

Distributing generic service credentials (such as ANALYTICS_STAGING_USER) among multiple agency contractors eliminates personal attribution within Snowflake's query history. If five contractors use the same credentials, identifying who downloaded an extract or executed a destructive drop statement requires external detective work rather than a direct metadata query.

5. Unmanaged Secure Data Shares

When employing snowflake secure data sharing, external access bypasses standard user account controls entirely. If an organization provisions a direct share to an agency's Snowflake account, dropping the contractor's user account inside your own environment does nothing to sever their data pipeline. The share grant remains active until explicitly revoked at the database level.

Stale Grant Detection Query

To identify unmanaged or lingering contractor grants across your account, query the system metadata views provided in your account usage schema, as outlined in the Snowflake ACCOUNT_USAGE documentation:

-- Find users marked as contractors who have logged in recently
SELECT 
    u.name AS user_name,
    u.created_on,
    u.last_success_login,
    r.role_name
FROM snowflake.account_usage.users u
LEFT JOIN snowflake.account_usage.grants_to_users r 
    ON u.name = r.grantee_name 
    AND r.deleted_on IS NULL
WHERE u.name LIKE '%CTR_%' 
   OR u.comment LIKE '%Contractor%'
   AND u.deleted_on IS NULL;

Design the grant around the engagement, not the person

Access control should mirror the operational bounds of a commercial agreement. When structuring permissions, establish the expiration date before selecting object privileges. A four-week database indexing contract requires an entirely different security boundary than an ongoing fractional data engineering retainer.

Name every contractor role descriptively to communicate its scope and scheduled end date directly to anyone auditing the account. Use explicit naming conventions, such as ROLE_CTR_TRANSFORM_2026Q4. If an operator spots this role in January 2027, the naming convention immediately indicates that the grant has outlived its authorization.

To mitigate financial exposure from unoptimized queries or runaway Cartesian joins written by external users, warehouse-level parameters must be enforced:

  • Warehouse Sizing: Assign contractors to an isolated, right-sized warehouse (typically X-Small or Small) separated from core production pipelines.
  • Statement Timeouts: Apply the STATEMENT_TIMEOUT_IN_SECONDS parameter to the contractor's warehouse or user profile to automatically kill queries running longer than 15 or 30 minutes.
  • Auto-Suspend: Set aggressive auto-suspend triggers (such as 60 seconds) on dedicated external warehouses to prevent idle compute billing.

often document the baseline grant in an internal runbook or configuration repository. Capture who approved the grant, which specific tables or schemas were shared, the commercial rationale, and the scheduled contract termination date.

Managing external data access without shared credentials

To maintain verifiable operational security, every external contributor must authenticate through an individual, trackable identity. When external users share credentials, password rotation disrupts the entire team, and forensic auditing becomes ineffective.

For contractors conducting programmatic work—such as deploying analytics engineering models—configure key-pair authentication. As detailed in Snowflake's key-pair documentation, this architecture requires at least a 2048-bit RSA key pair. The contractor generates the key pair locally, sends the public key to your operations team, and keeps the private key protected on their machine. At the end of the engagement, removing the public key from the user object immediately severs access without altering global connection strings.

Use the following criteria to determine the appropriate authentication mechanism for your contractors:

Authentication Method Ideal Contractor Persona Primary Security Advantage Operational Overhead
Password + MFA Fractional BI analysts, ad-hoc query reviewers Enforces secondary physical device verification Requires initial Duo enrollment coordination
Key-Pair Authentication dbt developers, pipeline migration engineers No interactive credentials stored in code Requires manual key rotation at contract completion
Corporate SSO Federation Long-term embedded agencies Centralized offboarding via identity provider Requires creating external accounts in corporate directory

While Snowflake enforces authentication configurations and object privileges reliably, it does not provide native lifecycle scheduling to automatically revoke roles on a specific calendar date. Operations managers must build internal cron mechanisms or utilize external access management tooling to handle scheduled expirations across their broader software stack.

Snowflake secure data sharing with contractors

When collaborating with specialized analytics firms or agencies that operate their own Snowflake environments, provisioning user accounts in your account may be counterproductive. Instead, snowflake secure data sharing provides an architectural alternative that prevents role sprawl.

Under this model, as outlined in the Snowflake secure data sharing documentation, your organization acts as a data provider, granting privileges on specific databases, schemas, or secure views directly to an external consumer account. The contractor then mounts that share as a read-only database in their own warehouse. No external users exist inside your account, and no compute resources from your bill are consumed when the contractor queries the shared data.

However, secure data sharing introduces a distinct administrative challenge: access lives entirely outside your standard user directory. If an operations manager deprovisions a contractor's communication channels, their data share remains fully accessible unless revoked explicitly in SQL. Deprovisioning a secure share requires dropping the recipient's account privilege directly:

-- Revoke access to a shared dataset from an external contractor account
REVOKE USAGE ON DATABASE share_analytics_db FROM SHARE contractor_analytics_share;
ALTER SHARE contractor_analytics_share REMOVE ACCOUNTS = xy12345.us-east-1;

Confirm the revocation by verifying that the external account identifier is no longer bound to the share object. If the agency used a reader account that you funded, remember to suspend or delete the reader account to halt lingering compute expenses.

Verify the removal, then write it down

Offboarding is not complete when a task is checked off in a project board. Real verification requires querying provider state back directly to confirm that permissions have cleared from the data plane. In Snowflake, this means inspecting metadata catalogs to verify that the user is disabled, their session tokens are revoked, and their custom roles have been dropped.

Execute this audit script against your metadata views to confirm removal:

-- Confirm user is disabled and has no active role associations
SELECT 
    name, 
    disabled, 
    last_success_login 
FROM snowflake.account_usage.users 
WHERE name = 'CTR_JSMITH';

-- Verify no object grants remain attached to the contractor role
SHOW GRANTS TO ROLE ROLE_CTR_TRANSFORM_2026Q4;

Maintaining a clear paper trail is essential for passing client security questionnaires and compliance checks. You need an exportable record documenting who authorized the grant, when access began, what scopes were approved, when it expired, and who validated the removal. Storing these logs externally ensures that historic operational records remain intact even if internal users are deleted.

When orchestrating permissions across a distributed company environment, automated tools simplify credential lifecycles. Tempkey grants contractor access for a set period, revokes it automatically when the grant expires, reads provider state back to confirm the removal on natively enforced providers, and records each step in an exportable audit trail.

It is important to understand specific tool integrations. Tempkey natively enforces access on 10 providers — Slack, Google Workspace, Microsoft 365, GitHub, GitLab, Zoom, AWS IAM, Figma, Dropbox, and Asana. Notion and Trello are limited-native (tracked, not fully enforced) and Zapier/Make are best-effort webhook bridges without automated verification. Automatic Slack deactivation uses Slack's SCIM API, which Slack offers on its Business+ and Enterprise plans. On other Slack plans, Tempkey verifies that access was removed rather than removing it.

Because Snowflake is not one of those 10 natively enforced providers, operations managers should pair automated platform deprovisioning with an internal runbook script for their data warehouse. Furthermore, Tempkey gives you an exportable, append-only audit trail to support your own compliance and offboarding records. Tempkey does not hold SOC 2, ISO 27001, HIPAA, or PCI certification.

For organizations building custom orchestrations, developers can review the Tempkey API documentation and inspect the OpenAPI reference at api.tempkey.io/openapi.json to align access grants with external workflow triggers. Provider admin tokens are write-only in the browser and encrypted at rest using AWS KMS in production; they are never displayed again after submission.

A repeatable offboarding sequence for a Snowflake contractor

To avoid missed steps, run this repeatable deprovisioning runbook whenever a contractor concludes an engagement:

  1. Freeze the User Account: Immediately lock the account to block new interactive logins or token exchanges:
    ALTER USER CTR_JSMITH SET DISABLED = TRUE;
  2. Abort Active Queries and Drop Sessions: Terminate any ongoing queries running under the user's warehouses:
    SELECT SYSTEM$ABORT_USER_QUERIES('CTR_JSMITH');
  3. Revoke Assigned Roles: Disconnect the contractor from all functional roles:
    REVOKE ROLE ROLE_CTR_TRANSFORM_2026Q4 FROM USER CTR_JSMITH;
  4. Sever Secure Data Shares: If the engagement relied on account-level shares, explicitly remove the external account from the share metadata.
  5. Rotate Programmatic Credentials: Clear RSA public keys from automated service identities to prevent unauthorized API calls:
    ALTER USER CTR_JSMITH UNSET RSA_PUBLIC_KEY;
  6. Verify and Archive: Query snowflake.account_usage.grants_to_users to confirm zero remaining grants, then export your access logs for operational records.

What to do when the engagement gets extended

Scope creep is the most common cause of access creep. When an initial six-week engagement extends into a multi-quarter collaboration, teams often extend access indefinitely without reassessing initial boundaries. Treat an extension as an explicit re-authorization event rather than an informal administrative continuation.

First, re-scope the role's permissions. An external engineer hired to establish schema foundations rarely requires write privileges to those tables during a maintenance extension. Downgrade their access to read-only views where appropriate.

Second, ensure every extension is recorded as a discrete event within your audit log. Avoid simply overwriting calendar deadlines in internal tickets. Keeping distinct records of original grants alongside timestamped extensions ensures transparency if your data operations are reviewed by external auditors.

If you are managing contractor lifecycles using structured tools, monitor your active provisioning thresholds. Plans are month-to-month (Free / $39 Team / $99 Business) with active-grant limits of 2 / 10 / 30. Business includes extended audit-history retention. For operations leaders tracking privacy guidelines across platforms, review the Tempkey privacy policy to understand how administrative metadata is retained.

Conclusion: the grant is the easy part

Granting permissions in Snowflake takes seconds. Ensuring that external users cannot read your production tables once their contract finishes requires deliberate operational rigor. Snowflake gives teams granular role-based access control, but the responsibility for enforcing expirations, verifying revocation, and documenting the lifecycle falls on internal operators.

Protect your data warehouse by adhering to three core practices: enforce separate identities with strict MFA for every external user, build isolated roles bounded by clear project timeframes, and query provider state back directly to confirm that access has been removed.

Audit your current contractor list this week: pull every Snowflake role and share grant tied to an outside person, confirm each has a named end date, and export the record. If you want that expiry-and-verification loop handled alongside Slack, GitHub, and AWS, start a free Tempkey plan and connect your first provider.

Frequently Asked Questions

How can operations users update snowflake data without direct warehouse credentials?

Operations teams can allow external workers or non-technical operators to interact with Snowflake datasets by using reverse-ETL platforms or dedicated internal workflow tooling that writes through predefined, validated API endpoints. Alternatively, administrators can grant access to staging-only tables where outside updates are reviewed and merged into production using automated pipeline tasks, preventing contractors from executing unrestricted UPDATE or DELETE queries directly on core database tables.

How do I give a contractor read-only access to specific Snowflake tables?

To grant read-only access to select tables, create a dedicated custom role rather than reusing existing team profiles. Grant the role USAGE on the database and schema, followed by SELECT privileges on the specific target tables or views. Ensure the contractor does not inherit broader parent roles through role inheritance, and bind that role to a warehouse restricted by strict statement timeouts.

Does Snowflake automatically expire a contractor's role on a set date?

No. Snowflake does not have a native calendar scheduling feature to automatically expire or drop role assignments on a predetermined calendar date. Once a role or privilege is granted, it remains active indefinitely until an administrator explicitly revokes it via SQL commands or drops the underlying user object. Teams must schedule manual offboarding tasks or use external lifecycle automation platforms to enforce calendar-based expiration.

What is the difference between a Snowflake role grant and a secure data share for contractor access?

A role grant operates inside your own Snowflake account, assigning database object privileges to an internal user identity who executes queries using your compute warehouses. A secure data share exposes specific database objects directly to an external Snowflake account owned by the contractor. With secure data shares, the contractor uses their own warehouse compute resources to query the shared data, and your account does not maintain individual user logins for their personnel.

How do I confirm a contractor's Snowflake access was actually removed?

Do not rely solely on closed offboarding tickets. Confirm removal by directly querying Snowflake's metadata views. Run SHOW GRANTS TO USER <username> to verify that no functional roles remain mapped to their profile. Inspect snowflake.account_usage.users to confirm the user object is set to DISABLED = TRUE, and query your share configurations to ensure external consumer accounts have been stripped of database access.