

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

# 使用 Snowflake 進行身分驗證
<a name="connectors-snowflake-authentication"></a>

您可以設定 Amazon Athena Snowflake 連接器，讓其使用金鑰對身分驗證或 OAuth 身分驗證方法來連線至 Snowflake 資料倉儲。這兩種方法都能安全存取 Snowflake，而無需在連線字串中存放密碼。
+ **金鑰對身分驗證** – 此方法使用 RSA 公有或私有金鑰對，以進行 Snowflake 的身分驗證。當對應的公有金鑰在 Snowflake 中註冊以進行驗證時，私有金鑰會以數位方式簽署身分驗證請求。此方法無需密碼儲存。
+ **OAuth 身分驗證** –此方法使用授權權杖和重新整理權杖，以進行 Snowflake 的身分驗證。此方法支援自動權杖重新整理，因此適用於長時間執行的應用程式。

如需詳細資訊，請參閱《Snowflake 使用者指南》中的[金鑰對身分驗證](https://docs.snowflake.com/en/user-guide/key-pair-auth)和 [OAuth 身分驗證](https://docs.snowflake.com/en/user-guide/oauth-custom)。

## 先決條件
<a name="connectors-snowflake-authentication-prerequisites"></a>

開始之前，請先完成以下先決條件：
+ 擁有管理權限的 Snowflake 帳戶存取。
+ 專屬於 Athena 連接器的 Snowflake 使用者帳戶。
+ OpenSSL 或同等金鑰產生工具，以進行金鑰對身份驗證。
+ AWS Secrets Manager 建立和管理秘密的存取權。
+ Web 瀏覽器，以完成進行 OAuth 身分驗證的 OAuth 流程。

## 設定金鑰對身分驗證
<a name="connectors-snowflake-keypair-authentication"></a>

此程序包括產生 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 身分驗證的應用程式才能存取私有金鑰。

1. **擷取 Snowflake 的公有金鑰內容 (不含分隔符號)**

   ```
   # Extract public key content (remove BEGIN/END lines and newlines)
   cat rsa_key.pub | grep -v "BEGIN\|END" | tr -d '\n'
   ```

   儲存此輸出，因為您在後續步驟中需要此輸出。

1. **設定 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}};
      ```

   1. 授予身分驗證權限。若要將公有金鑰指派給使用者，您必須擁有下列其中一個角色或權限。
      + 使用者的 `MODIFY PROGRAMMATIC AUTHENTICATION METHODS` 或 `OWNERSHIP` 權限。
      + `SECURITYADMIN` 角色或更高權限。

      授予必要權限，以使用下列命令指派公有金鑰。

      ```
      GRANT MODIFY PROGRAMMATIC AUTHENTICATION METHODS ON USER {{athena_connector_user}} TO ROLE {{your_admin_role}};
      ```

   1. 使用下列命令，將公有金鑰指派給 Snowflake 使用者。

      ```
      ALTER USER {{athena_connector_user}} SET RSA_PUBLIC_KEY='{{RSAkey}}';
      ```

      使用以下命令，驗證公有金鑰是否已成功指派給使用者。

      ```
      DESC USER {{athena_connector_user}};
      ```

1. **在 中存放私有金鑰 AWS Secrets Manager**

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

      ```
      # Read private key content
      cat rsa_key.p8
      ```

   1.  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 身分驗證
<a name="connectors-snowflake-oauth-authentication"></a>

此身分驗證方法可利用自動憑證重新整理功能，啟用對 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 天，以秒為單位)。

1. **擷取 OAuth 用戶端秘密**

   1. 請執行下列 SQL 命令，以取得用戶端憑證。

      ```
      DESC SECURITY INTEGRATION '{{MY_SNOWFLAKE_OAUTH_INTEGRATION_A}}';
      ```

   1. 擷取 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 用戶端。

1. **授權使用者並擷取授權碼**

   1. 在瀏覽器中開啟下列 URL。

      ```
      https://{{<your_account>}}.snowflakecomputing.com/oauth/authorize?client_id={{<OAUTH_CLIENT_ID>}}&response_type=code&redirect_uri=https://localhost:8080/oauth/callback
      ```

   1. 完成授權流程。

      1. 使用您的 Snowflake 憑證登入。

      1. 授予所需的許可。您會被重新導向至具有授權碼的回呼 URI。

   1. 從重新導向 URL 複製程式碼參數，擷取授權碼。

      ```
      https://localhost:8080/oauth/callback?code={{<authorizationcode>}}
      ```
**注意**  
授權碼有效期限有限，且只能使用一次。

1. **在 中存放 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，並且您可以在[建立資料來源連線](connect-to-a-data-source.md)時，於 Glue 連線中使用該 ARN。