文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  WebAuthn 可插拔式驗證

8.4.1.10 WebAuthn 可插拔式驗證

注意

WebAuthn 驗證是 MySQL 企業版(商業產品)中包含的擴充功能。若要進一步瞭解商業產品,請參閱 https://mysql.dev.org.tw/products/

MySQL 企業版支援一種驗證方法,可讓使用者使用 WebAuthn 驗證來驗證至 MySQL 伺服器。

WebAuthn 代表 Web Authentication,這是一種由全球資訊網協會 (W3C) 發布的網頁標準,以及將以 FIDO 為基礎的驗證新增至支援的瀏覽器和平台的網頁應用程式 API。

WebAuthn 可插拔式驗證取代了已棄用的 FIDO 可插拔式驗證。WebAuthn 可插拔式驗證同時支援 FIDO 和 FIDO2 裝置。

WebAuthn 可插拔式驗證提供以下功能

  • WebAuthn 可使用智慧卡、安全金鑰和生物辨識讀取器等裝置來驗證至 MySQL 伺服器。

  • 因為驗證可以透過提供密碼以外的方式進行,所以 WebAuthn 可實現無密碼驗證。

  • 另一方面,裝置驗證通常與密碼驗證結合使用,因此 WebAuthn 驗證可有效地用於使用多因素驗證的 MySQL 帳戶;請參閱第 8.2.18 節「多因素驗證」

下表顯示外掛程式和程式庫檔案名稱。您的系統上的檔案名稱後綴可能不同。常見的後綴是 Unix 和類似 Unix 系統的 .so 和 Windows 的 .dll。檔案必須位於 plugin_dir 系統變數所命名的目錄中。如需安裝資訊,請參閱安裝 WebAuthn 可插拔式驗證

表 8.26 WebAuthn 驗證的外掛程式和程式庫名稱

外掛程式或檔案 外掛程式或檔案名稱
伺服器端外掛程式 authentication_webauthn
用戶端外掛程式 authentication_webauthn_client
程式庫檔案 authentication_webauthn.soauthentication_webauthn_client.so

注意

在使用伺服器端或用戶端 WebAuthn 驗證外掛程式的系統上,必須提供 libfido2 程式庫。

伺服器端 WebAuthn 驗證外掛程式僅包含在 MySQL 企業版中。它不包含在 MySQL 社群發行版本中。用戶端外掛程式包含在所有發行版本中,包括社群發行版本,這可讓任何發行版本的用戶端連線到已載入伺服器端外掛程式的伺服器。

以下章節提供特定於 WebAuthn 可插拔式驗證的安裝和使用資訊

如需有關 MySQL 中可插拔式驗證的一般資訊,請參閱第 8.2.17 節「可插拔式驗證」

安裝 WebAuthn 可插拔式驗證

本節說明如何安裝伺服器端 WebAuthn 驗證外掛程式。如需有關安裝外掛程式的一般資訊,請參閱第 7.6.1 節「安裝和解除安裝外掛程式」

為了讓伺服器可以使用,外掛程式庫檔案必須位於 MySQL 外掛程式目錄中(由 plugin_dir 系統變數指定的目錄)。如有必要,請在伺服器啟動時設定 plugin_dir 的值,以設定外掛程式目錄的位置。

伺服器端外掛程式庫檔案的基本名稱為 authentication_webauthn。檔案名稱後綴會因平台而異(例如,Unix 和類 Unix 系統為 .so,Windows 為 .dll)。

在安裝伺服器端外掛程式之前,請為依賴方 ID (relying party ID) 定義一個唯一的名稱(用於裝置註冊和驗證),也就是 MySQL 伺服器。使用 --loose-authentication-webauthn-rp-id=value 選項啟動伺服器。此處的範例將 mysql.com 指定為依賴方 ID。請將此值替換為符合您需求的值。

$> mysqld [options] --loose-authentication-webauthn-rp-id=mysql.com
注意

對於複製,如果使用者預期會連線到多個伺服器,請在所有節點上使用相同的 authentication_webauthn_rp_id 值。

若要在伺服器啟動時定義依賴方並載入外掛程式,請使用 --plugin-load-add 選項來命名包含外掛程式的程式庫檔案,並根據您的平台調整 .so 後綴。使用此外掛程式載入方法,每次伺服器啟動時都必須提供此選項。

$> mysqld [options] 
    --loose-authentication-webauthn-rp-id=mysql.com
    --plugin-load-add=authentication_webauthn.so

若要定義依賴方並載入外掛程式,請在您的 my.cnf 檔案中放入如下的行,並根據您的平台調整 .so 後綴

[mysqld]
plugin-load-add=authentication_webauthn.so
authentication_webauthn_rp_id=mysql.com

修改 my.cnf 後,重新啟動伺服器以使新設定生效。

或者,若要在執行階段載入外掛程式,請使用以下陳述式,並根據您的平台調整 .so 後綴

INSTALL PLUGIN authentication_webauthn
  SONAME 'authentication_webauthn.so';

INSTALL PLUGIN 會立即載入外掛程式,並將其註冊到 mysql.plugins 系統表中,使伺服器在每次後續正常啟動時載入它,而無需 --plugin-load-add

若要驗證外掛程式安裝,請檢查 Information Schema PLUGINS 表格,或使用 SHOW PLUGINS 陳述式(請參閱 第 7.6.2 節,「取得伺服器外掛程式資訊」)。例如

mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
       FROM INFORMATION_SCHEMA.PLUGINS
       WHERE PLUGIN_NAME = 'authentication_webauthn';
+-------------------------+---------------+
| PLUGIN_NAME             | PLUGIN_STATUS |
+-------------------------+---------------+
| authentication_webauthn | ACTIVE        |
+-------------------------+---------------+

如果外掛程式初始化失敗,請檢查伺服器錯誤記錄檔以取得診斷訊息。

若要將 MySQL 帳戶與 WebAuthn 驗證外掛程式建立關聯,請參閱使用 WebAuthn 驗證

使用 WebAuthn 驗證

WebAuthn 驗證通常用於多因素驗證的情境中(請參閱 第 8.2.18 節,「多因素驗證」)。本節說明如何使用 authentication_webauthn 外掛程式將基於 WebAuthn 裝置的驗證納入多因素帳戶中。

以下討論假設伺服器正在執行已啟用伺服器端 WebAuthn 驗證外掛程式的情況,如 安裝 WebAuthn 可插拔驗證所述,並且用戶端 WebAuthn 外掛程式在用戶端主機上的外掛程式目錄中可用。

注意

在 Windows 上,只有當用戶端程序以具有管理員權限的使用者身分執行時,WebAuthn 驗證才能運作。可能還需要將您的 FIDO/FIDO2 裝置位置新增至用戶端主機的 PATH 環境變數。

此外,假設 WebAuthn 驗證與非 WebAuthn 驗證結合使用(這表示 2FA 或 3FA 帳戶)。WebAuthn 也可以單獨使用,以建立以無密碼方式驗證的 1FA 帳戶。在這種情況下,設定程序會略有不同。如需指示,請參閱 WebAuthn 無密碼驗證

設定為使用 authentication_webauthn 外掛程式的帳戶會與 Fast Identity Online (FIDO/FIDO2) 裝置建立關聯。因此,在執行 WebAuthn 驗證之前,需要執行一次性的裝置註冊步驟。裝置註冊程序具有以下特性

  • 與帳戶關聯的任何 FIDO/FIDO2 裝置都必須先註冊,才能使用該帳戶。

  • 註冊要求 FIDO/FIDO2 裝置在用戶端主機上可用,否則註冊會失敗。

  • 使用者應在註冊期間,在收到提示時執行適當的 FIDO/FIDO2 裝置動作(例如,觸碰裝置或執行生物識別掃描)。

  • 若要執行裝置註冊,用戶端使用者必須叫用 mysql 用戶端程式,並指定 --register-factor 選項,以指定正在註冊裝置的一個或多個因素。例如,如果帳戶設定為將 WebAuthn 作為第二個驗證因素使用,則使用者會叫用 mysql,並使用 --register-factor=2 選項。

  • 如果使用者帳戶設定為使用 authentication_webauthn 外掛程式作為第二個或第三個因素,則必須先成功驗證所有先前的因素,才能繼續執行註冊步驟。

  • 伺服器會根據使用者帳戶中的資訊知道 FIDO/FIDO2 裝置是否需要註冊,或是已經註冊。當用戶端程式連線時,如果裝置必須註冊,伺服器會將用戶端工作階段置於沙箱模式,以便必須先執行註冊,才能執行任何其他操作。用於 FIDO/FIDO2 裝置註冊的沙箱模式與用於處理過期密碼的模式類似。請參閱 第 8.2.16 節,「伺服器處理過期密碼」

  • 在沙箱模式中,除了 ALTER USER 之外,不允許任何其他陳述式。註冊是使用此陳述式的形式來執行的。當使用 --register-factor 選項叫用時,mysql 用戶端會產生執行註冊所需的 ALTER USER 陳述式。完成註冊後,伺服器會將工作階段移出沙箱模式,且用戶端可以正常繼續。如需關於產生的 ALTER USER 陳述式的資訊,請參閱 --register-factor 描述。

  • 當帳戶的裝置註冊完成後,伺服器會更新該帳戶的 mysql.user 系統表格列,以更新裝置註冊狀態,並儲存公開金鑰和認證 ID。(伺服器不會在 FIDO2 裝置註冊後保留認證 ID。)

  • 註冊步驟只能由帳戶命名的使用者執行。如果一個使用者嘗試為另一個使用者執行註冊,則會發生錯誤。

  • 使用者應在註冊和驗證期間使用相同的 FIDO/FIDO2 裝置。如果在用戶端主機上註冊 FIDO/FIDO2 裝置後,裝置重設或插入不同的裝置,驗證會失敗。在這種情況下,必須取消註冊與帳戶關聯的裝置,且必須再次執行註冊。

假設您希望帳戶先使用 caching_sha2_password 外掛程式進行驗證,然後使用 authentication_webauthn 外掛程式進行驗證。請使用如下的陳述式建立多因素帳戶

CREATE USER 'u2'@'localhost'
  IDENTIFIED WITH caching_sha2_password
    BY 'sha2_password'
  AND IDENTIFIED WITH authentication_webauthn;

若要連線,請提供因素 1 密碼以滿足該因素的驗證,並啟動 FIDO/FIDO2 裝置的註冊,請將 --register-factor 設定為因素 2。

$> mysql --user=u2 --password1 --register-factor=2
Enter password: (enter factor 1 password)
Please insert FIDO device and follow the instruction. Depending on the device, 
you may have to perform gesture action multiple times.
1. Perform gesture action (Skip this step if you are prompted to enter device PIN).
2. Enter PIN for token device:
3. Perform gesture action for registration to complete.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8

在接受因素 1 密碼後,用戶端工作階段會進入沙箱模式,以便可以執行因素 2 的裝置註冊。在註冊期間,系統會提示您執行適當的 FIDO/FIDO2 裝置動作,例如觸碰裝置或執行生物識別掃描。

或者,您可以叫用 mysql 用戶端程式,並指定 --plugin-authentication-webauthn-client-preserve-privacy 選項。如果 FIDO2 裝置針對指定的依賴方 (RP) ID 包含多個可探索的認證(常駐金鑰),則此選項允許選擇要用於判斷提示的金鑰。依預設,此選項設定為 FALSE,表示應使用指定 RP ID 的所有常駐金鑰建立判斷提示。當使用此選項指定時,mysql 會提示您輸入裝置 PIN,並列出指定 RP ID 的所有可用認證。選取一個金鑰,然後執行其餘的線上指示以完成驗證。此處的範例假設 mysql.com 是有效的 RP ID

$> mysql --user=u2 --password1 --register-factor=2
     --plugin-authentication-webauthn-client-preserve-privacy
Enter password: (enter factor 1 password)
Enter PIN for token device: 
Found following credentials for RP ID: mysql.com
[1]`u2`@`127.0.0.1`
[2]`u2`@`%`
Please select one(1...N):
1
Please insert FIDO device and perform gesture action for authentication to complete.
+----------------+
| CURRENT_USER() |
+----------------+
| u2@127.0.0.1   |
+----------------+

--plugin-authentication-webauthn-client-preserve-privacy 選項對不支援常駐金鑰功能的 FIDO 裝置沒有影響。

當註冊程序完成後,允許連線到伺服器。

注意

在註冊後,允許連線到伺服器,無論帳戶的驗證鏈中是否有其他驗證因素。例如,如果前一個範例中的帳戶定義為具有第三個驗證因素(使用非 WebAuthn 驗證),則在成功註冊後,將允許連線,而無需驗證第三個因素。不過,後續的連線將需要驗證所有三個因素。

WebAuthn 無密碼驗證

本節說明如何單獨使用 WebAuthn 來建立以無密碼方式驗證的 1FA 帳戶。在此情境中,「無密碼」表示驗證會發生,但使用密碼以外的方法,例如安全金鑰或生物識別掃描。這不是指使用基於密碼的驗證外掛程式(密碼為空)的帳戶。那種「無密碼」完全不安全,因此不建議使用。

使用 authentication_webauthn 外掛程式來實現無密碼驗證時,適用以下先決條件

若要使用 authentication_webauthn 作為無密碼驗證方法,必須使用 authentication_webauthn 作為第一個因素驗證方法來建立帳戶。也必須為第一個因素指定 INITIAL AUTHENTICATION IDENTIFIED BY 子句(第二或第三個因素不支援此子句)。此子句指定是否將隨機產生的密碼或使用者指定的密碼用於 FIDO/FIDO2 裝置註冊。裝置註冊後,伺服器會刪除密碼並修改帳戶,使 authentication_webauthn 成為唯一的驗證方法(1FA 方法)。

所需的 CREATE USER 語法如下

CREATE USER user
  IDENTIFIED WITH authentication_webauthn
  INITIAL AUTHENTICATION IDENTIFIED BY {RANDOM PASSWORD | 'auth_string'};

以下範例使用 RANDOM PASSWORD 語法

mysql> CREATE USER 'u1'@'localhost'
         IDENTIFIED WITH authentication_webauthn
         INITIAL AUTHENTICATION IDENTIFIED BY RANDOM PASSWORD;
+------+-----------+----------------------+-------------+
| user | host      | generated password   | auth_factor |
+------+-----------+----------------------+-------------+
| u1   | localhost | 9XHK]M{l2rnD;VXyHzeF |           1 |
+------+-----------+----------------------+-------------+

若要執行註冊,使用者必須使用與 INITIAL AUTHENTICATION IDENTIFIED BY 子句相關聯的密碼(隨機產生的密碼或 'auth_string' 值)向伺服器進行驗證。如果帳戶是按照剛才顯示的方式建立的,使用者會執行此命令並在提示符號中貼上先前隨機產生的密碼(9XHK]M{l2rnD;VXyHzeF

$> mysql --user=u1 --password --register-factor=2
Enter password:
Please insert FIDO device and follow the instruction. Depending on the device, 
you may have to perform gesture action multiple times.
1. Perform gesture action (Skip this step if you are prompted to enter device PIN).
2. Enter PIN for token device:
3. Perform gesture action for registration to complete.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10

或者,使用 --plugin-authentication-webauthn-client-preserve-privacy 選項來選擇可探索的認證進行驗證。

$> mysql --user=u1 --password --register-factor=2
     --plugin-authentication-webauthn-client-preserve-privacy
Enter password:
Enter PIN for token device: 
Found following credentials for RP ID: mysql.com
[1]`u1`@`127.0.0.1`
[2]`u1`@`%`
Please select one(1...N):
1
Please insert FIDO device and perform gesture action for authentication to complete.
+----------------+
| CURRENT_USER() |
+----------------+
| u1@127.0.0.1   |
+----------------+

使用選項 --register-factor=2,因為 INITIAL AUTHENTICATION IDENTIFIED BY 子句目前充當第一個因素驗證方法。因此,使用者必須使用第二個因素提供臨時密碼。成功註冊後,伺服器會移除臨時密碼,並修改 mysql.user 系統表中的帳戶條目,將 authentication_webauthn 列為唯一的 (1FA) 驗證方法。

建立無密碼驗證帳戶時,請務必在 CREATE USER 陳述式中包含 INITIAL AUTHENTICATION IDENTIFIED BY 子句。伺服器接受沒有此子句的陳述式,但產生的帳戶無法使用,因為沒有任何方法可以連線到伺服器來註冊裝置。假設您執行如下的陳述式

CREATE USER 'u2'@'localhost'
  IDENTIFIED WITH authentication_webauthn;

後續使用帳戶連線的嘗試會失敗,如下所示

$> mysql --user=u2 --skip-password
mysql: [Warning] Using a password on the command line can be insecure.
No FIDO device on client host.
ERROR 1 (HY000): Unknown MySQL error
注意

無密碼驗證是使用通用第二因素 (U2F) 通訊協定實現的,該通訊協定不支援額外的安全措施,例如在要註冊的裝置上設定 PIN 碼。因此,裝置持有者有責任確保裝置以安全的方式處理。

WebAuthn 的裝置取消註冊

可以取消註冊與 MySQL 帳戶相關聯的 FIDO/FIDO2 裝置。在多種情況下,這可能是可取的或必要的

  • FIDO/FIDO2 裝置將被另一個不同的裝置取代。必須取消註冊先前的裝置,並註冊新的裝置。

    在這種情況下,帳戶擁有者或任何具有 CREATE USER 權限的使用者都可以取消註冊該裝置。帳戶擁有者可以註冊新裝置。

  • FIDO/FIDO2 裝置被重設或遺失。在取消註冊目前的裝置並執行新的註冊之前,驗證嘗試將會失敗。

    在這種情況下,帳戶擁有者由於無法進行驗證,因此無法取消註冊目前的裝置,必須聯絡 DBA(或任何具有 CREATE USER 權限的使用者)來執行此操作。然後,帳戶擁有者可以重新註冊重設的裝置或註冊新的裝置。

取消註冊 FIDO/FIDO2 裝置可以由帳戶擁有者或任何具有 CREATE USER 權限的使用者完成。使用此語法

ALTER USER user {2 | 3} FACTOR UNREGISTER;

若要重新註冊裝置或執行新的註冊,請參閱 使用 WebAuthn 驗證中的指示。

MySQL 使用者的 WebAuthn 驗證運作方式

本節概述 MySQL 和 WebAuthn 如何協同工作來驗證 MySQL 使用者。如需顯示如何設定 MySQL 帳戶以使用 WebAuthn 驗證外掛程式的範例,請參閱 使用 WebAuthn 驗證

使用 WebAuthn 驗證的帳戶必須先執行初始裝置註冊步驟,然後才能連線到伺服器。裝置註冊後,即可繼續進行驗證。WebAuthn 裝置註冊程序如下:

  1. 伺服器會以 JSON 格式向用戶端傳送隨機挑戰、使用者 ID 和信賴方 ID(唯一識別伺服器的 ID)。信賴方 ID 由 authentication_webauthn_rp_id 系統變數定義。預設值為 mysql.com

  2. 用戶端接收該資訊並將其傳送至用戶端 WebAuthn 驗證外掛程式,然後該外掛程式將其提供給 FIDO/FIDO2 裝置。用戶端也會傳送 1 位元組的功能,其中 RESIDENT_KEYS 位元設定為 ON(如果是 FIDO2 裝置)或 OFF

  3. 在使用者執行適當的裝置操作(例如,觸碰裝置或執行生物特徵掃描)後,FIDO/FIDO2 裝置會產生公用/私密金鑰對、金鑰控制代碼、X.509 憑證和簽章,然後將其傳回伺服器。

  4. 伺服器端 WebAuthn 驗證外掛程式會驗證簽章。驗證成功後,伺服器會將認證 ID(僅適用於 FIDO 裝置)和公用金鑰儲存在 mysql.user 系統表中。

成功執行註冊後,WebAuthn 驗證會遵循此程序:

  1. 伺服器會向用戶端傳送隨機挑戰、使用者 ID、信賴方 ID 和認證。該挑戰會轉換為 URL 安全的 Base64 格式。

  2. 用戶端會將相同的資訊傳送至裝置。用戶端會查詢裝置,以檢查其是否支援用戶端至驗證器通訊協定 (CTAP2) 通訊協定。CTAP2 支援表示裝置可感知 FIDO2 通訊協定。

  3. FIDO/FIDO2 裝置會提示使用者根據註冊期間所做的選擇執行適當的裝置操作。

    如果裝置可感知 FIDO2 通訊協定,裝置會使用裝置中針對給定 RP ID 的所有可用的私密金鑰進行簽署。或者,它也可以提示使用者從清單中選擇一個。如果裝置不具備 FIDO2 功能,它會擷取正確的私密金鑰。

  4. 此操作會解鎖私密金鑰,並簽署挑戰。

  5. 此已簽署的挑戰會傳回伺服器。

  6. 伺服器端 WebAuthn 驗證外掛程式會使用公用金鑰驗證簽章,並回應以指示驗證成功或失敗。