

# 通过 Snowflake 进行身份验证
Snowflake 身份验证

您可以将 Amazon Athena Snowflake 连接器配置为使用密钥对身份验证或 OAuth 身份验证方法，来连接 Snowflake 数据仓库。这两种方法都提供对 Snowflake 的安全访问，并且无需在连接字符串中存储密码。
+ **密钥对身份验证**：此方法使用 RSA 公有或私有密钥对通过 Snowflake 进行身份验证。私有密钥会对身份验证请求进行数字签名，而相应的公有密钥则会在 Snowflake 中注册以供验证。此方法消除了存储密码的需要。
+ **OAuth 身份验证**：此方法使用授权令牌和刷新令牌通过 Snowflake 进行身份验证。它支持自动令牌刷新，因此适用于长时间运行的应用程序。

有关更多信息，请参阅 Snowfla ke 用户指南中的 [Key-pair authentication](https://docs.snowflake.com/en/user-guide/key-pair-auth) 和 [OAuth authentication](https://docs.snowflake.com/en/user-guide/oauth-custom)。

## 先决条件


在开始之前，请满足以下先决条件：
+ 具有管理权限的 Snowflake 账户访问权限。
+ 专门用于 Athena 连接器的 Snowflake 用户账户。
+ 用于密钥对身份验证的 OpenSSL 或等效密钥生成工具。
+ Amazon Secrets Manager 访问权限，用于创建和管理密钥。
+ 用于完成 OAuth 身份验证的 OAuth 流程的 Web 浏览器。

## 配置密钥对身份验证


此过程包括生成 RSA 密钥对、使用公有密钥配置您的 Snowflake 账户，以及将私有密钥安全地存储在 Amazon Secrets Manager 中。以下步骤将指导您创建加密密钥、设置必要的 Snowflake 权限以及配置 Amazon 凭证以实现流畅的身份验证。

1. **生成 RSA 密钥对**

   使用 OpenSSL 生成私有和公有密钥对。
   + 要生成未加密的版本，请在本地命令行应用程序中使用以下命令。

     ```
     openssl genrsa 2048 | openssl pkcs8 -topk8 -inform PEM -out rsa_key.p8 -nocrypt
     ```
   + 要生成加密版本，请使用以下命令，该命令省略了 `-nocrypt`。

     ```
     openssl genrsa 2048 | openssl pkcs8 -topk8 -v2 des3 -inform PEM -out rsa_key.p8
     ```
   + 使用私有密钥生成公有密钥。

     ```
     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
     ```
**注意**  
请勿与他人共享您的私有密钥。只有需要通过 Snowflake 进行身份验证的应用程序才能访问私有密钥。

1. **为 Snowflake 提取不带分隔符的公有密钥内容**

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

   请记下这些信息，因为需要在下一步中用到。

1. **配置 Snowflake 用户**

   按照以下步骤配置 Snowflake 用户：

   1. 为 Athena 连接器创建专属用户（如果还没有执行此操作）。

      ```
      -- 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. 授予身份验证权限。要向用户分配公有密钥，您必须具有以下角色或权限之一：
      + 用户的 `MODIFY PROGRAMMATIC AUTHENTICATION METHODS` 或 `OWNERSHIP` 权限。
      + `SECURITYADMIN` 角色或更高层级角色。

      使用以下命令授予必要权限以分配公有密钥。

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

   1. 使用以下命令将公有密钥分配给 Snowflake 用户。

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

      使用以下命令验证公有密钥是否已成功分配给该用户。

      ```
      DESC USER athena_connector_user;
      ```

1. **将私有密钥存储在 Amazon Secrets Manager 中**

   1. 将私有密钥转换为连接器要求的格式。

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

   1. 在 Amazon Secrets Manager 中，创建一个使用以下结构的密钥。

      ```
      {
        "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)"
      }
      ```
**注意**  
页眉和页脚为选填。
私有密钥必须使用 `\n` 分隔。

## 配置 OAuth 身份验证


此身份验证方法具备自动刷新凭证的功能，可以实现对 Snowflake 进行基于令牌的安全访问。配置过程包括在 Snowflake 中创建安全集成、检索 OAuth 客户端凭证、完成授权流程以获取访问代码，以及将 OAuth 凭据存储在 Amazon Secrets Manager 中以供连接器使用。

1. **在 Snowflake 创建安全集成**

   在 Snowflake 中执行以下 SQL 命令创建 Snowflake OAuth 安全集成。

   ```
   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;
   ```

   **配置参数**
   + `TYPE = OAUTH`：指定 OAuth 身份验证类型。
   + `ENABLED = TRUE`：启用安全集成。
   + `OAUTH_CLIENT = CUSTOM`：使用自定义 OAuth 客户端配置。
   + `OAUTH_CLIENT_TYPE = 'CONFIDENTIAL'`：为安全应用程序设置客户端类型。
   + `OAUTH_REDIRECT_URI`：OAuth 流程的回调 URL。它可以是用于测试的本地主机。
   + `OAUTH_ISSUE_REFRESH_TOKENS = TRUE`：启用刷新令牌生成。
   + `OAUTH_REFRESH_TOKEN_VALIDITY = 7776000`：设置刷新令牌的有效期（以秒为单位，最长 90 天）。

1. **检索 OAuth 客户端密钥**

   1. 运行以下 SQL 命令来获取客户端凭证。

      ```
      DESC SECURITY INTEGRATION 'MY_SNOWFLAKE_OAUTH_INTEGRATION_A';
      ```

   1. 检索 OAuth 客户端密钥。

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

      **响应示例**

      ```
      {
        "OAUTH_CLIENT_SECRET_2": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
        "OAUTH_CLIENT_SECRET": "je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY,
        "OAUTH_CLIENT_ID": "AIDACKCEVSQ6C2EXAMPLE"
      }
      ```
**注意**  
请妥善保管这些凭证，不要与他人共享。这些凭证将用于配置 OAuth 客户端。

1. **授权用户并检索授权码**

   1. 在浏览器中打开以下 URL。

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

   1. 完成授权流程。

      1. 使用 Snowflake 凭证登录。

      1. 授予所需的权限。您将被重定向到带有授权码的回调 URI。

   1. 从重定向 URL 中复制代码参数来提取授权码。

      ```
      https://localhost:8080/oauth/callback?code=<authorizationcode>
      ```
**注意**  
该授权码仅在有限时间内有效，而且只能使用一次。

1. **将 OAuth 凭证存储在 Amazon Secrets Manager 中**

   在 Amazon Secrets Manager 中，创建一个使用以下结构的密钥。

   ```
   {
     "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"
   }
   ```

   **必填字段**
   + `redirect_uri`：您在步骤 1 中获得的 OAuth 重定向 URI。
   + `client_secret`：您在步骤 2 中获得的 OAuth 客户端密钥。
   + `token_url`：Snowflake OAuth 令牌端点。
   + `client_id`：步骤 2 中的 OAuth 客户端 ID。
   + `username`：连接器的 Snowflake 用户名。
   + `auth_code`：您在步骤 3 中获得的授权码。

创建密钥后，您将获得一个密钥 ARN，您可以在[创建数据来源连接](connect-to-a-data-source.md)时在 Glue 连接中使用该密钥 ARN。