驗證是指一方建立其身分以使第二方滿意的過程。多因素驗證 (MFA) 是指在驗證過程中,使用多個驗證值(或「因素」)。MFA 比單因素/單因素驗證 (1FA/SFA) 提供更高的安全性,後者僅使用一種驗證方法,例如密碼。MFA 啟用其他驗證方法,例如使用多個密碼進行驗證,或使用智慧卡、安全金鑰和生物辨識讀取器等裝置進行驗證。
MySQL 包含對多因素驗證的支援。此功能包含需要最多三個驗證值的 MFA 形式。也就是說,MySQL 帳戶管理除了現有的 1FA 支援之外,還支援使用 2FA 或 3FA 的帳戶。
當用戶端嘗試使用單因素帳戶連線至 MySQL 伺服器時,伺服器會叫用帳戶定義所指示的驗證外掛程式,並根據外掛程式是否報告成功或失敗來接受或拒絕連線。
對於具有多個驗證因素的帳戶,過程類似。伺服器會依照帳戶定義中列出的順序叫用驗證外掛程式。如果外掛程式報告成功,則如果外掛程式是最後一個,伺服器會接受連線,如果還有剩餘的外掛程式,則繼續叫用下一個外掛程式。如果任何外掛程式報告失敗,則伺服器會拒絕連線。
以下各節將更詳細地說明 MySQL 中的多因素驗證。
驗證因素通常包括下列類型的資訊
您知道的某些事物,例如機密密碼或通行短語。
您擁有的某些事物,例如安全金鑰或智慧卡。
您的某些事物;也就是說,生物辨識特徵,例如指紋或臉部掃描。
「您知道的某些事物」因素類型依賴於在驗證過程的兩端都保密的資訊。不幸的是,機密資訊可能會被洩露:有人可能會看到您輸入密碼,或使用網路釣魚攻擊欺騙您,伺服器端儲存的密碼可能會因安全性漏洞而洩露,等等。使用多個密碼可以提高安全性,但每個密碼仍可能被洩露。使用其他因素類型可以提高安全性,並降低洩露風險。
在 MySQL 中實作多因素驗證包含下列元素
authentication_policy
系統變數控制可以使用多少個驗證因素以及每個因素允許的驗證類型。也就是說,它限制了CREATE USER
和ALTER USER
陳述式關於多因素驗證的限制。CREATE USER
和ALTER USER
具有語法,可讓您為新帳戶指定多種驗證方法,以及新增、修改或刪除現有帳戶的驗證方法。如果帳戶使用 2FA 或 3FA,則mysql.user
系統表格會在User_attributes
欄中儲存關於其他驗證因素的資訊。為了讓需要多重密碼的帳戶能夠驗證連線到 MySQL 伺服器,用戶端程式提供了
--password1
、--password2
和--password3
選項,允許指定最多三個密碼。對於使用 C API 的應用程式,mysql_options4()
C API 函式的MYSQL_OPT_USER_PASSWORD
選項提供了相同的功能。伺服器端的
authentication_webauthn
外掛程式啟用使用裝置進行驗證的功能。這個伺服器端、基於裝置的驗證外掛程式僅包含在 MySQL Enterprise Edition 發行版本中。它不包含在 MySQL 社群發行版本中。然而,用戶端authentication_webauthn_client
外掛程式則包含在所有發行版本中,包括社群發行版本。這使得任何發行版本的用戶端都能連線到使用authentication_webauthn
在伺服器上進行驗證的帳戶。請參閱第 8.4.1.11 節,「WebAuthn 可插拔驗證」。如果
authentication_webauthn
是帳戶使用的唯一驗證外掛程式,它也啟用無密碼驗證。請參閱WebAuthn 無密碼驗證。多因素驗證可以使用非 WebAuthn 的 MySQL 驗證方法、WebAuthn 驗證方法,或兩者的組合。
這些權限允許使用者執行某些受限的多因素驗證相關操作。
擁有
AUTHENTICATION_POLICY_ADMIN
權限的使用者不受authentication_policy
系統變數施加的約束。(對於原本不允許的語句,會出現警告)。PASSWORDLESS_USER_ADMIN
權限允許建立無密碼驗證帳戶以及複製它們的操作。
authentication_policy
系統變數定義多因素驗證原則。具體而言,它定義了帳戶可以擁有(或必須擁有)多少個驗證因素,以及每個因素可以使用的驗證方法。
authentication_policy
的值是一個以逗號分隔的 1 個、2 個或 3 個元素的列表。列表中的每個元素都對應一個驗證因素,可以是驗證外掛程式名稱、星號 (*
)、空白或遺失。(例外:元素 1 不能為空白或遺失)。整個列表用單引號括起來。例如,以下 authentication_policy
值包含星號、驗證外掛程式名稱和空白元素
authentication_policy = '*,authentication_webauthn,'
星號 (*
) 表示需要驗證方法,但允許任何方法。空白元素表示驗證方法是可選的,並且允許任何方法。遺失元素(沒有星號、空白元素或驗證外掛程式名稱)表示不允許驗證方法。當指定外掛程式名稱時,在建立或修改帳戶時,該驗證方法是相應因素的必要方法。
預設的 authentication_policy
值為 '*,,'
(一個星號和兩個空白元素),表示需要第一個因素,並可選擇允許第二個和第三個因素。因此,預設的 authentication_policy
值與現有的 1FA 帳戶向後相容,但也允許建立或修改帳戶以使用 2FA 或 3FA。
擁有 AUTHENTICATION_POLICY_ADMIN
權限的使用者不受 authentication_policy
設定施加的約束。(對於原本不允許的語句,會出現警告)。
authentication_policy
值可以在選項檔案中定義,或使用 SET GLOBAL
語句指定。
SET GLOBAL authentication_policy='*,*,';
有一些規則管理 authentication_policy
值的定義方式。請參閱 authentication_policy
系統變數描述以了解這些規則的完整說明。下表提供了一些 authentication_policy
範例值和每個值建立的原則。
表 8.11:範例 authentication_policy 值
authentication_policy 值 | 有效原則 |
---|---|
'*' |
僅允許建立或變更具有一個因素的帳戶。 |
'*,*' |
僅允許建立或變更具有兩個因素的帳戶。 |
'*,*,*' |
僅允許建立或變更具有三個因素的帳戶。 |
'*,' |
允許建立或變更具有一個或兩個因素的帳戶。 |
'*,,' |
允許建立或變更具有一個、兩個或三個因素的帳戶。 |
'*,*,' |
允許建立或變更具有兩個或三個因素的帳戶。 |
'*, |
允許建立或變更具有兩個因素的帳戶,其中第一個因素可以是任何驗證方法,而第二個因素必須是指定的外掛程式。 |
' |
允許建立或變更具有兩個或三個因素的帳戶,其中第一個因素必須是指定的外掛程式。 |
' |
允許建立或變更具有一個或兩個因素的帳戶,其中第一個因素必須是指定的外掛程式。 |
' |
允許建立或變更具有三個因素的帳戶,其中這些因素必須使用指定的外掛程式。 |
預設情況下,MySQL 使用多因素驗證原則,該原則允許第一個因素使用任何驗證外掛程式,並可選擇允許第二個和第三個驗證因素。此原則可配置;有關詳細資訊,請參閱設定多因素驗證原則。
不允許將任何內部憑證儲存外掛程式 (caching_sha2_password
或 mysql_native_password
) 用於因素 2 或 3。
假設您希望帳戶先使用 caching_sha2_password
外掛程式進行驗證,然後使用 authentication_ldap_sasl
SASL LDAP 外掛程式進行驗證。(這假設 LDAP 驗證已按照第 8.4.1.7 節,「LDAP 可插拔驗證」中所述設定,並且該使用者在 LDAP 目錄中擁有與範例中顯示的驗證字串對應的條目。) 使用類似如下的語句建立帳戶
CREATE USER 'alice'@'localhost'
IDENTIFIED WITH caching_sha2_password
BY 'sha2_password'
AND IDENTIFIED WITH authentication_ldap_sasl
AS 'uid=u1_ldap,ou=People,dc=example,dc=com';
為了連線,使用者必須提供兩個密碼。為了讓需要多重密碼的帳戶能夠驗證連線到 MySQL 伺服器,用戶端程式提供了 --password1
、--password2
和 --password3
選項,允許指定最多三個密碼。這些選項與 --password
選項類似,因為它們可以在命令列上的選項後面帶有密碼值(這是不安全的),或者如果沒有密碼值,則會提示使用者輸入密碼。對於剛建立的帳戶,因素 1 和 2 採用密碼,因此使用 mysql 用戶端調用 --password1
和 --password2
選項。mysql 會依次提示輸入每個密碼
$> mysql --user=alice --password1 --password2
Enter password: (enter factor 1 password)
Enter password: (enter factor 2 password)
假設您想新增第三個驗證因素。這可以透過刪除並重新建立具有第三個因素的使用者,或使用 ALTER USER
語法來實現。兩種方法如下所示user
ADD factor
DROP USER 'alice'@'localhost';
CREATE USER 'alice'@'localhost'
IDENTIFIED WITH caching_sha2_password
BY 'sha2_password'
AND IDENTIFIED WITH authentication_ldap_sasl
AS 'uid=u1_ldap,ou=People,dc=example,dc=com'
AND IDENTIFIED WITH authentication_webauthn;
ADD
語法包括因素編號和 factor
FACTOR
關鍵字
ALTER USER 'alice'@'localhost' ADD 3 FACTOR IDENTIFIED WITH authentication_webauthn;
ALTER USER
語法允許刪除因素。以下範例刪除了先前範例中新增的第三個因素 (user
DROP factor
authentication_webauthn
)
ALTER USER 'alice'@'localhost' DROP 3 FACTOR;
ALTER USER
語法允許變更特定因素的外掛程式或驗證字串,前提是該因素存在。以下範例修改了第二個因素,將驗證方法從 user
MODIFY factor
authentication_ldap_sasl
變更為 authetication_webauthn
ALTER USER 'alice'@'localhost' MODIFY 2 FACTOR IDENTIFIED WITH authentication_webauthn;
使用 SHOW CREATE USER
來檢視為帳戶定義的驗證方法。
SHOW CREATE USER 'u1'@'localhost'\G
*************************** 1. row ***************************
CREATE USER for u1@localhost: CREATE USER `u1`@`localhost`
IDENTIFIED WITH 'caching_sha2_password' AS 'sha2_password'
AND IDENTIFIED WITH 'authentication_authn' REQUIRE NONE
PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY
DEFAULT PASSWORD REUSE INTERVAL DEFAULT PASSWORD REQUIRE
CURRENT DEFAULT