使用 Snowflake 驗證 - Amazon Athena

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 Snowflake 驗證

您可以將 Amazon Athena Snowflake 連接器設定為使用金鑰對身分驗證或 OAuth 身分驗證方法來連線至 Snowflake 資料倉儲。這兩種方法都提供對 Snowflake 的安全存取,無需在連線字串中存放密碼。

  • 金鑰對身分驗證 – 此方法使用 RSA 公有或私有金鑰對向 Snowflake 進行身分驗證。當對應的公有金鑰在 Snowflake 中註冊以進行驗證時,私有金鑰會數位簽署身分驗證請求。此方法消除了密碼儲存。

  • OAuth 身分驗證 – 此方法使用授權字符和重新整理字符來驗證 Snowflake。它支援自動權杖重新整理,使其適用於長時間執行的應用程式。

如需詳細資訊,請參閱 Snowflake 使用者指南中的金鑰對身分驗證OAuth 身分驗證

先決條件

開始之前,請先完成以下先決條件:

  • 具有管理權限的 Snowflake 帳戶存取。

  • 專用於 Athena 連接器的 Snowflake 使用者帳戶。

  • 用於金鑰對身分驗證的 OpenSSL 或同等金鑰產生工具。

  • AWS Secrets Manager 建立和管理秘密的存取權。

  • Web 瀏覽器,以完成 OAuth 身分驗證的 OAuth 流程。

設定金鑰對身分驗證

此程序涉及產生 RSA 金鑰對、使用公有金鑰設定 Snowflake 帳戶,以及安全地存放私有金鑰 AWS Secrets Manager。下列步驟將引導您建立密碼編譯金鑰、設定必要的 Snowflake 許可,以及設定 AWS 登入資料以進行無縫身分驗證。

  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. 在 中存放私有金鑰 AWS Secrets Manager

    1. 將您的私有金鑰轉換為連接器所需的格式。

      # Read private key content cat rsa_key.p8
    2. 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 以供連接器使用。

  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。它可以是 localhost 進行測試。

    • 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 登入資料 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 連線中使用。