使用 Snowflake 進行身分驗證
您可以設定 Amazon Athena Snowflake 連接器,讓其使用金鑰對身分驗證或 OAuth 身分驗證方法來連線至 Snowflake 資料倉儲。這兩種方法都能安全存取 Snowflake,而無需在連線字串中存放密碼。
-
金鑰對身分驗證 – 此方法使用 RSA 公有或私有金鑰對,以進行 Snowflake 的身分驗證。當對應的公有金鑰在 Snowflake 中註冊以進行驗證時,私有金鑰會以數位方式簽署身分驗證請求。此方法無需密碼儲存。
-
OAuth 身分驗證 –此方法使用授權權杖和重新整理權杖,以進行 Snowflake 的身分驗證。此方法支援自動權杖重新整理,因此適用於長時間執行的應用程式。
如需詳細資訊,請參閱《Snowflake 使用者指南》中的金鑰對身分驗證
必要條件
開始之前,請先完成以下先決條件:
-
擁有管理權限的 Snowflake 帳戶存取。
-
專屬於 Athena 連接器的 Snowflake 使用者帳戶。
-
OpenSSL 或同等金鑰產生工具,以進行金鑰對身份驗證。
-
建立和管理秘密的 AWS Secrets Manager 存取權。
-
Web 瀏覽器,以完成進行 OAuth 身分驗證的 OAuth 流程。
設定金鑰對身分驗證
此程序包括產生 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。其可設為 localhost 以用於測試。 -
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>注意
授權碼有效期限有限,且只能使用一次。
在 AWS Secrets Manager 中存放 OAuth 憑證
在 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。