通过 Snowflake 进行身份验证
您可以将 Amazon Athena Snowflake 连接器配置为使用密钥对身份验证或 OAuth 身份验证方法,来连接 Snowflake 数据仓库。这两种方法都提供对 Snowflake 的安全访问,并且无需在连接字符串中存储密码。
-
密钥对身份验证:此方法使用 RSA 公有或私有密钥对通过 Snowflake 进行身份验证。私有密钥会对身份验证请求进行数字签名,而相应的公有密钥则会在 Snowflake 中注册以供验证。此方法消除了存储密码的需要。
-
OAuth 身份验证:此方法使用授权令牌和刷新令牌通过 Snowflake 进行身份验证。它支持自动令牌刷新,因此适用于长时间运行的应用程序。
有关更多信息,请参阅 Snowfla ke 用户指南中的 Key-pair authentication
先决条件
在开始之前,请满足以下先决条件:
-
具有管理权限的 Snowflake 账户访问权限。
-
专门用于 Athena 连接器的 Snowflake 用户账户。
-
用于密钥对身份验证的 OpenSSL 或等效密钥生成工具。
-
AWS Secrets Manager 访问权限,用于创建和管理密钥。
-
用于完成 OAuth 身份验证的 OAuth 流程的 Web 浏览器。
配置密钥对身份验证
此过程包括生成 RSA 密钥对、使用公有密钥配置您的 Snowflake 账户,以及将私有密钥安全地存储在 AWS Secrets Manager 中。以下步骤将指导您创建加密密钥、设置必要的 Snowflake 权限以及配置 AWS 凭证以实现流畅的身份验证。
生成 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 进行身份验证的应用程序才能访问私有密钥。
-
为 Snowflake 提取不带分隔符的公有密钥内容
# Extract public key content (remove BEGIN/END lines and newlines) cat rsa_key.pub | grep -v "BEGIN\|END" | tr -d '\n'请记下这些信息,因为需要在下一步中用到。
-
配置 Snowflake 用户
按照以下步骤配置 Snowflake 用户:
-
为 Athena 连接器创建专属用户(如果还没有执行此操作)。
-- Create user for Athena connector CREATE USERathena_connector_user; -- Grant necessary privileges GRANT USAGE ON WAREHOUSEyour_warehouseTO ROLEathena_connector_role; GRANT USAGE ON DATABASEyour_databaseTO ROLEathena_connector_role; GRANT SELECT ON ALL TABLES IN DATABASEyour_databaseTO ROLEathena_connector_role; 授予身份验证权限。要向用户分配公有密钥,您必须具有以下角色或权限之一:
-
用户的
MODIFY PROGRAMMATIC AUTHENTICATION METHODS或OWNERSHIP权限。 -
SECURITYADMIN角色或更高层级角色。
使用以下命令授予必要权限以分配公有密钥。
GRANT MODIFY PROGRAMMATIC AUTHENTICATION METHODS ON USERathena_connector_userTO ROLEyour_admin_role;-
-
使用以下命令将公有密钥分配给 Snowflake 用户。
ALTER USERathena_connector_userSET RSA_PUBLIC_KEY='RSAkey';使用以下命令验证公有密钥是否已成功分配给该用户。
DESC USERathena_connector_user;
-
将私有密钥存储在 AWS Secrets Manager 中
将私有密钥转换为连接器要求的格式。
# Read private key content cat rsa_key.p8-
在 AWS 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 凭据存储在 AWS Secrets Manager 中以供连接器使用。
在 Snowflake 创建安全集成
在 Snowflake 中执行以下 SQL 命令创建 Snowflake OAuth 安全集成。
CREATE SECURITY INTEGRATIONmy_snowflake_oauth_integration_aTYPE = 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 天)。
-
检索 OAuth 客户端密钥
-
运行以下 SQL 命令来获取客户端凭证。
DESC SECURITY INTEGRATION 'MY_SNOWFLAKE_OAUTH_INTEGRATION_A'; 检索 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 客户端。
-
授权用户并检索授权码
在浏览器中打开以下 URL。
https://<your_account>.snowflakecomputing.com/oauth/authorize?client_id=<OAUTH_CLIENT_ID>&response_type=code&redirect_uri=https://localhost:8080/oauth/callback完成授权流程。
-
使用 Snowflake 凭证登录。
-
授予所需的权限。您将被重定向到带有授权码的回调 URI。
-
从重定向 URL 中复制代码参数来提取授权码。
https://localhost:8080/oauth/callback?code=<authorizationcode>注意
该授权码仅在有限时间内有效,而且只能使用一次。
将 OAuth 凭证存储在 AWS Secrets Manager 中
在 AWS 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。