• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 编写密钥环插件

    MySQL Server支持密钥环服务,该服务使内部服务器组件和插件能够安全地存储敏感信息,以便以后检索。本节描述如何编写服务器端密钥环插件,服务功能可以使用该插件来执行密钥管理操作。有关常规密钥环的信息,请参见“ MySQL密钥环”。

    此处的说明基于plugin/keyringMySQL源代码分发目录中的源代码。该目录中的源文件实现了一个名为的插件keyring_file,该插件使用服务器主机本地的文件进行数据存储。

    要编写密钥环插件,请在插件源文件中包含以下头文件。根据插件的功能和要求,可能还需要其他MySQL或常规头文件。

    #include <mysql/plugin_keyring.h>
    

    plugin_keyring.hinclude plugin.h,因此您无需显式包括后者。plugin.h定义MYSQL_KEYRING_PLUGIN服务器插件类型和声明插件所需的数据结构。plugin_keyring.h定义特定于密钥环插件的数据结构。

    像任何MySQL服务器插件一样,密钥环插件具有通用的插件描述符(请参见“服务器插件库和插件描述符”)。在中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何时加载插件,以参见插件是否与其兼容。对于keyring插件,该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
    };
    

    密钥环插件实现的功能类似于密钥环服务API公开的功能。例如,插件功能类似于密钥环服务功能。有关密钥环服务功能的参数及其用法的信息,请参见“密钥环服务”。mysql_key_xxxmy_key_xxxmysql_key_storemy_key_store

    要编译和安装插件库文件,请使用“编译和安装插件库”中的说明。要使该库文件可供使用,请将其安装在插件目录(由plugin_dir系统变量命名的目录)中。对于该keyring_file插件,当您从源代码构建MySQL时,将对其进行编译和安装。它也包含在二进制发行版中。构建过程将生成一个共享对象库,其名称为keyring_file.so.so后缀可能因平台而异)。

    密钥环插件通常在服务器启动过程中较早加载,以便内置插件和可能依赖于它们的存储引擎可以使用它们。对于keyring_file,请在服务器my.cnf文件中使用以下几行(.so根据需要调整平台的后缀):

    [mysqld]
    early-plugin-load=keyring_file.so
    

    有关插件加载的更多信息,请参见“MySQL服务器插件”。

    要验证插件安装,请检查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	|
    +-------------------	+----------------------------------	+
    

    有关keyring_file_data变量的说明,请参见“服务器系统变量”。

    要在测试插件后禁用它,请在不使用--early-plugin-load命名插件的选项的情况下重新启动服务器。