MySQL服务器支持密匙环服务,使内部组件和插件能够安全地存储敏感信息,以供以后检索。
MySQL Server还包括一个用于密匙环密匙管理的SQL接口,它实现为一组通用的用户定义函数(udf),用于访问内部密匙环服务提供的函数。密匙环udf包含在一个插件库文件中,该文件还包含一个keyring_udf
插件,该插件必须在UDF调用之前启用。要使用这些udf,一个密匙环插件,例如keyring_file
或keyring_okv
必须启用。
这里描述的udf是通用的,用于任何密匙环插件。一个给定的密匙环插件可能有自己的udf,仅用于该插件;看到第6.4.4.15节“特定于插件的密钥环密钥管理功能”.
以下部分提供了密匙环udf的安装说明,并演示了如何使用它们。有关udf调用的密匙环服务函数的信息,请参见第5.6.9.2节“密匙环服务”.有关一般密匙环信息,请参见第6.4.4节“MySQL Keyring”.
本节描述如何安装或卸载密匙环用户定义函数(udf),它们在插件库文件中实现,该文件还包含一个keyring_udf
插件。有关安装或卸载插件和udf的一般信息,请参见第5.6.1节“安装和卸载插件”,第5.7.1节“安装和卸载自定义函数”.
密匙环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_key_generate返回整数SONAME 'keyring_udf.so';` ` keyring_udf.so ` `;函数keyring_key_length_fetch返回整数SONAME 'keyring_udf.so';` keyring_udf.so `;函数keyring_key_store返回INTEGER SONAME 'keyring_udf.so';函数keyring_key_remove返回INTEGER SONAME 'keyring_udf.so';
如果在源复制服务器上使用插件和udf,请在所有副本上安装它们,以避免复制问题。
安装完成后,插件和udf将保持安装状态,直到卸载为止。要删除它们,请使用卸载插件
而且删除函数
声明:
卸载插件keyring_udf;函数:DROP函数:DROP函数:DROP函数:DROP函数;删除函数:
使用密匙环用户定义函数(udf)之前,请按照安装/卸载通用密匙环功能.
密匙环udf受以下约束:
若要使用任何密匙环UDF,则
keyring_udf
必须启用插件。否则,会出现错误:错误1123 (HY000):无法初始化keyring_key_generate函数;该函数需要keyring_udf插件,该插件没有安装。请安装
安装
keyring_udf
插件,看到安装/卸载通用密匙环功能.密匙环udf调用密匙环服务函数(参见第5.6.9.2节“密匙环服务”).服务函数依次使用所安装的任何密匙环插件(例如,
keyring_file
或keyring_okv
).因此,要使用任何密匙环UDF,必须启用一些底层的密匙环插件。否则,会出现错误:keyring_key_generate函数失败,因为底层keyring服务返回错误。请检查是否安装了密匙环插件,以及所提供的参数对于您正在使用的密匙环是否有效。
要安装密匙环插件,请参见第6.4.4.3节“密匙环插件安装”.
要使用任何密匙环UDF,用户必须拥有全局
执行
特权。否则,会出现错误:错误1123 (HY000):无法初始化keyring_key_generate函数;用户没有执行此函数的特权。用户需要EXECUTE
授予全球
执行
权限分配给用户时,使用以下语句:授权执行*。*用户;
或者,您是否希望避免授予全局
执行
特权,同时仍然允许用户访问特定的密钥管理操作,”包装器”可以定义存储的程序(本节稍后将介绍一种技术)。由给定用户存储在密匙环中的密钥以后只能由同一用户操作。也就是值
CURRENT_USER ()
函数在键操作时的值必须与键存储在密匙环时的值相同。(此约束禁止使用密匙环udf来操作实例范围的密匙,例如由InnoDB
支持表空间加密。)为了让多个用户对同一个密钥进行操作,”包装器”可以定义存储的程序(本节稍后将介绍一种技术)。
密匙环udf支持底层密匙环插件支持的密匙类型和长度。有关特定于特定密匙环插件的密匙的信息,请参见第6.4.4.12节“支持的Keyring密钥类型和长度”.
要创建一个新的随机密钥并将其存储在密匙环中,请调用keyring_key_generate ()
,向它传递密钥的ID,以及密钥类型(加密方法)和以字节为单位的长度。下面的调用创建一个2048位的dsa加密密钥MyKey
:
SELECT 'MyKey', 'DSA', 256);+-------------------------------------------+ | keyring_key_generate (MyKey, DSA, 256 ) | +-------------------------------------------+ | 1 | +-------------------------------------------+
返回值1表示成功。如果不能创建密钥,则返回值为零
出错了。一个原因可能是底层的keyring插件不支持指定的密钥类型和密钥长度的组合;看到第6.4.4.12节“支持的Keyring密钥类型和长度”.
若要能够检查返回类型而不管是否发生错误,请使用选择……为@
并测试变量值:var_name
SELECT keyring_key_generate(", ", -1) INTO @x;keyring_key_generate函数失败,因为底层keyring服务返回错误。请检查是否安装了密匙环插件,以及所提供的参数对于您正在使用的密匙环是否有效。mysql> SELECT @x;+------+ | @ x | +------+ | 零 | +------+ mysql >选择keyring_key_generate(“x”,AES, 16) @x;mysql> SELECT @x;+------+ | @x | +------+ | 1 | +------+
该技术也适用于其他在失败时返回值和错误的密匙环udf。
传递给keyring_key_generate ()
提供了在后续UDF调用中引用该键的方法。例如,使用键ID检索其类型为字符串或其长度(以字节为单位)为整数:
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 ()
.下面的示例使用十六进制()
显示键值,因为它可能包含不可打印的字符。为了简洁,该示例还使用了短密钥,但请注意,较长的密钥提供了更好的安全性:
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 ()
:
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调用有效。允许没有全局权限的用户进行键操作执行
特权或谁可能不是关键”老板,”使用以下技巧:
定义”包装器”封装所需的键操作并具有
定义者
值等于键所有者。授予
执行
将特定存储程序的权限授予应该能够调用它们的个别用户。如果包装器存储程序实现的操作不包括密钥创建,请使用名为的帐户提前创建任何必要的密钥
定义者
在存储程序定义中。
这种技术支持在用户之间共享密钥,并为dba提供更细粒度的控制,以控制谁可以使用密钥做什么,而不必授予全局特权。
下面的示例演示如何设置名为SharedKey
由DBA拥有,还有一个get_shared_key ()
提供对当前键值的访问的存储函数。的任何用户都可以检索该值执行
函数的特权,该函数是在key_schema
模式。
从MySQL管理帐户(“根”@“localhost”
在本例中),创建管理模式和存储函数来访问密钥:
CREATE SCHEMA SCHEMA;函数key_schema.get_shared_key()返回BLOB读取SQL数据返回keyring_key_fetch('SharedKey');
在管理帐户中,确保共享密钥存在:
SELECT keyring_key_generate('SharedKey', 'DSA', 8);+---------------------------------------------+ | keyring_key_generate (SharedKey, DSA, 8 ) | +---------------------------------------------+ | 1 | +---------------------------------------------+
从管理帐户中创建一个普通用户帐户,授予其密钥访问权:
CREATE USER 'key_user'@'localhost' IDENTIFIED BY 'key_user_pwd';
从key_user
帐户,验证,没有适当执行
权限,新账号无法访问共享密钥:
SELECT HEX(key_schema.get_shared_key());错误1370 (42000):execute command denied to user' key_user'@'localhost' for例程'key_schema.get_shared_key'
从管理帐户,授予执行
来key_user
对于存储函数:
mysql>授予EXECUTE ON函数key_schema。get_shared_key到'key_user'@'localhost'
从key_user
帐户,验证密钥现在可以访问:
SELECT HEX(key_schema.get_shared_key());+----------------------------------+ | 十六进制(key_schema.get_shared_key ()) | +----------------------------------+ | 9 bafb9e75ceeb013 | +----------------------------------+
对于每个通用密匙环用户定义函数(UDF),本节描述其用途、调用顺序和返回值。有关可以调用这些udf的条件的信息,请参见使用通用密匙环函数.
给定一个键ID,消除混淆并返回键值。
参数:
key_id
:指定密钥ID的字符串。
返回值:
返回键值作为成功的字符串,
零
如果密钥不存在,或者零
失败的错误。请注意使用
keyring_key_fetch ()
的一般密匙环UDF限制第6.4.4.12节“支持的Keyring密钥类型和长度”.长于此长度的键值可以使用键环服务函数(参见第5.6.9.2节“密匙环服务”),但如果使用keyring_key_fetch ()
被截断为通用密匙环UDF限制。例子:
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、类型和长度的新随机密钥,并将其存储在密匙环中。类型和长度值必须与底层密匙环插件支持的值一致。看到第6.4.4.12节“支持的Keyring密钥类型和长度”.
参数:
key_id
:指定密钥ID的字符串。相关联
:指定密钥类型的字符串。key_length
:以字节为单位指定密钥长度的整数。
返回值:
成功返回1,或者
零
失败的错误。例子:
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的字符串。
返回值:
返回密钥长度(以字节为单位),作为成功的整数,
零
如果密钥不存在,或者零
失败的错误。例子:
从密匙环中移除具有给定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,或者
零
失败的错误。例子:
SELECT keyring_key_store('new key', 'DSA', 'My key value');+-----------------------------------------------------+ | keyring_key_store(“新的密钥”,“DSA”,“我的键值 ') | +-----------------------------------------------------+ | 1 | +-----------------------------------------------------+
keyring_key_type_fetch (
key_id
)给定键ID,返回键类型。
参数:
key_id
:指定密钥ID的字符串。
返回值:
返回成功的键类型为字符串,
零
如果密钥不存在,或者零
失败的错误。例子: