通过 Snowflake 进行身份验证 - Amazon Athena
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

通过 Snowflake 进行身份验证

您可以将 Amazon Athena Snowflake 连接器配置为使用密钥对身份验证或 OAuth 身份验证方法,来连接 Snowflake 数据仓库。这两种方法都提供对 Snowflake 的安全访问,并且无需在连接字符串中存储密码。

  • 密钥对身份验证:此方法使用 RSA 公有或私有密钥对通过 Snowflake 进行身份验证。私有密钥会对身份验证请求进行数字签名,而相应的公有密钥则会在 Snowflake 中注册以供验证。此方法消除了存储密码的需要。

  • OAuth 身份验证:此方法使用授权令牌和刷新令牌通过 Snowflake 进行身份验证。它支持自动令牌刷新,因此适用于长时间运行的应用程序。

有关更多信息,请参阅 Snowfla ke 用户指南中的 Key-pair authenticationOAuth authentication

先决条件

在开始之前,请满足以下先决条件:

  • 具有管理权限的 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 进行身份验证的应用程序才能访问私有密钥。

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

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

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

  3. 配置 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;
    2. 授予身份验证权限。要向用户分配公有密钥,您必须具有以下角色或权限之一:

      • 用户的 MODIFY PROGRAMMATIC AUTHENTICATION METHODSOWNERSHIP 权限。

      • SECURITYADMIN 角色或更高层级角色。

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

      GRANT MODIFY PROGRAMMATIC AUTHENTICATION METHODS ON USER athena_connector_user TO ROLE your_admin_role;
    3. 使用以下命令将公有密钥分配给 Snowflake 用户。

      ALTER USER athena_connector_user SET RSA_PUBLIC_KEY='RSAkey';

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

      DESC USER athena_connector_user;
  4. 将私有密钥存储在 Amazon Secrets Manager 中

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

      # Read private key content cat rsa_key.p8
    2. 在 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 天)。

  2. 检索 OAuth 客户端密钥

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

      DESC SECURITY INTEGRATION 'MY_SNOWFLAKE_OAUTH_INTEGRATION_A';
    2. 检索 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 客户端。

  3. 授权用户并检索授权码

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

      https://<your_account>.snowflakecomputing.com/oauth/authorize?client_id=<OAUTH_CLIENT_ID>&response_type=code&redirect_uri=https://localhost:8080/oauth/callback
    2. 完成授权流程。

      1. 使用 Snowflake 凭证登录。

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

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

      https://localhost:8080/oauth/callback?code=<authorizationcode>
      注意

      该授权码仅在有限时间内有效,而且只能使用一次。

  4. 将 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,您可以在创建数据来源连接时在 Glue 连接中使用该密钥 ARN。