MySQL 提供兩個驗證外掛程式,實作使用者帳戶密碼的 SHA-256 雜湊
caching_sha2_password
:實作 SHA-256 驗證(如sha256_password
),但在伺服器端使用快取以獲得更好的效能,並具有更廣泛適用性的額外功能。sha256_password
(已棄用):實作基本 SHA-256 驗證。此功能已棄用,可能會移除,請勿使用此驗證外掛程式。
本節說明快取 SHA-2 驗證外掛程式。如需原始基本(非快取)已棄用外掛程式的相關資訊,請參閱 章節 8.4.1.3,「SHA-256 可插拔驗證」。
在 MySQL 8.4 中,caching_sha2_password
是預設的驗證外掛程式,而非 mysql_native_password
(已棄用)。如需此變更對伺服器運作以及伺服器與用戶端和連接器相容性的影響資訊,請參閱 以 caching_sha2_password 作為慣用驗證外掛程式。
若要使用以 caching_sha2_password
外掛程式進行驗證的帳戶連線至伺服器,您必須使用安全連線或支援使用 RSA 金鑰對進行密碼交換的未加密連線,如本節稍後所述。無論哪種方式,caching_sha2_password
外掛程式都會使用 MySQL 的加密功能。請參閱 章節 8.3,「使用加密連線」。
在名稱 sha256_password
中,「「sha256」」指的是外掛程式用於加密的 256 位元摘要長度。在名稱 caching_sha2_password
中,「「sha2」」更廣泛地指稱 SHA-2 類別的加密演算法,其中 256 位元加密是其中一個實例。後者的名稱選擇為未來擴充可能的摘要長度保留空間,而無需變更外掛程式名稱。
與已棄用的 sha256_password
外掛程式相比,caching_sha2_password
外掛程式具有以下優點
在伺服器端,記憶體內快取可讓先前連線過的使用者再次連線時更快地重新驗證。
無論 MySQL 連結到哪個 SSL 程式庫,都可使用以 RSA 為基礎的密碼交換。
提供對使用 Unix Socket 檔案和共用記憶體協定的用戶端連線的支援。
下表顯示伺服器和用戶端的外掛程式名稱。
表 8.16:SHA-2 驗證的外掛程式和程式庫名稱
外掛程式或檔案 | 外掛程式或檔案名稱 |
---|---|
伺服器端外掛程式 | caching_sha2_password |
用戶端外掛程式 | caching_sha2_password |
程式庫檔案 | 無(外掛程式內建) |
以下各節提供特定於快取 SHA-2 可插拔驗證的安裝和使用資訊
如需 MySQL 中可插拔驗證的一般資訊,請參閱 章節 8.2.17,「可插拔驗證」。
caching_sha2_password
外掛程式以伺服器和用戶端形式存在
伺服器端外掛程式內建於伺服器中,不需要明確載入,也無法藉由解除載入來停用。
用戶端外掛程式內建於
libmysqlclient
用戶端程式庫中,且可供連結libmysqlclient
的任何程式使用。
伺服器端外掛程式使用 sha2_cache_cleaner
稽核外掛程式作為輔助工具,以執行密碼快取管理。sha2_cache_cleaner
與 caching_sha2_password
一樣是內建的,不需要安裝。
要設定使用 caching_sha2_password
外掛程式進行 SHA-256 密碼雜湊的帳戶,請使用以下語句,其中 password
是所需的帳戶密碼
CREATE USER 'sha2user'@'localhost'
IDENTIFIED WITH caching_sha2_password BY 'password';
伺服器會將 caching_sha2_password
外掛程式指派給帳戶,並使用它以 SHA-256 加密密碼,然後將這些值儲存在 mysql.user
系統資料表的 plugin
和 authentication_string
欄位中。
先前的指示並未假設 caching_sha2_password
是預設的身份驗證外掛程式。如果 caching_sha2_password
是預設的身份驗證外掛程式,則可以使用較簡單的 CREATE USER
語法
CREATE USER 'sha2user'@'localhost' IDENTIFIED BY 'password';
預設外掛程式由 authentication_policy
系統變數的值決定;預設值是使用 caching_sha2_password
。
要使用不同的外掛程式,您必須使用 IDENTIFIED WITH
指定它。例如,要指定已棄用的 mysql_native_password
外掛程式,請使用此語句
CREATE USER 'nativeuser'@'localhost'
IDENTIFIED WITH mysql_native_password BY 'password';
caching_sha2_password
支援透過安全傳輸的連線。如果您遵循本節稍後提供的 RSA 設定程序,它也支援透過未加密連線使用 RSA 加密的密碼交換。RSA 支援具有以下特性
在伺服器端,兩個系統變數會命名 RSA 私鑰和公鑰對檔案:
caching_sha2_password_private_key_path
和caching_sha2_password_public_key_path
。如果使用的金鑰檔案名稱與系統變數預設值不同,資料庫管理員必須在伺服器啟動時設定這些變數。伺服器使用
caching_sha2_password_auto_generate_rsa_keys
系統變數來判斷是否自動產生 RSA 金鑰對檔案。請參閱第 8.3.3 節,「建立 SSL 和 RSA 憑證與金鑰」。Caching_sha2_password_rsa_public_key
狀態變數會顯示caching_sha2_password
身份驗證外掛程式使用的 RSA 公鑰值。持有 RSA 公鑰的用戶端可以在連線過程中執行與伺服器基於 RSA 金鑰對的密碼交換,如稍後所述。
對於使用
caching_sha2_password
和基於 RSA 金鑰對的密碼交換進行身份驗證的帳戶連線,伺服器預設不會將 RSA 公鑰傳送給用戶端。用戶端可以使用所需的公鑰的用戶端副本,或從伺服器請求公鑰。使用公鑰的可信任本機副本,可讓用戶端避免用戶端/伺服器協定中的往返,並且比從伺服器請求公鑰更安全。另一方面,從伺服器請求公鑰更方便(不需要管理用戶端檔案),並且在安全的網路環境中可能是可以接受的。
對於命令列用戶端,請使用
--server-public-key-path
選項來指定 RSA 公鑰檔案。使用--get-server-public-key
選項從伺服器請求公鑰。以下程式支援這兩個選項:mysql、mysqlsh、mysqladmin、mysqlbinlog、mysqlcheck、mysqldump、mysqlimport、mysqlshow、mysqlslap、mysqltest。對於使用 C API 的程式,請呼叫
mysql_options()
,方法是傳遞MYSQL_SERVER_PUBLIC_KEY
選項和檔案名稱來指定 RSA 公鑰檔案,或者傳遞MYSQL_OPT_GET_SERVER_PUBLIC_KEY
選項從伺服器請求公鑰。對於副本,請使用帶有
SOURCE_PUBLIC_KEY_PATH
選項的CHANGE REPLICATION SOURCE TO
語句來指定 RSA 公鑰檔案,或使用GET_SOURCE_PUBLIC_KEY
選項從來源請求公鑰。對於群組複寫,group_replication_recovery_public_key_path
和group_replication_recovery_get_public_key
系統變數具有相同的作用。
在所有情況下,如果給定選項來指定有效的公鑰檔案,則它優先於從伺服器請求公鑰的選項。
對於使用 caching_sha2_password
外掛程式的用戶端,密碼在連線到伺服器時永遠不會以明文形式公開。密碼傳輸的方式取決於是否使用安全連線或 RSA 加密
如果連線是安全的,則不需要 RSA 金鑰對,也不會使用。這適用於使用 TLS 加密的 TCP 連線,以及 Unix socket 檔案和共享記憶體連線。密碼會以明文形式傳送,但由於連線是安全的,因此無法被窺探。
如果連線不安全,則會使用 RSA 金鑰對。這適用於未使用 TLS 加密的 TCP 連線和具名管道連線。RSA 僅用於用戶端和伺服器之間的密碼交換,以防止密碼被窺探。當伺服器收到加密的密碼時,它會將其解密。加密中使用擾亂以防止重複攻擊。
要啟用在用戶端連線過程中使用 RSA 金鑰對進行密碼交換,請使用以下程序
請使用第 8.3.3 節,「建立 SSL 和 RSA 憑證與金鑰」中的指示來建立 RSA 私鑰和公鑰對檔案。
如果私鑰和公鑰檔案位於資料目錄中,並且名稱為
private_key.pem
和public_key.pem
(caching_sha2_password_private_key_path
和caching_sha2_password_public_key_path
系統變數的預設值),則伺服器會在啟動時自動使用它們。否則,要明確命名金鑰檔案,請在伺服器選項檔案中將系統變數設定為金鑰檔案名稱。如果檔案位於伺服器資料目錄中,則您無需指定它們的完整路徑名稱
[mysqld] caching_sha2_password_private_key_path=myprivkey.pem caching_sha2_password_public_key_path=mypubkey.pem
如果金鑰檔案未位於資料目錄中,或要在系統變數值中明確指定它們的位置,請使用完整路徑名稱
[mysqld] caching_sha2_password_private_key_path=/usr/local/mysql/myprivkey.pem caching_sha2_password_public_key_path=/usr/local/mysql/mypubkey.pem
如果您想變更
caching_sha2_password
在密碼產生期間使用的雜湊回合數,請設定caching_sha2_password_digest_rounds
系統變數。例如[mysqld] caching_sha2_password_digest_rounds=10000
重新啟動伺服器,然後連線到伺服器並檢查
Caching_sha2_password_rsa_public_key
狀態變數值。實際顯示的值與此處顯示的值不同,但應該不是空的mysql> SHOW STATUS LIKE 'Caching_sha2_password_rsa_public_key'\G *************************** 1. row *************************** Variable_name: Caching_sha2_password_rsa_public_key Value: -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDO9nRUDd+KvSZgY7cNBZMNpwX6 MvE1PbJFXO7u18nJ9lwc99Du/E7lw6CVXw7VKrXPeHbVQUzGyUNkf45Nz/ckaaJa aLgJOBCIDmNVnyU54OT/1lcs2xiyfaDMe8fCJ64ZwTnKbY2gkt1IMjUAB5Ogd5kJ g8aV7EtKwyhHb0c30QIDAQAB -----END PUBLIC KEY-----
如果值為空,則表示伺服器在金鑰檔案中發現了一些問題。請檢查錯誤記錄檔以取得診斷資訊。
在伺服器使用 RSA 金鑰檔案設定完成後,使用 caching_sha2_password
外掛程式進行身份驗證的帳戶可以選擇使用這些金鑰檔案連線到伺服器。如先前所述,此類帳戶可以使用安全連線(在這種情況下不會使用 RSA),或者使用執行 RSA 密碼交換的未加密連線。假設使用未加密的連線。例如
$> mysql --ssl-mode=DISABLED -u sha2user -p
Enter password: password
對於 sha2user
的此連線嘗試,伺服器會判斷 caching_sha2_password
是適當的身份驗證外掛程式並調用它(因為那是 CREATE USER
時指定的)。外掛程式發現連線未加密,因此要求使用 RSA 加密傳輸密碼。但是,伺服器不會將公鑰傳送給用戶端,而且用戶端未提供公鑰,因此無法加密密碼,且連線失敗
ERROR 2061 (HY000): Authentication plugin 'caching_sha2_password'
reported error: Authentication requires secure connection.
要從伺服器請求 RSA 公鑰,請指定 --get-server-public-key
選項
$> mysql --ssl-mode=DISABLED -u sha2user -p --get-server-public-key
Enter password: password
在這種情況下,伺服器會將 RSA 公鑰傳送給用戶端,用戶端使用它來加密密碼並將結果傳回伺服器。外掛程式使用伺服器端的 RSA 私鑰來解密密碼,並根據密碼是否正確來接受或拒絕連線。
或者,如果用戶端有包含伺服器所需 RSA 公鑰的本機副本的檔案,則可以使用 --server-public-key-path
選項來指定該檔案
$> mysql --ssl-mode=DISABLED -u sha2user -p --server-public-key-path=file_name
Enter password: password
在這種情況下,用戶端會使用公開金鑰加密密碼,並將結果傳回伺服器。外掛程式會使用伺服器端的 RSA 私密金鑰解密密碼,並根據密碼是否正確來接受或拒絕連線。
由 --server-public-key-path
選項指定檔名的檔案中的公開金鑰值,應與由伺服器端系統變數 caching_sha2_password_public_key_path
所指定檔名的檔案中的金鑰值相同。如果金鑰檔案包含有效的公開金鑰值,但該值不正確,則會發生拒絕存取錯誤。如果金鑰檔案不包含有效的公開金鑰,則用戶端程式無法使用它。
用戶端使用者可以透過兩種方式取得 RSA 公開金鑰:
資料庫管理員可以提供公開金鑰檔案的副本。
能夠以其他方式連線到伺服器的用戶端使用者,可以使用
SHOW STATUS LIKE 'Caching_sha2_password_rsa_public_key'
陳述式,並將傳回的金鑰值儲存到檔案中。
在伺服器端,caching_sha2_password
外掛程式會使用記憶體內快取來更快驗證先前已連線的用戶端。快取項目包含帳戶名稱/密碼雜湊對。快取運作方式如下:
當用戶端連線時,
caching_sha2_password
會檢查用戶端和密碼是否與某些快取項目相符。如果是,則驗證成功。如果沒有相符的快取項目,外掛程式會嘗試根據
mysql.user
系統表中的憑證驗證用戶端。如果驗證成功,caching_sha2_password
會將用戶端的項目新增到雜湊中。否則,驗證會失敗並拒絕連線。
透過這種方式,當用戶端首次連線時,會根據 mysql.user
系統表進行驗證。當用戶端後續連線時,則會根據快取進行更快的驗證。
除了新增項目之外,其他密碼快取操作由 sha2_cache_cleaner
稽核外掛程式處理,該外掛程式代表 caching_sha2_password
執行這些動作。
它會清除任何已重新命名或刪除的帳戶,或任何憑證或驗證外掛程式已變更的帳戶的快取項目。
當執行
FLUSH PRIVILEGES
陳述式時,它會清空快取。它會在伺服器關閉時清空快取。(這表示快取不會在伺服器重新啟動時持續存在。)
快取清除操作會影響後續用戶端連線的驗證需求。對於每個使用者帳戶,在下列任何操作之後,該使用者的第一個用戶端連線必須使用安全連線(使用 TLS 憑證、Unix socket 檔案或共享記憶體進行 TCP 連線),或使用基於 RSA 金鑰對的密碼交換:
帳戶建立之後。
帳戶密碼變更之後。
針對帳戶執行
RENAME USER
之後。執行
FLUSH PRIVILEGES
之後。
FLUSH PRIVILEGES
會清除整個快取,並影響所有使用 caching_sha2_password
外掛程式的帳戶。其他操作會清除特定的快取項目,且僅影響屬於該操作一部分的帳戶。
一旦使用者成功驗證,該帳戶就會輸入到快取中,後續連線則不需要安全連線或 RSA 金鑰對,直到發生另一個影響該帳戶的快取清除事件。(當可以使用快取時,伺服器會使用挑戰回應機制,該機制不會使用明文密碼傳輸,且不需要安全連線。)