通过 Snowflake 进行身份验证
您可以将 Amazon Athena Snowflake 连接器配置为使用密钥对身份验证或 OAuth 身份验证方法,来连接 Snowflake 数据仓库。这两种方法都提供对 Snowflake 的安全访问,并且无需在连接字符串中存储密码。
-
密钥对身份验证:此方法使用 RSA 公有或私有密钥对通过 Snowflake 进行身份验证。私有密钥会对身份验证请求进行数字签名,而相应的公有密钥则会在 Snowflake 中注册以供验证。此方法消除了存储密码的需要。
-
OAuth 身份验证:此方法使用授权令牌和刷新令牌通过 Snowflake 进行身份验证。它支持自动令牌刷新,因此适用于长时间运行的应用程序。
有关更多信息,请参阅 Snowfla ke 用户指南中的 Key-pair authentication
先决条件
在开始之前,请满足以下先决条件:
-
具有管理权限的 Snowflake 账户访问权限。
-
专门用于 Athena 连接器的 Snowflake 用户账户。
-
用于密钥对身份验证的 OpenSSL 或等效密钥生成工具。
-
Amazon Secrets Manager 访问权限,用于创建和管理密钥。
-
用于完成 OAuth 身份验证的 OAuth 流程的 Web 浏览器。
配置密钥对身份验证
此过程包括生成 RSA 密钥对、使用公有密钥配置您的 Snowflake 账户,以及将私有密钥安全地存储在 Amazon Secrets Manager 中。以下步骤将指导您创建加密密钥、设置必要的 Snowflake 权限以及配置 Amazon 凭证以实现流畅的身份验证。
生成 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 USER
athena_connector_user
; -- Grant necessary privileges GRANT USAGE ON WAREHOUSEyour_warehouse
TO ROLEathena_connector_role
; GRANT USAGE ON DATABASEyour_database
TO ROLEathena_connector_role
; GRANT SELECT ON ALL TABLES IN DATABASEyour_database
TO ROLEathena_connector_role
; 授予身份验证权限。要向用户分配公有密钥,您必须具有以下角色或权限之一:
-
用户的
MODIFY PROGRAMMATIC AUTHENTICATION METHODS
或OWNERSHIP
权限。 -
SECURITYADMIN
角色或更高层级角色。
使用以下命令授予必要权限以分配公有密钥。
GRANT MODIFY PROGRAMMATIC AUTHENTICATION METHODS ON USER
athena_connector_user
TO ROLEyour_admin_role
;-
-
使用以下命令将公有密钥分配给 Snowflake 用户。
ALTER USER
athena_connector_user
SET RSA_PUBLIC_KEY='RSAkey
';使用以下命令验证公有密钥是否已成功分配给该用户。
DESC USER
athena_connector_user
;
-
将私有密钥存储在 Amazon Secrets Manager 中
将私有密钥转换为连接器要求的格式。
# Read private key content cat rsa_key.p8
-
在 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 中以供连接器使用。
在 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 天)。
-
检索 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 凭证存储在 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。