Best practices for migration from single-factor authentication

This section provides best practices for customers on how to leverage Snowflake capabilities to enforce strong authentication and mitigate the risks of credential theft. Use this information in conjunction with Planning for the deprecation of single-factor password sign-ins, which highlights the latest Snowflake strategies for moving away from password-only authentication.

The sample queries in this guide are examples to help Snowflake customers and are not meant to be implemented in production environments.

Introduction

As mentioned in this article, Snowflake focuses on three key pillars that make it easier to keep your accounts secure:

  • Prompt: Encourage users who are not using security best practices to adopt them (for example, configure multi-factor authentication (MFA).

  • Enforce: Make it easy for admins to enforce security by default (for example, require all human users to use MFA).

  • Monitor: Provide visibility into adherence to security policies (for example, audit which users haven’t configured MFA).

The following information focuses mainly on best practices for monitoring by using the Snowflake Trust Center, and enforcement steps that leverage authentication and network policies.

Snowflake connection session lifecycle

Connections to Snowflake start with drivers, connectors, or Snowsight, as shown in the following diagram:

Ways to connect to Snowflake securely

When a user or a service connects to Snowflake, the following happens:

  • If configured, the network policy applies. Keep in mind that user-level network policies override account-level network policies.

  • If configured, the authentication policy applies. Keep in mind that user-level authentication policies override account-level authentication policies.

    If a user or service uses Snowflake-native password authentication, the password policy applies if configured.

  • If the user or service is allowed and authorized by the above controls, the session policies apply to control how a user reauthenticates after an inactivity period. User-level session policies override account-level session policies.

Network and authentication policies: General guidelines

Consider the following guidelines in all cases. For more information, see Phase 3: Protection.

Snowflake strongly recommends configuring and applying:

  • User TYPE attribute to differentiate between PERSON (human), SERVICE, and LEGACY_SERVICE.

    • PERSON: For interactive authentication via human users where MFA will be enforced. By default, at the time of this writing, it is NULL, which is treated from the MFA enforcement perspective as PERSON.

    • SERVICE: For service-to-service authentication that uses programmatic access. This will be exempted from MFA enforcement, but those users will not support password authentication any more. Those users will support either OAuth or key-pair only.

    • LEGACY_SERVICE: This is the only user type that supports password-only authentication (exempted from MFA enforcement). It is meant only as a migration tool, and customers must protect those users with network policies and monitor them with leaked password protection capabilities.

      Note

      LEGACY_SERVICE should be used as a migration tool and will be deprecated in November 2025.

  • SCIM for automatic provisioning and setting user type via customer attributes

  • Network policies to make sure your users and services are coming from only authorized and trusted sources whenever that is possible.

  • Authentication policies to enforce strong authentication methods that leverage short-lived credentials like OAuth and SAML.

  • Password policies to enforce the organization’s password policies.

  • Session policies to limit idle session times.

For service users, customers are encouraged to use short-lived credentials, such as OAuth, whenever possible. For longer-term credentials, such as key-pairs, customers are advised to rotate those keys regularly and combine them with network policies whenever possible.

For human interactive users, customers should integrate their Snowflake accounts with their organization-wide identity providers, leveraging their own SAML-federated authentication with their own identity provider, and with their own MFA.

For break-glass use cases and customers using native passwords, Snowflake highly recommends using Snowflake native MFA for those break-glass users.

Customers should rotate their credentials regularly, according to their internal security policies.

Customers should always use the Trust Center to monitor their risky users and integrate their Snowflake accounts with their organization’s security operation center.

Snowflake North Star for stronger authentication

In 2025, Snowflake will support additional capabilities to help customers.

In the first half of 2025

  • Improve our native MFA support to go beyond DUO only toward supporting passkey and Authenticator apps (in private preview targeting General Availability around the end of April 2025).

  • Native OAuth support in our drivers and connectors to simplify OAuth configuration and adoption.

  • Trust center new capabilities, such as:

    • Email notifications (public preview is targeted for end of April 2025).

    • Extensions with our partners and custom scanner packages (in private preview now, targeting General Availability around the end of July 2025).

    • Trust Center at the customer organization level (in private preview for end of April 2025).

Later in 2025

  • Enhance the Trust Center to use machine-learning anomaly detection.

  • Improve user experience with SAML, OAuth with Snowsight.

  • Support workload identity and OIDC where customers can use native CSP identities such as Azure managed identity, AWS roles, and GCP service accounts to connect their workloads to Snowflake easily without credentials.

  • Support mTLS in both directions, inbound to Snowflake and outbound from Snowflake, to the customer’s resources that support mTLS.

Snowflake reserves the right to update and change the above list and timelines as the company sees fit; we will share more details in the future.

Best practices for enforcing authentication and network policies

Snowflake recommends following these four steps for migrating toward a stronger authentication posture:

  1. Detect the risky users.

  2. Plan your migration to minimize the disruption.

  3. Protect your users in Snowflake.

  4. Continuously monitor for risky users.

Four phases of migration to MFA

Phase 1: Detect

Snowflake introduced two main capabilities:

  • Threat Intelligence scanner package: This scanner identifies the risky users based on the logic in the next diagram. This section also includes a sample query to list the risky users and explain why they are risky.

  • Leaked password protection: This will verify and automatically disable user passwords discovered on the dark web. This provides built-in protection against leaked passwords and helps limit the potential for data exfiltration. Compromised users can contact account administrators to reset their passwords.

Customers should turn on the threat intelligence scanner and customize the scanning frequency. In general, this scanner should run once a week to report on the current riskys user posture. The findings from all trust scanners are stored in the SNOWFLAKE.TRUST_CENTER schema. Customers can leverage Snowflake native alerting to automatically notify the security admins or even take action in case a risky user is detected.

Evaluation logic for healthy users

Evaluation logic for healthy users

Sample queries for lists of risky users

The following query lists the latest risky users and why they are risky:

SELECT DISTINCT
  f.value:entity_id::VARCHAR AS entity_id,
  f.value:entity_name::VARCHAR AS entity_name,
  f.value:entity_detail:user_type::VARCHAR as user_type,
  f.value:entity_detail:has_password::VARCHAR as has_password,
  f.value:entity_detail:has_rsa_public_key::VARCHAR as has_rsa_public_key,
  f.value:entity_detail:mfa_enabled::VARCHAR as mfa_enabled,
  f.value:entity_detail:account_auth_policy_name::VARCHAR as Account_level_Auth_policy,
  f.value:entity_detail:account_auth_policy_requires_mfa::VARCHAR as Account_level_EnforceMFA_policy,
  f.value:entity_detail:user_auth_policy_name::VARCHAR as User_level_Auth_policy,
  f.value:entity_detail:user_auth_policy_requires_mfa::VARCHAR as User_level_EnforceMFA_policy,
  f.value:entity_detail:account_network_policy_name::VARCHAR as Account_level_Net_policy_Name,
  f.value:entity_detail:account_network_policy_Allowlist::VARCHAR as Account_level_Net_policy_Allowlist,
  f.value:entity_detail:user_network_policy_name::VARCHAR as User_level_Net_policy_Name,
  f.value:entity_detail:user_network_policy_allowlist::VARCHAR as User_level_Net_policy_Allowlist,
FROM SNOWFLAKE.TRUST_CENTER.FINDINGS,
  LATERAL FLATTEN(input => at_risk_entities) AS f
WHERE EVENT_ID =
  (SELECT event_id FROM snowflake.trust_center.findings WHERE SCANNER_PACKAGE_NAME = 'Threat Intelligence'
   ORDER BY event_id DESC LIMIT 1);
Copy

Snowflake recently added two new scanners: one for person users and one for service users. This allows customers to have separate lists of users using single-factor password sign-on, depending on the user type.

You can return a list of risky users for each type.

List of risky human users
SELECT *
  FROM SNOWFLAKE.TRUST_CENTER.FINDINGS
  WHERE event_id =
    (SELECT event_id FROM SNOWFLAKE.TRUST_CENTER.FINDINGS
    WHERE scanner_id = 'THREAT_INTELLIGENCE_NON_MFA_PERSON_USERS'
    ORDER BY event_id DESC LIMIT 1) AND total_at_risk_count != 0
;
Copy
List of risky service users
SELECT *
  FROM SNOWFLAKE.TRUST_CENTER.FINDINGS
  WHERE event_id =
    (SELECT event_id FROM SNOWFLAKE.TRUST_CENTER.FINDINGS
    WHERE scanner_id = 'THREAT_INTELLIGENCE_PASSWORD_SERVICE_USERS'
    ORDER BY event_id DESC LIMIT 1 ) and total_at_risk_count != 0
;
Copy

User distribution across TYPE and authentication method used

In addition to the previous query, it is beneficial to list user distribution across user types and used authentication methods. This helps customers strategize on user migration to stronger authentication methods such as SAML and OAuth. For instance, if a user is showing as risky (because they have a password in Snowflake) but that user is only using SAML authentication, it is advisable to remove that password from Snowflake as soon as possible.

WITH users AS (
  SELECT DISTINCT
       user_id
      , name
      , login_name
      , type
      , email
  FROM
      SNOWFLAKE.ACCOUNT_USAGE.USERS
  WHERE
      DELETED_ON IS NULL)
SELECT
    u.user_id
    , a.event_timestamp
    , a.user_name
    , u.type
    , a.reported_client_type
    , a.first_authentication_factor
    , a.second_authentication_factor
  FROM SNOWFLAKE.ACCOUNT_USAGE.LOGIN_HISTORY AS a
    JOIN USERS u ON a.user_name = u.name
;
Copy

Phase 2: Migration planning

Migration planning starts with Phase 1: Detect. After identifying the risky users, start planning to follow the Network and authentication policies: General guidelines. You should move away from static credentials such as passwords, and key-pair whenever possible, and leverage single sign-on (federated authentication), such as SAML for interactive users, and OAuth for both programmatic (SERVICE) and interactive (PERSON) users.

If you are forced to use static credentials (key-pair or passwords) to support some legacy applications, consider the following in your planning:

  • Leverage network policies when possible.

  • Rotate those static credentials based on your organization’s policies.

Migration considerations

Here are a few considerations to keep in mind when you plan your migration:

  • First, set user types (this can be automated via SCIM).

  • Second, check what authentication methods your applications support: Snowflake supports a variety of authentication methods, such as OAuth, SAML, key-pair, MFA, and so on. However, the application that connects to Snowflake also needs to support strong authentication methods. There are two use cases:

    • The app already supports SAML and/or OAuth. You are encouraged to migrate to that authentication as soon as possible.

    • The app is legacy and does not support strong authentication methods such as SAML or OAuth; it supports passwords only. In this case, you are advised to update your legacy application. In the meantime, you can leverage network policies, password rotation, and leaked password protection features until you update their application.

  • Next, customers should consider the following for local users (created manually in Snowflake who are not SAML or OAuth enabled):

    • For an application that supports SSO, switch the local user to SSO-enabled users and consider downtime when switching users.

    • To switch local users to SSO-enabled, make sure such users exist in your IdP and then sre provisioned in Snowflake manually, or preferably automatically, via SCIM.

    • Disable unused local users.

  • Snowflake supports authentication policies, network policies, and password policies at both the user level and account level. Consider user-level policies first to migrate gradually (user-level policies take priority over account-level policies):

    • Snowflake recommends user-level network policies for applications that use service users (TYPE = SERVICE or LEGACY_SERVICE).

    • For human users (TYPE = PERSON or NULL), you can start with user-level network policies and then apply network policies at the account level to protect all user populations that do not have user-level-specific policies.

    • The same concept with MFA policies starts with user-level policies first.

  • If you have a legacy application that does not support single sign-on, Snowflake recommends leveraging programmatic access tokens (PATs), which by default are tied to specific roles, require a network policy, and are time-bound.

Phase 3: Protection

The following diagram helps you to navigate through the recommended authentication best practices. As you can see, Snowflake always recommends using federated authentication and authorization first.

Authentication best practices

Please follow these steps to mitigate the risk of Snowflake account compromise:

  1. Set user type.

  2. Remove local passwords when they are not needed.

  3. Create authentication policies for service users.

  4. Create authentication policies to enforce MFA on human users.

  5. Create password policy.

  6. Create session policy.

  7. Create network policies for service users.

  8. Create network policies at the account level.

  9. Protect service users.

  10. Apply password and session policies at the account level.

  11. Test service users.

  12. Protect the account with MFA enforcement.

  13. Apply account-level network policies.

  14. Disable unused users.

Set user type

The first step in the protection phase is to set the user types automatically via SCIM or manually:

ALTER USER svc_user1 SET TYPE = SERVICE;
ALTER USER user1@example.COM SET TYPE = PERSON;
-- LEGACY APPLICATION ONLY
Copy

In addition, you can now set the admin user type when they create an account:

CREATE ACCOUNT <name> [ ADMIN_USER_TYPE = PERSON | SERVICE | LEGACY_SERVICE | NULL ];
Copy

Tip

Many customers usually have some pattern in their service user names (such as local_svc_user1). You can leverage this naming pattern to set the SERVICE type at scale.

Remove local passwords when they are not needed

Leverage the queries under User Distribution Across TYPE and AuthN Method Used and List of Risky Users, based on trust center findings, to start cleaning any password in Snowflake for a user who is already using SAML, OAuth, or keypair exclusively.

Create authentication policies for service users

Snowflake recommends using OAuth for programmatic service users, and you can enforce that with authentication policies:

CREATE AUTHENTICATION POLICY PROGRAMMATIC_ACCESS_USER_AUTH
  CLIENT_TYPES = ('DRIVERS', 'SNOWSQL')
  AUTHENTICATION_METHODS = ('OAUTH')
  SECURITY_INTEGRATIONS = ('<OAUTH SECURITY INTEGRATIONS>');

ALTER USER <SERVICE_USER> SET AUTHENTICATION POLICY PROGRAMMATIC_ACCESS_USER_AUTH;
Copy

Customers can still use keypair for authentication with SERVICE users, but they should combine that with network policies and regularly rotate their keys.

Note

If you have a legacy system that does not support key-pair or OAuth, and you must use a password for authentication, create an additional authentication policy with the authentication method PASSWORD and apply it to that specific programmatic user. Combine that approach with the Network and authentication policies: General guidelines.

Create authentication policies to enforce MFA on human users

Snowflake recommends that customers use their own SAML identity providers (IdPs) with any MFA solution that their IdP supports. The following authentication policy example helps customers to:

  • Enforce Snowflake native MFA for any human users who use Snowflake native passwords.

  • Rely on the customer SAML IdP to enforce MFA for single sign-on users.

CREATE AUTHENTICATION POLICY HUMAN_ACCESS_ACCOUNT_ENFORCE_MFA
  AUTHENTICATION_METHODS = ('SAML', 'PASSWORD')
  SECURITY_INTEGRATIONS = ('<SAML SECURITY INTEGRATIONS>')
  MFA_AUTHENTICATION_METHODS = ('PASSWORD'); -- enforce Snowflake MFA for native passwords only
  MFA_ENROLLMENT = 'REQUIRED';
Copy

Customers should consider a break-glass situation in case the customer IdP is offline so their account admins can still log in to their Snowflake accounts.

CREATE AUTHENTICATION POLICY ACCOUNTADMIN_BREAKGLASS_MFA
  AUTHENTICATION_METHODS = ('PASSWORD')
  MFA_AUTHENTICATION_METHODS = ('PASSWORD') -- enforce Snowflake MFA for native passwords only
  MFA_ENROLLMENT = 'REQUIRED';
Copy
MFA on SSO

Note

For stricter policies, you can create additional MFA enforcement policies and apply them directly at the user level: for instance, when the customer IdP does not support MFA, to enforce Snowflake MFA on a user regardless of MFA enforcement at the IdP level. (Some customers could use this option for double MFA for highly privileged users, such as account admins.)

CREATE AUTHENTICATION POLICY ACCOUNTADMIN_DOUBLE_MFA
  AUTHENTICATION_METHODS = ('PASSWORD', 'SAML')
  SECURITY_INTEGRATIONS = ('<SAML SECURITY INTEGRATIONS>')
  MFA_AUTHENTICATION_METHODS = ('PASSWORD', 'SAML') -- double MFA
  MFA_ENROLLMENT = 'REQUIRED';
Copy

Create password policy

In case you have a legacy system or a break-glass situation where you must use Snowflake native passwords, please leverage Snowflake password policies to match organization password policies, if they are different from the default policies.

CREATE PASSWORD POLICY password_policy_account
  PASSWORD_MIN_LENGTH = 32
  -- PASSWORD_MAX_LENGTH = <integer>
  PASSWORD_MIN_UPPER_CASE_CHARS = 6
  PASSWORD_MIN_LOWER_CASE_CHARS = 6
  PASSWORD_MIN_NUMERIC_CHARS = 4
  PASSWORD_MIN_SPECIAL_CHARS = 8
  PASSWORD_MIN_AGE_DAYS = 10
  PASSWORD_MAX_AGE_DAYS = 30
  PASSWORD_MAX_RETRIES = 3
  PASSWORD_LOCKOUT_TIME_MINS = 30
  PASSWORD_HISTORY = 24
  COMMENT = '<string_literal>';
Copy

Create session policy

Snowflake recommends that you create session policies to enforce reauthentication after a specific period of inactivity. This is just an example; you can customize policies at the individual user level.

CREATE SESSION POLICY session_policy_account
  SESSION_IDLE_TIMEOUT_MINS = 240 -- Snowflake clients and programmatic clients
  SESSION_UI_IDLE_TIMEOUT_MINS = 20 -- For the Snowflake web interface
  COMMENT = '<string_literal>';
Copy

Create network policies for service users

In general, service or programmatic access users should come from authorized IP addresses (or VPCE ID, LinkID, and so on, in case of private connectivity).

Snowflake recommends creating service user-level network policies to restrict access to those programmatic access users from authorized and trusted sources. Customers should consider enforcing network rules at internal stages as well.

Note

Network rules for internal stages are supported in Snowflake in AWS regions only; for Azure, you may consider blocking public access, and for GCP with service controls, contact Snowflake support.

There are cases where, because of the dynamic nature of the cloud, some cloud providers cannot provide ranges of IP addresses to be listed in Snowflake network policies. For such scenarios, please follow the Network and Authentication Policies General Guidelines. Alternatively, consider private connectivity if your tool supports it.

Connections can come from private or public networks, depending if the customer is using private connectivity or not. Keep in mind that you can allow both public and private connectivity at the same time by adding multiple network rules that include the relevant IPs (public or private) and/or CSP tags (such as VPCE ID, LinkIDs).

-- ACCESS FROM PUBLIC IP ADDRESSES
CREATE NETWORK RULE PROGRAMMATIC_ACCESS_USER_NET_RULE_PUBLIC
  TYPE = IPV4
  VALUE_LIST = ( 'PUBLIC IP1' , 'XX.XX.XX.XX/24' [ , ... ] )
  MODE =  INGRESS
;
-- ACCESS FROM PRIVATE NETWORK
CREATE NETWORK RULE PROGRAMMATIC_ACCESS_USER_NET_RULE_PL
  TYPE = AWSVPCEID
  VALUE_LIST = ( 'VPCE-123ABC3420C1931' , 'VPCE-123ABC3420C1932' )
  MODE =  INGRESS
;
-- RESTRICT ACCESS TO INTERNAL STAGE USING VPCE ID
CREATE NETWORK RULE PROGRAMMATIC_ACCESS_USER_NET_RULE_INTERNAL_STAGE
  TYPE = AWSVPCEID
  VALUE_LIST = ( 'VPCE-123ABC3420C1933' )
  MODE =  INTERNAL_STAGE
;
CREATE NETWORK POLICY PROGRAMMATIC_ACCESS_USER_NET_POLICY
  ALLOWED_NETWORK_RULE_LIST =
    (
     'PROGRAMMATIC_ACCESS_USER_NET_RULE_PUBLIC',
     'PROGRAMMATIC_ACCESS_USER_NET_RULE_PL',
     'PROGRAMMATIC_ACCESS_USER_NET_RULE_INTERNAL_STAGE'
    )
  --BLOCKED_NETWORK_RULE_LIST = ( 'OPTIONAL BLOCKED LIST OF IPS' )
;
Copy

Create network policies at the account level

Account-level policies work as default security network policies for users who do not have network policies applied directly to them. The best practice is to keep these policies as restrictive and as short as possible while using user-level policies to handle specific user needs.

Snowflake does not recommend building huge account-level network policies to satisfy all the organization’s needs; instead, enables user-level policies to have more granular controls.

Similar to user-level network policies, connections can come from private or public networks, depending on whether the customer is using private connectivity. Keep in mind that you can allow both public and private connectivity at the same time by adding multiple network rules that include the relevant IPs (public or private) and/or CSP tags (such as VPCE ID, LinkIDs).

-- ACCESS FROM PUBLIC IP ADDRESSES
CREATE NETWORK RULE HUMAN_ACCESS_ACCOUNT_NET_RULE_PUBLIC
  TYPE = IPV4
  VALUE_LIST = ( 'PUBLIC IP1' , 'XX.XX.XX.XX/24' [ , ... ] )
  MODE =  INGRESS
;
-- ACCESS FROM PRIVATE NETWORK
CREATE NETWORK RULE HUMAN_ACCESS_ACCOUNT_NET_RULE_PL
  TYPE = AWSVPCEID
  VALUE_LIST = ( 'VPCE-123ABC3420C1934' , 'VPCE-123ABC3420C1936' )
  MODE =  INGRESS
;
-- RESTRICT ACCESS TO INTERNAL STAGE USING VPCE ID
CREATE NETWORK RULE HUMAN_ACCESS_ACCOUNT_NET_RULE_INTERNAL_STAGE
  TYPE = AWSVPCEID
  VALUE_LIST = ( 'VPCE-123ABC3420C1937')
  MODE =  INTERNAL_STAGE
;
CREATE NETWORK POLICY ACCOUNT_LEVEL_NET_POLICY
  ALLOWED_NETWORK_RULE_LIST =
   (
    'HUMAN_ACCESS_ACCOUNT_NET_RULE_PUBLIC',
    'HUMAN_ACCESS_ACCOUNT_NET_RULE_PL',
    'HUMAN_ACCESS_ACCOUNT_NET_RULE_INTERNAL_STAGE'
   )
   --BLOCKED_NETWORK_RULE_LIST = ( 'OPTIONAL BLOCKED LIST OF IPS' )
;
Copy

Protect service users

Users with TYPE=SERVICE are exempted from account-level MFA enforcement policies and have restrictions to improve the security posture of noninteractive use cases. Notably, SERVICE-type users cannot log in using a password or SAML SSO. See the caution below.

-- FOR EVERY SERVICE PROGRAMMATIC ACCESS USER
ALTER USER SERVICE_USER_1 SET
TYPE = SERVICE
NETWORK_POLICY = PROGRAMMATIC_ACCESS_USER_NET_POLICY
AUTHENTICATION POLICY = PROGRAMMATIC_ACCESS_USER_AUTH;
Copy
Service users for legacy applications

If you have a legacy application that does not support OAuth, use programmatic access tokens (PATs) instead of using passwords with LEGACY_SERIVCE. (The PAT feature is currently in Private Preview.)

PATs have many restrictions to improve your security: When you generate a PAT, it is tied to specific roles, is time-bound, and tied to a network policy applied to that specific user (account level or user level).

You can copy the PAT and use it in the password field in your legacy application; you do not need to use LEGACY_SERVICE or password-only authentication for such legacy applications.

Caution

Because SERVICE-type users cannot use passwords as an authentication method, for legacy systems that do not support any stronger form of authentication, customers are advised to use a PAT instead.

Note

Keep in mind that LEGACY_SERVICE will be deprecated in November 2025.

Apply password and session policies at the account level

The Snowflake security admin should apply baseline password and session policies at the account level and then override these policies with user-level policies as needed.

ALTER ACCOUNT SET
SESSION POLICY = SESSION_POLICY_ACCOUNT;
PASSWORD POLICY = PASSWORD_POLICY_ACCOUNT;
Copy

Test service users

At this stage, the account has password and session policies applied; the service programmatic users are exempted from MFA; and they have their own specific authentication policies and network policies that make sure the connections are established from trusted sources and use the recommended authentication methods, such as OAuth or key-pair.

The security admin should test a few service users to ensure smooth operations and to confirm that the connections are coming from trusted sources and using the proper authentication methods. Admins should use LOGIN_HISTORY, in addition to the Trust Center, to confirm that the service users are protected by network policies.

SELECT *
  FROM TABLE(INFORMATION_SCHEMA.LOGIN_HISTORY(TIME_RANGE_START =>
    DATEADD('HOURS',-1,CURRENT_TIMESTAMP()),CURRENT_TIMESTAMP()))
  ORDER BY EVENT_TIMESTAMP;
Copy

Protect the account with MFA enforcement

To enforce MFA for all non-SERVICE type users, apply the MFA enforcement policy at the account level.

These policies help ensure that all human interactive users enable MFA either from their own IdP or from the native Snowflake MFA.

ALTER ACCOUNT SET
AUTHENTICATION POLICY = HUMAN_ACCESS_ACCOUNT_ENFORCE_MFA;
Copy

If you want to enforce double MFA on your highly privileged users, such as account admins, enforce MFA at this user level. However, you need to strike a balance between break-glass procedures in case your IdP is down and your security requirements.

ALTER USER SUPER_PROTECTED_ACCOUNTADMIN_1
AUTHENTICATION POLICY = ACCOUNTADMIN_DOUBLE_MFA;
Copy

For a break-glass situation:

ALTER USER BREAKGLASS_ACCOUNTADMIN_1
AUTHENTICATION POLICY = ACCOUNTADMIN_BREAKGLASS_MFA;
Copy

Apply account-level network policies

Finally, it is time to apply network policies at the account level to protect all other users that do not have explicit network policies.

ALTER ACCOUNT SET
NETWORK_POLICY = ACCOUNT_LEVEL_NET_POLICY;
Copy

Disable unused users

The Trust Center CIS scanner (1.8) will monitor users who have not been active in the past 90 days. As shown in the following diagram, you can click Open a Worksheet to show the query that lists the inactive users:

SELECT
  F.VALUE:ENTITY_ID::VARCHAR AS ENTITY_ID,
  F.VALUE:ENTITY_NAME::VARCHAR AS ENTITY_NAME,
  F.VALUE:ENTITY_OBJECT_TYPE::VARCHAR AS ENTITY_OBJECT_TYPE,
  F.VALUE:ENTITY_DETAIL AS ENTITY_DETAIL
FROM
  SNOWFLAKE.TRUST_CENTER.FINDINGS,
  LATERAL FLATTEN(INPUT => AT_RISK_ENTITIES) AS F;
Copy

Snowflake highly recommends that you disable those users.

Phase 4: Continuous monitoring

Leverage the Trust Center threat intelligence scanner package to monitor your MFA and network policy enforcement. With the leaked password protection feature, Snowflake will monitor the dark web for stolen credentials and disable any user that has a password hash that matches the one found in the dark web. You can also leverage Snowflake native alerting, along with custom queries to build extra hygiene alerts for:

  • Users without type specifically set

  • An application with static credentials such as passwords or key-pairs

  • A new user with LEGACY_SERVICE added

  • Regularly reaching out to legacy applications to upgrade to stronger authorization