Snowflake’s approach to access control combines aspects of the following two models:

Discretionary Access Control (DAC), in which each object has an owner, who can in turn grant access to that object.

Role-based Access Control (RBAC), in which access privileges are assigned to roles, which are in turn assigned to users.

The key concepts to understanding access control in Snowflake are:

Securable object: an entity to which access can be granted. Unless allowed by a grant, access will be denied.

Role: an entity to which privileges can be granted. Roles are in turn assigned to users. Note that roles can also be assigned to other roles, creating a role hierarchy.

Privilege: a defined level of access to an object. Multiple distinct privileges may be used to control the granularity of access granted.

User: a user identity recognized by Snowflake, whether associated with a person or program.

In the Snowflake model, access to securable objects is allowed via privileges assigned to roles, which are in turn assigned to other roles or users. In addition, each securable object has an owner that can grant access to other roles. This model is different from a user-based access control model, in which rights and privileges are assigned to each user or group of users. The Snowflake model is designed to provide a significant amount of both control and flexibility.

Every securable object resides within a logical container in a hierarchy of containers. The top-most container is the customer account, within which reside USER, ROLE, WAREHOUSE, and DATABASE objects. All other securable objects (such as TABLE, FUNCTION, FILE FORMAT, STAGE, SEQUENCE, etc.) are contained within a SCHEMA object within a DATABASE. This hierarchy of objects and containers is illustrated below:

Every securable object is owned by a single role, which is typically the role used to create the object. When this role is assigned to users, they effectively have shared control over the securable object. The owning role has all privileges on the object by default, including the ability to grant or revoke privileges on the object to other roles. In addition, ownership can be transferred from one role to another.

Access to objects is defined by privileges granted to roles. The following are examples of privileges on various objects in Snowflake:

Roles are the entities to which privileges can be granted and revoked. Roles are assigned to users to specify which privileges are available to which users. A user can be assigned multiple roles, in which case the user’s privileges are the combination of the privileges granted to all of the roles that have been assigned to the user.

Roles can be also granted to other roles, creating a hierarchy of roles. The privileges associated with a role are inherited by any roles above that role in the hierarchy.

There are a small number of system-defined roles in a Snowflake account. Users with appropriate access can alter the system-defined roles and can also create custom roles.

Role that encapsulates the SYSADMIN and SECURITYADMIN system-defined roles. It is the top-level role in the system and should be granted only to a limited/controlled number of users in your account.

SECURITYADMIN:

AKA Security Administrator

Role that can create, monitor, and manage users and roles. More specifically, this role is used to:

Create users and roles in your account (and grant those privileges to other roles).

Modify and monitor any user, role, or session.

Modify any grant, including revoking it.

SYSADMIN:

AKA System Administrator

Role that has privileges to create warehouses and databases (and other objects) in an account.

If, as recommended, you create a role hierarchy that ultimately assigns all custom roles to the SYSADMIN role, this role also has the ability
to grant privileges on warehouses, databases, and other objects to other roles.

PUBLIC:

Pseudo-role that is automatically granted to every user and every role in your account. The PUBLIC role can own securable objects, just like any other role; however, the objects owned by the role
are, by definition, available to every other user and role in your account.

This role is typically used in cases where explicit access control is not needed and all users are viewed as equal with regard to their access rights.

Custom roles (i.e. any roles other than the system-defined roles) can be created by the SECURITYADMIN roles as well as by any role to which the CREATE ROLE privilege has been granted. By default, the
newly-created role is not assigned to any user, nor granted to any other role.

When creating roles that will serve as the owners of objects in the system, we recommend creating a hierarchy of custom roles, with the top-most custom role assigned to the system role SYSADMIN. That way,
the system administrators will be able to manage all warehouses and all databases, while maintaining management of user and roles restricted to users granted the SECURITYADMIN or ACCOUNTADMIN roles.
Conversely, if a custom role is not assigned to SYSADMIN through a role hierarchy, the system administrators will not be able to manage the objects owned by the role. Only those roles granted the MANAGE
GRANTS privilege (typically only the SECURITYADMIN role) will see the objects and be able to modify their access grants.

For each securable object, there is a set of privileges that can be granted on it. Privileges are always defined as a privilege on a specified, existing object, e.g. CREATE TABLE privilege on
SCHEMA myschema object.

Privileges are managed using the GRANT and REVOKE commands. Usage of these commands is restricted to roles that own an object or role that have the MANAGE GRANTS global privilege for the object (typically
the SECURITYADMIN role).

Every active user session has a “current role”. When a session is initiated (e.g. a user connects via JDBC/ODBC or logs in to the Snowflake web interface), the current role is determined based on the
following:

If a role was specified as part of the connection and that role is a role that has already been granted to the connecting user, the specified role becomes the current role.

If no role was specified and a default role has been set for the connecting user, that role becomes the current role.

If no role was specified and a default role has not been set for the connecting user, the system role PUBLIC is used.

During the course of a session, the user can use the USE ROLE command to change the current role. If the role is granted other roles, the user’s session has privileges equal to the
sum of the privileges of the current role and all the privileges of the roles granted to the current role within the role hierarchy.

When a user attempts to execute an action on an object, Snowflake compares the privileges available in the user’s session against the privileges required on the object for that action. If the session has
the required privileges on the object, the action is allowed.

Note

There is no concept of a “super-user” or “super-role” in Snowflake that can bypass authorization checks. All access requires appropriate access privileges.