MySQL 伺服器支援金鑰環服務,使內部伺服器元件和外掛程式能夠安全地儲存敏感資訊以供日後檢索。本節說明如何編寫伺服器端金鑰環外掛程式,該外掛程式可由服務函式使用以執行金鑰管理操作。有關金鑰環的一般資訊,請參閱MySQL 金鑰環。
MySQL 8.4 移除了已棄用的金鑰環外掛程式,轉而使用金鑰環元件。例如,使用 component_keyring_file
而不是 keyring_file
。有關相關資訊,請參閱金鑰環元件與金鑰環外掛程式的比較。
此處的說明基於 MySQL 原始程式碼發行版本中的 plugin/keyring
目錄中的原始程式碼。該目錄中的原始程式碼檔案實作了一個名為 keyring_file
的外掛程式,該外掛程式使用伺服器主機本機的檔案進行資料儲存。
若要編寫金鑰環外掛程式,請在外掛程式原始程式碼檔案中包含下列標頭檔。根據外掛程式的功能和需求,可能還需要其他 MySQL 或一般標頭檔。
#include <mysql/plugin_keyring.h>
plugin_keyring.h
包含 plugin.h
,因此您無需明確包含後者檔案。plugin.h
定義了 MYSQL_KEYRING_PLUGIN
伺服器外掛程式類型,以及宣告外掛程式所需的資料結構。plugin_keyring.h
定義了金鑰環外掛程式特有的資料結構。
金鑰環外掛程式與任何 MySQL 伺服器外掛程式一樣,都有一個一般外掛程式描述符(請參閱第 4.4.2.1 節「伺服器外掛程式庫和外掛程式描述符」)。在 keyring.cc
中,keyring_file
的一般描述符如下所示
mysql_declare_plugin(keyring_file)
{
MYSQL_KEYRING_PLUGIN, /* type */
&keyring_descriptor, /* descriptor */
"keyring_file", /* name */
"Oracle Corporation", /* author */
"store/fetch authentication data to/from a flat file", /* description */
PLUGIN_LICENSE_GPL,
keyring_init, /* init function (when loaded) */
keyring_deinit, /* deinit function (when unloaded) */
0x0100, /* version */
NULL, /* status variables */
keyring_system_variables, /* system variables */
NULL,
0,
}
mysql_declare_plugin_end;
name
成員 (keyring_file
) 表示外掛程式名稱。這是 INFORMATION_SCHEMA.PLUGINS
或 SHOW PLUGINS
顯示的名稱。
一般描述符也參考 keyring_system_variables
,這是一個將系統變數公開給 SHOW VARIABLES
陳述式的結構
static struct st_mysql_sys_var *keyring_system_variables[]= {
MYSQL_SYSVAR(data),
NULL
};
keyring_init
初始化函式會在資料檔案不存在時建立該檔案,然後讀取該檔案並初始化金鑰存放區。keyring_deinit
函式會釋放與該檔案相關聯的資料結構。
一般描述符中的 keyring_descriptor
值指向類型特定的描述符。對於金鑰環外掛程式,此描述符具有以下結構
struct st_mysql_keyring
{
int interface_version;
bool (*mysql_key_store)(const char *key_id, const char *key_type,
const char* user_id, const void *key, size_t key_len);
bool (*mysql_key_fetch)(const char *key_id, char **key_type,
const char *user_id, void **key, size_t *key_len);
bool (*mysql_key_remove)(const char *key_id, const char *user_id);
bool (*mysql_key_generate)(const char *key_id, const char *key_type,
const char *user_id, size_t key_len);
};
類型特定的描述符具有以下成員
interface_version
:按照慣例,類型特定的外掛程式描述符以給定外掛程式類型的介面版本開頭。伺服器會在載入外掛程式時檢查interface_version
,以查看外掛程式是否與其相容。對於金鑰環外掛程式,interface_version
成員的值為MYSQL_KEYRING_INTERFACE_VERSION
(在plugin_keyring.h
中定義)。mysql_key_store
:一個混淆並將金鑰儲存在金鑰環中的函式。mysql_key_fetch
:一個從金鑰環中解混淆並擷取金鑰的函式。mysql_key_remove
:一個從金鑰環中移除金鑰的函式。mysql_key_generate
:一個產生新的隨機金鑰並將其儲存在金鑰環中的函式。
對於 keyring_file
外掛程式,類型特定的描述符如下所示
static struct st_mysql_keyring keyring_descriptor=
{
MYSQL_KEYRING_INTERFACE_VERSION,
mysql_key_store,
mysql_key_fetch,
mysql_key_remove,
mysql_key_generate
};
金鑰環外掛程式實作的 mysql_key_
函式類似於金鑰環服務 API 公開的 xxx
my_key_
函式。例如,xxx
mysql_key_store
外掛程式函式類似於 my_key_store
金鑰環服務函式。有關金鑰環服務函式的引數及其使用方式的資訊,請參閱金鑰環服務。
若要編譯和安裝外掛程式庫檔案,請使用第 4.4.3 節「編譯和安裝外掛程式庫」中的說明。若要使庫檔案可供使用,請將其安裝在外掛程式目錄中(由 plugin_dir
系統變數命名的目錄)。對於 keyring_file
外掛程式,當您從原始程式碼建置 MySQL 時,會編譯並安裝它。它也包含在二進位發行版本中。建置過程會產生一個共用物件庫,其名稱為 keyring_file.so
(.so
字尾可能因您的平台而異)。
金鑰環外掛程式通常會在伺服器啟動過程的早期載入,以便它們可供可能依賴它們的內建外掛程式和儲存引擎使用。對於 keyring_file
,請在伺服器 my.cnf
檔案中使用這些行,並根據需要調整您的平台的 .so
字尾
[mysqld]
early-plugin-load=keyring_file.so
有關外掛程式載入的其他資訊,請參閱安裝和解除安裝外掛程式。
若要驗證外掛程式安裝,請檢查 INFORMATION_SCHEMA.PLUGINS
表格或使用 SHOW PLUGINS
陳述式(請參閱取得伺服器外掛程式資訊)。例如
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
FROM INFORMATION_SCHEMA.PLUGINS
WHERE PLUGIN_NAME LIKE 'keyring%';
+--------------+---------------+
| PLUGIN_NAME | PLUGIN_STATUS |
+--------------+---------------+
| keyring_file | ACTIVE |
+--------------+---------------+
在安裝 keyring_file
外掛程式時,它會公開一個系統變數,指出它用於安全資訊儲存的資料檔案的位置
mysql> SHOW VARIABLES LIKE 'keyring_file%';
+-------------------+----------------------------------+
| Variable_name | Value |
+-------------------+----------------------------------+
| keyring_file_data | /usr/local/mysql/keyring/keyring |
+-------------------+----------------------------------+
若要在測試外掛程式後停用該外掛程式,請重新啟動伺服器,而不要使用命名該外掛程式的 --early-plugin-load
選項。