使用 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. 在 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。