10bet网址
MySQL的安全性
相关的文档10bet官方网站 下载此节选
PDF(美国高级主任)- 2.2 mb
PDF (A4)- 2.2 mb
HTML下载(TGZ)- 453.0 kb
HTML下载(Zip)- 460.3 kb


6.4.14通用Keyring密钥管理功能

MySQL服务器支持一个keyring服务,允许内部组件和插件安全地存储敏感信息以供以后检索。

MySQL Server还包括一个用于密匙环密钥管理的SQL接口,该接口实现为一组通用用户定义函数(udf),这些函数访问内部密匙环服务提供的函数。密匙环udf包含在一个插件库文件中,该文件还包含一个keyring_udf必须在UDF调用之前启用的插件。对于要使用的这些udf,使用keyring插件,例如keyring_filekeyring_okv必须启用。

这里描述的udf是通用的,适用于任何keyring插件。给定的密匙环插件可能有自己的udf,仅用于该插件;看到第6.4.15节,特定于插件的Keyring密钥管理功能

以下部分提供了密匙环udf的安装说明,并演示了如何使用它们。有关udf调用的密匙环服务函数的信息,请参见密匙环服务.有关一般密匙环信息,请参见章节6.4,“MySQL密匙环”

安装或卸载通用密匙环功能

本节介绍如何安装或卸载keyring用户定义函数(udf), udf是在插件库文件中实现的,该插件库文件还包含keyring_udf插件。有关安装或卸载插件和udf的一般信息,请参见安装和卸载插件,安装和卸载自定义函数

密匙环udf支持密匙环密匙管理操作,但是keyring_udf插件也必须安装,因为没有它udf不能正常工作。方法尝试使用udfkeyring_udf插件导致错误。

为了能够被服务器使用,插件库文件必须位于MySQL插件目录中(该目录由plugin_dir系统变量)。如果需要,可以通过设置的值来配置插件的目录位置plugin_dir在服务器启动时。

插件库文件基名为keyring_udf.文件名后缀因平台而异(例如,所以对于Unix和类Unix系统,. dll对于Windows)。

安装keyring_udf插件和udf,使用安装插件而且创建函数语句,调整所以为你的平台添加必要的后缀:

安装插件keyring_udf SONAME的keyring_udf.so创建keyring_udf.so函数创建keyring_key_fetch函数,返回keyring_udf.so创建函数keyring_key_length_fetch返回整数SONAME 'keyring_udf.so'创建函数keyring_key_type_fetch返回STRING SONAME 'keyring_udf.so';创建keyring_key_store函数,返回string对象keyring_udf.so;创建函数keyring_key_remove返回整数SONAME 'keyring_udf.so'

如果在源复制服务器上使用插件和udf,也要在所有副本上安装它们,以避免复制问题。

一旦按照刚才描述的方式安装,插件和udf将一直保持安装状态,直到卸载为止。若要删除它们,请使用卸载插件而且删除函数声明:

卸载插件keyring_udfDROP FUNCTION keyring_key_generateDROP FUNCTION keyring_key_fetch;DROP FUNCTION keyring_key_length_fetch;DROP FUNCTION keyring_key_type_fetch;DROP FUNCTION keyring_key_store;删除keyring_key_remove函数;

使用通用密匙环功能

使用keyring用户定义函数(udf)之前,请按照中提供的说明安装它们安装或卸载通用密匙环功能

密匙环udf受以下约束:

  • 要使用任何密匙环UDF,keyring_udf必须启用插件。否则,将发生错误:

    错误1123 (HY000):无法初始化函数keyring_key_generate;这个函数需要keyring_udf插件,这个插件没有安装。请安装

    安装keyring_udf插件,看到安装或卸载通用密匙环功能

  • 密匙环udf调用密匙环服务函数(参见密匙环服务).服务函数反过来使用所安装的任何keyring插件(例如,keyring_filekeyring_okv).因此,要使用任何密匙环UDF,必须启用一些底层的密匙环插件。否则,将发生错误:

    错误3188 (HY000):函数'keyring_key_generate'失败,因为底层keyring服务返回错误。请检查是否安装了密匙环插件,并且所提供的参数对您正在使用的密匙环有效。

    要安装钥匙圈插件,请参见章节6.4.3,“Keyring插件安装”

  • 要使用任何密匙环UDF,用户必须拥有全局执行特权。否则,将发生错误:

    错误1123 (HY000):无法初始化函数keyring_key_generate;用户没有执行此函数的特权。用户需要EXECUTE

    授予全局执行用户的特权,使用下面的语句:

    授权执行*。*用户

    或者,如果您希望避免授予全局执行特权,同时仍然允许用户访问特定的密钥管理操作,包装器可以定义存储的程序(本节稍后将介绍该技术)。

  • 由给定用户存储在密匙环中的密钥以后只能由同一用户操作。也就是的值CURRENT_USER ()函数在进行键操作时的值必须与在密匙环中存储密钥时的值相同。(这个约束排除了使用密匙环udf来操作实例范围的键,例如由InnoDB支持表空间加密。)

    为了允许多个用户对同一个密钥进行操作,包装器可以定义存储的程序(本节稍后将介绍该技术)。

  • Keyring udf支持底层Keyring插件所支持的密钥类型和长度。有关特定于特定keyring插件的密钥的信息,请参见章节6.4.12,“支持的Keyring密钥类型和长度”

要创建一个新的随机密钥并将其存储在密匙环中,请调用keyring_key_generate (),向它传递密钥的ID,以及密钥类型(加密方法)和以字节为单位的长度。下面的调用创建一个名为MyKey

mysql> SELECT keyring_key_generate('MyKey', 'DSA', 256);+-------------------------------------------+ | keyring_key_generate (MyKey, DSA, 256 ) | +-------------------------------------------+ | 1  | +-------------------------------------------+

返回值为1表示成功。如果不能创建密钥,则返回值为然后出现一个错误。原因之一可能是底层的keyring插件不支持指定的密钥类型和密钥长度的组合;看到章节6.4.12,“支持的Keyring密钥类型和长度”

若要能够检查返回类型而不管是否发生错误,请使用选择……为@var_name并测试变量值:

SELECT keyring_key_generate(", ", -1) INTO @x;错误3188 (HY000):函数'keyring_key_generate'失败,因为底层keyring服务返回错误。请检查是否安装了密匙环插件,并且所提供的参数对您正在使用的密匙环有效。mysql> SELECT @x;+------+ | @ x  | +------+ | 零  | +------+ mysql >选择keyring_key_generate(“x”,AES, 16) @x;mysql> SELECT @x;+------+ | @x | +------+ | 1 | +------+

这种技术也适用于其他密匙环udf,如果失败则返回一个值和一个错误。

传递给的IDkeyring_key_generate ()提供了一种在后续UDF调用中引用键的方法。例如,使用key ID检索其类型为字符串或长度为整数(以字节为单位):

mysql> SELECT keyring_key_type_fetch('MyKey');+---------------------------------+ | keyring_key_type_fetch(“MyKey ') | +---------------------------------+ | DSA  | +---------------------------------+ mysql >选择keyring_key_length_fetch(“MyKey”);+-----------------------------------+ | keyring_key_length_fetch(“MyKey ') | +-----------------------------------+ | 256年  | +-----------------------------------+

要检索键值,请将键ID传递给keyring_key_fetch ().下面的示例使用十六进制()显示键值,因为它可能包含不可打印的字符。为了简洁起见,该示例还使用了短密钥,但请注意,较长的密钥可以提供更好的安全性:

mysql> SELECT keyring_key_generate('MyShortKey', 'DSA', 8);+----------------------------------------------+ | keyring_key_generate (MyShortKey, DSA, 8 ) | +----------------------------------------------+ | 1  | +----------------------------------------------+ mysql >选择十六进制(keyring_key_fetch (' MyShortKey '));+--------------------------------------+ | 十六进制(keyring_key_fetch (MyShortKey ')) | +--------------------------------------+ | 1 db3b0fc3328a24c  | +--------------------------------------+

Keyring udf将键id、类型和值视为二进制字符串,因此比较是区分大小写的。例如,的idMyKey而且mykey参考不同的键。

若要删除密钥,请将密钥ID传递给keyring_key_remove ()

mysql> SELECT keyring_key_remove(MyKey);+-----------------------------+ | keyring_key_remove(“MyKey ') | +-----------------------------+ | 1  | +-----------------------------+

若要混淆和存储您提供的键,请将键ID、类型和值传递给keyring_key_store ()

mysql> SELECT keyring_key_store('AES_key', 'AES', 'Secret string');+------------------------------------------------------+ | keyring_key_store(‘AES_key’,‘AES’,‘秘密字符串 ') | +------------------------------------------------------+ | 1  | +------------------------------------------------------+

如前所述,用户必须具有全局变量执行调用密匙环udf的特权,并且最初在密匙环中存储密钥的用户必须是稍后对该密钥执行后续操作的同一用户CURRENT_USER ()值对每个UDF调用都有效。允许没有全局变量的用户进行关键操作执行特权或谁可能不是关键老板,使用这个技巧:

  1. 定义包装器存储程序,封装所需的键操作并具有定义者值等于密钥所有者。

  2. 授予执行将特定存储程序的特权授予应该能够调用这些程序的个别用户。

  3. 如果包装器存储程序实现的操作不包括密钥创建,请使用命名为的帐户提前创建任何必要的密钥定义者在存储的程序定义中。

这种技术允许在用户之间共享密钥,并为dba提供更细粒度的控制,以确定谁可以使用密钥做什么,而不必授予全局特权。

下面的示例显示如何设置名为SharedKey由DBA拥有的get_shared_key ()提供对当前键值的访问的存储函数。属性的任何用户都可以检索该值执行类中创建的该函数的特权key_schema模式。

从MySQL管理帐户(“根”@“localhost”在这个例子中),创建管理模式和存储函数来访问密钥:

mysql>创建key_schemamysql> CREATE DEFINER = 'root'@'localhost' FUNCTION key_schema.get_shared_key() RETURNS BLOB READS SQL DATA RETURN keyring_key_fetch('SharedKey');

从管理帐户,确保共享密钥存在:

mysql> SELECT keyring_key_generate('SharedKey', 'DSA', 8);+---------------------------------------------+ | keyring_key_generate (SharedKey, DSA, 8 ) | +---------------------------------------------+ | 1  | +---------------------------------------------+

从管理帐户中创建一个普通用户帐户,并授予其密钥访问权:

mysql>创建用户“key_user”@“localhost”

key_user帐户,验证,没有适当的执行特权,新帐户不能访问共享密钥:

SELECT HEX(key_schema.get_shared_key());错误1370(42000):执行命令拒绝用户'key_user'@'localhost'为例程'key_schema.get_shared_key'

从管理帐户,授予执行key_user对于存储的函数:

mysql> GRANT EXECUTE ON key_schema函数get_shared_key TO 'key_user'@'localhost';

key_user帐户,验证密钥现在是可访问的:

SELECT HEX(key_schema.get_shared_key());+----------------------------------+ | 十六进制(key_schema.get_shared_key ()) | +----------------------------------+ | 9 bafb9e75ceeb013  | +----------------------------------+

通用密匙环功能参考

对于每个通用密匙环用户定义函数(UDF),本节描述其用途、调用顺序和返回值。有关可以调用这些udf的条件的信息,请参见使用通用密匙环功能

  • keyring_key_fetch (key_id

    给定键ID,解混淆并返回键值。

    参数:

    • key_id:指定密钥ID的字符串。

    返回值:

    返回键值作为成功的字符串,如果该键不存在,或者和失败的错误。

    请注意

    使用keyring_key_fetch ()的通用密匙环UDF限制章节6.4.12,“支持的Keyring密钥类型和长度”.大于该长度的键值可以使用keyring服务函数存储(请参阅密匙环服务),但如果检索使用keyring_key_fetch ()截断为通用密匙环UDF限制。

    例子:

    mysql> SELECT keyring_key_generate('RSA_key', 'RSA', 16);+--------------------------------------------+ | keyring_key_generate (RSA_key, RSA, 16岁 ) | +--------------------------------------------+ | 1  | +--------------------------------------------+ mysql >选择十六进制(keyring_key_fetch (' RSA_key '));+-----------------------------------+ | 十六进制(keyring_key_fetch (RSA_key ')) | +-----------------------------------+ | 91年c2253b696064d3556984b6630f891a  | +-----------------------------------+ mysql >选择keyring_key_type_fetch(“RSA_key”);+-----------------------------------+ | keyring_key_type_fetch(“RSA_key ') | +-----------------------------------+ | RSA  | +-----------------------------------+ mysql >选择keyring_key_length_fetch(“RSA_key”);+-------------------------------------+ | keyring_key_length_fetch(“RSA_key ') | +-------------------------------------+ | 16  | +-------------------------------------+

    示例使用十六进制()显示键值,因为它可能包含不可打印的字符。为了简洁起见,该示例还使用了短密钥,但请注意,较长的密钥可以提供更好的安全性。

  • keyring_key_generate (key_id相关联key_length

    生成一个具有给定ID、类型和长度的新随机密钥,并将其存储在密匙环中。类型和长度值必须与底层keyring插件支持的值一致。看到章节6.4.12,“支持的Keyring密钥类型和长度”

    参数:

    • key_id:指定密钥ID的字符串。

    • 相关联:指定密钥类型的字符串。

    • key_length:以字节为单位指定密钥长度的整数。

    返回值:

    成功返回1,或者和失败的错误。

    例子:

    mysql> SELECT keyring_key_generate('RSA_key', 'RSA', 384);+---------------------------------------------+ | keyring_key_generate (RSA_key, RSA, 384 ) | +---------------------------------------------+ | 1  | +---------------------------------------------+
  • keyring_key_length_fetch (key_id

    给定键ID,返回键长度。

    参数:

    • key_id:指定密钥ID的字符串。

    返回值:

    如果成功,返回以字节为单位的整数的密钥长度,如果该键不存在,或者和失败的错误。

    例子:

    参见keyring_key_fetch ()

  • keyring_key_remove (key_id

    从密匙环中移除具有给定ID的密匙。

    参数:

    • key_id:指定密钥ID的字符串。

    返回值:

    成功返回1,或者失败。

    例子:

    SELECT keyring_key_remove('AES_key');+-------------------------------+ | keyring_key_remove(“AES_key ') | +-------------------------------+ | 1  | +-------------------------------+
  • keyring_key_store (key_id相关联关键

    在密匙环中混淆并存储密钥。

    参数:

    • key_id:指定密钥ID的字符串。

    • 相关联:指定密钥类型的字符串。

    • 关键:指定键值的字符串。

    返回值:

    成功返回1,或者和失败的错误。

    例子:

    mysql> SELECT keyring_key_store('新密钥','DSA', '我的密钥值');+-----------------------------------------------------+ | keyring_key_store(“新的密钥”,“DSA”,“我的键值 ') | +-----------------------------------------------------+ | 1  | +-----------------------------------------------------+
  • keyring_key_type_fetch (key_id

    给定键ID,返回键类型。

    参数:

    • key_id:指定密钥ID的字符串。

    返回值:

    返回键类型为成功的字符串,如果该键不存在,或者和失败的错误。

    例子:

    参见keyring_key_fetch ()