Configuração do controle de acesso

Este tópico descreve como configurar a segurança do controle de acesso para objetos protegíveis em sua conta.

Neste tópico:

Administração de contas

Designação de usuários adicionais como administradores de conta

Por padrão, cada conta tem um usuário que foi designado como administrador de conta (ou seja, o usuário tem a função ACCOUNTADMIN definida pelo sistema). Recomendamos designar pelo menos um outro usuário como administrador de conta. Isto ajuda a garantir que sua conta tenha sempre pelo menos um usuário que possa executar tarefas em nível de conta, especialmente se um dos administradores de sua conta não conseguir fazer o login.

Para estes administradores de conta adicionais, você pode optar por criar novos usuários ou designar usuários existentes, mas certifique-se de especificar o seguinte:

  • Conceda a função ACCOUNTADMIN ao(s) usuário(s), mas não defina esta função como o padrão dele(s). Em vez disso, designe uma função administrativa de nível inferior (por exemplo, SYSADMIN) ou uma função personalizada como o padrão. Isto ajuda a evitar que os administradores de conta utilizem inadvertidamente a função ACCOUNTADMIN para criar objetos.

  • Certifique-se de que um endereço de e-mail seja especificado para cada usuário (necessário para autenticação multifator).

Por exemplo, conceda as funções ACCOUNTADMIN e SYSADMIN a um usuário existente chamado user2 e especifique SYSADMIN como a função padrão:

GRANT ROLE ACCOUNTADMIN, SYSADMIN TO USER user2;

ALTER USER user2 SET EMAIL='user2@domain.com', DEFAULT_ROLE=SYSADMIN;
Copy

Habilitação da MFA para cada administrador de conta

Para garantir o mais alto nível de segurança para sua conta Snowflake, recomendamos fortemente que qualquer usuário que possa modificar ou visualizar dados confidenciais seja obrigado a usar a autenticação multifator (MFA) para o login.

Esta recomendação aplica-se particularmente aos usuários com a função ACCOUNTADMIN, mas também pode ser expandida para incluir usuários com as funções SECURITYADMIN e SYSADMIN.

Para obter mais detalhes, consulte Considerações sobre o controle de acesso e Autenticação multifator (MFA).

Criação de funções personalizadas

Para seguir o princípio geral do “menor privilégio”, recomendamos a criação de funções personalizadas que se alinhem com as funções empresariais em sua organização para permitir ações SQL sobre um conjunto restrito de objetos protegíveis.

O fluxo de trabalho é o seguinte:

  1. Crie uma função personalizada.

  2. Conceda um conjunto de privilégios para a função.

  3. Conceda a função a um ou mais usuários que necessitam dos privilégios concedidos à função para realizar ações SQL para suas necessidades comerciais.

  4. Conceda a função a outra função para criar ou adicionar a uma hierarquia de funções. Embora não seja necessário, esta etapa é altamente recomendada. Para obter mais informações, consulte Criação de uma hierarquia de funções (neste tópico).

Esta seção fornece instruções para a criação de uma função chamada r1 e a concessão dos seguintes privilégios à função. Os privilégios permitem a um usuário que ativa a função em uma sessão consultar uma única tabela, d1.s1.t1:

Privilégio

Objeto

Notas

USAGE

Warehouse w1

Banco de dados d1

Esquema s1

Para consultar um objeto (por exemplo, uma tabela ou exibição), uma função deve ter o privilégio USAGE para um warehouse. O warehouse fornece os recursos computacionais para executar a consulta.

Para operar em qualquer objeto de um esquema, uma função deve ter o privilégio USAGE para o banco de dados e o esquema de contêiner.

SELECT

Tabela t1

Depois que uma função é criada, privilégios adicionais podem ser concedidos a ela para permitir que usuários com a função executem ações SQL adicionais sobre os mesmos objetos ou objetos adicionais.

Criar uma função

  1. Crie a função r1, usando CREATE ROLE.

    Somente administradores de usuários (ou seja, usuários com a função do sistema USERADMIN ou superior), ou outra função com o privilégio CREATE ROLE para a conta podem criar funções.

    CREATE ROLE r1
       COMMENT = 'This role has all privileges on schema_1';
    
    Copy

Conceder privilégios para a função

  1. Conceda à função r1 os privilégios definidos na tabela anterior desta seção.

    A função SECURITYADMIN do sistema pode ser usada para conceder privilégios em objetos a funções. Para obter opções adicionais, consulte GRANT <privilégios>.

    GRANT USAGE
      ON WAREHOUSE w1
      TO ROLE r1;
    
    GRANT USAGE
      ON DATABASE d1
      TO ROLE r1;
    
    GRANT USAGE
      ON SCHEMA d1.s1
      TO ROLE r1;
    
    GRANT SELECT
      ON TABLE d1.s1.t1
      TO ROLE r1;
    
    Copy

Conceder a função a usuários

  1. Atribua a função r1 ao usuário smith.

    A função SECURITYADMIN pode ser usada para conceder funções aos usuários. Para obter opções adicionais, consulte GRANT ROLE.

    GRANT ROLE r1
       TO USER smith;
    
    Copy
  2. Opcionalmente, defina a nova função personalizada como a função padrão para o usuário. Da próxima vez que o usuário entrar no Snowflake, a função padrão estará automaticamente ativa na sessão.

    Somente a função com o privilégio OWNERSHIP para o usuário, ou uma função superior, pode executar este comando.

    O seguinte comando define a função padrão para o usuário smith:

    ALTER USER smith
       SET DEFAULT_ROLE = r1;
    
    Copy

Criação de funções somente leitura personalizadas

Suponha que você precise de uma função que se limite a consultar todas as tabelas em um esquema específico (por exemplo, d1.s1). Os usuários que executam comandos usando esta função não podem atualizar os dados da tabela, criar objetos de banco de dados adicionais ou descartar tabelas. A função limita-se a consultar os dados da tabela.

Para criar uma função somente leitura, complete as etapas básicas descritas em Criação de funções personalizadas (neste tópico). Na seção Conceder privilégios para a função, conceda à função somente leitura (denominada read_only nestas instruções) os seguintes privilégios de objeto:

Privilégio

Objeto

Notas

USAGE

Warehouse

Para consultar um objeto (por exemplo, uma tabela ou exibição), uma função deve ter o privilégio USAGE para um warehouse. O warehouse fornece os recursos computacionais para executar a consulta.

SELECT

Tabela

Para operar em qualquer objeto de um esquema, uma função deve ter o privilégio USAGE para o banco de dados e o esquema de contêiner.

As instruções de GRANT <privilégio> são:

GRANT USAGE
  ON DATABASE d1
  TO ROLE read_only;

GRANT USAGE
  ON SCHEMA d1.s1
  TO ROLE read_only;

GRANT SELECT
  ON ALL TABLES IN SCHEMA d1.s1
  TO ROLE read_only;

GRANT USAGE
  ON WAREHOUSE w1
  TO ROLE read_only;
Copy

Nota

A instrução GRANT SELECT ON ALL TABLES IN SCHEMA <esquema> concede o privilégio SELECT apenas para todas as tabelas existentes. Para conceder à função o privilégio SELECT para todas as tabelas futuras, execute a seguinte instrução:

GRANT SELECT ON FUTURE TABLES IN SCHEMA d1.s1 TO ROLE read_only;
Copy

Criação de uma hierarquia de funções

Ao criar funções personalizadas, considere a possibilidade de criar uma hierarquia de funções atribuída em última instância a uma função de administrador de alto nível. Em geral, a função SYSADMIN funciona bem como a função à qual todas as outras funções são atribuídas em uma hierarquia, embora seja importante notar que qualquer função com privilégios suficientes poderia servir a esta função. A função SYSADMIN é uma função definida pelo sistema que tem privilégios para criar warehouses, bancos de dados e objetos de banco de dados em uma conta e conceder esses privilégios a outras funções. Na hierarquia padrão do sistema, a função de nível superior ACCOUNTADMIN gerencia a função de administrador do sistema.

Crie uma hierarquia de funções concedendo uma função a uma segunda função. Você pode então conceder essa segunda função a uma terceira função. Os privilégios associados a uma função são herdados por quaisquer funções acima dessa função na hierarquia (ou seja, a função pai).

O diagrama a seguir mostra um exemplo de hierarquia de funções e os privilégios concedidos a cada função:

Role hierarchy and privileges granted to each role

Atribuir uma função a outra função

Atribua a função a uma função de nível superior em uma hierarquia de funções. Neste exemplo, estamos atribuindo a função r1 criada em Criação de funções personalizadas (neste tópico) à função SYSADMIN. A função SYSADMIN herda qualquer privilégio de objeto concedido à função r1:

GRANT ROLE r1
   TO ROLE sysadmin;
Copy

Nota

Em um exemplo mais complexo, você pode atribuir a função custom a outra função filha de SYSADMIN (ou outra função de administrador, tal como uma função personalizada com privilégios suficientes para criar bancos de dados). A função SYSADMIN herdaria os privilégios combinados atribuídos à função custom e à sua função pai. Se a função acima de custom na hierarquia possuísse algum objeto, então a hierarquia de funções asseguraria que os membros da função SYSADMIN também fossem proprietários desses objetos (indiretamente) e pudessem administrá-los como esperado.

Visualização dos privilégios concedidos

Para visualizar o conjunto atual de privilégios concedidos para um objeto, você pode executar o comando SHOW GRANTS.

Nota

A execução do comando SHOW GRANTS em um objeto específico requer os mesmos privilégios de objeto que a execução do comando SHOW para esse tipo de objeto.

Por exemplo, a execução do comando SHOW GRANTS em uma tabela requer os seguintes privilégios na tabela e no banco de dados e esquema de contêiner:

Banco de dados

USAGE

Esquema

USAGE

Tabela

qualquer privilégio

Por exemplo, para visualizar as permissões atuais em um esquema, execute o seguinte comando:

SHOW GRANTS ON SCHEMA <database_name>.<schema_name>;
Copy

Por exemplo, execute o seguinte comando para ver os privilégios em database_a.schema_1 que foram concedidos em Criação de funções personalizadas (neste tópico):

SHOW GRANTS ON SCHEMA database_a.schema_1;
Copy

O Snowflake retorna os seguintes resultados:

+-------------------------------+-----------------------+------------+----------------------+------------+--------------------------+--------------+---------------+
| created_on                    | privilege             | granted_on | name                 | granted_to | grantee_name             | grant_option | granted_by    |
|-------------------------------+-----------------------+------------+----------------------+------------+--------------------------+--------------+---------------|
| 2022-03-07 09:04:23.635 -0800 | USAGE                 | SCHEMA     | D1.S1                | ROLE       | R1                       | false        | SECURITYADMIN |
+-------------------------------+-----------------------+------------+----------------------+------------+--------------------------+--------------+---------------+
Copy

Você também pode executar o comando SHOW GRANTS para visualizar o conjunto atual de privilégios concedidos a uma função, ou o conjunto atual de funções concedidas a um usuário:

SHOW GRANTS TO ROLE <role_name>;
SHOW GRANTS TO USER <user_name>;
Copy

Por exemplo, execute o seguinte comando para visualizar os privilégios concedidos para a função r1 criada em Criação de funções personalizadas (neste tópico):

SHOW GRANTS TO ROLE r1;
Copy

O Snowflake retorna os seguintes resultados:

+-------------------------------+-----------+------------+----------------------+------------+--------------+--------------+---------------+
| created_on                    | privilege | granted_on | name                 | granted_to | grantee_name | grant_option | granted_by    |
|-------------------------------+-----------+------------+----------------------+------------+--------------+--------------+---------------|
| 2022-03-07 09:08:43.773 -0800 | USAGE     | DATABASE   | D1                   | ROLE       | R1           | false        | SECURITYADMIN |
| 2022-03-07 09:08:55.253 -0800 | USAGE     | SCHEMA     | D1.S1                | ROLE       | R1           | false        | SECURITYADMIN |
| 2022-03-07 09:09:07.206 -0800 | SELECT    | TABLE      | D1.S1.T1             | ROLE       | R1           | false        | SECURITYADMIN |
| 2022-03-07 09:08:34.838 -0800 | USAGE     | WAREHOUSE  | W1                   | ROLE       | R1           | false        | SECURITYADMIN |
+-------------------------------+-----------+------------+----------------------+------------+--------------+--------------+---------------+
Copy

Atribuição de concessões futuras para objetos

Para simplificar o gerenciamento de concessões, concessões futuras permitem definir um conjunto inicial de privilégios para conceder para objetos novos (ou seja, futuros) de um determinado tipo em um banco de dados ou esquema. À medida que novos objetos são criados no banco de dados ou esquema, os privilégios definidos são automaticamente concedidos a uma função específica.

As concessões futuras somente definem o conjunto inicial de privilégios concedidos para novos objetos de um tipo específico. Depois que um objeto individual é criado, os administradores podem conceder explicitamente privilégios adicionais ou revogar privilégios para o objeto. Isto permite um controle de acesso refinado para todos os objetos do esquema ou banco de dados.

Considerações

  • Quando concessões futuras são definidas no mesmo tipo de objeto para um banco de dados e um esquema no mesmo banco de dados, as concessões no nível do esquema têm precedência sobre as concessões no nível do banco de dados, e as concessões no nível do banco de dados são ignoradas. Esse comportamento se aplica a privilégios sobre objetos futuros concedidos a uma função ou funções diferentes.

    Por exemplo, as seguintes instruções concedem privilégios diferentes sobre objetos do mesmo tipo nos níveis do banco de dados e do esquema.

    Conceder o privilégio SELECT em todas as tabelas futuras do banco de dados d1 à função r1:

    GRANT SELECT ON FUTURE TABLES IN DATABASE d1 TO ROLE r1;
    
    Copy

    Conceder os privilégios INSERT e DELETE em todas as tabelas futuras no esquema d1.s1 à função r2:

    GRANT INSERT,DELETE ON FUTURE TABLES IN SCHEMA d1.s1 TO ROLE r2;
    
    Copy

    As futuras concessões atribuídas à função r1 nos tipos de objeto no esquema d1.s1 são completamente ignoradas. Quando novas tabelas são criadas no esquema d1.s1, somente os privilégios futuros definidos nas tabelas para a função r2 são concedidos.

  • Concessões futuras em nível de banco de dados se aplicam tanto a esquemas de acesso regular quanto a esquemas de acesso gerenciado.

Definição de concessões futuras para objetos de banco de dados ou esquema

Conceda privilégios em objetos futuros de um tipo específico usando o comando GRANT <privilégios> com as palavras-chave ON FUTURE.

Revogação de concessões futuras para objetos de banco de dados ou esquema

Revogue concessões em objetos futuros usando o comando REVOKE <privilégios> com as palavras-chave ON FUTURE.

Clonagem de objeto e concessões futuras

  • Quando um banco de dados ou esquema é clonado, as concessões futuras são copiadas para seu clone. Este comportamento mantém a coerência com as concessões de objetos regulares; isto é, concessões de privilégios em um objeto de origem (ou seja, banco de dados) não são copiadas para seus clones, mas concessões de privilégios em todos os objetos filho (ou seja, tabelas no banco de dados) são copiadas para os clones.

  • Quando um objeto em um esquema é clonado, quaisquer concessões futuras definidas para esse tipo de objeto no esquema são aplicadas ao objeto clonado, a menos que a opção COPY GRANTS esteja especificada na instrução CREATE <objeto> para a operação de clonagem. Nesse caso, o novo objeto reterá as permissões de acesso do objeto original e não herdará qualquer futura concessão para objetos desse tipo.

Gerenciamento de concessões futuras usando o console clássico

Você também pode definir concessões futuras usando a Classic Console:

Concessões para objetos de banco de dados futuros
  1. Selecione Databases Databases tab.

  2. Selecione a linha para um banco de dados específico. O painel de segurança é aberto.

  3. Selecione Grant Privileges. A caixa de diálogo Grant Privileges é aberta.

  4. A partir da lista suspensa Grant privileges on, selecione future object_type para definir concessões futuras para novos objetos de um tipo específico de objeto.

  5. Nas listas suspensas restantes, selecione os privilégios que você está concedendo para novos objetos do tipo especificado, bem como a função à qual os privilégios serão concedidos.

  6. Selecione Grant Privileges.

Concessões para objetos de esquema futuros
  1. Selecione Databases Databases tab » <nome_bd> » Schemas.

  2. Selecione a linha para um esquema específico. O painel de segurança é aberto.

  3. Selecione Grant Privileges. A caixa de diálogo Grant Privileges é aberta.

  4. A partir da lista suspensa Grant privileges on, selecione future object_type para definir concessões futuras para novos objetos de um tipo específico de objeto.

  5. Nas listas suspensas restantes, selecione os privilégios que você está concedendo para novos objetos do tipo especificado, bem como a função à qual os privilégios serão concedidos.

  6. Selecione Grant Privileges.

Para gerenciar concessões futuras em Snowsight, execute instruções SQL em uma planilha.

Criação de esquemas de acesso gerenciado

Os esquemas de acesso gerenciados melhoram a segurança ao bloquear o gerenciamento de privilégios para objetos.

Em esquemas regulares (ou seja, não gerenciados), os proprietários de objetos (ou seja, uma função com o privilégio OWNERSHIP para um objeto) podem conceder acesso a seus objetos para outras funções, com a opção de também conceder a essas funções a capacidade de gerenciar concessões de objetos.

Com esquemas de acesso gerenciado, os proprietários de objetos perdem a capacidade de tomar decisões de concessão. Somente o proprietário do esquema (ou seja, a função com o privilégio OWNERSHIP para o esquema) ou uma função com o privilégio MANAGE GRANTS pode conceder privilégios para objetos no esquema, incluindo concessões futuras, centralizando o gerenciamento de privilégios.

Você pode criar um esquema de acesso gerenciado usando a interface da Web ou SQL:

Classic Console

Clique em Databases Databases tab » <nome_bd> » Schemas » Create Schema.

SQL

Execute uma instrução CREATE SCHEMA com as palavras-chave WITH MANAGED ACCESS.

Você pode mudar um esquema regular para um esquema de acesso gerenciado (ou vice-versa) usando a interface da Web ou SQL:

Classic Console

Clique em Databases Databases tab » <nome_bd> » Schemas » <nome_esquema> » Alter a schema.

SQL

Execute uma instrução ALTER SCHEMA com as palavras-chave ENABLE | DISABLE MANAGED ACCESS.

A tabela a seguir indica quais funções podem gerenciar privilégios de objetos em um esquema de acesso regular ou gerenciado:

Função

Pode conceder privilégios de objeto em um esquema regular

Pode conceder privilégios de objeto em um esquema de acesso gerenciado

SYSADMIN

Não

Não

SECURITYADMIN ou superior

Sim

Sim

Proprietário do banco de dados

Não

Não

Proprietário do esquema

Não

Sim

Proprietário do objeto

Sim

Não

Qualquer função com o privilégio MANAGE GRANTS

Sim

Sim

Gerenciamento de privilégios de objetos com o Snowsight

Você pode usar Snowsight para gerenciar concessões de privilégios de objeto de banco de dados para funções. Para gerenciar essas concessões, use uma função com o privilégio OWNERSHIP no objeto ou com o privilégio global MANAGE GRANTS.

Quando você usa Snowsight para gerenciar concessões, isso é equivalente a executar um comando GRANT PRIVILEGE ou REVOKE PRIVILEGE em SQL. Por exemplo, você pode usar Snowsight para conceder o privilégio USAGE em uma exibição à função ACCOUNTADMIN.

Concessão de privilégios nos objetos

Para conceder privilégios de objeto de banco de dados a uma função, faça o seguinte:

  1. Entre em Snowsight.

  2. Selecione Data » Databases.

  3. Para um banco de dados e um esquema específicos, selecione um objeto de banco de dados ao qual você deseja conceder privilégios.

  4. Em Object Details, localize a seção Privileges.

  5. Selecione + Privilege.

  6. Selecione a função à qual deseja conceder os privilégios.

  7. Selecione o privilégio que você deseja conceder à função.

  8. Se você quiser que a função possa conceder o privilégio a outras funções, selecione Grant option.

  9. Repita os passos para cada privilégio do objeto que você deseja conceder à função.

  10. Selecione Grant Privileges.

Revogação de privilégios nos objetos

Para revogar privilégios de objeto de banco de dados de uma função, faça o seguinte:

  1. Entre em Snowsight.

  2. Selecione Data » Databases.

  3. Para um banco de dados e um esquema específicos, selecione um objeto de banco de dados do qual você deseja revogar privilégios.

  4. Em Object Details, localize a seção Privileges.

  5. Para uma função específica listada, selecione o ícone de lápis Edit Role que aparece quando você passa o mouse sobre a linha.

  6. Na caixa de diálogo exibida, selecione x para revogar um privilégio de uma função específica.

  7. Selecione Update Privileges.

Identificação dos privilégios concedidos às funções

Para mostrar os privilégios concedidos em uma função específica, você pode executar o comando SHOW GRANTS ou fazer o seguinte em Snowsight:

  1. Entre em Snowsight.

  2. Selecione Admin » Users & Roles » Roles.

  3. Selecione Table e localize a função para a qual deseja visualizar os privilégios concedidos.

  4. Selecione a função para a qual deseja visualizar os privilégios concedidos para visualizar os detalhes.

  5. Revise a seção Privileges da função.

Habilitação de administradores sem conta para monitorar o uso e o histórico de faturamento no console clássico

O Snowflake fornece extensas informações de uso de conta e faturamento sobre armazenamento/transferência de dados e uso/carga de warehouse:

Snowsight

Select Admin » Cost Management.

Classic Console

Clique em Account Account tab » Billing & Usage.

SQL

Consulte qualquer um dos seguintes:

Por padrão, estas informações podem ser acessadas/visualizadas somente por administradores de conta.

Nota

Atualmente, o Snowsight exibe informações de uso e faturamento apenas aos administradores de conta. Não é possível conceder a outras funções a capacidade de visualizar estas informações.

Para permitir aos usuários que não são administradores de conta acessar/visualizar estas informações, conceda os seguintes privilégios a uma função definida pelo sistema ou personalizada. A concessão de privilégios a uma função permite que todos os usuários a quem é concedida a função tenham acesso a essas informações históricas/de utilização:

Privilégio

Objeto

Descrição

MONITOR USAGE

Conta (ou seja, privilégio global)

Permite aos usuários a quem foi concedida a função visualizar as informações de uso e faturamento na interface da Web e consultar as funções da tabela correspondente no Information Schema.

Além disso, com este privilégio, os comandos SHOW DATABASES e SHOW WAREHOUSES retornam as listas de todos os bancos de dados e warehouses da conta, respectivamente, independentemente de outras concessões de privilégio.

IMPORTED PRIVILEGES

Banco de dados snowflake

Permite aos usuários a quem foi concedida a função consultar todas as exibições ACCOUNT USAGE, incluindo as exibições que contêm informações de uso e faturamento.

Para obter mais informações, consulte Habilitação do uso do banco de dados SNOWFLAKE para outras funções.

Por exemplo, para conceder estas permissões para a função custom:

GRANT MONITOR USAGE ON ACCOUNT TO ROLE custom;

GRANT IMPORTED PRIVILEGES ON DATABASE snowflake TO ROLE custom;
Copy