天天看點

MySQL8認證插件——SHA-256 Pluggable Authentication

作者:賀浦力特

MySQL 提供了兩個身份驗證插件,用于實作使用者帳戶密碼的 SHA-256 哈希:

● sha256_password:實作基本的SHA-256身份驗證。

● caching_sha2_password:實作SHA-256身份驗證(如sha256_password),但在伺服器端使用緩存以獲得更好的性能,并具有更廣泛的适用性的附加功能。

重要

在 MySQL 8.0 中,caching_sha2_password 是預設的身份驗證插件,而不是 MySQL_native_password。

由于 caching_sha2_password 是 MySQL 8.0 中的預設身份驗證插件,并且提供了 sha256_password 身份驗證插件功能的超集,是以不推薦使用sha256_pass word;期望它在MySQL的未來版本中被删除。使用sha256_password進行身份驗證的MySQL帳戶應該遷移為使用caching_sha2_password。

要使用通過sha256_password插件進行身份驗證的帳戶連接配接到伺服器,您必須使用TLS連接配接或支援使用RSA密鑰對進行密碼交換的未加密連接配接,無論哪種方式,sha256_password插件都使用 MySQL 的加密功能。

說明:

在名稱 sha256_password 中,sha256 指的是插件用于加密的 256 位摘要長度。在名稱 caching_sha2_password 中,sha2 通常指的是 SHA-2 類加密算法,256位加密就是其中一個例子。後一種名稱選擇為未來在不更改插件名稱的情況下擴充可能的摘要長度留出了空間。

插件和庫名稱

插件或檔案 插件或檔案名稱
Server-side plugin sha256_password
Client-side plugin sha256_password
Library file None (plugins are built in)

安裝 SHA-256 Pluggable Authentication

sha256_password 插件以伺服器和用戶端形式存在:

● 伺服器端插件内置于伺服器中,不需要顯式加載,也不能通過解除安裝來禁用。

● 用戶端插件内置于 libmysqlclient 用戶端庫中,可用于任何連結到 libmysqlclient 的程式。

使用 SHA-256 Pluggable Authentication

要設定一個使用 sha256_password 插件進行 SHA-256 密碼哈希的帳戶,請使用以下語句:

CREATE USER 'sha256_password_user'@'localhost' IDENTIFIED WITH sha256_password BY 'Test_1qaz';           

伺服器将 sha256_password 插件配置設定給帳戶,并使用它使用 SHA-256 加密密碼,将這些值存儲在 mysql.user 系統表的 plugin 和 authentication_string 列中。

sha256_password 支援通過安全傳輸進行連接配接。如果 MySQL 是使用 OpenSSL 編譯的,并且您希望連接配接的 MySQL 伺服器配置為支援 RSA,那麼 sha256_password 還支援通過未加密連接配接使用 RSA 進行加密密碼交換。

RSA支援具有以下特點:

● 在伺服器端,兩個系統變量命名RSA私鑰和公鑰對檔案:sha256_password_private_key_path 和 sha256_pass word_public_key_path。如果名稱與系統變量的預設值不同,則資料庫管理者必須在伺服器啟動時設定這些變量。

● 伺服器使用 sha256_password_auto_generate_rsa_keys 系統變量來确定是否自動生成rsa密鑰對檔案。

● Rsa_public_key 狀态變量顯示 sha256_password 身份驗證插件使用的Rsa公鑰值。

● 擁有RSA公鑰的用戶端可以在連接配接過程中與伺服器執行基于 RSA 密鑰對的密碼交換。

● 對于使用 sha256_password 和基于 RSA 公鑰對的密碼交換進行身份驗證的連接配接,伺服器會根據需要向用戶端發送RSA公鑰。但是,如果用戶端主機上有公鑰的副本,則用戶端可以使用該副本在用戶端/伺服器協定中儲存往返:

■ 對于指令行用戶端,使用 --server 公鑰路徑選項指定RSA公鑰檔案:mysql、mysqladmin、mysqlbinlog、mysqlcheck、mysqldump、mysqlimport、mysqlpump、mysqlshow、mysqlslap、mysqltest、mysql_upgrade

■ 對于使用C API的程式,請調用 mysql_options(),通過傳遞mysql_SERVER_public_key選項和檔案名來指定RSA公鑰檔案。

■ 對于副本,請使用 CHANGE REPLICATION SOURCE TO 語句(從MySQL 8.0.23開始)或 CHANGE MASTER TO 語句(在MySQL 8.00.23之前)以及 SOURCE_PUBLIC_KEY_PATH | MASTER_PUBLIC_6KEY_PATH 選項來指定RSA公鑰檔案。對于組複制,Group_Replication_recovery_get_public_key系統變量具有相同的用途。

對于使用 sha256_password 插件的用戶端,在連接配接到伺服器時,密碼永遠不會以明文形式公開。密碼傳輸的方式取決于使用的是安全連接配接還是RSA加密:

● 如果連接配接是安全的,則不需要使用RSA密鑰對。這适用于使用 TLS 加密的連接配接。密碼以明文形式發送,但由于連接配接是安全的,是以無法窺探。

說明:與caching_sha2_password 不同,sha256_password 插件不會将共享記憶體連接配接視為安全的,即使共享記憶體傳輸在預設情況下是安全的。

● 如果連接配接不安全,并且RSA密鑰對可用,則該連接配接将保持未加密狀态。這适用于未使用 TLS 加密的連接配接。RSA 僅用于用戶端和伺服器之間的密碼交換,以防止密碼窺探。當伺服器接收到加密的密碼時,它會對其進行解密。加密時會使用加擾來防止重複攻擊。

● 如果未使用安全連接配接,且RSA加密不可用,則連接配接嘗試失敗,因為如果不将密碼公開為明文,則無法發送密碼。

說明:要将RSA密碼加密與sha256_password一起使用,用戶端和伺服器都必須使用 OpenSSL 進行編譯,而不僅僅是其中之一。

假設MySQL是使用OpenSSL編譯的,請使用以下過程在用戶端連接配接過程中啟用RSA密鑰對進行密碼交換:

1. 使用第6.3.3節“建立SSL和RSA證書和密鑰”中的說明建立RSA私鑰和公鑰對檔案。

如果私鑰和公鑰檔案位于資料目錄中,并命名為 private_key.pem 和 public_key.pem(sha256_password_private_key_path 和 sha256_pass word_public_key_path 系統變量的預設值),則伺服器會在啟動時自動使用它們。

否則,要顯式命名關鍵檔案,請将系統變量設定為伺服器選項檔案中的關鍵檔案名。如果檔案位于伺服器資料目錄中,則無需指定其完整路徑名:

[mysqld]
sha256_password_private_key_path=myprivkey.pem
sha256_password_public_key_path=mypubkey.pem           

2. 如果密鑰檔案不在資料目錄中,或者要使其位置在系統變量值中明确,請使用完整的路徑名:

[mysqld]
sha256_password_private_key_path=/usr/local/mysql/myprivkey.pem
sha256_password_public_key_path=/usr/local/mysql/mypubkey.pem           

3. 重新啟動伺服器,然後連接配接到伺服器并檢查 Rsa_public_key 狀态變量值。實際顯示的值與此處顯示的值不同,但應為非空值. 如果該值為空,則伺服器發現密鑰檔案有問題。檢查錯誤日志以擷取診斷資訊。

SHOW STATUS LIKE 'Rsa_public_key'\G           

使用RSA密鑰檔案配置伺服器後,使用sha256_password插件進行身份驗證的帳戶可以選擇使用這些密鑰檔案連接配接到伺服器。如前所述,此類帳戶可以使用安全連接配接(在這種情況下不使用RSA),也可以使用使用RSA進行密碼交換的未加密連接配接。假設使用了一個未加密的連接配接。例如:

mysql --ssl-mode=DISABLED -u sha256user -p           

對于sha256user的此連接配接嘗試,伺服器确定sha256_password是适當的身份驗證插件并調用它(因為這是CREATE USER時指定的插件)。插件發現連接配接未加密,是以需要使用RSA加密傳輸密碼。在這種情況下,插件将RSA公鑰發送給用戶端,用戶端使用它來加密密碼,并将結果傳回給伺服器。該插件使用伺服器端的RSA私鑰來解密密碼,并根據密碼是否正确來接受或拒絕連接配接。

伺服器根據需要向用戶端發送RSA公鑰。但是,如果用戶端的檔案包含伺服器所需的RSA公鑰的本地副本,則可以使用 --server 公鑰路徑選項指定該檔案:

mysql --ssl-mode=DISABLED -u sha256user -p --server-public-key-path=file_name           

由 --server 公鑰路徑選項命名的檔案中的公鑰值應與由 sha256_password_public_key_path 系統變量命名的伺服器端檔案中的密鑰值相同, 否則則會發生拒絕通路錯誤。如果密鑰檔案不包含有效的公鑰,則用戶端程式無法使用它。在這種情況下,sha256_password 插件将公鑰發送到用戶端,就像沒有指定 --server 公鑰路徑選項一樣。

● 用戶端使用者可以通過兩種方式獲得RSA公鑰:

● 資料庫管理者可以提供公鑰檔案的副本。

可以通過其他方式連接配接到伺服器的用戶端使用者可以使用SHOW STATUS LIKE“Rsa_public_key”語句,并将傳回的鍵值儲存在檔案中。

繼續閱讀