文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


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

8.4.1.11 WebAuthn 可插拔驗證

注意

WebAuthn 驗證是包含在 MySQL 企業版中的延伸功能,屬於商業產品。若要深入了解商業產品,請參閱 https://mysql.dev.org.tw/products/

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

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

WebAuthn 可插拔驗證取代了已淘汰的 FIDO 可插拔驗證。WebAuthn 可插拔驗證同時支援 FIDO 與 FIDO2 裝置。

WebAuthn 可插拔驗證提供下列功能

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

  • 由於驗證可以使用提供密碼以外的其他方式進行,因此 WebAuthn 能夠進行無密碼驗證。

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

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

表 8.27 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(用於裝置註冊和身份驗證)定義一個唯一的名稱,該名稱為 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 作為第二個身份驗證因素,則使用者會叫用具有--register-factor=2選項的mysql

  • 如果使用者帳戶設定為將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   |
+----------------+

由於 INITIAL AUTHENTICATION IDENTIFIED BY 子句目前充當第一個因素驗證方法,因此使用 --register-factor=2 選項。因此,使用者必須使用第二個因素來提供臨時密碼。成功註冊後,伺服器會移除臨時密碼,並修訂 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 由 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 驗證外掛程式會使用公用金鑰驗證簽章,並回應以指示驗證成功或失敗。