

# Autenticar com o Snowflake
<a name="connectors-snowflake-authentication"></a>

Você pode configurar o conector do Amazon Athena Snowflake para usar a autenticação por par de chaves ou o método de autenticação OAuth para se conectar ao data warehouse do Snowflake. Ambos os métodos fornecem acesso seguro ao Snowflake e eliminam a necessidade de armazenar senhas em cadeias de conexão.
+ **Autenticação por par de chaves**: esse método usa pares de chaves públicas ou privadas RSA para autenticar com o Snowflake. A chave privada assina digitalmente as solicitações de autenticação enquanto a chave pública correspondente é registrada no Snowflake para verificação. Esse método elimina o armazenamento de senhas.
+ **Autenticação OAuth**: esse método usa o token de autorização e o token de atualização para autenticar com o Snowflake. Ele oferece suporte à atualização automática de tokens, o que o torna adequado para aplicações de execução longa.

Para obter mais informações, consulte [autenticação por par de chaves](https://docs.snowflake.com/en/user-guide/key-pair-auth) e [autenticação OAuth](https://docs.snowflake.com/en/user-guide/oauth-custom) no guia do usuário do Snowflake.

## Pré-requisitos
<a name="connectors-snowflake-authentication-prerequisites"></a>

Antes de começar, conclua os seguintes pré-requisitos:
+ Acesso à conta do Snowflake com privilégios administrativos.
+ Conta de usuário do Snowflake dedicada para o conector do Athena.
+ OpenSSL ou ferramentas equivalentes de geração de chaves para autenticação de pares de chaves.
+ Acesso ao AWS Secrets Manager para criar e gerenciar segredos.
+ Navegador da Web para concluir o fluxo do OAuth para a autenticação do OAuth.

## Configurar a autenticação por par de chaves
<a name="connectors-snowflake-keypair-authentication"></a>

Esse processo envolve gerar um par de chaves RSA, configurar sua conta do Snowflake com a chave pública e armazenar com segurança a chave privada no AWS Secrets Manager. As etapas a seguir guiarão você na criação das chaves criptográficas, na configuração das permissões necessárias do Snowflake e na configuração das credenciais da AWS para autenticação direta. 

1. **Gerar pares de chaves RSA**

   Gere um par de chaves pública e privada usando o OpenSSL.
   + Para gerar uma versão não criptografada, use o comando a seguir em sua aplicação de linha de comando local.

     ```
     openssl genrsa 2048 | openssl pkcs8 -topk8 -inform PEM -out rsa_key.p8 -nocrypt
     ```
   + Para gerar uma versão criptografada, use o comando a seguir, que omite `-nocrypt`.

     ```
     openssl genrsa 2048 | openssl pkcs8 -topk8 -v2 des3 -inform PEM -out rsa_key.p8
     ```
   + Para gerar uma chave pública com base em uma chave privada.

     ```
     openssl rsa -in rsa_key.p8 -pubout -out rsa_key.pub
     # Set appropriate permissions (Unix/Linux)
     chmod 600 rsa_key.p8
     chmod 644 rsa_key.pub
     ```
**nota**  
Não compartilhe sua chave privada. A chave privada só deve estar acessível à aplicação que precisa se autenticar com o Snowflake.

1. **Extrair conteúdo da chave pública sem delimitadores para o Snowflake**

   ```
   # Extract public key content (remove BEGIN/END lines and newlines)
   cat rsa_key.pub | grep -v "BEGIN\|END" | tr -d '\n'
   ```

   Salve essa saída, pois ela será necessária mais tarde na próxima etapa.

1. **Configurar um usuário do Snowflake**

   Siga estas etapas para configurar um usuário do Snowflake.

   1. Crie um usuário dedicado para o conector do Athena, caso ele ainda não exista.

      ```
      -- Create user for Athena connector
      CREATE USER {{athena_connector_user}};
      
      -- Grant necessary privileges
      GRANT USAGE ON WAREHOUSE {{your_warehouse}} TO ROLE {{athena_connector_role}};
      GRANT USAGE ON DATABASE {{your_database}} TO ROLE {{athena_connector_role}};
      GRANT SELECT ON ALL TABLES IN DATABASE {{your_database}} TO ROLE {{athena_connector_role}};
      ```

   1. Conceda privilégios de autenticação. Para atribuir uma chave pública a um usuário, é necessário ter um dos seguintes perfis ou privilégios.
      + O privilégio `MODIFY PROGRAMMATIC AUTHENTICATION METHODS` ou `OWNERSHIP` no usuário.
      + O perfil `SECURITYADMIN` ou superior.

      Conceda os privilégios necessários para atribuir chaves públicas usando o comando a seguir.

      ```
      GRANT MODIFY PROGRAMMATIC AUTHENTICATION METHODS ON USER {{athena_connector_user}} TO ROLE {{your_admin_role}};
      ```

   1. Atribua a chave pública ao usuário do Snowflake usando o comando a seguir.

      ```
      ALTER USER {{athena_connector_user}} SET RSA_PUBLIC_KEY='{{RSAkey}}';
      ```

      Verifique se a chave pública foi atribuída com sucesso ao usuário com o comando a seguir.

      ```
      DESC USER {{athena_connector_user}};
      ```

1. **Armazenar a chave privada em AWS Secrets Manager**

   1. Converta a chave privada para o formato exigido pelo conector.

      ```
      # Read private key content
      cat rsa_key.p8
      ```

   1. Crie um segredo no AWS Secrets Manager com a estrutura a seguir.

      ```
      {
        "sfUser": "{{your_snowflake_user}}",
        "pem_private_key": "-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----",
        "pem_private_key_passphrase": "{{passphrase_in_case_of_encrypted_private_key(optional)}}"
      }
      ```
**nota**  
O cabeçalho e o rodapé são opcionais.
A chave privada deve ser separada por `\n`.

## Configurar autenticação do OAuth
<a name="connectors-snowflake-oauth-authentication"></a>

Esse método de autenticação permite acesso seguro e baseado em tokens ao Snowflake com recursos de atualização automática de credenciais. O processo de configuração envolve a criação de uma integração de segurança no Snowflake, a recuperação das credenciais do cliente OAuth, a conclusão do fluxo de autorização necessário para obter um código de acesso e o armazenamento das credenciais do OAuth no AWS Secrets Manager para uso do conector. 

1. **Criar uma integração de segurança no Snowflake**

   Execute o seguinte comando SQL no Snowflake para criar uma integração de segurança OAuth do Snowflake.

   ```
   CREATE SECURITY INTEGRATION {{my_snowflake_oauth_integration_a}}
     TYPE = OAUTH
     ENABLED = TRUE
     OAUTH_CLIENT = CUSTOM
     OAUTH_CLIENT_TYPE = 'CONFIDENTIAL'
     OAUTH_REDIRECT_URI = 'https://localhost:8080/oauth/callback'
     OAUTH_ISSUE_REFRESH_TOKENS = TRUE
     OAUTH_REFRESH_TOKEN_VALIDITY = 7776000;
   ```

   **Parâmetros de configuração**
   + `TYPE = OAUTH`: especifica o tipo de autenticação OAuth.
   + `ENABLED = TRUE`: permite a integração de segurança.
   + `OAUTH_CLIENT = CUSTOM`: usa a configuração personalizada do cliente OAuth.
   + `OAUTH_CLIENT_TYPE = 'CONFIDENTIAL'`: define o tipo de cliente para aplicações seguras.
   + `OAUTH_REDIRECT_URI`: o URL de retorno de chamada para o fluxo do OAuth. Para fins de teste, ele pode ser o localhost.
   + `OAUTH_ISSUE_REFRESH_TOKENS = TRUE`: habilita a geração de tokens de atualização.
   + `OAUTH_REFRESH_TOKEN_VALIDITY = 7776000`: define a validade do token de atualização (90 dias em segundos).

1. **Recuperar segredos do cliente OAuth**

   1. Execute o comando SQL a seguir para obter as credenciais do cliente.

      ```
      DESC SECURITY INTEGRATION '{{MY_SNOWFLAKE_OAUTH_INTEGRATION_A}}';
      ```

   1. Recupere os segredos do cliente OAuth.

      ```
      SELECT SYSTEM$SHOW_OAUTH_CLIENT_SECRETS('{{MY_SNOWFLAKE_OAUTH_INTEGRATION_A}}');
      ```

      **Exemplo de resposta**

      ```
      {
        "OAUTH_CLIENT_SECRET_2": "{{wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY}}",
        "OAUTH_CLIENT_SECRET": "{{je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY}},
        "OAUTH_CLIENT_ID": "{{AIDACKCEVSQ6C2EXAMPLE}}"
      }
      ```
**nota**  
Mantenha essas credenciais em segurança e não as compartilhe. Elas serão usadas para configurar o cliente OAuth.

1. **Autorizar o usuário e recuperar o código de autorização**

   1. Abra o URL a seguir no seu navegador.

      ```
      https://{{<your_account>}}.snowflakecomputing.com/oauth/authorize?client_id={{<OAUTH_CLIENT_ID>}}&response_type=code&redirect_uri=https://localhost:8080/oauth/callback
      ```

   1. Conclua o fluxo de autorização.

      1. Faça login usando suas credenciais do Snowflake.

      1. Conceda as permissões solicitadas. Você será redirecionado para o URI de retorno de chamada com um código de autorização.

   1. Extraia o código de autorização copiando o parâmetro de código do URL de redirecionamento.

      ```
      https://localhost:8080/oauth/callback?code={{<authorizationcode>}}
      ```
**nota**  
O código de autorização é válido por tempo limitado e só pode ser usado uma vez.

1. **Armazenar credenciais do OAuth no AWS Secrets Manager**

   Crie um segredo no AWS Secrets Manager com a estrutura a seguir.

   ```
   {
     "redirect_uri": "https://localhost:8080/oauth/callback",
     "client_secret": "{{je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY}}",
     "token_url": "https://<{{your_account}}>.snowflakecomputing.com/oauth/token-request",
     "client_id": "{{AIDACKCEVSQ6C2EXAMPLE}},
     "username": "{{your_snowflake_username}}",
     "auth_code": "{{authorizationcode}}"
   }
   ```

   **Campos obrigatórios**
   + `redirect_uri`: URI de redirecionamento do OAuth que você obteve na Etapa 1.
   + `client_secret`: segredo do cliente OAuth que você obteve na Etapa 2.
   + `token_url`: Snowflake. O endpoint do token OAuth.
   + `client_id`: o ID do cliente OAuth da Etapa 2.
   + `username`: o nome de usuário do Snowflake para o conector.
   + `auth_code`: o código de autorização que você obteve na Etapa 3.

Após criar um segredo, você obtém um ARN de segredo que pode ser usado na sua conexão do Glue ao [criar uma conexão de fonte de dados](connect-to-a-data-source.md). 