第六章安全

目录

一般的安全问题
6.1.1安全指南
6.1.2保证密码安全
6.1.3使MySQL安全免受攻击
6.1.4安全相关的mysqld选项和变量
6.1.5如何运行MySQL作为一个正常的用户
6.1.6安全问题和负荷数据的地方
6.1.7客户端编程的安全指南
6.2 MySQL的权限系统
6.2.1提供MySQL权限模式
6.2.2静态与动态权限
6.2.3授权表
6.2.4指定帐户名称
6.2.5指定角色的名字
6.2.6访问控制,第一阶段:连接验证
6.2.7访问控制,第二阶段:请求验证
6.2.8当特权更改生效
6.2.9连接到MySQL问题的故障排除
6.3 MySQL用户账户管理
6.3.1用户名称和密码
6.3.2添加用户帐户
6.3.3删除用户帐户
6.3.4使用角色
6.3.5保留用户帐户
6.3.6设置帐户的资源限制
6.3.7分配帐户密码
6.3.8密码管理
6.3.9服务器过期密码处理
6.3.10认证
6.3.11 .激光器代理
6.3.12用户帐户锁定
6.3.13基于SQL MySQL帐户活动的审计
6.4使用加密连接
6.4.1配置MySQL使用加密连接
6.4.2命令选项加密连接
6.4.3创建SSL和RSA证书和密钥
6.2.4 Opsssl versus Wolfsl
6.4.5建筑MySQL加密连接支持
6.4.6加密连接协议和密码
6.4.7连接到MySQL从Windows SSH远程
6.5安全组件和插件
6.5.1认证插件
6.5.2连接控制插件
6.5.3密码验证组件
6.5.4 MySQL的钥匙圈
6.5.5 MySQL企业审计
6.5.6 MySQL企业防火墙
6.6 fips支持

当考虑安全在MySQL的安装,你应该考虑各种可能的话题和他们是如何影响你的MySQL服务器的安全及相关应用:

一般的安全问题

本节描述了一般的安全问题,要意识到你可以做些什么来让你的MySQL安装的攻击或误用更安全。信息特别是关于MySQL用于设置用户帐户和检查数据库访问的访问控制系统,看2.9节,“安装后的设置和测试

要常常问MySQL服务器的安全问题,一些问题的答案,看部分出来,“MySQL 5.0常见问题:安全”

6.1.1安全指南

使用MySQL在计算机连接到互联网的人都应该阅读这部分避免最常见的安全错误。

在讨论安全,有必要充分考虑保护整个服务器主机(不只是MySQL服务器)对所有类型的应用攻击:窃听、篡改,回放,和拒绝服务。我们没有涵盖所有方面的可用性和容错能力在这里。

MySQL采用基于访问控制列表(ACL)安全的所有连接,查询等操作,用户可以尝试执行。也有SSL加密连接MySQL客户端和服务器之间的支持。许多的概念在这里讨论的是不特定的MySQL的所有;相同的一般思路适用于几乎所有的应用程序。

当运行MySQL,遵循这些指导方针:

  • 永远不要给任何人(除了MySQLroot账户存取)*用户表中mysql数据库!这是关键

  • 了解MySQL的权限系统(见6.2节,“MySQL的权限系统”)。使用“GRANTREVOKE语句来控制访问MySQL。不授予不必要的权限。没有权限授予所有主机。

    自评量表:

    • 试用mysql -u root。如果你能够成功连接到服务器没有被要求输入密码,任何人都可以连接到你的MySQL服务器和MySQLroot具有完全权限的用户!回顾MySQL的安装说明,特别要注意设定一个信息root密码.看到第2.9.4,”保证初始MySQL账户”

    • 使用SHOW GRANTS语句来检查账户获得什么。然后使用REVOKE语句删除那些不必要的特权。

  • 不存储明文密码在您的数据库。如果你的计算机成为入侵,入侵者可以带密码的完整列表,并使用它们。相反,使用SHA2()或一些其他的单向散列函数和存储的哈希值。

    为了防止密码恢复使用彩虹表,不使用这些功能在一个普通的密码;相反,选择一些字符串作为盐,并使用哈希(Hash(密码)盐)值。

  • 不要选择密码字典。特殊程序存在破坏密码。即使密码一样XFIFS98很坏。更好的是duag98它包含相同的字但是打在一个标准的QWERTY键盘左键一。另一种方法是使用一个是从句子中的每个单词的第一个字符的密码(例如,八十七年前在密码的结果fsasya)。密码是容易记住的类型,但很难猜的人谁不知道这句话。在这种情况下,你还可以替代数字的数量词获得的短语4分和7年前,得到密码4sa7ya这是更难猜

  • 投资一个防火墙。这将保护你从至少50%在任何软件的所有类型的漏洞。把MySQL防火墙后面或在非军事区(DMZ)。

    自评量表:

    • 尝试扫描你的端口,在互联网上使用的工具,如nmap。MySQL默认使用端口3306。本港不应使用来自不受信任的主机。作为一个简单的方法来检查是否你的MySQL端口是开放的,试试下面的一些远程主机的命令,在server_host是主机名或IP地址的主机上的MySQL服务器运行:

      内核>telnet server_host 3306

      如果Telnet挂起或连接被拒绝,港口被封锁,这是你想要的。如果你得到一个连接和一些乱码,端口是开放的,而应该在你的防火墙或路由器关闭,除非你真的有一个很好的理由来保持开放。

  • 应用程序访问MySQL不能相信任何用户输入的数据,而应该使用适当的防御性编程技术。看到第6.1.7,“客户端编程安全指南”

  • 不传播平原(未加密)在互联网上的数据。这一信息是每个人拥有的时间和拦截它,利用它为自己的目的的能力可。相反,使用加密协议,如SSL和SSH。MySQL支持内部SSL连接。另一种方法是使用SSH端口转发来创建一个加密的(压缩)的通信通道。

  • 学习使用命令字符串工具在大多数情况下,您可以检查是否MySQL数据流加密发出命令如下:

    shell> tcpdump -l -i eth0 -w - src or dst port 3306 | strings
    

    这是linux下的,应该在其他系统小的修改工作。

    警告

    如果你没有看到明文数据,这并不总是意味着信息实际上是加密的。如果你需要更高的安全保障,有安全专家咨询。

6.1.2保证密码安全

在几种情况下发生在mysql密码。以下部分提供了指导方针,使最终用户和管理员把这些密码安全,避免暴露他们。此外,该validate_password插件可以用来执行一个可接受的密码策略。看到第6.5.3,“密码验证组件”

密码安全6.1.2.1用户指南

MySQL的用户应该使用下列准则保持密码安全。

当你运行一个客户端程序连接到MySQL服务器,它是一种暴露给其他用户发现指定密码不可取。你可以使用指定的密码,当你运行客户端程序,这里列出的方法,随着每一种方法的风险评估。总之,最安全的方法是有密码的客户端程序的提示或在一个适当的保护选项文件中指定的密码。

  • 使用_ _ MySQL配置编辑器实用工具,使您能够存储在一个加密的登录认证证书的文件的路径名.mylogin.cnf。文件可以读取后,MySQL客户端程序获得连接到MySQL服务器的身份验证凭据。看到4.6.7“,”_ _ MySQL配置编辑器MySQL的配置实用程序”

  • 使用-pyour_pass--password=your_pass在命令行选项。例如:

    内核>mysql -u francis -pfrank db_name
    警告

    这是方便但不安全。在某些系统上,你的密码是系统状态的程序如可见PS这可能是由其他用户调用显示命令行。MySQL客户端通常覆盖有零点的命令行参数初始化序列中的密码。然而,仍然有一个短暂的间隔期间,价值是可见的。另外,在一些系统的覆盖策略是无效的,密码仍然是可见的PS。(了UNIX系统和别人也许是这个问题。)

    如果你的工作环境是建立在你的终端窗口的标题栏显示当前命令,密码仍然可见只要运行命令,即使命令已滚动查看窗口中的内容。

  • 使用-p——密码选项在命令行中指定的密码值不。在这种情况下,客户端程序征求密码交互:

    shell> mysql -u francis -p db_name
    Enter password: ********
    

    这个*字符显示在你输入你的密码。密码不显示为你进入它。

    它是更安全的这种方式比输入您的密码,可以在命令行上指定它因为它对于其他用户不可见。然而,这种输入密码只适合节目你交互运行的方法。如果你想调用客户端脚本以非交互方式运行,没有机会从键盘输入密码。在某些系统上,你甚至会发现,你的脚本的第一行读和解释(错误地)你的密码。

  • 保存你的密码在一个选项文件。例如,在UNIX系统下,你可以在你的密码列表[client]部分的my.cnf在你的家目录文件:

    [client]
    password=your_pass
    

    保持密码安全,文件不应该被任何人除了你自己。为了确保这一点,设置文件访问模式400六百。。。。。。。例如:

    shell> chmod 600 .my.cnf
    

    从命令行的特定选项文件含有密码的名称,使用--defaults-file=file_name选项,在file_name是完整的路径名的文件。例如:

    shell> mysql --defaults-file=/home/francis/mysql-opts
    

    第4.2.6、“使用选项文件”,详细讨论了选择文件。

  • 存储您的密码在MYSQL_PWD环境变量。见4.9节,“MySQL程序环境变量”

    这说明你的MySQL密码的方法必须考虑极不安全不应使用。一些版本的PS包括一个选项来显示正在运行的进程的环境。在某些系统上,如果你设置MYSQL_PWD,你的密码暴露给其他用户运行PS。甚至在系统没有这样的版本PS,它是假设有没有其他的方法,用户可以检查过程中不明智。

在UNIX的MySQL客户写一个执行语句的历史文件记录(见第4.5.1.3,“MySQL日志”)。默认情况下,此文件名为.mysql_history是在你的家目录创建。密码可以写成SQL语句如纯文本CREATE USERALTER USER,所以如果你使用这些语句,它们记录在历史文件。把这个文件的安全,使用受限制的访问模式,方法如前所述的相同my.cnf文件

如果你的命令解释器配置保持历史,任何文件中的命令将包含MySQL的密码保存在命令行输入。例如,猛击使用~/.bash_history。任何这样的文件应该有限制的访问模式。

6 .1 .2.2管理员密码安全指南

数据库管理员可以使用下列准则保持密码安全。

MySQL存储用户帐户的密码mysql.user表访问此表不应给予任何非管理员帐户。

账户密码可以过期,用户必须重新设置。看到第6.3.8,“密码管理”,和第6.3.9条,“服务器处理过期的密码”

这个validate_password插件可以用来执行一个可接受的密码策略。看到第6.5.3,“密码验证组件”

用户访问修改插件目录(的价值plugin_dir系统变量)或my.cnf文件中指定的插件目录的位置可以取代插件和修改由插件提供的功能,包括身份验证插件。

文件,如日志文件,密码会被写应该被保护。看到第6.1.2.3,“密码登录”

6.1.2.3密码和登录

密码可以写成SQL语句如纯文本CREATE USERGRANTSET PASSWORD。如果这样的陈述是由MySQL服务器作为书面记录,密码在他们成为访问日志中可见的任何人。

避免写密码明文声明记录以下语句:

CREATE USER ... IDENTIFIED BY ...
ALTER USER ... IDENTIFIED BY ...
SET PASSWORD ...
SLAVE START ... PASSWORD = ...
CREATE SERVER ... OPTIONS(... PASSWORD ...)
ALTER SERVER ... OPTIONS(... PASSWORD ...)

在这些报表密码改写,没有出现字面语句文本写入通用查询日志,慢查询日志,和二进制日志。重写并不适用于其他报表。特别地,INSERTUPDATE报表的mysql.user表引用的文字密码登录的,所以你应该避免这样的陈述。(格兰特表直接修改是气馁,无论如何。)

对于一般的查询日志,密码修改可通过启动服务器与抑制--log-raw选项出于安全原因,不建议使用此选项用于生产。用于诊断目的,可以看到报表服务器收到的确切文本有用。

默认情况下,审计日志文件的日志插件制作的内容是不加密的,可能包含敏感信息,如SQL语句的文本。出于安全原因,审计日志文件应该被写入目录只能访问MySQL服务器和用户提供了一个正当的理由来查看日志。看到第6.5.5.3,MySQL企业审计的安全考虑”

服务器收到的陈述可能会改写,如果安装了查询重写插件(参见查询重写插件)。在这情况下,--log-raw选项影响语句记录如下:

  • 没有--log-raw,服务器日志中的语句返回的查询重写插件。这可能与声明收到。

  • --log-raw原来,服务器日志语句接收。

密码改写的一个含义是,语句不能被解析(由于,例如,语法错误)不写入通用查询日志因为他们不能被称为是密码免费。用例需要记录所有的陈述,包括那些错误,应该使用--log-raw选项,铭记这也绕过密码改写。

密码改写只发生在纯文本密码预计。对于语法,期待一个密码哈希值的陈述,没有重写发生。如果一个纯文本密码提供这样的语法错误,密码登录,而无需重写。

保护日志文件不受不必要的照射,定位在一个目录,限制访问服务器和数据库管理员。如果服务器日志中的表mysql授予访问这些表的数据库,只有数据库管理员。

复制奴隶密码存储在主信息库的复制,在默认情况下是在表mysql数据库命名slave_master_info。在数据目录文件的主信息库的使用现在已经过时,但还是有可能的(见第17.2.4,“复制继电器和状态日志”)。确保掌握信息库只能由数据库管理员访问。另一个在主信息库存储的密码是使用START SLAVE语句连接到主指定凭据。

使用限制访问的方式来保护数据库备份,包括日志表或日志文件包含密码。

6.1.3使MySQL安全免受攻击

当你连接到MySQL服务器,你应该使用一个密码。密码是没有连接上的明文传输。

所有其他的信息转换为文本,并可以由任何人能够观看连接阅读。如果客户端和服务器通过一个不受信任的网络之间的连接,以及你对这方面的关注,你可以使用压缩协议使交通更难以破译。你也可以使用MySQL的内部SSL的支持使连接更加安全。看到6.4节,“使用加密的连接”。另外,使用ssh来得到一个加密的TCP / IP的MySQL服务器和客户端之间的连接。你可以找到一个开源的SSH客户端www.openssh.org http:/ / /,和开源和商业SSH客户比较http:///wiki/比较产生的_ of _ _ SSH客户端

做一个MySQL数据库系统的安全,你应该考虑以下建议:

  • 要求所有的MySQL账户有密码。一个客户端程序不一定知道它运行的人的身份。这是常见的客户端/服务器应用程序,用户可以指定客户端程序的任何用户名。例如,任何人都可以使用MySQL程序简单的调用任何其他人连接mysql -u other_user db_name如果other_user没有密码。如果所有的账户密码,连接使用另一个用户的账户变得更加困难。

    用于设置密码的方法讨论,看第6.3.7,“分配账号密码”

  • 确保在数据库目录的读或写权限只有UNIX用户帐户的帐户,用于运行mysqld

  • 从不运行MySQL服务器的Unixroot用户这是非常危险的,因为任何用户的FILE特权是能够导致服务器创建的文件root(例如,~root/.bashrc页:1要做这件事mysqld拒绝运行root除非显式指定使用--user=root选项

    mysqld可以(也应该)是作为一个普通的,普通用户而不是。你可以创建一个单独的UNIX帐户名mysql让一切变得更加安全。使用此账户只用于管理MySQL。开始mysqld作为一个不同的UNIX用户,添加一个user选项指定的用户名[ mysqld ]组的my.cnf选择文件您指定服务器选项。例如:

    [mysqld]user=mysql

    这导致服务器为指定用户是否启动手动或通过使用开始mysqld_safemysql.server。详情见6.1.5节,“如何运行MySQL作为一个正常的用户

    运行mysqld作为一个Unix用户比其他root并不意味着你需要改变root在用户名userMySQL账户的用户名不为UNIX帐户的用户名

  • 没有给予FILE非管理员用户权限。有这个特权可以在特权写在文件系统中的任何一个文件的所有用户mysqld守护进程。这包括服务器数据目录包含执行权限表的文件。使FILE特权操作安全一点,文件生成SELECT ... INTO OUTFILE不覆盖现有的文件是可写的,大家。

    这个FILE特权也可以用来阅读,是世界可读或到服务器运行Unix用户可访问的文件。这一特权,你可以读任何文件到数据库表。这可能会被滥用,例如,通过使用LOAD DATA加载/etc/passwd到一个表,然后可以显示SELECT

    限制哪些文件可以读取和写入的位置,设置secure_file_priv系统对一个特定的目录。看到第5.1.7,服务器“系统变量”

  • 没有给予PROCESSSUPER非管理员用户权限。输出mysqladmin processlistSHOW PROCESSLIST显示当前正在执行的任何语句的文本,所以任何用户谁被允许查看服务器进程列表中可以看到其他用户发表声明。

    mysqld储备额外的连接为用户谁有CONNECTION_ADMINSUPER特权,使MySQLroot用户可以登录,即使一切正常连接使用检查服务器的活动。

    这个SUPER权限可用于终止客户连接,通过改变系统变量的值更改服务器的操作,控制复制服务器。

  • 不允许使用符号表。(此功能可以被禁用的--skip-symbolic-links选择。)如果你运行这是特别重要的mysqld作为root,因为任何人都具有写访问服务器数据目录就可以删除系统中的任何文件!看到第8.12.2.2,“使用MyISAM表在UNIX”符号链接

  • 存储程序和视图应该使用了安全指南23.6节,“访问控制用于存储程序和视图”

  • 如果你不信任你的DNS,你应该使用而不是在授权表的主机名的IP地址。在任何情况下,你应该创建授权表条目使用包含主机名值通配符非常小心。

  • 如果你想限制允许一个帐户的连接数,你可以通过设置max_user_connections变量mysqld。这个CREATE USERALTER USER声明还支持限制服务器上允许一个帐户使用资源的控制选项。看到第13.7.1.3,“创建用户语法”,和第13.7.1.1,“改变用户的语法”

  • 如果插件目录是由服务器可写,可能会写的一个用户可执行代码文件目录中的应用SELECT ... INTO DUMPFILE。这是可以预防的plugin_dir通过设置只读到服务器或--secure-file-priv一个目录SELECT写可安全

6.1.4安全相关的mysqld选项和变量

下表显示mysqld选项和系统变量影响安全。对于这些描述,看到第5.1.6、“服务器选项”,和第5.1.7,服务器“系统变量”

表6.1安全选项和可变的总结

姓名命令行选项文件系统无功状态变量变量范围动态
允许可疑的UDF
自动_ SP _特权全球
改变根目录
DES的密钥文件
local_infile全球
old_passwords
安全的用户创建
安全的auth全球
变量安全_ auth全球
安全的私人文件全球
变量_ _私人文件的安全全球
跳过授权表
跳过名字解析全球
变量skip_name_resolve全球
跳过网络全球
变量skip_networking全球
跳过显示数据库全球
变量skip_show_database全球

6.1.5如何运行MySQL作为一个正常的用户

在Windows上,你可以运行服务器作为Windows服务使用普通用户帐户。

在Linux中,安装使用MySQL存储库或RPM包,MySQL服务器mysqld应该由当地开始mysql操作系统用户。另一个操作系统的用户开始是不被包含在MySQL库的初始化脚本支持。

在UNIX或Linux的安装使用的是(tar.gz包),MySQL服务器mysqld可以启动和运行任何用户。然而,你应该避免运行服务器的Unixroot出于安全原因,用户。改变mysqld运行作为一个正常的特权的Unix用户user_name,你必须做到以下几点:

  1. 如果它是运行停止服务器(使用关闭

  2. 更改数据库目录和文件,user_name有读写文件的权限在他们(你可能需要这样做的Unixroot用户):

    shell> chown -R user_name /path/to/mysql/datadir
    

    如果你不这样做,服务器将无法访问数据库或表运行时user_name

    如果在MySQL数据目录的目录或文件的符号链接,chown -R可能没有遵循你的符号链接。如果没有,你也要遵循这些联系和变化的目录和文件,他们指出。

  3. 当用户启动服务器user_name。另一个选择是开始mysqld作为Unixroot用户使用--user=user_name选项mysqld开始,然后切换到运行UNIX用户user_name在接受任何连接

  4. 为在系统启动时自动给用户启动服务器,通过添加一个指定的用户名user选择的[ mysqld ]组的/etc/my.cnf选择文件或my.cnf在服务器的数据目录选项文件。例如:

    [mysqld]
    user=user_name
    

如果你的UNIX机器本身是不是安全的,你应该指定密码,MySQLroot在授权表账户。否则,任何机器上登录帐户的用户可以运行MySQL一个客户--user=root选择和执行任何操作。(这是一个好主意给MySQL账户密码在任何情况下,尤其是当其他的登录帐户存在服务器主机上看到。)第2.9.4,”保证初始MySQL账户”

6.1.6安全问题和负荷数据的地方

这个LOAD DATA语句可以加载文件位于服务器主机,或者,如果当地关键词指定客户端主机上。

有两个潜在的安全问题与LOCAL版本LOAD DATA

  • 该文件从客户端转移到服务器主机的MySQL服务器启动。在理论上,一个补丁服务器可以建立,会告诉客户程序来调用一个服务器的选择而不是文件名中的客户端文件LOAD DATA声明。这样的服务器可以访问任何文件在客户端,客户端的用户进行读访问。(一个补丁服务器其实可以回复一个文件传输请求的任何声明,不只是LOAD DATA LOCAL因此,一个更基本的问题是,客户不应连接到不受信任的服务器。)

  • 在Web环境下的客户从Web服务器的连接,用户可以使用LOAD DATA LOCAL阅读任何文件,Web服务器进程读取(假设用户可以运行任何语句对SQL Server)。在这种环境下,相对于MySQL服务器的客户端实际上是Web服务器,而不是一个远程程序正在运行的用户连接到Web服务器。

为了避免LOAD DATA问题,客户应避免使用当地。为了避免连接到不受信任的服务器,客户端可以建立安全连接和验证服务器的身份通过连接使用--ssl-mode=VERIFY_IDENTITY选择合适的CA证书

使管理员和应用程序来管理本地数据加载性能,LOCAL配置是这样的:

  • 在服务器端:

    • 这个local_infile系统变量控制服务器端当地能力.根据local_infile设置服务器拒绝或允许本地数据加载的客户,当地在客户端上启用。默认情况下,local_infile被禁用

    • 明确导致服务器拒绝或允许LOAD DATA LOCAL陈述(不论如何客户端程序和库的配置在建设或运行时),开始mysqldlocal_infile禁用或启用,分别local_infile也可以在运行时设置

  • 在客户端:

    • 这个ENABLED_LOCAL_INFILECMake在默认的编译选项控制LOCAL对于MySQL客户端库的能力。客户没有明确安排,因此有当地能力禁用或启用根据ENABLED_LOCAL_INFILE设置指定MySQL建立时间。

      默认情况下,MySQL客户端库的二进制分布编译ENABLED_LOCAL_INFILE禁用。如果你编译MySQL从源,其配置ENABLED_LOCAL_INFILE禁用或启用基于客户是否让没有明确的安排当地能力禁用或启用,分别。

    • 客户端程序使用C API可以加载数据加载通过调用控制mysql_options()禁用或启用mysql_opt_local_infile选项看到第27.7.7.50,“mysql_options()”

    • 对于MySQL客户端本地数据加载默认是禁用的。禁用或启用它明确,使用--local-infile=0--local-infile[=1]选项

    • 对于mysqlimport客户端本地数据加载默认是禁用的。禁用或启用它明确,使用--local=0--local[=1]选项

    • 如果你使用LOAD DATA LOCAL在Perl脚本或其他程序,读取[顾客]从选项文件组,你可以添加一个local-infile选项设置,组。为防止对不理解这个选项的程序问题,指定使用loose-前缀:

      [client]loose-local-infile=0

      [client]
      loose-local-infile=1
      
    • 在所有的情况下,一个成功的使用LOCAL由客户端负载运行也需要服务器允许它。

如果LOCAL能力是残疾人,在服务器端或客户端,客户端尝试问题LOAD DATA LOCAL声明中收到以下错误消息:

错误1148:使用的命令是不允许使用这个版本的MySQL

6.1.7客户端编程的安全指南

应用程序访问MySQL不能相信任何用户输入的数据,谁能想骗你的代码在网页的形式,进入特殊或转义字符序列的URL,或你所建造的任何应用程序。确保你的应用程序是安全的如果一个用户进入类似; DROP DATABASE mysql;。这是一个极端的例子,但大的安全漏洞和数据丢失可能是由于使用了类似的技术,黑客的出现,如果你不为他们准备的。

一个常见的错误是只保护字符串数据值。记得检查数据以及。如果一个应用程序生成查询等SELECT * FROM table WHERE ID=234当使用价值的时候二百三十四,用户可以输入值234 OR 1=1使应用程序来生成查询SELECT * FROM table WHERE ID=234 OR 1=1。因此,服务器检索表中每行的。这暴露了每一排,导致过度的服务器负载。为了防止这种类型的攻击,最简单的方法是使用单引号的数字常量:SELECT * FROM table WHERE ID='234'。如果用户输入更多的信息,这一切成为字符串的一部分。在数字环境中,MySQL会自动将这个字符串到数字和非数字字符的条任何尾随。

有时人们认为,如果一个数据库只包含公开数据,它不需要被保护。这是不正确的。即使是允许显示数据库中的任何一行,你还是应该防止拒绝服务攻击(例如,那些基于前款所导致服务器资源浪费的技术)。否则,你的服务器就成为合法用户反应迟钝。

自评量表:

  • 使严格的SQL模式告诉服务器要更严格的什么数据它接受的价值观。看到第5.1.10,”服务器的SQL模式”

  • 尝试进入单双引号('在你所有的网页形式)。如果你得到任何MySQL错误,探讨的问题吧。

  • 尝试通过添加修改动态URL%22),%23#),和%27'给他们

  • 尝试修改动态网址的数字用在前面的例子中所示的字符的字符型数据类型。你的应用应该是安全的对这些和类似的攻击。

  • 试着输入字符,空格和特殊符号而不是数字字段数。你的程序应该删除它们在传送到MySQL或者产生一个错误。通过选中的值,MySQL是很危险的!

  • 在将它传递到MySQL检查数据的大小。

  • 你的应用程序连接到使用不同于你使用的用户名数据库管理的目的。不要给你的应用程序的访问权限,他们不需要任何。

许多应用程序编程接口提供特殊字符转义手段在数据值。使用得当,这可以防止应用程序用户输入值,导致应用程序产生一个比你打算的不同影响的陈述:

  • MySQL提供的C API:使用mysql_real_escape_string_quote()API调用

  • 使用MySQL:escape报价我爱你

  • PHP可以使用mysqlipdo_mysql扩展,而不是旧的ext/mysql扩展首选的API支持改进的MySQL的认证协议和密码,以及编制报表与占位符。参见选择一个API

    如果老ext/mysql扩展必须使用,然后逃生使用mysql_real_escape_string_quote()功能不mysql_escape_string()ADSLASHES()因为只有mysql_real_escape_string_quote()是字符集的其它功能可以感知;绕过当使用多字节字符集(无效)。

  • Perl DBI:使用占位符或quote()方法

  • 红宝石的使用占位符或quote()方法

  • java JDBC:使用PreparedStatement对象和占位符

其他编程接口可能有类似的能力。

6.2 MySQL的权限系统

MySQL可系的主要功能是验证的用户连接从一个给定的主机和关联,用户对数据库等特权SELECTINSERTUPDATE,和DELETE。附加的功能包括有匿名用户和MySQL等特定功能给予特权的能力LOAD DATA INFILE和管理操作

有些事情你不能做MySQL的权限系统:

  • 你不能显式地指定特定的用户应该拒绝访问。那就是,你不能明确地匹配用户然后拒绝连接。

  • 你不能指定一个用户创建或删除数据库表但不创建或删除数据库本身的特权。

  • 密码的应用在全球范围内的一个账户。你不能用一个具体的对象,如数据库、表关联的密码,或常规。

用户界面到MySQL权限系统由SQL语句等CREATE USERGRANT,和REVOKE。看到第13.7.1,“账户管理报表”

在内部,在授权表服务器存储权限信息mysql数据库(即数据库中的命名MySQL)。MySQL服务器读取这些表的内容到内存中时,它开始与基地的访问控制决策对在授权表的内存拷贝。

MySQL的权限系统确保所有用户可以执行的操作只允许他们。作为一个用户,当您连接到MySQL服务器,你的身份是由主机由你连接用户指定名称。当你发出请求连接后,系统根据你的身份和授予权限你想做什么

MySQL的考虑你的主机名和用户名识别你因为没有理由假定一个给定的用户名属于所有主机上的同一个人。例如,用户joe谁将从office.example.com不需要人作为用户相同joe谁将从home.example.com。MySQL处理这使你能够区分在不同的主机上,恰好有相同名称的用户:你可以授予一组权限的连接joeoffice.example.com,和一组不同的权限的连接joehome.example.com。看到一个给定的帐户有什么特权,使用SHOW GRANTS声明。例如:

显示“乔”'office补助。例如.com”;显示“乔”“返回”补助。例如.com”;

MySQL访问控制包括两个阶段,当你运行一个程序的客户端连接到服务器:

阶段1:服务器接受或拒绝基于你的身份,你是否能提供正确的密码,验证您的身份连接。

阶段2:假设你可以连接,服务器会检查每个语句你的问题来确定你是否有足够的权限来执行它。例如,如果你想选择数据库中的表中的行或从数据库中删除表,服务器验证您有SELECT为表或特权DROP特权的数据库

在每一个阶段的更详细的描述发生了什么,看见第6,访问控制,阶段1:连接验证”,和第6.2.7,访问控制,阶段2:请求验证”

如果你的权限更改(无论是自己或别人)当你连接,这些变化不一定立即生效,你问题的下一个语句。对于细节的情况下,服务器重新加载授权表,看第6.2.8,当特权更改生效”

一般安全相关的建议,看第6.1、一般安全问题”。在诊断权限相关问题的帮助,看第6.2.9”故障,连接到MySQL”问题

6.2.1提供MySQL权限模式

的权限授予一个MySQL账户确定操作的帐户可以执行。MySQL的权限在其应用和不同层次的运行脉络的差异:

  • 行政权限允许用户管理MySQL服务器运行。这些特权是全球性的因为他们没有具体到一个特定的数据库。

  • 数据库权限适用于一个数据库,所有的物体在它。这些权限可以授予特定的数据库,或在全球范围内使它们适用于所有的数据库。

  • 数据库对象如表、索引、视图和存储过程的权限,可以授予特定对象的数据库内,对内的一个给定的数据库类型的所有对象(例如,一个数据库中的所有表),或用于一个给定类型的所有数据库中的所有对象)。

特权也不同方面是否是静态的(内置到服务器)或动态的(在运行时定义)。是否有特权是静态或动态的影响给予用户账号和角色的可用性。看到6.2.2、静态与动态的特权”

关于帐户权限信息存储在userDBtables_privcolumns_privprocs_priv,和全球_补助表中的mysql系统数据库(见第6.2.3,“Grant Tables”)。MySQL服务器读取这些表的内容到内存中时,它开始和重新加载的情况下显示第6.2.8,当特权更改生效”。访问控制决策是基于在授权表的内存拷贝。

介绍一些MySQL的版本变化的授权表的结构来添加新的权限或特征。确保你可以利用任何新功能,更新你的授权表有电流结构当你升级MySQL。看到4.4.5“,”mysql_upgrade检查升级MySQL表”

下表显示了用于静态权限名称GRANTREVOKE报表,以及在授权表的每个权限相关的列名称和背景的特权应用。

表6.2允许的静态权限授予和撤销

特权专栏语境
ALL [PRIVILEGES]同义词所有的特权服务器管理
ALTERAlter_priv
ALTER ROUTINEAlter_routine_priv存储程序
CREATECreate_priv数据库、表或索引
CREATE ROLECreate_role_priv服务器管理
CREATE ROUTINECreate_routine_priv存储程序
CREATE TABLESPACECreate_tablespace_priv服务器管理
CREATE TEMPORARY TABLESCreate_tmp_table_priv
CREATE USERCreate_user_priv服务器管理
CREATE VIEWCreate_view_priv意见
DELETEDelete_priv
DROPDrop_priv数据库,表或视图
DROP ROLEDrop_role_priv服务器管理
EVENTEvent_priv数据库
EXECUTEExecute_priv存储程序
FILEFile_priv在服务器主机的文件访问
GRANT OPTIONGrant_priv数据库,表,或存储程序
INDEXIndex_priv
INSERTInsert_priv表或列
LOCK TABLESLock_tables_priv数据库
PROCESSProcess_priv服务器管理
PROXY看到proxies_priv服务器管理
REFERENCESReferences_priv数据库或表
RELOADReload_priv服务器管理
REPLICATION CLIENTRepl_client_priv服务器管理
REPLICATION SLAVERepl_slave_priv服务器管理
SELECTSelect_priv表或列
SHOW DATABASESShow_db_priv服务器管理
SHOW VIEWShow_view_priv意见
SHUTDOWNShutdown_priv服务器管理
SUPERSuper_priv服务器管理
TRIGGERTrigger_priv
UPDATEUpdate_priv表或列
USAGE同义词没有特权服务器管理

下表显示了用于动态权限名称GRANTREVOKE报表,随着语境的特权申请。

表6.3允许动态权限授予和撤销

特权语境
AUDIT_ADMIN审计日志管理
BACKUP_ADMIN备份管理
BINLOG_ADMIN备份和复制管理
CONNECTION_ADMIN服务器管理
ENCRYPTION_KEY_ADMIN服务器管理
FIREWALL_ADMIN防火墙管理
FIREWALL_USER防火墙管理
GROUP_REPLICATION_ADMIN复制管理
PERSIST_RO_VARIABLES_ADMIN服务器管理
REPLICATION_SLAVE_ADMIN复制管理
RESOURCE_GROUP_ADMIN资源组管理
RESOURCE_GROUP_USER资源组管理
ROLE_ADMIN服务器管理
SET_USER_ID服务器管理
SYSTEM_VARIABLES_ADMIN服务器管理
VERSION_TOKEN_ADMIN服务器管理
XA_RECOVER_ADMIN服务器管理

这是一个好主意,给一个帐户只有那些特权,它需要。你应该在给予运动特别小心FILE行政特权:

  • 这个FILE滥用特权可以读到数据库表中的任何文件,MySQL服务器可以在服务器主机读。这包括所有世界可读的文件和文件在服务器的数据目录。然后,可以使用表SELECT将其内容给客户端主机。

  • 这个GRANT OPTION特权用户可以给其他用户的权限。两用户有不同的权限与GRANT OPTION特权是能够结合的特权。

  • 这个ALTER特权可以用来颠覆特权系统重命名表。

  • 这个SHUTDOWN权限可以被滥用拒绝服务完全由终端服务器的其他用户。

  • 这个PROCESS特权可以用来查看当前正在执行的语句的文本,包括报表,设置或更改密码。

  • 这个SUPER权限可用于终止其他会话或改变服务器如何工作。

  • 优惠待遇mysql数据库本身可以用来修改密码等权限信息。密码是加密存储,所以恶意用户不能单纯看他们知道明文密码。然而,用户有写权限的用户authentication_string柱可以改变帐户的密码,然后连接到MySQL服务器使用的帐户。

    这个SELECT特权也为表或视图的使用需要EXPLAIN,包括任何潜在的表观。

以下各节提供可用的MySQL的静态和动态权限的一般描述。(关于这两种特权之间的差异信息见6.2.2、静态与动态的特权”特别是SQL语句。)可能有更具体的要求比表明这里的特权。如果是这样的话,对问题的描述提供了细节。

静态权限

静态的特权是建立在服务器上,与动态的特权,这是在运行时定义。下面的列表描述了可用的MySQL的静态权限。

动态权限

动态权限定义在运行时,相对于静态的特权,这是建立在服务器。下面的列表描述了可用的MySQL动态权限。

6.2.2静态与动态权限

MySQL支持静态和动态权限:

  • 静态的特权是建立在服务器。他们总是可以授予用户帐户不能注册。

  • 动态权限可以注册和未注册的在运行时。这会影响他们的可用性:一个动态的特权,没有注册不能授予。

例如,在SELECTINSERT特权是静态的,总是可用的,而动态权限变得可用,只有实现它已启用的服务器组件。

本节介绍了如何在MySQL动态权限。讨论使用的术语组件但也同样适用于插件

笔记

服务器管理员应该知道哪些服务器组件定义动态权限。MySQL的分布,对组件定义的动态权限的文件描述了这些特权。

第三方组件也可以定义动态权限;管理员应该了解那些特权和不安装组件,可能会发生冲突或妥协的服务器操作。例如,一个组件冲突如果都定义了一个同名的特权。组件开发人员可以通过选择具有特权的名字前缀基于组件名称减少这种情况发生的可能性。

服务器维护注册动态权限内部存储器中的设置。注销发生在服务器关闭。

通常,一个服务器组件,定义了动态特权寄存器他们安装时,其初始化序列中。当卸载,服务器组件不注销其注册的动态权限。(这是目前的做法,不要求。那是,组件可以,但不要在任何时候他们登记注销的特权。)

没有警告或错误的企图已注册登记的动态权限。考虑下面的语句序列:

INSTALL COMPONENT 'my_component';
UNINSTALL COMPONENT 'my_component';
INSTALL COMPONENT 'my_component';

第一INSTALL COMPONENT声明寄存器任何特权的服务器组件的定义我的喜剧演员,但UNINSTALL COMPONENT不注销他们。第二INSTALL COMPONENT语句,它注册的是已注册的组件的权限,但没有警告或错误发生。

动态权限只应用在全球层面。服务器存储信息的动态权限的用户帐户的当前任务mysql.global_grants系统表:

  • 服务器自动注册权限的命名global_grants在服务器启动(除非--skip-grant-tables是给定的选项)

  • 这个GRANTREVOKE语句修改内容全球_补助

  • 动态权限分配上市global_grants是持久的。他们不是在服务器关闭删除。

例如:下面的语句授予用户u1需要控制复制的权限(包括组复制)在从服务器,并修改系统变量:

Grant repedicience at the Suse Per AMIN,Group Const Relipped Per AMIN,BINOLG ET ADMinon * . * to ' u1 ' @encipast;

动态权限授予出现在输出从SHOW GRANTS声明和information_schemaUSER_PRIVILEGES

GRANTREVOKE在全球层面,任何命名的权限不被公认为静态检查注册动态权限设置,如果发现电流。否则,表示一个未知的特权标识发生错误。

GRANTREVOKE的意思所有的[权限]在全球层面,包括所有静态全局权限,以及所有目前注册的动态权限:

  • GRANT ALL在全球层面上授予所有静态全局权限和所有目前注册的动态权限。动态权限注册执行后续赠款语句不授予追溯任何账户。

  • REVOKE ALL在全球层面上解除所有授予特权和所有静态全局动态权限授予。

这个FLUSH PRIVILEGES语句读取全球_补助表的动态权限分配和登记未经登记的特权有。

用MySQL服务器和服务器组件包含在MySQL的分布提供了动态权限说明,见6.2.1节”,privileges提供由mysql”

帐户迁移从超级动态权限

在MySQL 8中,许多以前需要的操作SUPER特权也与动态范围较为有限的特权相关。(对于这些特权,说明见6.2.1节”,privileges提供由mysql”。)每一个这样的操作可以允许一个帐户授予的特权而不是相关的动态SUPER。这种变化使DBA能够避免发放提高了安全性SUPER根据用户权限允许的操作更紧密。SUPER现在是过时的、将在未来版本的MySQL移除。

当去除SUPER发生,以前需要操作SUPER将失败,除非帐户授予SUPER迁移到适当的动态权限。使用下面的指令来完成这一目标,账户前做好充分的准备SUPER搬家公司

  1. 执行此查询识别帐户是理所当然的SUPER

    SELECT GRANTEE FROM INFORMATION_SCHEMA.USER_PRIVILEGESWHERE PRIVILEGE_TYPE = 'SUPER';
  2. 通过前面的查询识别每个帐户,确定操作的需要SUPER。然后给予动态权限对应的操作,并撤销SUPER

    例如,如果'u1'@'localhost'要求SUPER二进制日志清除和系统变量修改这些报表进行必要更改的帐户:

    格兰特binlog_admin,system_variables_admin *。*“U1 '@'本地主机';撤销超*。*从U1 '@'本地主机';

    在你修改所有适用的账户,INFORMATION_SCHEMA在第一步中查询应该产生一个空结果集。

6.2.3授权表

这个mysql系统数据库包含多个授权表包含有关用户帐户和他们所持有的特权信息。本节描述了这些表。对系统数据库中的其他表的信息,参见5.3节,“MySQL数据库”

操纵授权表的内容,修改它们间接利用账户管理报表等CREATE USERGRANT,和REVOKE建立账户并有效控制每个人的特权。看到第13.7.1,“账户管理报表”。这里讨论了授权表的基础结构和服务器如何使用它们的内容与客户互动时。

笔记

格兰特表使用等语句直接修改INSERTUPDATE,或DELETE是气馁,做你自己的风险。服务器是忽略行成为畸形由于这样的修改。

进行任何操作,修改授权表,服务器检查表是否具有预期的结构和产生一个错误,如果不是。mysql_upgrade必须运行更新表的结构。

这些mysql数据库表包含授权信息:

  • user:用户帐户、全球的特权,和其他非特权列

  • global_grants:动态权限的用户看到的作业;6.2.2、静态与动态的特权”

  • db数据库:层次privileges

  • tables_priv表:层次privileges

  • columns_priv:柱过程中的层次privileges

  • procs_priv:存储过程和函数的权限

  • proxies_priv代理:用户privileges

  • default_roles默认用户角色:

  • role_edges:角色图的边缘

  • password_history:密码的修改

在MySQL 8中,授权表的使用InnoDB存储引擎和事务。在MySQL 8,授权表的使用MyISAM而非事务性存储引擎。这批表的存储引擎的变化使伴随的变化对账户管理报表等行为CREATE USERGRANT。此前,账户管理报表,命名为多个用户成功和失败的人对一些用户。现在,每个语句的事务,无论是成功的所有指定用户或卷有错误发生后并没有影响。

每个授权表包含的列和列范围的特权:

  • 范围列确定每行的范围在表;即在该行运用语境。例如,一个user表格行主机Userh1.example.net’’'bob'适用于验证了从主机服务器的连接h1.example.net由客户指定的用户的名称。bob。同样,一个DB表格行Host用户,和Db列值h1.example.net’’'bob'“报告”适用于当bob连接从主机h1.example.net访问reports数据库这个_前缀号码表columns_priv表包含范围列表示表或表的每一行/列的组合应用。这个_私人的过程范围列指示存储程序的每一行的应用。

  • 特权特权列指示表格行的补助;即,它允许进行哪些操作。服务器将信息在不同的授权表形成一个用户的权限的完整描述。第6.2.7,访问控制,阶段2:请求验证”the Rules for this介绍说。

服务器以下面的方式使用授权表:

  • 这个user表范围列决定是否拒绝或允许传入的连接。允许连接,任何权限的用户表格显示用户的全局权限。任何权限表中的应用全部服务器上的数据库

    注意安全

    因为全球的任何特权是所有数据库权限,任何全局权限允许用户查看所有数据库名称SHOW DATABASES或通过检查SCHEMATAinformation_schema

  • 这个global_grants表列出当前用户帐户的动态权限分配。

  • 这个db表范围列确定哪些用户可以访问该数据库的主机。特权列确定允许的操作。一个权限在数据库级别适用于数据库,数据库中的所有对象,如表和存储的程序。

  • 这个tables_privcolumns_priv表是相似的db表,但更细粒度的:他们申请表和列的水平,而不是在数据库级别。特权授予在表级适用于表及其所有列。特权授予在列级仅适用于特定的列。

  • 这个procs_priv表用于存储程序(程序和功能)。特权授予在常规水平仅适用于单个过程或函数。

  • 这个proxies_priv表格显示,用户可以作为其他用户代理和用户是否可以授予PROXY权限的其他用户

  • 这个default_rolesrole_edges表包含信息的作用关系。

  • 这个password_history表保留先前选择的密码,使密码重用的限制。看到第6.3.8,“密码管理”

服务器使用userDB表中的mysql在访问控制的第一和第二阶段的数据库(见6.2节,“MySQL的权限系统”)。在列userDB表所示

表6.4用户与数据库表中的列

表名userdb
范围列HostHost
UserDb
User
特权列Select_privSelect_priv
Insert_privInsert_priv
Update_privUpdate_priv
Delete_privDelete_priv
Index_privIndex_priv
Alter_privAlter_priv
Create_privCreate_priv
Drop_privDrop_priv
Grant_privGrant_priv
Create_view_privCreate_view_priv
Show_view_privShow_view_priv
Create_routine_privCreate_routine_priv
Alter_routine_privAlter_routine_priv
Execute_privExecute_priv
Trigger_privTrigger_priv
Event_privEvent_priv
Create_tmp_table_privCreate_tmp_table_priv
Lock_tables_privLock_tables_priv
References_privReferences_priv
Reload_priv
Shutdown_priv
Process_priv
File_priv
Show_db_priv
Super_priv
Repl_slave_priv
Repl_client_priv
Create_user_priv
Create_tablespace_priv
Create_role_priv
Drop_role_priv
安全列ssl_type
ssl_cipher
x509_issuer
x509_subject
plugin
authentication_string
password_expired
password_last_changed
password_lifetime
account_locked
Password_reuse_history
Password_reuse_time
Password_require_current
资源控制列max_questions
max_updates
max_connections
max_user_connections

这个user插件authentication_string列存储认证插件和证书信息。

服务器使用插件命名的plugin一个帐户行鉴定帐户连接尝试柱。

这个plugin列不能是空的。在启动时,在运行时FLUSH PRIVILEGES执行时,服务器会检查用户表中的行。有空的任何行plugin柱,服务器写这种形式的错误日志警告:

[警告]用户入口”user_name“@”host_name“有一个空的pluginvalue。用户将被忽略,没有人可以用这useranymore登录。

这个password_expired列允许DBA过期账号密码要求用户重置其密码。默认的password_expired'N',但可设置“Y”ALTER USER声明。在一个帐户的密码已过期,所有操作由账户在随后的连接在一个错误的服务器到用户的问题ALTER USER语句来建立一个新的帐户密码。

这可能是密码到期后重置通过它的电流值的密码。作为一个好的政策,最好是选择一个不同的密码。数据库管理员可以通过建立一个适当的密码重用政策执行非重用。看到密码重用策略

password_last_changed是一个时间戳列指示当上次更改口令。价值是非—NULL只有对那些使用MySQL的内置身份验证插件(mysql_native_passwordsha256_password,或caching_sha2_password)。the value isNULL其他账户,如那些使用外部认证系统认证。

password_last_changed更新的CREATE USERALTER USER,和SET PASSWORD报表,并通过GRANT语句创建一个帐户或更改帐户密码。

password_lifetime显示账号密码的寿命,在天。如果密码是过去的寿命(评估使用的password_last_changed列),服务器将密码过期,当客户端连接使用的帐户。一个值N大于零,意味着必须更改密码的每一N天.值0禁用自动密码过期。如果该值为无效的(默认),全球政策将到期,所定义的default_password_lifetime系统变量

account_locked指示帐户锁定(见第6.3.12,“用户帐户锁定”

Password_reuse_history是的价值密码历史该帐户的选项,或NULL对于默认的历史

Password_reuse_time是的价值密码重用区间该帐户的选项,或NULL对于默认间隔

Password_require_current(可作为MySQL 8.0.13)对应的值密码要求该帐户的选项,如下面的表。

表6.5允许password_require_current值

password_require_current价值要求选择相应的密码
'Y'PASSWORD REQUIRE CURRENT
'N'PASSWORD REQUIRE CURRENT OPTIONAL
NULLPASSWORD REQUIRE CURRENT DEFAULT

访问控制在第二阶段中,该服务器执行请求验证以确保每个客户对每个请求,这问题足够的特权。除了对userDB授权表,服务器也可以咨询tables_privcolumns_priv请求涉及表表。后者表提供更精细的权限控制在表和列级。他们有列如下表所示。

表6.6 tables_priv和columns_priv表列

表名tables_privcolumns_priv
范围列HostHost
DbDb
UserUser
Table_nameTable_name
Column_name
特权列Table_privColumn_priv
Column_priv
其他列TimestampTimestamp
Grantor

这个Timestamp让与人列设置为当前时间戳和CURRENT_USER值,分别为,但并不是未用的。

对于要求涉及存储程序验证,服务器可咨询procs_priv表,具有下表中显示的列。

表6.7 procs_priv表列

表名procs_priv
范围列Host
Db
User
Routine_name
Routine_type
特权列Proc_priv
其他列Timestamp
Grantor

这个Routine_type柱是一个ENUM值列“功能”'PROCEDURE'表明常规行指型。本栏目使权限被授予单独为一个函数和一个具有相同名称的程序。

这个Timestamp让与人列未使用

这个proxies_priv表中记录的有关代理的帐户信息。它有这些列:

  • Host用户:代理账户;即,账户有PROXY该代理帐户的特权

  • Proxied_hostproxied_user:代理帐户

  • Grantor时间戳unused:。。。。。。。

  • With_grant:是否可以授予的代理帐户PROXY特权帐户

一个帐号可以授予PROXY特权的其他帐户,它必须在有一排proxies_privWith_grant设置为1proxied_hostProxied_user设置显示的帐户或帐户的权限可以授予。例如,在root @本地主机在MySQL安装创建的帐户在一排proxies_priv表格可以授予PROXY特权“@”,即所有用户和所有主机。这使root设置代理的用户,以及委托其他帐户的权限设置代理用户。看到第6.3.11”代理用户”

这个global_grants表列出当前用户帐户的动态权限分配。这些特权是全球。这些列的表:

  • USER主机:用户的账户名称和主机名的特权是理所当然的。

  • PRIV名称:特权

  • WITH_GRANT_OPTION:户口是否可以向其他帐户授予的特权。

这个default_roles表中列出的默认用户角色。它有这些列:

  • HOST用户:帐户或角色的默认角色适用。

  • DEFAULT_ROLE_HOSTdefault_role_user:默认的角色

这个role_edges表列出角色图的边缘。它有这些列:

  • FROM_HOSTfrom_user:帐户被授予角色

  • TO_HOSTto_user:这是授予帐户的作用。

  • WITH_ADMIN_OPTION:户口是否可以角色授予和撤销其使用其他帐户有选项

这个password_history表包含有关修改密码信息。它有这些列:

  • Host用户:帐户的密码发生变化。

  • Password_timestamp:密码更改时发生的时间。

  • Password:《密码哈希值

这个password_history表非空密码账号积累足够数量使MySQL进行检查对账号密码的历史长度和复用间隔。条目,是在极限时更改密码的尝试发生自动修剪。

笔记

空密码不在密码历史计数,随时使用。

如果一个账号改名,其条目改名为比赛。如果一个帐户被丢弃或其认证的插件是改变,其条目删除。

在授权表范围列包含字符串。每个默认值是空字符串。下表显示每列中允许的字符数。

表6.8授权表范围列长度

列名称最大允许的字符
Hostproxied_host六十
Userproxied_user三十二
Db六十四
Table_name六十四
Column_name六十四
Routine_name六十四

访问检查的目的,比较Userproxied_userauthentication_stringDB,和Table_name的值都是大小写敏感。比较主机Proxied_hostcolumn_name,和Routine_name值不区分大小写

这个userDB表列出了每个权限在一个单独的列声明为ENUM('N','Y') DEFAULT 'N'。换句话说,每一个特权可以禁用或启用,与默认被禁用。

这个tables_privcolumns_priv,和procs_priv表列为申报的特权SET专栏在这些列的值可以包含由表控制权限的任何组合。只有在列值的权限,使上市。

表6.9集类型权限的列值

表名列名称可能的集合元素
tables_privTable_priv'Select', 'Insert', 'Update', 'Delete', 'Create', 'Drop', 'Grant', 'References', 'Index', 'Alter', 'Create View', 'Show view', 'Trigger'
tables_privColumn_priv'Select', 'Insert', 'Update', 'References'
columns_privColumn_priv'Select', 'Insert', 'Update', 'References'
procs_privProc_priv'Execute', 'Alter Routine', 'Grant'

只有user表指定的行政特权,如RELOADSHUTDOWN。行政业务是服务器本身的操作和不特定数据库,所以没有理由列表中的其他授权表这些特权。因此,服务器只需要咨询用户表以确定用户是否可以执行管理操作。

这个FILE特权也只在指定的用户表它不是一个行政特权等,但用户的阅读能力或服务器主机上写文件是独立的被访问的数据库。

服务器读取授权表的内容到内存中时,它开始。你可以告诉它加载表发布FLUSH PRIVILEGES语句或执行mysqladmin嵌入式的权利mysqladmin重装命令。授予表生效如变化第6.2.8,当特权更改生效”

当你修改一个帐户,这是一个好主意,以验证您的变化有预期的效果。检查权限,对于一个给定的账户,使用SHOW GRANTS声明。例如,确定权限授予一个帐户的用户名和主机名的值鲍勃pc84.example.com使用此语句:

显示“鲍勃”'pc84补助。例如.com”;

显示一个帐户nonprivilege性能,使用SHOW CREATE USER

显示创建用户“鲍勃”'pc84。例如.com”;

6.2.4指定帐户名称

MySQL账户名称由用户名和主机名。这使用户有相同名字的人可以从不同的主机连接的帐户创建。本节介绍如何写帐户的名称,包括特殊的价值观和通配符规则。

MySQL的角色名称与账户名称,有些不同了第6.2.5,“指定角色的名字”

在SQL语句等CREATE USERGRANT,和SET PASSWORD遵循这些规则,账户名称:

  • 帐户名称的语法是'user_name'@'host_name'

  • 帐户名称只包含一个用户名是等价的'user_name'@'%'。例如,“我”相当于'me'@'%'

  • 用户名和主机名不需要引用如果他们是合法的标识符作为非上市。报价必须指定user_name包含特殊字符的字符串(如空间或),或一个host_name字符串包含特殊字符或通配符(如%);例如,测试用户@“.com”

  • 引用用户名和主机名的标识符或字符串,可以使用引号(`)、单引号('),或双引号(")。字符串引用标识符引用指南,看9.1.1节,“String Literals”,和9.2节,“架构对象名称”

  • 用户名和主机名部分,如果引用,必须分开。那就是,写'me'@'localhost',不我是@本地主机后者实际上是等价的;'me@localhost'@'%'

  • 一个参考的CURRENT_USERCURRENT_USER()功能相当于指定当前客户端的用户名和主机名上。

MySQL存储帐户的名称在授权表mysql使用单独的列为用户名和主机名部分系统数据库:

  • 这个user表包含每个帐户的一行。这个用户Host列存储用户名和主机名。该表还表明全局权限的帐户。

  • 其他授权表显示特权的帐户对数据库和对象数据库内。这些表User主机列存储帐户名称。每一行在这些表中员工与客户的user表具有相同的用户Host价值观

  • 访问检查的目的,用户价值比较是区分大小写的。主机值比较是不区分大小写。

关于授权表结构的更多细节,参见第6.2.3,“Grant Tables”

用户名和主机名或通配符规则具有一定的特殊价值,如以下。

一个帐号的用户名部分是一个非空值,字面匹配的用户名传入的连接尝试,或空白值(空字符串),匹配任何用户名。一个空白的用户帐户是匿名用户。指定SQL语句中的匿名用户,使用一个引用空用户名的一部分,如''@'localhost'

一个帐户名主机名部分可采取多种形式,并允许使用通配符:

  • 一个主机的值可以是一个主机名或IP地址(IPv4或IPv6)。名称'localhost'显示本地主机。IP地址“127.0.0.1”表明IPv4环回接口。IP地址'::1'表明IPv6环回接口。

  • 这个%_通配符在主机名或IP地址允许值。这些具有相同含义的模式匹配操作进行的LIKE算子。例如,一个主机的价值“%”匹配任何主机名,而值'%.mysql.com'在任何主机匹配'198.51.100.%'比赛在198.51.100 C类网络的主机。

    由于IP通配符值在主机允许值(例如,'198.51.100.%'匹配的子网上的每个主机),有人可能试图通过命名主机利用这种能力198.51.100.somewhere.com。挫败这种企图,MySQL不执行主机的名字开始与数字和点匹配。例如,如果一个主机名1.2.example.com它的名字不匹配,账户名称的主机部分。一个IP通配符值只能匹配的IP地址,而不是主机名。

  • 对于一个指定的IPv4地址的主机,网络掩码可以表示多少位地址用于网络号。子网掩码符号不能用于IPv6地址。

    语法是host_ip/netmask。例如:

    创建用户“戴维”'198.51.100.0 / 255.255.255.0”;

    这使david要有一个IP地址的任何客户端连接client_ip其中下列条件为真:

    client_ip&netmask=host_ip

    这是对的CREATE USER声明只是证明:

    client_ip& 255.255.255.0 = 198.51.100.0

    IP地址,满足这个条件的范围从198.51.100.0198.51.100.255

    网络掩码通常始于位设置为1,其次是位设置为0。实例:

    • 198.0.0.0/255.0.0.0198类:对任何一个网络主机

    • 198.51.100.0/255.255.0.0198.51:在B类网络中的任何主机

    • 198.51.100.0/255.255.255.0:在198.51.100 C类网络的主机

    • 198.51.100.1:只有这个特定的IP地址的主机

服务器执行的帐户名称与客户端主机使用价值观匹配主机系统返回的DNS解析客户端的主机名或IP地址。除了在的情况下,账户价值是使用子网掩码符号指定主机,服务器作为一个字符串匹配比较,甚至一个帐号主机值给出一个IP地址。这意味着,你应该使用DNS格式相同主机值指定帐户。这是需要注意的问题的例子:

  • 假设在本地网络中的主机有一个完全合格的名称host1.example.com。如果DNS返回名字查找主机host1.example.com在帐户,主机值使用这个名字。如果DNS返回host1,使用注1相反

  • 如果DNS返回给定主机的IP地址198.51.100.2,将匹配一个帐户主值198.51.100.2但不198.051.100.2。同样,它将一个帐户的主机模式一样198.51.100 %但不198.051.100.%

为了避免这样的问题,这是明智的检查你的DNS返回主机名和地址的格式。在MySQL帐户名称相同的格式,使用价值。

6.2.5指定角色的名字

MySQL的角色名字指的是角色,即集合的特权。角色使用的例子,看第6.3.4,“角色”

角色名称有语法和语义相似的帐户名称(第6.2.4,“指定的帐户名”)。角色名称与账户名称在这些方面:

  • 角色名称的用户不能是空白的。因此,没有匿名的作用类似的概念匿名用户

  • 对于一个帐户名,省略角色名称,结果在一个主机部分,主机部分'%'。但不同于“%”在一个帐户名,主机部分'%'在一个角色的名字没有通配符属性。例如,一个名字“我”@“%”作为一个角色的名字,主机部分('%')只是一个文本值;它没有任何主机匹配性

  • 子网掩码的符号在一个角色名主机部分没有意义。

  • 帐户名称不得CURRENT_USER()在几种情况下。一个角色的名字是不。

在一排是可能的mysql.user系统表作为一个账户和一个角色。在这种情况下,任何特殊的用户或主机名匹配的属性不适用于上下文的名称作为一个角色的名字。例如,你不能执行与期望,它将使用所有的角色,有一部分用户设置的当前会话角色声明如下角色和任何主机名:

SET ROLE 'myrole'@'%';

相反,声明为会议的作用完全名称设置活动的作用'myrole'@'%'

为此,角色名称往往仅使用用户名和主机名部分让隐式地指定'%'。指定一个角色与一个非—“%”主机部分可以是有用的如果你打算创建一个名称,作为一个角色作为一个用户帐户,允许从特定的主机连接。

6.2.6访问控制,第一阶段:连接验证

当您试图连接到MySQL服务器,服务器接受或拒绝基于这些条件的连接:

  • 你的身份,你是否能提供正确的密码,确认你的身份

  • 无论您的帐户被锁定或解锁

服务器检查凭据,然后帐户锁定状态。一步失败导致服务器拒绝访问你完全。否则,服务器接受连接,然后进入第二阶段,等待请求。

凭证检查使用的是三行user表列(范围主机User,和_认证字符串)。锁定状态被记录在useraccount_locked专栏服务器接受连接只有Host用户列在一些user表中的行匹配的客户端的主机名和用户名,客户提供该行中指定的密码,和account_locked'N'。允许的规则主机User值给出了第6.2.4,“指定的帐户名”。帐户锁定是可以改变的ALTER USER声明

你的身份是基于两条信息:

  • 客户端主机的连接

  • 你的MySQL用户名

如果User列值为非空,在传入的连接的用户名称必须完全匹配。如果用户值是空白,它匹配任何用户名称。如果user表中的行匹配传入的连接有一个空白的用户名称,用户被认为是一个没有名字的匿名用户,不是一个真正的客户指定用户的名称。这意味着一个空白的用户名称用于所有进一步的访问检查连接的持续时间(即二期)。

这个authentication_string列可以是空白。这不是一个通配符,并不意味着任何密码匹配。这意味着用户必须连接没有指定密码。如果服务器对客户端使用一个插件,该插件实现的可能或不可能在使用密码的认证方法_认证字符串专栏在这种情况下,它可能是一个外部的密码也被用来验证到MySQL服务器。

非空authentication_string中的值用户表表示加密的密码。mysql不存储密码明文的形式给谁看。相反,由一个用户试图连接提供的密码进行加密(使用密码散列方法通过账户认证插件实现)。加密的密码然后连接过程时,检查是否正确输入密码时使用。这样做是不加密的密码曾经旅行过的连接。看到6.3.1节,“用户名和密码”

从MySQL的点,加密的密码是真实密码,所以你不应该给任何人访问它。特别地,不给非管理员用户访问表的读mysql数据库

下表显示了各种组合User主机中的值user表适用于传入的连接

User价值Host价值允许连接
'fred''h1.example.net'fred,连接h1.example.net
'''h1.example.net'任何用户连接h1.example.net
'fred''%'fred,从任何主机连接
'''%'任何用户,任何主机连接
'fred''%.example.net'fred从任何主机,连接在example.net
'fred''x.example.%'fred,连接x.example.netx.example.comx.example.edu,等等;这可能是没有用的
'fred''198.51.100.177'fred,从IP地址的主机连接198.51.100.177
'fred''198.51.100.%'fred从任何主机,连接在198.51.100C类子网
'fred''198.51.100.0/255.255.255.0'同以前的例子

客户端的主机名和用户名输入连接在一个以上的行匹配是可能的user表实例演示:前面几个条目显示匹配连接h1.example.netfred

多个可能的匹配时,服务器必须确定他们使用。解决这一问题如下:

  • 每当服务器读取user表到内存中,这类的行。

  • 当一个客户端试图连接,服务器查找行排序顺序。

  • 服务器使用第一行匹配客户端的主机名和用户名。

服务器使用的排序,最具体的行排序规则Host的值。字面上的主机名和IP地址是最具体的。(一个字面上的IP地址的特异性不受是否有子网掩码,所以198.51.100.13198.51.100.0/255.255.255.0同样被认为是特定的模式。)“%”方法任何主机是最不具体。空字符串''也意味着任何主机但整理后'%'。同一行主机价值是有序的最具体的User的值(一个空白用户价值手段任何用户是最具体的)。同样的具体行Host用户值,顺序是不确定的

看到这是如何工作的,假设user表看起来像这样:

----------- ---------- - |主机|用户|…----------- ---------- - | % |根|…| % |杰夫瑞|…| localhost |根|…| localhost | |…----------- ----------—

当服务器读取到内存中的表,各种行使用规则描述。排序后的结果看起来像这样:

+-----------+----------+-
| Host      | User     | ...
+-----------+----------+-
| localhost | root     | ...
| localhost |          | ...
| %         | jeffrey  | ...
| %         | root     | ...
+-----------+----------+-

当一个客户端试图连接,服务器查找排序的行和使用第一个找到的匹配。一个连接localhost杰夫瑞,两从表相匹配的行数:一个Host用户'localhost'' ',和价值观的人'%'“杰夫瑞”。这个'localhost'行出现在排序第一,所以这是一个服务器使用。

这里是另一个例子。假设user表看起来像这样:

---------------- ---------- - |主机|用户|…---------------- ---------- - | % |杰夫瑞|…| h1.example.net | |…---------------- ----------—

排序表看起来像这样:

+----------------+----------+-
| Host           | User     | ...
+----------------+----------+-
| h1.example.net |          | ...
| %              | jeffrey  | ...
+----------------+----------+-

一个连接jeffreyh1.example.net由第一行匹配,而连接jeffrey从任何主机的第二匹配。

笔记

这是一个常见的误解认为,对于一个给定的用户名,所有行的明确的名称,用户采用的是先当服务器试图找到一个匹配的连接。这不是真的。前面的例子说明,在一个连接h1.example.net杰夫瑞首先是匹配不由行'jeffrey'作为用户列的值,而是由行没有用户名称。因此,jeffrey经认证的匿名用户,即使他指定的用户名连接时。

如果你能够连接到服务器,但你的特权是不是你所期望的,你可能被鉴定为其他帐户。找出哪些账户用来验证你的服务器,使用CURRENT_USER()功能。(见12.14节,“信息功能”它返回一个值。)user_name@host_name格式说明用户Host从匹配值用户表格行。假设jeffrey连接问题以下查询:

MySQL的>SELECT CURRENT_USER();---------------- | current_user() | ---------------- | @本地| ----------------

这里显示的结果表明,匹配user表行有一个空白用户列值。换句话说,服务器处理jeffrey作为匿名用户

另一种方法来诊断认证问题是打印出来的user表用手把它看到的第一场比赛是由。

6.2.7访问控制,第二阶段:请求验证

你建立连接后,服务器进入访问控制2阶段。对于每个请求,你的问题通过该连接,服务器确定要执行什么操作,然后检查你是否有足够的权限去这么做。这是在授权表列的特权来发挥作用。这些特权可以来自任何的userDBtables_privcolumns_priv,或procs_priv表(你可能会发现它有用参考第6.2.3,“Grant Tables”,其中列出的列在每个授权表现。)

这个user表授予权限是指派给您在全球的基础上,运用无论默认数据库是什么。例如,如果用户表给你的DELETE特权,你可以删除行的任何表中的任何数据库服务器主机!在给予特权是明智的用户表只为需要的人,如数据库管理员。对于其他用户,你应该把所有的特权的user表格设置“N”而在更具体的层面只授予特权。你可以为特定的数据库,授予权限表,列,或例程。

这个db表格数据库特定的权限授予。在该表的列的值的范围,可以采取下列方式:

  • 一个空白User价值与匿名用户。一个非空的值匹配字面;有用户名称不包含通配符。

  • 通配符%_可用于HostDB专栏这些具有相同含义的模式匹配操作进行的LIKE算子。如果你想使用字符字面当授予特权,你必须摆脱它的反斜杠。例如,包含下划线字符(_)作为数据库名称的一部分,指定它作为\_GRANT声明

  • '%'或空白主机价值手段任何主机

  • '%'或空白DB值的均值任何数据库

服务器读取db到内存中的表和排序它的同时,它读取用户表服务器的分类db基于表主机Db,和用户范围列。与user表,分类提出最具体的值的第一和最具体的价值观上,当服务器查找匹配的行,它使用的第一场比赛,发现。

这个tables_privcolumns_priv,和procs_priv表授权表列具体,具体,和常规的特定权限。在这些表中的列的值的范围,可以采取下列方式:

  • 通配符%_可用于Host专栏这些具有相同含义的模式匹配操作进行的LIKE算子

  • '%'或空白主机价值手段任何主机

  • 这个DbColumn_name,和常规_名称列不能包含通配符或是空白。

服务器的分类tables_privcolumns_priv,和procs_priv基于表主机Db,和用户专栏这是类似于db表排序,但更简单,因为只有主机列可以包含通配符

服务器使用排序表来验证每一个请求,它接收。请求需要管理权限等SHUTDOWNRELOAD,服务器只检查用户表行,因为这是唯一的表,指定行政特权。服务器授予存取如果行允许请求的操作,否则拒绝访问。例如,如果你想执行关闭但你的user表格行不批SHUTDOWN特权,你的服务器拒绝访问,甚至没有检查DB表(不包含Shutdown_priv列,所以没有必要这样做。)

数据库相关的要求(INSERTUPDATE,等等),服务器首先检查用户的全局权限看的用户表格行。如果行允许请求的操作,访问是理所当然的。如果在全球的特权user表是不够的,服务器确定用户的数据库特定的权限检查DB

服务器会在db在一个匹配表主机Db,和用户专栏这个Host用户柱配合连接用户的主机名和MySQL用户名。这个Db柱是相匹配的,用户要访问数据库。如果没有行为主机User,访问被拒绝

在确定数据库特定的权限授予db表的行,服务器添加到全局权限授予用户表如果结果允许请求的操作,访问是理所当然的。否则,服务器先后检查用户的表和列中的特权tables_privcolumns_priv表,增加了对用户的权限,并允许或拒绝基于结果的访问。对于存储的常规操作,服务器使用procs_priv表而不是_前缀号码表columns_priv

在布尔表示,前面的描述一个用户权限的计算可以概括如下:

global privileges
OR (database privileges AND host privileges)
OR table privileges
OR column privileges
OR routine privileges

它可能不是很明显的原因,如果全球user行特权最初发现不足以操作请求,服务器将这些权限的数据库、表和列的权限后。原因是,一个请求可能需要不止一种类型的特权。例如,如果你执行一个INSERT INTO ... SELECT声明中,你既需要INSERTSELECT特权.你的权限可能是这样的用户一个表行授予特权和db表格行给予其他。在这种情况下,你必须执行该请求所必需的权限,但服务器无法从表本身;在表行授予特权必须结合。

6.2.8当特权更改生效

什么时候mysqld开始,它读取所有授权表内容到内存。在内存表成为有效的访问控制点。

如果修改授权表间接使用帐户管理报表等GRANTREVOKESET PASSWORD,或RENAME USER注意到这些变化,服务器加载到内存立即再次授权表。

如果修改授权表直接使用报表等INSERTUPDATE,或DELETE,你的变化对特权检查你重启服务器或者让它重新加载表直到没有影响。如果你改变了格兰特表直接而忘了加载它们,你的变化没有影响直到你重新启动服务器。这可能会让你想知道为什么你的变化似乎没有影响!

告诉服务器重新加载授权表,执行FLUSH PRIVILEGES操作。这可以通过发行完成FLUSH PRIVILEGES通过执行一个语句或mysqladmin嵌入式的权利mysqladmin重装命令

金表加载影响特权每个现有的客户端连接如下:

  • 表和列的权限更改生效与客户的下一个请求。

  • 数据库权限更改将在客户端执行接下来的时间效应USE db_name声明

    笔记

    客户端应用程序可以缓存数据库名称;因此,这种效应可能没有改变到一个不同的数据库可以看到他们。

  • 全局权限和密码进行连接的客户端不受影响。这些变化会影响仅为后续连接。

如果服务器开始的--skip-grant-tables选项,读起来不授权表或执行任何访问控制。任何人都可以做任何事,insecure which is。导致服务器从而开始看表并启用访问检查,冲洗的特权。

6.2.9连接到MySQL问题的故障排除

如果你遇到问题,当你试图连接到MySQL服务器,以下介绍一些你可以采取的行动来纠正问题。

  • 确保服务器运行。如果不是,客户端无法连接到它。例如,如果尝试连接到服务器失败,消息如一人,一个原因可能是服务器没有运行:

    shell> mysql
    ERROR 2003: Can't connect to MySQL server on 'host_name' (111)
    shell> mysql
    ERROR 2002: Can't connect to local MySQL server through socket
    '/tmp/mysql.sock' (111)
    
  • 可能是服务器正在运行,但你想使用一个TCP / IP端口,连接命名管道,或UNIX socket文件不同的一个服务器上听。要纠正这种当你调用一个客户端程序,指定--port选项指出正确的端口号,或--socket选项指出正确的命名管道或UNIX socket文件。发现那里的套接字文件,你可以使用此命令:

    内核>netstat -ln | grep mysql
  • 确保服务器没有配置为忽略网络连接(如果您试图远程连接),它没有被配置为只听本地网络接口。如果服务器启动--skip-networking,它不会接受TCP/IP连接在所有。如果服务器启动--bind-address=127.0.0.1,它将侦听TCP/IP只有本地环回接口连接和不接受远程连接。

  • 检查以确保没有防火墙阻止访问MySQL。你的防火墙的配置可能对正在执行的应用程序的基础上,或由MySQL用于通信的端口号(默认为3306)。Linux或Unix下,检查你的IP表(或类似的)配置确保端口没有被封锁。在Windows环境下,应用如ZoneAlarm或者Windows防火墙可能需要配置不阻止MySQL端口。

  • 授权表必须正确设置使得服务器可以使用它们访问控制。对于一些分布类型(如二进制分布在Windows,Linux或转速分布),安装程序初始化MySQL数据目录,包括mysql包含授权表数据库。对于分布,不这样做,你必须手动初始化数据目录。详情见2.9节,“安装后的设置和测试

    决定你是否需要初始化的授权表,寻找mysql数据目录下的目录。(数据目录通常被称为数据var位于你的MySQL安装目录下。)确保你有一个文件名为user.mydmysql数据库目录。如果不是,初始化数据目录。这样做之后,启动服务器,你应该能够连接到服务器。

  • 重新安装后,如果您尝试登录到服务器root不使用密码,您可能会收到以下错误消息。

    内核>mysql -u root 错误1045(28000):拒绝访问用户的根'@'本地主机'(使用密码:无)

    这意味着root密码已被指定在安装过程中,它必须提供。看到第2.9.4,”保证初始MySQL账户”在密码可能已被分配了不同的方式,在某些情况下,如何找到它。如果你需要重置密码,请在说明第b.5.3.2,“如何重置密码”。当你发现或重置您的密码,重新登录为root使用--password(或-p期权:)

    内核>mysql -u root -p 输入密码:

    然而,服务器会让你连接root如果你不使用密码初始化MySQL的使用mysqld -初始化不安全(见部分2.9.1.1,“初始化使用mysqld”手动数据目录详情)。这是一个安全风险,所以你应该为设置密码root看到账户;第2.9.4,”保证初始MySQL账户”说明

  • 如果你已经更新了现有的MySQL安装更新的版本,你跑mysql_upgrade脚本如果不这样做。结构的授权表变化偶尔当新的功能被添加,所以升级你应该确保你的表的当前结构后。有关说明,见4.4.5“,”mysql_upgrade检查升级MySQL表”

  • 如果一个客户端程序收到以下错误消息当试图连接,这意味着服务器预计在新格式的密码比客户端能够产生:

    shell> mysql
    Client does not support authentication protocol requested
    by server; consider upgrading MySQL client
    
  • 记住,客户程序使用连接参数中指定的选项文件或环境变量。如果一个客户端程序似乎是发送错误的默认连接参数,当你没有指定他们在命令行上,检查任何适用的选择文件和你的环境。例如,如果你得到Access denied当你运行一个客户端没有任何选项,确保你没有在你的任何选项文件指定一个旧密码!

    你可以通过调用它的抑制由客户端程序,选择文件的使用--no-defaults选项。例如:

    内核>mysqladmin --no-defaults -u root version

    选择文件,客户端使用的列第4.2.6、“使用选项文件”。环境变量中列出4.9节,“MySQL程序环境变量”

  • 如果你收到以下错误,这意味着你使用的是不正确的root密码:

    内核>mysqladmin -u root -pxxxx ver用户访问被拒绝的根'@'本地主机'(使用密码:是的)

    如果前面的错误发生时,即使你没有指定密码,这意味着你有一个不正确的密码列在一些选项文件。试试--no-defaults选择在以前的项目描述。

    有关更改密码的信息,参见第6.3.7,“分配账号密码”

    如果你丢失或遗忘的root密码,看第b.5.3.2,“如何重置密码”

  • localhost是一个你的本地主机名称的同义词,也是默认主机,客户端尝试连接如果你不指定主机明确。

    你可以使用一个--host=127.0.0.1选项名称服务器主机明确。这将使一个TCP/IP连接的地方mysqld伺候。你也可以用光谱法使用TCP / IP--host选择使用本地主机的主机名。在这种情况下,主机名必须指定一个用户服务器主机上的表行,即使你是运行在同一主机上的客户程序和服务器。

  • 这个Access denied错误信息告诉你你是谁试图登录,客户端主机,你想连接,无论你是使用一个密码。通常情况下,你应该在有一个排用户表完全匹配的主机名和用户名,在错误信息了。例如,如果你得到一个错误消息,包含using password: NO,这意味着你想不用密码登陆。

  • 如果你得到一个Access denied当试图连接数据库错误mysql -uuser_name,你可以与有问题用户表通过执行检查mysql -u root mysql发行该SQL语句:

    SELECT * FROM用户;

    结果应包括与行Host用户列匹配您的客户端的主机名和你的MySQL用户名。

  • 如果出现以下错误发生时,你要从其他的MySQL服务器运行的主机连接,这意味着在没有排user表一主机价值相匹配的客户端主机:

    Host ... is not allowed to connect to this MySQL server
    

    你可以通过设置客户端的主机名和用户名的组合一个帐户,您使用的是当试图连接固定这。

    如果你不知道,你正在连接本机的IP地址或主机名,你应该放一排'%'作为主机列中的值user表在试图从客户机连接使用选择user()查询看看你真的连接。然后改变'%'用户表格行的实际主机名称显示在日志。否则,你的系统是安全的因为它允许左连接从给定的用户名的任何主机。

    在Linux中,另一个原因,可能会发生这个错误是你用的是二进制的MySQL版本,用不同版本的编译glibc图书馆比你用。在这种情况下,您可以升级您的操作系统或glibc,或下载的MySQL版本的源分布和自己编译。一个RPM源通常是微不足道的编译和安装,所以这不是一个大问题。

  • 如果你指定一个主机名时,尝试连接,但得到一个错误信息,主机名是不显示或是一个IP地址,这意味着MySQL服务器收到一个错误当试图解决客户端主机名的IP地址:

    shell> mysqladmin -u root -pxxxx -h some_hostname ver
    Access denied for user 'root'@'' (using password: YES)
    

    如果你试图连接root并得到以下错误,这意味着你不能在一排用户表一User列值“根”mysqld无法解决您的客户端的主机名:

    Access denied for user ''@'unknown'
    

    这些错误表明DNS问题。为了修复它,执行mysqladmin冲洗主机重置内部DNS主机缓存。看到第8.12.4.2,“DNS查询优化和主机缓存”

    一些永久性的解决方案:

    • 确定什么是你的DNS服务器错误并修复它。

    • 指定而不是MySQL的授权表的主机名的IP地址。

    • 把客户机的名字中的一个条目/etc/hosts在Unix或\ Windows \主机在Windows

    • 开始mysqld--skip-name-resolve选项

    • 开始mysqld--skip-host-cache选项

    • 在Unix上,如果你正在运行的服务器在同一台机器上的客户端,连接到localhost。连接到本地服务器,MySQL程序试图利用UNIX套接字文件连接到本地服务器,除非有指定连接参数以确保客户端进行TCP/IP连接。有关更多信息,参见4.2.2节,“连接到服务器”

    • 在Windows中,如果你正在运行的服务器在同一台机器上的客户端和服务器支持命名管道连接,连接到主机的名字.(周期)。connections to使用命名管道而不是TCP / IP。

  • 如果mysql -u root的作品,但MySQL的Hyour_hostname你的根结果拒绝访问(在哪里your_hostname是本地主机的实际的主机名),你不可以在有你的主机的正确名称用户表一个常见的问题是,Host中的价值用户表行指定一个不合格的主机名称,但是你的系统的名称解析例程返回一个完全合格的域名(或反之亦然)。例如,如果你的主机有一排'pluto'用户表,但你的DNS主机名是MySQL,告诉你'pluto.example.com',行不工作。尝试添加一行到用户表中包含了你的主机的IP地址为Host列值。(或者,你可以添加一行到用户表一Host值,包含一个通配符;例如,“冥王星。%”。然而,使用Host值的结尾%不安全的和是推荐!)

  • 如果mysql -u user_name的作品,但mysql -uuser_namesome_db不,你没有权限访问的用户指定的数据库some_db

  • 如果mysql -u user_name当执行服务器主机上的作品,但MySQL的Hhost_nameUuser_name不工作时执行远程客户端主机,你没有启用访问服务器的用户从远程主机的名字。

  • 如果你不明白为什么你Access denied,除去用户表中的所有行,Host值包含通配符(列“%”'_'字符)。一个很常见的错误是插入一个新行主机='%'用户='some_user',以为这样可以指定本地服务器在同一台机器连接。这不工作的原因是默认权限包括一排Host=“localhost”User=' '。因为这行有Host价值“localhost”这比更具体'%',它被优先用于新行当连接本地服务器!正确的做法是将第二排Host=“localhost”User='some_user',或删除行主机='localhost'用户=''。删除该行后,记得问题FLUSH PRIVILEGES声明重载授权表。参见第6,访问控制,阶段1:连接验证”

  • 如果你能够连接到MySQL服务器,但得到一个Access denied当你发布一个消息SELECT ... INTO OUTFILELOAD DATA INFILE声明,你行的用户表中没有的FILE权限启用

  • 如果你直接更改授权表(例如,通过使用INSERTUPDATE,或DELETE报表)和你的变化似乎忽视了,记住,你必须执行FLUSH PRIVILEGES声明或mysqladmin嵌入式的权利命令导致服务器重新加载授权表。否则,你的变化不会影响到下一次重新启动服务器。记得在你改变root密码与UPDATE声明,你将不需要指定新的密码,直到刷新特权后,因为服务器不知道你改了密码呢!

  • 如果你的特权,似乎在一个会话中改变了,这可能是一个MySQL管理员改变了他们。重载授权表的影响新的客户端连接,但它也会影响现有的连接如第6.2.8,当特权更改生效”

  • 如果你是一个Perl,PHP,Python和接入问题,或ODBC程序尝试连接到服务器mysql -u user_name db_namemysql -uuser_namePyour_passdb_name。如果你能够连接使用MySQL客户端,问题在于你的程序,不具有访问权限。(没有空间之间-p和密码;您也可以使用--password=your_pass语法指定密码。如果你使用P--password没有密码的价值选择,MySQL会提示您输入密码。)

  • 出于测试目的,开始mysqld服务器与--skip-grant-tables选项然后你可以改变MySQL的授权表和使用SHOW GRANTS表检查是否你的修改有效果。当你不满意你的变化,执行mysqladmin嵌入式的权利告诉mysqld服务器加载的特权。这使您可以开始使用新的授权表内容不停止和重新启动服务器。

  • 如果一切都失败了,开始mysqld一个调试选项(例如服务器,--debug=d,general,query)。这个打印主机和用户信息进行连接,以及信息的每个命令的发布。看到第28.5.3,“该计划”

  • 如果您有任何其他问题与MySQL的授权表,觉得你必须张贴问题的邮件列表,总是提供一个转储MySQL授权表。你可以把表的mysqldump MySQL命令。提交一个bug报告,看说明1.7节,“如何报告错误或问题”。在某些情况下,您可能需要重新启动mysqld--skip-grant-tables运行mysqldump

6.3 MySQL用户账户管理

本节介绍如何设置你的MySQL服务器的客户帐户。它讨论了以下主题:

  • 意义的帐号名和密码中使用MySQL以及如何与您的操作系统使用的用户名和密码

  • 如何建立新的帐户和删除现有的帐户

  • 如何使用角色,即集合的特权

  • 如何更改密码

  • 使用密码安全指南

参见第13.7.1,“账户管理报表”,描述的语法和使用所有用户管理SQL语句。

6.3.1用户名称和密码

MySQL存储账户中user表的MySQL系统数据库。一个帐户被定义的用户名和主机或主机的用户可以连接到服务器。信息在有关账户表示user表,看第6.2.3,“Grant Tables”

该帐户可能也有一个密码。MySQL支持身份验证插件,所以它可能是一个账户认证使用一些外部认证方法。看到第6.3.10,“认证”

有用户名称和密码是由MySQL和你的操作系统使用方式之间的区别:

  • 用户名称,如用于认证目的MySQL的使用,没有任何用户名(登录名)通过Windows或Unix应用。在Unix系统中,大多数的MySQL客户端默认情况下尝试登录使用当前Unix用户名为MySQL用户的名字,但那是只为方便。默认可以覆盖很容易,因为客户端程序,允许任何用户指定一个名称-u用户选项这意味着任何人都可以尝试连接到使用任何用户名服务器,所以你不能使一个数据库安全的任何方式除非所有的MySQL账户密码。任何人指定一个用户名,没有密码的帐户能够成功连接到服务器。

  • MySQL的用户名称最多可包含32个字符。操作系统的用户名称可能是一个不同的最大长度。例如,UNIX用户名称通常限制为八个字符。

    警告

    在MySQL用户名长度限制是硬编码在MySQL服务器和客户端,并试图解决它通过修改的表的定义mysql数据库不工作

    你永远不应该改变表的结构mysql数据库以任何方式除了通过程序意味着了4.4.5“,”mysql_upgrade检查升级MySQL表”。试图重新定义MySQL的系统表中定义的任何其他方式的结果(与支持!)行为。服务器是忽略行成为畸形由于这样的修改。

  • 验证帐户使用MySQL本地认证客户端的连接(通过mysql_native_password身份验证插件),服务器使用存储在密码用户表这些密码是不同的密码登录到您的操作系统。之间没有必然的联系外部的密码您用来登录到Windows或Unix机器和你使用的机器上的MySQL服务器的密码。

    如果服务器对客户端使用一些其他的插件,该插件实现的可能或不可能使用的密码存储在认证方法user表在这种情况下,它可能是一个外部的密码也被用来验证到MySQL服务器。

  • 存储的密码user表格使用插件的具体算法加密。

  • 如果用户名和密码只包含ASCII字符,它可以连接到服务器不管字符集设置。连接时的用户名或密码包含非ASCII字符,客户端应该叫mysql_options()C API函数与MySQL字符集名称_ _ _选择合适的字符集名称作为参数。这使认证将使用指定的字符集。否则,认证将除非服务器默认字符集的编码认证默认相同的故障。

    标准的MySQL客户端程序支持--default-character-set选择的原因mysql_options()被称为是描述。此外,字符集是支持自动检测所10.4节,“连接字符集和Collations”。程序使用一个连接器,不是基于C的API,连接器可以提供相当于mysql_options()可以用来代替。检查连接文件。

    前面的说明不适用ucs2UTF16,和utf32,这是不允许客户端字符集。

MySQL的安装过程与初始填充授权表root帐户,如第2.9.4,”保证初始MySQL账户”,也讨论了如何分配密码吧。此后,你通常设置、修改和使用等语句删除MySQL账户CREATE USERDROP USERGRANT,和REVOKE。看到第13.7.1,“账户管理报表”

连接到一个MySQL服务器的命令行客户端,指定用户名和密码选项,必须要使用的帐户:

shell> mysql --user=finley --password db_name

如果你更喜欢短的选项,命令看起来像这样:

shell> mysql -u finley -p db_name

如果你忘记密码值以下--passwordP在命令行选项(如刚才所示),客户端会提示输入一个。另外,密码可以在命令行中指定:

shell> mysql --user=finley --password=password db_name
shell> mysql -u finley -ppassword db_name

如果你使用-p选择,必须有没有空间之间-p和下面的密码值

指定命令行上的密码应该被认为是不安全的。看到第6.1.2.1,“最终用户指南的密码安全”。你可以使用一个选项文件或注册文件的路径以避免在命令行上提供的密码。看到第4.2.6、“使用选项文件”,和4.6.7“,”_ _ MySQL配置编辑器MySQL的配置实用程序”

有关指定用户名,密码,和其他连接参数,看4.2.2节,“连接到服务器”

6.3.2添加用户帐户

创建MySQL账户,使用账户管理语句用于创建帐户和建立自己的特权,如CREATE USERGRANT。这些陈述导致服务器的基本授权表做适当修改。所有这些陈述中描述第13.7.1,“账户管理报表”

笔记

格兰特表使用等语句直接修改INSERTUPDATE,或DELETE是气馁,做你自己的风险。服务器是忽略行成为畸形由于这样的修改。

进行任何操作,修改授权表,服务器检查表是否具有预期的结构和产生一个错误,如果不是。mysql_upgrade必须运行更新表的结构。

创建帐户的另一个选择是使用GUI工具MySQL Workbench。另外,一些第三方程序提供的MySQL账户管理功能。phpMyAdmin就是这样的一个程序

下面的示例演示如何使用MySQL客户端程序建立新帐户。这些例子假设权限已设置按照默认设置第2.9.4,”保证初始MySQL账户”。这意味着要做出改变,你必须连接到MySQL服务器的MYSQLroot用户,具有CREATE USER特权

首先,使用MySQL程序连接到服务器的MYSQLroot用户:

内核>mysql --user=root mysql

如果你指定一个密码来的root帐户,你必须提供一个——密码-p选项

连接到服务器后root,你可以添加新的账户。下面的示例使用CREATE USER GRANT报表设置四个账户:

MySQL的>CREATE USER 'finley'@'localhost' IDENTIFIED BY 'password';MySQL的>GRANT ALL PRIVILEGES ON *.* TO 'finley'@'localhost'->    WITH GRANT OPTION;MySQL的>CREATE USER 'finley'@'%' IDENTIFIED BY 'password';MySQL的>GRANT ALL PRIVILEGES ON *.* TO 'finley'@'%'->    WITH GRANT OPTION;MySQL的>CREATE USER 'admin'@'localhost' IDENTIFIED BY 'password';MySQL的>GRANT RELOAD,PROCESS ON *.* TO 'admin'@'localhost';MySQL的>CREATE USER 'dummy'@'localhost';

这些语句创建的帐户具有以下特性:

  • 两个帐户的用户名称finley。都是超级用户帐户具有完全权限来做什么。这个是是是是localhost”芬利account can be used only when连接from the本地主机。the'finley'@'%'帐户使用“%”为主机部分通配符,可以从任何主机连接。

    这个'finley'@'localhost'如果有一个匿名用户帐户的帐户是必要的本地服务器。没有'finley'@'localhost'账户,匿名用户帐户优先时芬利从本地主机和连接finley作为匿名用户。这是因为,匿名用户帐户有一个更具体的主机列值比'finley'@'%'帐户,从而来早在用户表格的排序顺序。(user表排序分析第6,访问控制,阶段1:连接验证”。)

  • 这个'admin'@'localhost'帐户只能由admin从本地主机连接。这是理所当然的RELOADPROCESS行政特权。这些特权使admin用户执行mysqladmin重装mysqladmin刷新,和mysqladmin冲洗xxx命令,以及mysqladmin processlist。没有权限授予访问任何数据库。你可以把这种特权使用GRANT声明.

  • 这个'dummy'@'localhost'帐户没有密码(这是不安全的,不推荐)。此帐户只能用于从本地主机连接。没有权限授予。这是假定你将授予特定权限的帐户使用GRANT声明.

看到权限的一个帐户,使用SHOW GRANTS

MySQL的>SHOW GRANTS FOR 'admin'@'localhost';----------------------------------------------------- |授予管理员@本地| ----------------------------------------------------- |格兰特重装,过程*。*“admin '@'本地主机' | -----------------------------------------------------

看到一个帐户nonprivilege性能,使用SHOW CREATE USER

MySQL的>SHOW CREATE USER 'admin'@'localhost'\G*************************** 1。行***************************创建管理员@本地用户:创建用户Admin @ 'localhost'identified ' mysql_native_password'as * 67acdebdab923990001f0ffb017eb8ed41861105'require没有到期默认帐户解锁密码

下一个例子中创建三个帐户,并授予他们访问特定数据库。他们每个人都有一个用户名custom和密码password

MySQL的>CREATE USER 'custom'@'localhost' IDENTIFIED BY 'password';MySQL的>GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP->    ON bankaccount.*->    TO 'custom'@'localhost';MySQL的>CREATE USER 'custom'@'host47.example.com' IDENTIFIED BY 'password';MySQL的>GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP->    ON expenses.*->    TO 'custom'@'host47.example.com';MySQL的>CREATE USER 'custom'@'%.example.com' IDENTIFIED BY 'password';MySQL的>GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP->    ON customer.*->    TO 'custom'@'%.example.com';

3帐户可以使用如下:

  • 第一个帐户可以访问bankaccount数据库,但是只能从本地主机。

  • 第二帐户可以访问expenses数据库,但只有从主机host47.example.com

  • 第三帐户可以访问customer数据库,在任何主机example.com域该帐户已从域中所有机器由于使用的访问%在帐户名称主机部分通配符。

6.3.3删除用户帐户

删除一个帐户,使用DROP USER声明,这是描述第13.7.1.5,“降低用户的语法”。。。。。。。例如:

mysql> DROP USER 'jeffrey'@'localhost';

6.3.4使用角色

MySQL的作用是一个集合体的特权。如用户帐户、角色可以授予和撤销他们的特权。

用户帐户可以被授予的角色,赋予到每个角色关联的权限。这使得特权帐户组分配和提供了一个方便的选择赋予个人的特权,既为所需的权限分配和执行的概念。

下面的列表总结了角色管理能力提供MySQL:

对于各个角色的操作语句描述,看第13.7.1,“账户管理报表”。下面的讨论提供了角色的使用示例。除非另有规定,SQL语句所示,应使用MySQL具有管理特权的帐户执行,如root账户

创建角色和特权授予他们

考虑这种情况:

  • 一个应用程序使用一个数据库命名app_db

  • 与应用程序关联,可以为开发者创建帐户和维护应用程序,对于那些与它进行交互的用户。

  • 开发者需要完全访问数据库。一些用户只需要读取权限,其他需要读写权限。

避免单独授予特权给尽可能多的用户帐户、创建角色所需的权限集的名称。这使得它很容易授予权限的用户帐户,通过给予适当的角色。

创建角色,使用CREATE ROLE

创建角色的app_developer ',' app_read ',' app_write”;

角色的名字很像用户帐户名和由用户部分和主机部分'user_name'@'host_name'格式。茶党的主机,如果两个omitted,defaults“%”。用户和主机部分可以加引号,除非它们包含特殊字符,如-%。不同的账户名称,角色名称的用户不能是空白的。更多信息,参见第6.2.5,“指定角色的名字”

分配权限的角色,执行GRANT使用相同的语法指定权限的用户帐户:

给予所有对app_db。*“app_developer”;授予选择app_db。*“app_read’;格兰特插入,更新,删除app_db。*“app_write”;

现在假设最初你需要一个开发者账户,两个用户帐户需要只读访问,和一个用户帐户,需要读写权限。使用CREATE USER创建帐户:

创建用户“Dev1 '@'本地主机'确定' dev1pass”;创建用户read_user1 '@'本地主机'确定' read_user1pass”;创建用户read_user2 '@'本地主机'确定' read_user2pass”;创建用户rw_user1 '@'本地主机'确定' rw_user1pass”;

分配给每个用户帐户所需的权限,您可以使用GRANT相同形式的报表上面,但这需要在每个用户的个人特权。相反,使用一个替代的GRANT语法允许授予角色而不是特权:

格兰特app_developer”到“Dev1 '@'本地主机';格兰特app_read '到' read_user1 '@'本地主机',' read_user2 '@'本地主机';格兰特app_read ',' app_write '到' rw_user1 '@'本地主机';

这个GRANT声明为rw_user1帐户授予读取和写入的角色,并提供所需的读写权限。

这个GRANT授予权限授予角色的帐户不同于语法句法:有打开(放)子句指定的权限,而没有ON条款分配角色。因为语法是不同的,你不能把权限分配和在同一个语句的作用。(这是允许指定权限和角色的帐户,但你必须使用单独的GRANT报表,每个语法适当什么是理所当然的。)

强制性的角色定义

它可以通过命名他们的值指定的角色,强制mandatory_roles系统变量。该服务器将强制角色授予所有用户,所以它不需要被显式授予任何帐户。

在服务器启动强制角色指定,定义mandatory_roles在你的服务器my.cnf文件:

[mysqld]
mandatory_roles='role1,role2@localhost,r3@%.example.com'

建立和坚持mandatory_roles在运行时,使用这样的陈述:

SET PERSIST mandatory_roles = 'role1,role2@localhost,r3@%.example.com';

SET PERSIST设置运行MySQL实例的值。它还可以节省值被用于随后的重新启动服务器;看第13.7.5.1,”句法变量赋值”。更改运行MySQL实例的值而不保存它为随后的重新启动,使用GLOBAL关键词而不是坚持

设置mandatory_roles要求ROLE_ADMIN特权,另外的SYSTEM_VARIABLES_ADMINSUPER通常需要设置一个全局变量系统特权。

强制作用,如显式授予角色,不生效,直到激活(见活化作用)。在登录时,角色激活发生的所有授予的角色如果activate_all_roles_on_login系统变量是启用的,或只为角色设置为默认的角色,否则。在运行时,SET ROLE激活作用

角色的价值命名mandatory_roles不可撤销REVOKE或下降DROP ROLEDROP USER

如果一个角色命名mandatory_roles是不存在的mysql.user系统表的作用是不授予用户。当服务器尝试角色激活一个用户,它没有治疗作用,不存在强制写入错误日志警告。如果角色被创建后,从而成为有效的,FLUSH PRIVILEGES可能导致服务器将其作为强制性。

SHOW GRANTS显示强制角色按照规则第13.7.6.21”节目,格兰特的语法”

角色的权限检查

验证指定科目的权限,使用SHOW GRANTS。。。。。。。例如:

MySQL的>SHOW GRANTS FOR 'dev1'@'localhost';------------------------------------------------- |补助金”dev1 | ------------------------------------------------- |格兰特使用localhost创造*。* ` ` ` `”dev1本地应用程序开发者| |格兰特”_ ` ` ` ` `分` dev1 to“localhost”| -------------------------------------------------

然而,显示每个角色没有授予扩大它的作用是代表特权。显示角色权限以及添加USING条款命名授予的角色所显示的特权:

MySQL的>SHOW GRANTS FOR 'dev1'@'localhost' USING 'app_developer';---------------------------------------------------------- |补助Dev1 @本地| ---------------------------------------------------------- |授予使用*。* ` Dev1 ` @ ` localhost ` | |赋予全部权限` app_db `。* ` Dev1 ` @ ` localhost ` | |格兰特` app_developer ` @ ` % `到` Dev1 ` @ ` localhost ` | ----------------------------------------------------------

验证用户各类型同样:

mysql> SHOW GRANTS FOR 'read_user1'@'localhost' USING 'app_read';
+--------------------------------------------------------+
| Grants for read_user1@localhost                        |
+--------------------------------------------------------+
| GRANT USAGE ON *.* TO `read_user1`@`localhost`         |
| GRANT SELECT ON `app_db`.* TO `read_user1`@`localhost` |
| GRANT `app_read`@`%` TO `read_user1`@`localhost`       |
+--------------------------------------------------------+
mysql> SHOW GRANTS FOR 'rw_user1'@'localhost' USING 'app_read', 'app_write';
+------------------------------------------------------------------------------+
| Grants for rw_user1@localhost                                                |
+------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `rw_user1`@`localhost`                                 |
| GRANT SELECT, INSERT, UPDATE, DELETE ON `app_db`.* TO `rw_user1`@`localhost` |
| GRANT `app_read`@`%`,`app_write`@`%` TO `rw_user1`@`localhost`               |
+------------------------------------------------------------------------------+

SHOW GRANTS显示强制角色按照规则第13.7.6.21”节目,格兰特的语法”

活化作用

角色授予用户帐户可以在帐户会是积极或消极的。如果是在一个会话中是活跃的角色,其权限申请;否则,他们不。确定哪些角色在当前会话中是活跃的,使用CURRENT_ROLE()功能

默认情况下,授予角色描述或命名的mandatory_roles系统变量的值并不会自动导致作用在帐户会变得活跃。例如,因为到目前为止,在前面的讨论中没有rw_user1角色已经启动,如果你连接到服务器rw_user1和调用CURRENT_ROLE()功能,其结果是(没有积极作用):

mysql> SELECT CURRENT_ROLE();
+----------------+
| CURRENT_ROLE() |
+----------------+
| NONE           |
+----------------+

指定哪些角色应该成为活跃用户每次连接到服务器和认证,使用SET DEFAULT ROLE。设置默认的所有角色的分配为每个帐户创建之前,使用此语句:

设置默认的角色dev1 all to“localhost”“@”,“@”读_ user1 localhost”、“读“@”_ user2 RW _ user1 localhost”、“localhost”“@”;

现在,如果你连接rw_user1,初始值CURRENT_ROLE()反映了新的默认角色分配:

MySQL的>SELECT CURRENT_ROLE();-------------------------------- | current_role() | -------------------------------- | ` app_read ` @ ` % `,` app_write ` @ ` % ` | --------------------------------

导致所有显式授予和被自动激活,当用户连接到服务器的强制作用,使activate_all_roles_on_login系统变量。默认情况下,禁用自动角色激活。

在一个会话中,用户可以执行SET ROLE改变活跃角色集。例如,对于rw_user1

mysql> SET ROLE NONE; SELECT CURRENT_ROLE();
+----------------+
| CURRENT_ROLE() |
+----------------+
| NONE           |
+----------------+
mysql> SET ROLE ALL EXCEPT 'app_write'; SELECT CURRENT_ROLE();
+----------------+
| CURRENT_ROLE() |
+----------------+
| `app_read`@`%` |
+----------------+
mysql> SET ROLE DEFAULT; SELECT CURRENT_ROLE();
+--------------------------------+
| CURRENT_ROLE()                 |
+--------------------------------+
| `app_read`@`%`,`app_write`@`%` |
+--------------------------------+

第一SET ROLE静静地移动所有的岩石。第二个数学rw_user1有效阅读。三恢复默认的角色。

有效的用户存储程序和视图对象服从DEFINERSQL安全属性,它确定是否执行发生在调用或定义上下文(见23.6节,“访问控制用于存储程序和视图”):

  • 存储程序和视图对象执行调用的上下文中执行在当前会话的积极作用。

  • 存储程序和视图对象执行在定义中执行与用户指定的默认角色DEFINER属性。如果activate_all_roles_on_login启用,这样的对象执行授予所有角色定义者用户,包括强制作用。用于存储程序,如果执行应该不同于默认的角色出现,程序主体应当执行SET ROLE激活所需的角色

撤消角色或角色的权限

正如角色可以授予一个账户,他们可以从一个账户撤销:

REVOKE role FROM user;

角色命名的mandatory_roles系统变量的值不能被撤销。

REVOKE也可以用于修改的权限授予角色。这不仅影响到自身的角色,但任何帐户授予角色。假设你想暂时使所有应用程序用户只读。为此,使用REVOKE撤销的修改权限app_write角色:

REVOKE INSERT, UPDATE, DELETE ON app_db.* FROM 'app_write';

碰巧的是,剩下的角色没有在所有的特权,可以看出使用SHOW GRANTS(这表明该语句可以使用的角色,而不只是用户):

MySQL的>SHOW GRANTS FOR 'app_write';--------------------------------------- |补助app_write @ % | --------------------------------------- |授予使用*。* ` app_write ` @ ` % ` | ---------------------------------------

因为撤销权限作用影响权限的任何用户分配的改性作用,rw_user1现在没有表修改权限(INSERTUPDATE,和DELETE不再存在):

MySQL的>SHOW GRANTS FOR 'rw_user1'@'localhost'USING 'app_read', 'app_write';---------------------------------------------------------------- |补助rw_user1 @本地| ---------------------------------------------------------------- |授予使用*。* ` rw_user1 ` @ ` localhost ` | |格兰特选择` app_db `。* ` rw_user1 ` @ ` localhost ` | |格兰特` app_read ` @ ` % `,` app_write ` @ ` % `到` rw_user1 `“` localhost ` | ----------------------------------------------------------------

实际上,这rw_user1读/写用户已经成为一个只读用户。这也发生在其他帐户是理所当然的app_write的作用,说明如何使用角色不必修改个人账户的权限。

恢复修改权限的角色,只需再给他们:

GRANT INSERT, UPDATE, DELETE ON app_db.* TO 'app_write';

现在rw_user1再次修改的权限,因为做任何其他帐户授予app_write的作用

删除角色

删除角色,使用DROP ROLE

删除角色的app_read ',' app_write”;

删除角色从每个账户撤销它是理所当然的。

角色命名的mandatory_roles系统变量的值不能下降。

用户和角色的互换性

已经暗示了早SHOW GRANTS,这显示用户帐户或角色授予、账号和角色可以互换使用。你可以把一个用户帐户,如角色并授予帐户到另一个用户或角色。其效果是该帐户授予的权限,其他用户或角色的作用。

这套报表显示,你可以给用户一个用户,一个用户角色,用户角色,或角色的作用:

CREATE USER 'u1';
CREATE ROLE 'r1';
GRANT SELECT ON db1.* TO 'u1';
GRANT SELECT ON db2.* TO 'r1';
CREATE USER 'u2';
CREATE ROLE 'r2';
GRANT 'u1', 'r1' TO 'u2';
GRANT 'u1', 'r1' TO 'r2';

在每一种情况下的结果是予受让人与对象关联的特权授予对象。执行这些语句后,每u2R2已被授予权限的用户(从u1)和角色(R1):

mysql> SHOW GRANTS FOR 'u2' USING 'u1', 'r1';
+-------------------------------------+
| Grants for u2@%                     |
+-------------------------------------+
| GRANT USAGE ON *.* TO `u2`@`%`      |
| GRANT SELECT ON `db1`.* TO `u2`@`%` |
| GRANT SELECT ON `db2`.* TO `u2`@`%` |
| GRANT `u1`@`%`,`r1`@`%` TO `u2`@`%` |
+-------------------------------------+
mysql> SHOW GRANTS FOR 'r2' USING 'u1', 'r1';
+-------------------------------------+
| Grants for r2@%                     |
+-------------------------------------+
| GRANT USAGE ON *.* TO `r2`@`%`      |
| GRANT SELECT ON `db1`.* TO `r2`@`%` |
| GRANT SELECT ON `db2`.* TO `r2`@`%` |
| GRANT `u1`@`%`,`r1`@`%` TO `r2`@`%` |
+-------------------------------------+

前面的例子是说明性的,但是用户帐号和角色的互换性,具有实际的应用,如在以下情况:假设一个遗留应用程序开发项目开始之前的角色在MySQL的到来,所以所有用户帐户与项目相关的被授予特权直接(而不是授予被授予的角色美德的特权)。其中一个账户是一个开发者账户最初授予的权限如下:

CREATE USER 'old_app_dev'@'localhost' IDENTIFIED BY 'old_app_devpass';
GRANT ALL ON old_app.* TO 'old_app_dev'@'localhost';

如果开发人员离开项目,它成为必要的权限分配给另一个用户或多个用户,如果开发活动不断扩大。这是处理问题的一些方法:

  • 不使用角色:更改帐户密码,原开发商不能使用它,并有一个新的开发者使用的帐户不是:

    ALTER USER 'old_app_dev'@'localhost' IDENTIFIED BY 'new_password';
    
  • 使用角色:锁定帐户是为了防止有人用它来连接到服务器:

    ALTER USER 'old_app_dev'@'localhost' ACCOUNT LOCK;
    

    然后把账户的作用。每个开发新的项目,创建一个新帐户并将它原来的开发者帐户:

    CREATE USER 'new_app_dev1'@'localhost' IDENTIFIED BY 'new_password';
    GRANT 'old_app_dev'@'localhost' TO 'new_app_dev1'@'localhost';
    

    的作用是将原开发商帐户权限的新帐户。

6.3.5保留用户帐户

在MySQL的安装过程的一部分是数据目录初始化(见部分2.9.1.1,“初始化使用mysqld”手动数据目录)。数据目录初始化期间,MySQL创建用户账户,应考虑预留:

  • 'root'@'localhost用于行政管理的目的。这个账户的所有权限,可以执行任何操作。

    严格说来,这个帐户名称是不保留的,在这个意义上,一些设备重命名root考虑到别的东西来避免与知名高特权帐户曝光。

  • 'mysql.sys'@'localhost'习惯于定义者sys模式对象。使用的mysql.sys避免发生的问题,如果一个帐户重命名或删除管理员root账户这个账户被锁定,因此无法使用客户端连接。

  • 'mysql.session'@'localhost':内部使用插件来访问服务器。这个账户被锁定,因此无法使用客户端连接。

  • 'mysql.infoschema'@'localhost'习惯于定义者INFORMATION_SCHEMA意见使用的mysql.infoschema账户避免发生如果重命名或删除一个DBA root帐号的问题。这个账户被锁定,因此无法使用客户端连接。

6.3.6设置帐户的资源限制

限制MySQL服务器资源的客户端使用一个方法是将全局max_user_connections系统变量为非零值。这种限制可以通过任何账户的同时连接数,但不限制客户做什么一旦连接。此外,设置max_user_connections不使个人账户管理。这两种类型的控制MySQL管理员有兴趣。

要解决这些问题,MySQL允许在使用这些服务器的资源为个人账户的限制:

  • 查询账户可以发布每小时数

  • 更新一个帐户可以发布每小时数

  • 一个时代的账号可以连接到的服务器每小时

  • 通过一个帐户同步到服务器的连接数

任何声明,客户可以对查询限制计数问题。只有语句修改数据库或表计算在更新限制。

一个账户在这种情况下,对应于在一排mysql.user表这是一个连接,是评估对用户Host中的值用户表行,适用于连接。例如,一个帐户'usera'@'%.example.com'对应于在一排用户表,User主机useraexample.com %。,允许usera从任何主机连接example.com域在这种情况下,服务器应用资源限制这一行集体所有的连接usera在任何主机example.com因为所有这些连接的域使用相同的帐户。

在MySQL5.0,一账户被评估的实际主机从一个用户连接。这个老会计方法可以通过启动服务器的选择--old-style-user-limits选项在这种情况下,如果用户同时连接host1.example.comhost2.example.com,服务器应用的账户分别对每个连接的资源限制。如果usera重新连接从host1.example.com,服务器应用该连接的限制,连同现有的连接从主机。

建立在账户创建时间为帐户的资源限制,使用CREATE USER声明。修改现有帐户的限制,使用ALTER USER。提供一个条款名称每个资源是有限的。每个限制的默认值为零(无限制)。例如,创建一个新帐户可以访问customer数据库,但只有在一个有限的方式,发布这些声明:

MySQL的>CREATE USER 'francis'@'localhost' IDENTIFIED BY 'frank'->    WITH MAX_QUERIES_PER_HOUR 20->         MAX_UPDATES_PER_HOUR 10->         MAX_CONNECTIONS_PER_HOUR 5->         MAX_USER_CONNECTIONS 2;

极限类型并不需要被命名为WITH的条款,但这些命名可以以任何顺序出现。每小时限值应代表每小时计数的整数。为最大值的用户,极限是由账户代表同时最大连接数的整数。如果该限制设置为零,全球max_user_connections系统变量的值决定的同时连接数。如果max_user_connections也为零,没有限制的帐户。

修改现有帐户的限制,使用ALTER USER语句。下面是语句的查询限制。弗兰西斯这是100

mysql> ALTER USER 'francis'@'localhost' WITH MAX_QUERIES_PER_HOUR 100;

声明只修改指定的限值和叶帐户,否则不变。

要删除的限制,设置它的值为零。例如,删除多少次,每小时的限制francis可以连接,使用这条语句:

MySQL的>ALTER USER 'francis'@'localhost' WITH MAX_CONNECTIONS_PER_HOUR 0;

如前所述,一个帐号同时连接限制取决于MAX_USER_CONNECTIONS限制和max_user_connections系统变量。假设全球max_user_connections值为10和三的账户有个人资源限制如下:

对话框,使用最大值的用户,用户的用户的连接,使用最大的用户,用户的用户的连接,使用最大的用户,用户的用户,用户的用户的连接。

user1有10个连接的限制(全球max_user_connections因为它有价值)最大值的用户极限为零user2用户2有5和20,分别连接限制,因为他们有非零MAX_USER_CONNECTIONS限制.

服务器存储资源的限制,一个账户在user表列对应的账户。这个最大的问题max_updates,和最大_登录列存储每小时的限制,和max_user_connections该柱最大值的用户限制。(这第6.2.3,“Grant Tables”。)

资源的使用计数时发生的任何帐户有一个非零的限制,其使用的任何资源。

作为服务器运行,它计数次数每个账户使用资源。如果一个账户达到对连接数限制在一个小时内,服务器拒绝帐户的进一步连接直到时间到了。同样,如果客户达到其在查询或更新的数量限制,服务器拒绝进一步的查询或更新直到一小时了。在这种情况下,服务器问题相应的错误信息。

资源计数发生账号,不是每个客户。例如,如果你的账户有五十查询限制,你不可以用两个同步客户端到服务器的连接你的上限提高到100。两个连接上发出的疑问都算在一起。

当前资源的使用计数每小时可对所有帐户的全局复位,或单独为一个给定的帐户:

  • 重置当前计数为零的所有账户,发行FLUSH USER_RESOURCES声明。计数也可以通过重载授权表复位(例如,一个FLUSH PRIVILEGES声明或mysqladmin加载命令)

  • 对于个人账户的数量可以被重置为零设置任何限制了。指定一个极限值等于当前分配给客户的价值。

每小时计数器重置不影响MAX_USER_CONNECTIONS极限

在零服务器启动时开始计数。计数不通过服务器重新启动。

对于MAX_USER_CONNECTIONS极限,一个边缘的情况下,如果账户有开放,允许它的最大连接数时:断开之后迅速的连接会导致错误(ER_TOO_MANY_USER_CONNECTIONSER_USER_LIMIT_REACHED)如果服务器没有完全处理的时间断开连接时。当服务器完成断开处理,另一方面将再次被允许。

6.3.7分配帐户密码

为客户端连接到MySQL服务器所需的凭据可能包含一个密码。本节介绍如何指定MySQL账户密码。

MySQL存储凭据的user表中MySQL系统数据库。作业分配或修改密码只允许用户与CREATE USER特权,或者,或者,特权的MySQL数据库(INSERT权限创建新帐户,UPDATE权限修改现有账户)。如果read_only系统变量是启用的,使用的帐户修改报表等CREATE USERALTER USER另外需要CONNECTION_ADMINSUPER特权

这里的讨论总结为最常见的密码赋值语句的语法。对其他的可能性的完整细节,看第13.7.1.3,“创建用户语法”第13.7.1.1,“改变用户的语法”,和第13.7.1.10,“设置密码语法”

MySQL使用插件来执行客户端认证;看第6.3.10,“认证”。在密码赋值语句,关联一个账号认证插件执行任何所需的明文密码指定散列。这使得MySQL混淆密码存储在前mysql.user表这里描述的语句,MySQL会自动的哈希密码指定。也有语法CREATE USERALTER USER允许散列值被指定地。详情见这些语句的描述。

指定一个密码,当你创建一个新帐户,使用CREATE USER包括一个条款:

CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'password';

CREATE USER还支持指定账户认证插件的语法。看到第13.7.1.3,“创建用户语法”

分配或更改密码为现有的帐户,使用ALTER USER声明一个条款:

ALTER USER 'jeffrey'@'localhost' IDENTIFIED BY 'password';

如果你没有连接为一个匿名用户,你可以改变你自己的密码没有命名自己的帐户上:

ALTER USER USER() IDENTIFIED BY 'password';

更改帐户密码从命令行使用mysqladmin命令:

mysqladmin -u user_name -h host_name password "password"

该命令设置的帐户的密码是一个mysql.user表行匹配user_name用户柱和客户端主机从中你将Host专栏

警告

设置一个密码使用mysqladmin应考虑不安全的。在某些系统上,你的密码是系统状态的程序如可见PS这可能是由其他用户调用显示命令行。MySQL客户端通常覆盖有零点的命令行参数初始化序列中的密码。然而,仍然有一个短暂的间隔期间,价值是可见的。另外,在一些系统的覆盖策略是无效的,密码仍然是可见的PS。(了UNIX系统和别人也许是这个问题。)

如果你使用的是MySQL复制,必须意识到,目前,一个密码使用复制的奴隶的一部分CHANGE MASTER TO声明是有效长度限制在32字符;如果密码较长,任何多余的字符被截断。这是不是由于任何限制MySQL服务器实施一般,而是具体到MySQL复制问题。(更多信息见虫# 43439。)

6.3.8密码管理

MySQL支持这些密码管理功能:

  • 密码过期,需要密码要定期更换。

  • 密码重用的限制,防止旧密码被重新选择。

  • 密码验证,需要更改密码也指定当前密码被取代。

  • 密码强度评估,需要强密码。

下面这些能力,除了密码强度评估,并使用validate_password插件和描述第6.5.3,“密码验证组件”

重要

MySQL实现密码管理功能在使用表格mysql系统数据库。如果你升级MySQL从较早的版本,您的系统表,可能不是最新的。在这种情况下,服务器将消息写入类似这些错误日志在启动过程:

[错误] mysql.user列计数错误。expected49,发现47。表可能损坏[警告] ACL表mysql.password_history失踪的一些操作可能失败。

要纠正这个问题,运行mysql_upgrade并重新启动服务器。一直这样做,密码的修改是不可能的。

笔记

密码管理功能,这里描述的仅适用于存储凭据的帐户内mysql.user系统表(mysql_native_passwordsha256_password,或caching_sha2_password)。对那些使用执行验证外部认证系统插件,密码管理必须处理外部与系统以及。

密码过期策略

MySQL数据库管理员帐户的密码过期,可以手动,并建立一个自动密码过期策略。过期策略可以建立全球和个人账户可以设置为按照全球政策或特定账号的行为覆盖全球政策。

过期帐户密码手动,使用ALTER USER声明:

修改用户密码”(localhost,呼气;

这标志着在相应操作密码过期mysql.user表格行

密码过期根据政策是自动的,是基于密码的时代,这对于一个给定的帐户的日期和其最近更改密码的时间评估。这个mysql.user表格显示每个帐户的密码时,它最后一次被修改,和服务器自动把密码过期,在客户端连接时如果年龄大于其允许的寿命。这部作品没有明确的手动密码过期。

建立自动密码过期策略在全球范围内,使用default_password_lifetime系统变量。其默认值是0,禁用自动密码过期。如果价值default_password_lifetime是一个正整数N这表明,允许密码有效期,这样,密码必须更换一次N天.

实例:

  • 建立一个全球的政策,密码有一生的时间约六个月,启动服务器,这些服务器中的线my.cnf文件:

    [mysqld]default_password_lifetime=180
  • 建立全球政策等密码永不过期,集default_password_lifetime0:

    [mysqld]default_password_lifetime=0
  • default_password_lifetime也可以在运行时设置和坚持:

    SET PERSIST default_password_lifetime = 180;SET PERSIST default_password_lifetime = 0;

    SET PERSIST设置运行MySQL实例的值。它还可以节省值被用于随后的重新启动服务器;看第13.7.5.1,”句法变量赋值”。更改运行MySQL实例的值而不保存它为随后的重新启动,使用GLOBAL关键词而不是坚持

全球密码过期策略适用于所有的帐户尚未设置覆盖它。建立个人账户的政策,使用PASSWORD EXPIRE期权的CREATE USERALTER USER声明.看到第13.7.1.3,“创建用户语法”,和第13.7.1.1,“改变用户的语法”

例如帐户的具体陈述:

  • 需要密码才能改变每一天:

    CREATE USER 'jeffrey'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY;
    ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY;
    

    此过期选项重写所有帐户的语句命名的全球政策。

  • 禁用密码过期:

    CREATE USER 'jeffrey'@'localhost' PASSWORD EXPIRE NEVER;
    ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE NEVER;
    

    此过期选项重写所有帐户的语句命名的全球政策。

  • 按照所有帐户的声明称全球政策到期:

    CREATE USER 'jeffrey'@'localhost' PASSWORD EXPIRE DEFAULT;
    ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE DEFAULT;
    

当客户端成功连接,服务器确定帐户的密码已过期:

  • 服务器检查密码是否已被手动过期。

  • 否则,服务器会检查密码是否年龄大于其允许的寿命据自动密码过期策略。如果是这样,服务器将密码过期。

如果密码过期(无论是手动或自动),该服务器断开客户端或限制操作允许它(见第6.3.9条,“服务器处理过期的密码”)。操作由一个错误限制客户端的结果直到用户建立新的帐户密码:

mysql> SELECT 1;
ERROR 1820 (HY000): You must reset your password using ALTER USER
statement before executing this statement.

mysql> ALTER USER USER() IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.01 sec)

mysql> SELECT 1;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.00 sec)

在客户重置密码,服务器恢复会话的正常访问,以及后续的连接使用的帐户。用于重置帐户密码管理用户也有可能,但任何现有的限制会话保持限制,帐户。客户使用的帐户必须连接在语句可以执行成功。

笔记

这是可能的重置通过它的电流值的密码。作为一个好的政策,最好是选择一个不同的密码。数据库管理员可以通过建立一个适当的密码重用政策执行非重用。看到密码重用策略

密码重用策略

MySQL允许限制被放置在以前的密码重用。重用的限制可以基于密码的修改,建立的时间,或两者。利用政策可以建立全球和个人账户可以设置为按照全球政策或特定账号的行为覆盖全球政策。

一个帐号密码历史由密码已经在过去的分配。MySQL可以限制新的密码被从这个历史选择:

  • 如果一个帐户被限制对密码的修改数的基础上,一个新的密码,无法从指定数量的最新密码的选择。例如,如果更改密码的最小数量设置为3,新密码不能为任何最新的3个密码相同。

  • 如果一个帐户是基于时间的限制,一个新的密码,不能从历史中的密码,到指定的天数的新选择。例如,如果密码重用间隔设置为60,新密码不应在那些先前选在最后60天。

笔记

空密码不在密码历史计数,随时使用。

建立密码重用政策在全球范围内,使用password_historypassword_reuse_interval变量系统

实例:

  • 禁止使用任何密码或密码更新的最后6到365天,把这些线在服务器my.cnf文件:

    [mysqld]password_history=6password_reuse_interval=365
  • 建立和坚持的变量在运行时,使用下面的语句:

    SET PERSIST password_history = 6;
    SET PERSIST password_reuse_interval = 365;
    

    SET PERSIST设置运行MySQL实例的值。它还可以节省值被用于随后的重新启动服务器;看第13.7.5.1,”句法变量赋值”。更改运行MySQL实例的值而不保存它为随后的重新启动,使用GLOBAL关键词而不是坚持

全球密码重用政策适用于所有的帐户,也没有忽略它。建立个人账户的政策,使用PASSWORD HISTORY密码重用区间选项的CREATE USERALTER USER声明.看到第13.7.1.3,“创建用户语法”,和第13.7.1.1,“改变用户的语法”

例如帐户的具体陈述:

  • 之前允许重用最少需要5密码修改:

    CREATE USER 'jeffrey'@'localhost' PASSWORD HISTORY 5;
    ALTER USER 'jeffrey'@'localhost' PASSWORD HISTORY 5;
    

    这个历史长度选项重写所有帐户的语句命名的全球政策。

  • 之前允许重用最少需要365天时间:

    CREATE USER 'jeffrey'@'localhost' PASSWORD REUSE INTERVAL 365 DAY;
    ALTER USER 'jeffrey'@'localhost' PASSWORD REUSE INTERVAL 365 DAY;
    

    这个时间选项重写所有帐户的语句命名的全球政策。

  • 结合使用这两种类型的使用限制,PASSWORD HISTORY密码重用区间在一起:

    CREATE USER 'jeffrey'@'localhost'
      PASSWORD HISTORY 5
      PASSWORD REUSE INTERVAL 365 DAY;
    ALTER USER 'jeffrey'@'localhost'
      PASSWORD HISTORY 5
      PASSWORD REUSE INTERVAL 365 DAY;
    

    这些选项覆盖全球政策重用限制所有帐户的语句命名。

  • 按照用限制类型的全球政策:

    CREATE USER 'jeffrey'@'localhost'
      PASSWORD HISTORY DEFAULT
      PASSWORD REUSE INTERVAL DEFAULT;
    ALTER USER 'jeffrey'@'localhost'
      PASSWORD HISTORY DEFAULT
      PASSWORD REUSE INTERVAL DEFAULT;
    

密码验证所需的政策

在MySQL 8.0.13,可能需要尝试更改帐户密码被指定要取代现有的密码验证。这使DBA能够防止用户不需证明他们知道当前密码更改密码。这样的变化可能发生,例如,如果一个用户离开终端暂时没有注销,和恶意用户使用会话改变原有用户的密码。这可以有不幸的后果:

  • 原来的用户就不能到帐号密码由管理员设定访问MySQL。

  • 直到密码重置时,恶意用户可以使用用户的凭据访问MySQL的良性改变。

密码验证政策可以建立全球和个人账户可以设置为按照全球政策或特定账号的行为覆盖全球政策。

对于每一个客户,其mysql.user行指示是否有帐户的具体设置要求更改密码的尝试,当前的密码验证。该设置是由密码要求期权的CREATE USERALTER USER声明:

  • 如果帐户设置PASSWORD REQUIRE CURRENT,密码的修改必须指定当前密码。

  • 如果帐户设置PASSWORD REQUIRE CURRENT OPTIONAL但是,密码的修改可以不需要指定当前密码。

  • 如果帐户设置PASSWORD REQUIRE CURRENT DEFAULT,的password_require_current系统变量确定的帐户所需的验证策略:

换句话说,如果帐户设置不PASSWORD REQUIRE CURRENT DEFAULT,帐户设置优先于所建立的全球政策password_require_current系统变量。否则,该帐户按照password_require_current设置

默认情况下,密码验证是可选的:password_require_current创造了没有被禁用和账户密码要求选择默认PASSWORD REQUIRE CURRENT DEFAULT

下表显示每个帐户设置互动password_require_current系统变量的值来确定账号密码验证所需的政策。

表6.10密码验证策略

每个帐户设置password_require_current系统变量密码更改要求当前的密码吗?
PASSWORD REQUIRE CURRENTOFF
PASSWORD REQUIRE CURRENTON
PASSWORD REQUIRE CURRENT OPTIONALOFF
PASSWORD REQUIRE CURRENT OPTIONALON
PASSWORD REQUIRE CURRENT DEFAULTOFF
PASSWORD REQUIRE CURRENT DEFAULTON

笔记

特权用户可以更改帐户密码不指定的当前密码,无论验证所需的政策。一个有特权的用户是一个具有全球CREATE USER特权或UPDATE特权的MySQL系统数据库

建立密码验证政策在全球范围内,使用password_require_current系统变量。其默认值是关闭,所以它是不需要的账户密码修改指定当前密码。

实例:

  • 建立一个全球的政策,修改密码必须指定的当前密码,启动服务器,这些服务器中的线my.cnf文件:

    [mysqld]password_require_current=ON
  • 建立和坚持password_require_current在运行时,使用这样的语句作为一个:

    SET PERSIST password_require_current = ON;SET PERSIST password_require_current = OFF;

    SET PERSIST设置运行MySQL实例的值。它还可以节省值被用于随后的重新启动服务器;看第13.7.5.1,”句法变量赋值”。更改运行MySQL实例的值而不保存它为随后的重新启动,使用GLOBAL关键词而不是坚持

所需的政策适用于所有的帐户,没有建立覆盖全球的密码验证。建立个人账户的政策,使用PASSWORD REQUIRE选项的CREATE USERALTER USER声明.看到第13.7.1.3,“创建用户语法”,和第13.7.1.1,“改变用户的语法”

例如帐户的具体陈述:

  • 要求密码更改指定当前密码:

    CREATE USER 'jeffrey'@'localhost' PASSWORD REQUIRE CURRENT;
    ALTER USER 'jeffrey'@'localhost' PASSWORD REQUIRE CURRENT;
    

    这种验证选项重写所有帐户的语句命名的全球政策。

  • 不需要密码更改指定当前密码(当前密码可以但不必给出):

    CREATE USER 'jeffrey'@'localhost' PASSWORD REQUIRE CURRENT OPTIONAL;
    ALTER USER 'jeffrey'@'localhost' PASSWORD REQUIRE CURRENT OPTIONAL;
    

    这种验证选项重写所有帐户的语句命名的全球政策。

  • 按照所有帐户的语句命名要求全球密码验证策略:

    CREATE USER 'jeffrey'@'localhost' PASSWORD REQUIRE CURRENT DEFAULT;
    ALTER USER 'jeffrey'@'localhost' PASSWORD REQUIRE CURRENT DEFAULT;
    

当前的密码验证进场当用户更改密码使用ALTER USERSET PASSWORD停下来。考试使用ALTER USER,这是首选SET PASSWORD,但这里所描述的原则是相同的两个报表。

密码修改报表,一REPLACE子句指定要取代现有的密码。实例:

  • 更改当前用户的密码:

    ALTER USER USER() IDENTIFIED BY 'auth_string' REPLACE 'current_auth_string';
    
  • 改变一个指定用户的密码:

    ALTER USER 'jeffrey'@'localhost'
      IDENTIFIED BY 'auth_string'
      REPLACE 'current_auth_string';
    
  • 改变一个名叫用户认证插件和密码:

    ALTER USER 'jeffrey'@'localhost'
      IDENTIFIED WITH caching_sha2_password BY 'auth_string'
      REPLACE 'current_auth_string';
    

这个REPLACE条款是这样的:

  • REPLACE如果必须为帐户密码变更必须指定当前密码,验证的用户试图做出改变,真的知道当前密码。

  • REPLACE可选如果账户密码修改可以但不需要指定当前密码。

  • 如果REPLACE是指定的,它必须指定正确的密码,或发生错误。即使这是真的更换是可选的

  • REPLACE可以指定只有转化为当前用户的帐户密码。(这意味着在上面,例子,明确的名称的帐户报表杰夫瑞除非当前用户失败jeffrey。)即使改变尝试另一个用户的特权用户这是真的;然而,这样一个用户可以更改任何密码而不指定更换

  • REPLACE省略从二进制日志以避免写明文密码了。

6.3.9服务器过期密码处理

MySQL提供了密码过期功能,使数据库管理员可以要求用户重置其密码。可将密码过期的手工,和一个自动过期策略的基础(见第6.3.8,“密码管理”

为每个连接使用一个帐户过期的密码,服务器或断开客户端或限制客户沙盒模式,其中服务器允许客户端的操作必须重置密码过期。这是服务器所采取的行动取决于客户端和服务器的设置,为后文的论述。

如果服务器断开连接的客户端,它返回一个ER_MUST_CHANGE_PASSWORD_LOGIN误差:

内核>mysql -u myuser -p密码******错误1862(hy000):您的密码已过期。登录你要改变它使用支持过期密码的客户。

如果服务器限制客户端沙盒模式,这些操作都在客户端会话允许:

  • 客户端可以重置帐户密码ALTER USERSET PASSWORD。密码已重置后,服务器恢复会话的正常访问,以及后续的连接使用的帐户。

    这是可能的重置通过它的电流值的密码。作为一个好的政策,最好是选择一个不同的密码。数据库管理员可以通过建立一个适当的密码重用政策执行非重用。看到密码重用策略

  • 客户端可以使用SET声明.

任何操作不允许在会话,服务器返回一个ER_MUST_CHANGE_PASSWORD误差:

MySQL的>USE performance_schema;错误1820(hy000):你必须重置您的密码使用ALTER userstatement执行该语句之前。MySQL >SELECT 1;错误1820(hy000):你必须重置您的密码使用ALTER userstatement执行此语句之前。

这是通常发生的交互调用MySQL客户因为默认这样的调用放在沙盒模式。清除错误和恢复正常的功能,选择一个新密码。

对于非交互式调用MySQL客户端(例如,在批处理模式),服务器正常断开客户端如果密码过期。允许非交互式MySQL调用保持连接,可以更改密码(使用上述语句),加--connect-expired-password选择的MySQL命令

如前所述,无论服务器断开连接过期的密码,客户或限制它的沙盒模式的组合取决于客户端和服务器设置。下面的讨论介绍了相关的设置,以及它们如何相互作用。讨论仅适用于过期密码的帐户。如果一个客户端连接使用nonexpired密码,服务器处理客户端一般。

在客户端,一个给定的客户指示是否可办理过期密码的沙盒模式。对于使用C的客户端库的客户,有两种办法:

  • 通过MYSQL_OPT_CAN_HANDLE_EXPIRED_PASSWORDS国旗mysql_options()在连接:

    arg = 1;result = mysql_options(mysql,                       MYSQL_OPT_CAN_HANDLE_EXPIRED_PASSWORDS,                       &arg);

    这个MySQL客户端使用MYSQL_OPT_CAN_HANDLE_EXPIRED_PASSWORDS如果以交互方式调用或--connect-expired-password选择了

  • 通过CLIENT_CAN_HANDLE_EXPIRED_PASSWORDS国旗mysql_real_connect()在连接时间:

    mysql = mysql_real_connect(mysql,                           host, user, password, db,                           port, unix_socket,                           CLIENT_CAN_HANDLE_EXPIRED_PASSWORDS);

其他MySQL连接器都有自己的习俗,表示准备处理沙盒模式。看到文件的连接,你有兴趣。

在服务器端,如果客户表明,它可以处理过期的密码,服务器放在沙盒模式。

如果一个客户并不表明它可以处理过期的密码(或使用一个旧版本的客户端库,不能说明),服务器的作用取决于其价值disconnect_on_expired_password系统变量:

6.3.10认证

当一个客户端连接到MySQL服务器,服务器使用由客户端和客户端主机从选择合适的账户行所提供的用户名称mysql.user系统表。然后服务器对客户端进行身份验证,确定从账户行认证插件适用于客户:

  • 如果服务器无法找到插件,发生了一个错误,连接请求被拒绝。

  • 否则,服务器调用插件来验证用户的身份,和插件返回一个状态到服务器指示用户是否提供了正确的密码,并允许连接。

可插拔认证使得这些重要的能力:

  • 身份验证方法的选择可插拔认证便于DBA选择用于个人的MySQL账户认证方法。

  • 外部认证可插拔认证使客户端可以连接到适当的身份验证方法,凭据凭据存储在其他地方比在MySQL服务器mysql.user系统表。例如,插件可以创建使用外部身份验证方法如PAM,Windows登录ID、LDAP和Kerberos。

  • 代理用户:如果允许用户连接、身份验证插件可以返回到服务器不同于连接用户名称用户名称,表明连接用户是另一个用户代理(代理的用户)。而连接持续,代理用户进行处理,对访问控制的目的,具有代理的用户的权限。实际上,一个用户模拟另一个。有关更多信息,参见第6.3.11”代理用户”

笔记

如果你启动了服务器与--skip-grant-tables选择身份验证插件,即使因为服务器不执行客户端验证和允许任何客户端连接加载使用。因为这是不安全的,如果服务器开始的--skip-grant-tables选项,它使--skip-networkingautomatically to prevent远程登录。

available认证插件

MySQL 8提供了这些认证插件:

  • 一个插件进行本地认证;即基于密码散列法使用的认证在MySQL认证介绍。这个mysql_native_password插件实现了基于此本地密码散列方法认证。看到部分6.5.1.1,“本土认证”

  • 执行使用SHA-256密码散列认证插件。这是比现有的本地认证加密。看到第6.5.1.2,“SHA-256认证”,和第6.5.1.3,“缓存SHA-2认证”

  • 一个客户端插件,发送密码到服务器没有哈希或加密。这个插件是用于服务器端插件需要访问完全由客户端用户提供的密码连接。看到第6.5.1.4,“客户端明文认证”

  • 一个插件进行外部认证使用PAM(可插入认证模块),使MySQL服务器使用PAM认证的MySQL用户。这个插件支持代理用户以及。看到第6.5.1.5,“可插入认证”

  • 一个插件进行外部验证Windows,使MySQL服务器使用本地Windows服务进行身份验证的客户端连接。谁登录到Windows用户可以连接MySQL客户端程序基于环境信息的服务器没有指定一个额外的密码。这个插件支持代理用户以及。看到第6.5.1.6,“Windows认证”

  • 执行身份验证插件,使用LDAP(轻量级目录访问协议)认证的MySQL用户访问目录服务如X.500。这些插件支持代理用户以及。看到第6.5.1.7,“LDAP认证”

  • 一个插件,可以防止所有的客户端连接到任何帐户使用它。这个插件的使用案例包括代理帐户,不允许直接登录,但只有通过代理帐户和帐户必须能够执行存储程序和视图特权不暴露那些普通用户访问权限。看到第6.5.1.8,“没有登录认证”

  • 一个插件,验证客户端连接从本地主机通过Unix套接字文件。看到第6.5.1.9,“插座同行证书认证”

  • 测试插件,支票帐户凭据和记录成功或失败的服务器错误日志。这个插件是用于测试和开发的目的,并作为一个例子,如何写一个认证插件。看到第6.5.1.10,“试验认证”

笔记

关于对认证的使用电流限制的信息,包括连接器支持插件,看部分责任,“限制可插拔认证”

第三方开发者应该读连接器部分确定在何种程度上的连接器可以利用认证能力以及采取何种措施变得更柔顺。

如果你在写自己的身份验证插件感兴趣,看第28.2.4.9,“写作认证插件”

身份验证插件的使用

本节提供安装和使用身份验证插件的一般说明。用于指示特定于一个给定的插件,请参阅说明插件下第6.5.1,验证“插件”

在一般情况下,认证使用一对相应的插件的服务器端和客户端,所以你用了这样的认证方法:

  • 如有必要,安装插件库含有适当的插件。服务器主机上安装服务器端,包含插件库,这样服务器就可以使用它来验证客户端的连接。同样,在每个客户端主机,安装使用的客户端程序包含客户端插件库。认证的插件,是建立在不需要安装。

  • 每个MySQL帐户创建,指定用于验证相应的服务器端插件。如果该帐户是使用默认的身份验证插件,创建帐户声明不需要明确指定插件。这个default_authentication_plugin系统变量配置的默认身份验证插件。

  • 当一个客户端连接,服务器端插件告诉客户端程序,客户端插件使用认证。

在这种情况下,一个帐户使用,对服务器和客户端程序的默认身份验证方法,服务器不需要传达给客户端,客户端插件的使用,在客户机/服务器协商往返是可以避免的。

标准的MySQL客户端等MySQLmysqladmin,的--default-auth=plugin_name选项可以在命令行上指定作为一个提示,客户端插件程序可以使用,虽然服务器将覆盖此如果与用户帐户关联的服务器端插件需要不同的客户端插件。

如果客户端程序没有找到客户端插件库文件,指定--plugin-dir=dir_name选项显示插件库的目录位置。

客户机/服务器认证插件兼容性

可插拔认证使在MySQL账户认证方法选择的灵活性,但在某些情况下,客户端的连接不能因认证插件不兼容的客户端和服务器之间建立。

一个成功的客户端连接到一个给定的帐户在一个给定的服务器的通用性原则是,客户端和服务器都必须支持认证方法通过账户要求。因为身份验证方法验证插件实现,客户端和服务器都必须支持认证插件通过账户要求

出现的各种方式可以认证插件不兼容。实例:

  • 利用5.7.22或下MySQL 5.7客户端到MySQL 8服务器帐户认证与连接caching_sha2_password。失败,因为5.7的客户不承认这个插件,其中介绍了在MySQL 8。(此问题已在MySQL 5.7作为5.7.23,当caching_sha2_password客户端支持添加到MySQL客户端库和客户端程序。)

  • 使用mysql 5.5客户端到MySQL 5.6服务器帐户认证与连接sha256_password。失败,因为5.5的客户不承认这个插件,其中介绍了在MySQL 5.6。

  • 使用MySQL 5.7客户端一pre-5.7服务器帐户认证与连接mysql_old_password。失败的原因有多种。首先,这样的连接要求--secure-auth=0,而不再是一个支持选项。即使是支持的,5.7的客户不承认插件因为是在MySQL 5.7中删除。

  • 使用从群落分布MySQL 5.7客户端到MySQL 5.7企业服务器帐户进行身份验证使用一个企业只有LDAP身份验证插件连接。这不因为社区客户端不能访问企业的插件。

总的来说,这些兼容性问题不出现时,连接是一个客户端和服务器之间分布相同的MySQL。当连接是一个客户端和服务器之间不同的MySQL系列,问题会出现。这些问题都是发展过程中的内在当MySQL引入了新的认证插件或删除旧的。减少不兼容的潜力,定期升级服务器,客户端,并及时连接器。

身份验证插件连接器的写作注意事项

在MySQL客户端/服务器协议存在的各种不同的实现。这个libmysqlclientC API客户端库是一个实现。一些MySQL连接器(通常是那些没有写在C)提供自己的实现。然而,并不是所有的协议实现处理插件认证方式相同。本节描述了一个认证的问题,协议的执行者,应考虑。

在客户端/服务器协议,服务器告诉客户端连接认证插件将默认。如果客户端使用的协议实现尝试加载默认插件,插件不在客户端存在,负载操作失败。这是一个不必要的失败,如果默认插件没有插件的帐户实际上需要的客户端尝试连接。

如果一个客户端/服务器协议的实现,没有它的默认身份验证插件的概念,总是试图加载服务器指定的默认插件,它将失败与错误如果插件不可用。

为了避免这个问题,客户端使用的协议的实现,应该有自己的默认插件和使用它作为自己的第一选择(或,或者,回到这个默认在未加载服务器指定的默认插件的情况下)。例子:

  • 在MySQL 5.7,libmysqlclient默认使用的选择mysql_native_password或插件指定通过MYSQL_DEFAULT_AUTH选项mysql_options()

  • 当一个5.7客户端试图连接到一个服务器8、服务器指定caching_sha2_password作为其默认身份验证插件,但是客户仍然发送凭据每一mysql_native_password无论是通过指定MYSQL_DEFAULT_AUTH

  • 唯一的一次客户端负载服务器指定的插件是一个更改插件的请求,但在这种情况下,它可以是任何插件根据用户帐户。在这种情况下,客户端必须尝试加载插件,如果该插件不可用,一个错误是不可选的。

6.3.11 .激光器代理

MySQL服务器验证客户端连接使用的身份验证插件。插件验证一个给定的连接可能会要求连接(外部)用户可为不同的用户权限检查的目的。这使外部用户是第二用户代理;即承担第二用户的特权:

  • 外部用户是代理用户(一个用户可以模仿或成为另一个用户)。

  • 第二用户是代理用户(一个用户的身份和权限可以通过代理用户承担)。

本节介绍如何代理用户的能力。有关身份验证插件的一般信息,看第6.3.10,“认证”。有关特定插件的信息,参见第6.5.1,验证“插件”。有关编写认证插件,支持代理用户的信息,参见第28.2.4.9.4,实施代理支持用户认证插件”

笔记

作为一种替代的代理用户的使用,支持作用可能会提供一个合适的方法来映射到特定的用户命名的权限集。看到第6.3.4,“角色”

代理用户支持的要求

代理发生的对于一个给定的身份验证插件,这些条件必须满足:

  • 代理必须支持,或者通过插件本身,或由代表MySQL服务器的插件。在后一种情况下,服务器支持可能需要显式启用;看代理服务器支持用户映射

  • 代理用户帐户必须建立由插件认证。使用CREATE USER语句关联账户认证插件,或ALTER USER改变它的插件

  • 代理的用户帐户必须被授予特权被代理用户承担。使用CREATE USERGRANT陈述这

  • 代理用户帐户必须具有PROXY该代理帐户的特权。使用GRANT陈述本

  • 一个客户端连接到代理帐户被视为代理用户的身份验证插件,必须返回一个不同的客户名称的用户名称,显示用户名的代理帐户定义被代理用户承担的特权。

    另外,插件是由服务器提供的代理映射,代理用户确定的PROXY成功的城市特权的用户代理。

代理机构允许映射只有客户端用户名被代理的用户的名称。没有提供映射的主机名。当一个客户端连接的服务器和代理帐户,试图找到一个适合使用代理帐户的用户名认证插件和代理帐户的主机名称返回。

考虑以下账户的定义:

-- create proxy account
CREATE USER 'employee_ext'@'localhost'
  IDENTIFIED WITH my_auth_plugin AS 'my_auth_string';

-- create proxied account and grant its privileges
CREATE USER 'employee'@'localhost'
  IDENTIFIED BY 'employee_pass';
GRANT ALL ON employees.*
  TO 'employee'@'localhost';

-- grant PROXY privilege to proxy account for proxied account
GRANT PROXY
  ON 'employee'@'localhost'
  TO 'employee_ext'@'localhost';

当一个客户端连接为employee_ext从本地主机,MySQL使用命名的插件我_ auth _插件进行身份验证。假设my_auth_plugin返回一个用户名称雇员到服务器,基于内容的'my_auth_string'也许通过查阅一些外部认证系统。名称雇员不同于employee_ext,所以返回雇员作为一个请求给服务器处理employee_ext客户对权限检查的目的,为雇员本地用户

在这种情况下,employee_ext是用户和代理雇员是代理用户

服务器验证代理认证employee是有可能的employee_ext通过检查用户是否employee_ext(代理用户)有PROXY特权雇员(代理用户)。如果这种特权没有被授予,发生了一个错误。否则,employee_extassumes的privileges of雇员。服务器检查客户端的会话中执行的语句employee_ext对授予的特权雇员。在这种情况下,employee_ext可以访问表中的员工数据库

When proxing occus,theUSER()CURRENT_USER()功能可以用来查看连接用户之间的差异(代理用户帐户的权限),应用当前会话期间(代理用户)。例如刚才所说的,这些函数的返回值:

MySQL的>SELECT USER(), CURRENT_USER();------------------------ -------------------- | user() | current_user() | ------------------------ -------------------- | employee_ext @本地|员工@本地| ------------------------ --------------------

CREATE USER语句创建用户帐户的代理,确定条款名称认证插件是可选的AS 'auth_string'子句指定一个字符串,服务器通过插件当用户连接。如果当前字符串中提供的信息有助于确定如何映射插件外部客户端的用户名称到代理的用户名。它是由每个插件是否需要作为条款.如果是这样,该认证字符串的格式取决于插件,打算用它。请参考文档对于一个给定的有关认证字符串值,它接受信息的插件。

授予的代理权限

这个PROXY特权是需要允许外部连接用户和其他用户的权限。授予特权,使用GRANT声明。例如:

授权代理”proxied_user' 'proxy_user';

语句创建一个行mysql.proxies_priv授权表

在连接时间,proxy_user必须是一个有效的外部认证的MySQL用户,和proxied_user必须是一个有效的本地身份验证的用户。否则,连接尝试失败。

相应的REVOKE语法是:

撤销代理”proxied_user“从”proxy_user';

MySQLGRANTREVOKE句法扩展照常工作。例如:

格兰特'a'到B的代理,C,D;格兰特'a'到D的权限授予代理;代理“”“”“”;撤销'从' B '代理,C,D;

这个PROXY可以在这些情况下授予的特权:

  • 由用户具有GRANT PROXY ... WITH GRANT OPTIONproxied_user

  • proxied_user方法:对自身的价值USER()必须完全匹配CURRENT_USER()proxied_user,两用户名和主机名部分帐户名称。

最初的root在MySQL安装创建的帐户有PROXY ... WITH GRANT OPTION特权“@”,即所有用户和所有主机。这使root设置代理的用户,以及委托其他帐户的权限设置代理用户。例如,root可以这样做:

CREATE USER 'admin'@'localhost' IDENTIFIED BY 'test';
GRANT PROXY ON ''@'' TO 'admin'@'localhost' WITH GRANT OPTION;

这些语句创建一个admin用户可以管理所有授权代理映射。例如,admin可以这样做:

Grant Proxy Proxy on Sally to Joe;

默认的代理用户

指定部分或所有用户将使用一个给定的身份验证插件,创建一个空白MySQL账户(''@''),它与插件关联,让插件返回真实身份验证的用户的名称(如果不同于空白的用户)。例如,假设存在一个插件命名ldap_auth实现LDAP认证和地图连接用户到开发者或管理账户。设置代理的用户到这些账户,使用下面的语句:

-- create default proxy account
CREATE USER ''@'' IDENTIFIED WITH ldap_auth AS 'O=Oracle, OU=MySQL';

-- create proxied accounts
CREATE USER 'developer'@'localhost' IDENTIFIED BY 'developer_pass';
CREATE USER 'manager'@'localhost' IDENTIFIED BY 'manager_pass';

-- grant PROXY privilege to default proxy account for proxied accounts
GRANT PROXY ON 'manager'@'localhost' TO ''@'';
GRANT PROXY ON 'developer'@'localhost' TO ''@'';

现在假设一个客户端连接如下:

shell> mysql --user=myuser --password ...
Enter password: myuser_pass

服务器找不到myuser定义为一个MySQL的用户。但因为有一个空白的用户帐户(“@”)相匹配的客户端的用户名和主机名、服务器认证,客户对服务器的调用:ldap_auth并通过认证的插件myuser_pass它为用户名称和密码

如果ldap_auth发现在LDAP目录的插件myuser_pass不正确的密码myuser,认证失败,服务器拒绝连接。

如果密码是正确的,ldap_auth发现是一个开发商,它返回的用户名developerMySQL服务器的,而不是。返回一个不同于客户端的用户名称,用户名称myuser信号到服务器,它应该作为一个代理。服务器验证''@''可以进行身份验证开发商(由于帐户有PROXY这样做的特权)和接受连接。会议开始有特权developer,代理用户。(这些特权必须由DBA设置使用赠款报表,没有显示的。)USER()CURRENT_USER()函数的返回值:

MySQL的>SELECT USER(), CURRENT_USER();------------------ --------------------- | user() | current_user() | ------------------ --------------------- |中@本地|开发者@本地| ------------------ ---------------------

如果插件而不是发现在LDAP目录,myuser是一个经理,它返回经理当用户的名字和会话进行myuser有特权经理

mysql> SELECT USER(), CURRENT_USER();
+------------------+-------------------+
| USER()           | CURRENT_USER()    |
+------------------+-------------------+
| myuser@localhost | manager@localhost |
+------------------+-------------------+

为简单起见,外部认证不能多:既没有凭据developer也不是那些经理在前面的例子中考虑。然而,他们仍然是如果客户端试图连接和直接认证为用developer经理帐户,这就是为什么那些账户应分配的密码。

默认的代理用户和匿名用户冲突

如果你打算创建一个默认的代理用户,检查现有的其他匹配任何用户账户,先于默认代理用户因为他们可以防止用户从工作的打算。

在前面的讨论中,默认代理用户帐户''在主机部分,它匹配任何主机。如果你设置一个默认的代理用户,注意检查是否存在nonproxy帐户使用相同的用户部分“%”在主机部分,因为'%'同时匹配任何主机,但优先于' '由服务器使用的帐户行内部排序的规则(见第6,访问控制,阶段1:连接验证”

假设一个MySQL的安装包括这两个账户:

-- create default proxy account
CREATE USER ''@''
  IDENTIFIED WITH some_plugin AS 'some_auth_string';
-- create anonymous account
CREATE USER ''@'%'
  IDENTIFIED BY 'some_password';

第一个帐户(''@'')作为默认的代理用户,用于验证谁否则不匹配一个更具体的帐户的用户连接。第二帐户(“”“%”)是一个匿名用户帐户,这可能已经建立,例如,让用户无需自己帐户的匿名连接。

都有相同的用户部分(''),它匹配任何用户。每个账户有主机部分匹配任何主机。然而,有一个优先考虑匹配的连接尝试因为匹配规则排序的主机“%”提前''。对那些不符合任何更具体的帐户,服务器试图验证他们对“”“%”(匿名用户)而不是''@''(默认代理用户)。结果是,默认的是不使用代理帐户。

为了避免这个问题,使用下面的策略之一:

  • 删除匿名帐户,它不使用默认代理用户冲突。这可能是一个好主意,如果你想把每一名用户连接。

  • 使用一个更具体的默认代理用户匹配前面的匿名用户。例如,只允许localhost代理连接使用“是是是localhost

    CREATE USER ''@'localhost'
      IDENTIFIED WITH some_plugin AS 'some_auth_string';
    

    此外,修改GRANT PROXY报表名称“是是是localhost而不是''@''作为代理的用户

    注意,这个策略防止匿名用户连接localhost

  • 创建多个代理的用户,一个本地连接和一个其他(远程连接)。这会很有用,特别是当本地用户应该从远程用户不同的权限。

    创建代理用户:

    -- create proxy user for local connections
    CREATE USER ''@'localhost'
      IDENTIFIED WITH some_plugin AS 'some_auth_string';
    -- create proxy user for remote connections
    CREATE USER ''@'%'
      IDENTIFIED WITH some_plugin AS 'some_auth_string';
    

    创建代理用户:

    -- create proxied user for local connections
    CREATE USER 'developer'@'localhost'
      IDENTIFIED BY 'some_password';
    -- create proxied user for remote connections
    CREATE USER 'developer'@'%'
      IDENTIFIED BY 'some_password';
    

    每个代理用户进行相应的代理用户授予的代理权限:

    GRANT PROXY ON 'developer'@'localhost' TO ''@'localhost';
    GRANT PROXY ON 'developer'@'%' TO ''@'%';
    

    最后,给予适当权限的本地和远程用户代理(未显示)。

    假设some_plugin/auth的字符串是_ _ some组合的原因some_plugin地图客户端的用户名开发商。本地连接符''@'localhost'代理用户的映射使用“localhost”代理用户。远程连接符''@'%'代理用户的映射“开发商”“%”代理用户

代理服务器支持用户映射

一些认证插件实现代理用户映射为自己(例如,PAM与Windows身份验证插件)。其他认证插件默认不支持代理用户。其中,有些可以要求MySQL服务器本身地图代理用户根据授予的代理权限:mysql_native_passwordsha256_password。如果check_proxy_users系统变量是启用,该服务器执行任何身份验证插件,这样要求代理用户映射:

代理用户映射服务器执行的是受这些限制:

  • 服务器将从一个匿名的用户代理,即使相关PROXY特权是理所当然的

  • 当一个帐户已被授予的代理权限的多个代理账号,代理服务器的用户映射是不确定的。因此,给予一个帐户的代理权限的代理帐户不多。

代理用户的系统变量

两个系统变量跟踪代理登录过程的帮助:

  • proxy_user这个值是:无效的如果不使用代理。否则,它表明代理用户帐户。例如,如果一个客户认证通过''@''代理帐户,这个变量设置如下:

    MySQL的>SELECT @@proxy_user;-------------- | @ @ proxy_user | -------------- |“@”| --------------
  • external_user:有时认证插件可以使用一个外部用户身份验证到MySQL服务器。例如,使用Windows本地认证时,认证的插件,使用Windows API不需要传递给它的登录ID。然而,它仍然使用Windows用户身份认证。该插件可以将外部用户ID(或它的第一个字节gb3212 512)到服务器使用external_user只读会话变量。如果插件没有设置这个变量,它的值是NULL

6.3.12用户帐户锁定

MySQL支持锁定和解锁用户帐户使用ACCOUNT LOCK账户解锁条款的CREATE USERALTER USER声明:

  • 当使用CREATE USER,这些条款指定初始锁定状态的一个新帐户。无论是在条款的情况下,帐户处于解锁状态了。

  • 当使用ALTER USER,这些条款规定了新的锁定状态的现有帐户。无论是在条款的情况下,帐户锁定状态保持不变。

帐户锁定状态被记录在account_locked列的mysql.user表。The Outturn fromSHOW CREATE USER指示一个帐户被锁定或解锁。

如果客户端尝试连接到锁定账户,尝试失败。服务器的增量Locked_connects状态变量表示尝试连接到锁定账号,返回一个ER_ACCOUNT_HAS_BEEN_LOCKED错误,并将消息写入错误日志:

用户“拒绝访问user_name“@”host_name“.account也锁。

锁定账户不影响能够使用代理的用户,假设锁定帐户的身份连接。它也不影响执行存储程序或有意见的能力DEFINER条款命名锁定的帐户。那就是,能够使用一个代理帐户或存储程序或意见不通过锁定账户的影响。

帐户锁定能力取决于其存在account_locked列在mysql.user表升级到MySQL 5.7.6后来从旧版本,运行mysql_upgrade为了确保这个栏目的存在。对于nonupgraded设施没有account_locked柱,该服务器将所有帐户解锁,并使用帐户锁定ACCOUNT UNLOCK条款产生一个错误

6.3.13基于SQL MySQL帐户活动的审计

应用程序可以使用下列准则执行SQL基础审计关系数据库MySQL账户活动。

MySQL账户对应的行mysql.user表当一个客户端连接成功,服务器对客户端进行身份验证,这个表中的特定行。这个用户Host在这一行的列值唯一标识对应的帐户'user_name“@”host_name'格式,账户名称写在SQL语句。

使用的帐户来验证客户端的决定权限的客户端。通常情况下,的CURRENT_USER()函数可以被调用来确定哪些帐户,这是客户端的用户。它的价值是由用户Host列的用户该帐户的表行

然而,有些情况下,CURRENT_USER()值对应的客户端用户不但是不同的帐户。这发生在当特权上下文检查不通过客户帐户:

  • 存储子程序(过程和函数)的定义SQL SECURITY DEFINER特征

  • 与定义的视图SQL SECURITY DEFINER特征

  • 触发器和事件

在这些情况下,权限检查针对DEFINER帐户CURRENT_USER()是指账户,不到客户端调用存储程序或查看或谁造成触发激活。确定调用的用户,你可以调用USER()函数返回一个值表示实际的用户名提供的客户端和主机的客户端连接。然而,这个值不一定直接对应一个账户的用户表,因为USER()值不包含通配符,则返回的值(如帐户CURRENT_USER())可能包含用户名和主机名通配符。

例如,一个空白的用户名匹配任何用户,所以一个帐户''@'localhost'使客户能够以匿名用户从本地主机的任何用户名称连接。在这种情况下,如果一个客户端连接为user1从本地主机,USER()CURRENT_USER()返回不同的值:

MySQL的>SELECT USER(), CURRENT_USER();|十号用户(用户)的电流_ |(十)1号| | @本地主机| @本地主机|十号

一个帐户的主机名部分可以包含通配符,太。如果主机名包含'%'“_”图形字符或使用子网掩码符号,帐户可用于从多个主机连接客户和CURRENT_USER()价值并不能说明哪一个。例如,帐户“user2”@“%。例如.com”可以使用user2从任何主机连接example.com域如果user2连接方remote.example.comUSER()CURRENT_USER()返回不同的值:

MySQL的>SELECT USER(), CURRENT_USER();-------------------------- --------------------- | user() | current_user() | -------------------------- --------------------- | user2@remote.example.com | user2 example.com | -------------------------- --------------------- @ %。

如果一个应用程序必须调用USER()用户审核(例如,如果它不在触发审计)但也必须能够准USER()在与客户价值用户表,要避免含有通配符的账户User主机专栏具体来说,不允许User是空的(这将创建一个匿名用户帐户),并且不允许的字符或子网掩码符号模式主机值。有一个非空的账户必须User价值和文字主机价值

相对于以前的例子,''@'localhost'“user2”@“%。例如.com”账户应该改变不使用通配符:

RENAME USER ''@'localhost' TO 'user1'@'localhost';
RENAME USER 'user2'@'%.example.com' TO 'user2'@'remote.example.com';

如果user2必须能够在多个主机连接example.com域,应该有一个独立的账户,每个主机。

提取用户名和主机名的一部分CURRENT_USER()USER()值,使用SUBSTRING_INDEX()功能:

MySQL的>SELECT SUBSTRING_INDEX(CURRENT_USER(),'@',1);--------------------------------------- | substring_index(current_user(),“@”,1)| --------------------------------------- | user1 | --------------------------------------- MySQL >SELECT SUBSTRING_INDEX(CURRENT_USER(),'@',-1);---------------------------------------- | substring_index(current_user(),“@”- 1)| ---------------------------------------- | localhost | ----------------------------------------

6.4使用加密连接

与MySQL客户端和服务器之间的加密连接,接入网络的人可以看到你所有的交通检查发送或接收客户端和服务器之间的数据。

当你必须在一个安全的方式的信息网络,一个未加密的连接是不可接受的。使任何类型的数据无法读取,使用加密。加密算法必须包括安全元素来抵抗各种已知的攻击,如改变加密邮件或重放数据两次订单。

MySQL支持加密客户端和服务器之间的连接使用TLS(传输层安全)协议。TLS是有时被称为SSL(安全套接字层)但MySQL实际上没有SSL协议由于其加密弱使用加密连接(见第6.4.6,“加密连接协议和密码”

TLS使用的加密算法,以确保收到的公用网络上的数据是可以信任的。它的机制来检测数据的变化,损失,或重播。TLS还包括算法,提供身份验证使用X509标准。

X509使得它能够识别网络上的人。基本上,应该有一些实体称为证书权威(或CA),将电子证书给需要的人。证明依赖于非对称加密算法,有两个加密密钥(公开密钥和秘密密钥)。证书所有者可以颁发证书给另一方作为身份证明。证书由其拥有者的公共密钥。任何数据加密使用公钥可以解密,只有用对应的私钥,这是由证书所有者举行。

MySQL可以编译使用OpenSSL加密或wolfssl连接支持。对包进行比较,看6.4.4部分,“OpenSSL与wolfssl”对信息的加密协议和密码每包支持,看到第6.4.6,“加密连接协议和密码”

默认情况下,MySQL程序试图连接使用加密如果服务器支持加密连接,返回到未加密的连接如果加密连接无法建立。有关影响使用加密连接选项的信息,参见第6.4.1配置MySQL,使用加密的连接”第6.4.2,“加密连接”命令选项

MySQL对每个连接进行加密,而且对于一个给定的用户使用加密是可选的或强制性的。这使您可以选择加密或未加密的连接根据个人的应用需求。关于如何要求用户使用加密连接,看到的讨论REQUIRE的条款CREATE USER声明第13.7.1.3,“创建用户语法”。See also the description of therequire_secure_transport系统变量第5.1.7,服务器“系统变量”

加密连接可以使用主从复制服务器之间。看到第17.3.9,“设置复制使用加密连接”

有关使用从MySQL C API加密的连接信息,看第27.7.18,“C API加密连接支持”

它也可以用在一个SSH加密连接到MySQL服务器主机连接。例如,看6.4.7”部分,用SSH连接到MySQL从“Windows远程

6.4.1配置MySQL使用加密连接

有几个选项可用来指示是否使用加密连接,并指定相应的证书和密钥文件。本节提供有关加密连接配置服务器和客户端的一般指导:

一个完整的加密连接建立相关的选项列表,参见第6.4.2,“加密连接”命令选项。如果你需要创建所需的证书和密钥文件,看第6.4.3,“创建SSL和RSA证书和密钥”

加密连接可以使用主从复制服务器之间。看到第17.3.9,“设置复制使用加密连接”

加密的连接可通过MySQL C API。看到第27.7.18,“C API加密连接支持”

加密连接服务器端配置

在服务器端,该--ssl选项指定的服务器许可证,但不需要加密连接。默认是启用。

这些选项在服务器端识别证书和密钥文件服务器使用时,允许客户建立加密连接:

  • --ssl-ca:证书的权威证书文件的路径名(CA)。(——SSL capath类似但指定目录路径名的CA证书文件。)

  • --ssl-cert:服务器的公钥证书的文件的路径名。这可以被发送到客户端和认证针对的CA证书,具有。

  • --ssl-key:私钥文件服务器的路径名。

例如,启用加密连接服务器,开始与这些线在my.cnf文件,改变文件的名字是必要的:

[mysqld]ssl-ca=ca.pemssl-cert=server-cert.pemssl-key=server-key.pem

每个选项名称PEM格式的文件。如果你需要创建所需的证书和密钥文件,看第6.4.3,“创建SSL和RSA证书和密钥”。另外,如果你有一个MySQL源分布,你可以用实证的证书和密钥文件在测试您的设置mysql-test/std_data目录

MySQL服务器使用OpenSSL可以编译生成丢失的证书和密钥文件的自动启动。看到第6.4.3.1,“创建SSL和RSA证书和使用MySQL”键

该服务器执行证书和密钥文件的自动发现。如果--ssl启用(可能随着--ssl-cipher)等——SSLxxx选项给出明确的配置加密连接,服务器尝试启用加密连接,支持自动启动:

  • 如果服务器发现有效的证书和密钥文件命名ca.pemserver-cert.pem,和server-key.pem在数据目录下,它使加密连接的客户支持。(不需要的文件已经自动生成;重要的是,他们有指定的名称和有效。)

  • 如果服务器不在数据目录中找到有效的证书和密钥文件,则继续执行,但不支持加密连接。

如果服务器能够自动加密的连接支持,它写了一个便条错误日志。如果服务器发现CA的证书是自签名的,它写入错误日志警告。(证书签名如果服务器,自动创建自动或手动使用mysql_ssl_rsa_setup。)

服务器使用任何自动发现和使用的证书和密钥文件,设置相应的系统变量的名称(ssl_cassl_certssl_key

在客户是否必须连接使用加密的进一步控制,使用require_secure_transport系统变量;看第5.1.7,服务器“系统变量”。指定允许的加密协议明确,使用tls_version系统变量;看第6.4.6,“加密连接协议和密码”

加密连接的客户端配置

默认情况下,MySQL客户端程序试图如果服务器支持加密连接建立加密连接,以进一步控制可通过--ssl-mode选项:

下面在客户端选项确定证书和密钥文件的客户使用在建立加密连接到服务器。他们是类似于用在服务器端的选项,但--ssl-cert--ssl-key识别客户的公钥和私钥:

  • --ssl-ca:证书的权威证书文件的路径名(CA)。这个选项,如果使用,必须指定的服务器使用相同的证书。(——SSL capath类似但指定目录路径名的CA证书文件。)

  • --ssl-cert:客户的公钥证书的文件的路径名。

  • --ssl-key:私人密钥文件的客户端的路径名。

对于额外的安全性相对于默认的加密设置,客户端可以提供一个CA证书匹配的一个服务器使用的身份验证,使主机名。在这种方式中,服务器和客户端在同一个地方他们信任的CA证书和客户端验证的主机,它连接的是一个打算:

笔记

主机名的身份验证不使用自签名证书由服务器自动创建工作,或手动使用mysql_ssl_rsa_setup(见第6.4.3.1,“创建SSL和RSA证书和使用MySQL”键)。这样的自签名证书不包含服务器名称为通用名称的价值。

根据加密要求的MySQL账户由客户使用,客户可能需要指定要使用的加密,支持加密连接MySQL服务器连接的某些选项。

假设你想使用无特殊加密要求或是使用一个账户连接CREATE USER声明,包括需要SSL选项假设服务器支持加密连接,客户端可以使用加密连接--ssl-mode选择或一个明确的--ssl-mode=PREFFERED选项:

MySQL

mysql --ssl-mode=PREFERRED

一个账号REQUIRE SSL,如果一个加密的连接不能建立连接尝试失败。一个帐户没有特殊的加密需求,尝试回到一个加密的连接如果加密连接无法建立。为了防止撤退和失败如果加密连接无法获得,连这样的:

mysql --ssl-mode=REQUIRED

如果帐户有更严格的安全要求,其他选项必须指定建立加密连接:

  • 为帐户REQUIRE X509,客户必须至少指定--ssl-cert--ssl-key。此外,--ssl-ca(或--ssl-capath)建议,由服务器提供的公共证书可以验证。例如:

    mysql --ssl-ca=ca.pem \      --ssl-cert=client-cert.pem \      --ssl-key=client-key.pem
  • 对那些有REQUIRE ISSUER要求主体,选择的要求是相同的REQUIRE X509,但证书必须匹配的问题或主题,分别在项目定义中指定的。

有关更多信息REQUIRE条款,看到讨论第13.7.1.3,“创建用户语法”

为了防止使用加密和覆盖其他--ssl-xxx选项,调用客户端程序--ssl-mode=DISABLED

mysql --ssl-mode=DISABLED

指定允许的加密协议明确,使用--tls-version看到选项;第6.4.6,“加密连接协议和密码”

要确定是否与服务器当前连接使用加密,检查的价值Ssl_cipher状态变量。如果该值为空,连接不加密。否则,连接是加密的,加密密码的值表示。例如:

MySQL的>SHOW SESSION STATUS LIKE 'Ssl_cipher';|变量name)--------------------------- _ |值|)--------------------------- | SSL RSA密码| DHE - _ AES128 - GCM - | SHA256)---------------------------

对于MySQL客户端,另一种是使用STATUS-S命令检查SSL线:

MySQL的>\s...ssl:不使用…

mysql> \s
...
SSL: Cipher in use is DHE-RSA-AES128-GCM-SHA256
...

6.4.2命令选项加密连接

本节描述的选项,指定是否使用加密连接,密钥和证书的文件名称,并加密连接支持其它相关参数。这些选项可以在命令行或在一个选项文件。为建议使用的例子,如何检查是否连接是加密的,看第6.4.1配置MySQL,使用加密的连接”

有关使用从MySQL C API加密的连接信息,看第27.7.18,“C API加密连接支持”

表6.11总结了加密的连接选项

格式描述介绍
-跳过SSL不使用加密连接
——SSL启用加密连接
SSL作为…文件包含受信任的SSL证书颁发机构的列表
——SSL capath目录包含受信任的SSL证书颁发机构的证书文件
SSL证书文件包含X509证书
- SSL密码允许连接加密的密码列表
——SSL证书文件包含证书吊销列表
crlpath——SSL目录包含证书吊销列表文件
——SSL FIPS模式是否启用FIPS模式在客户端8.0.11
SSL密钥…文件包含X509关键
- SSL -时尚到服务器的连接安全状态
TLS版本……加密连接许可协议

  • --ssl

    笔记

    客户端--ssl选择是在MySQL 8中删除。客户程序,使用--ssl-mode相反

    在服务器端,该--ssl选项指定的服务器许可证,但不需要加密连接。启用服务器端默认的选项是。--ssl暗示了其他——SSLxxx选项,表示in the描述那些选项。

    这个--ssl在否定形式的选择表明,加密应该其他的使用和覆盖--ssl-xxx选项。指定选择你--ssl=0同义词(或--skip-ssl--disable-ssl

    指定加密连接额外的参数,使用至少--ssl-cert--ssl-key在服务器端,--ssl-ca在客户端见第6.4.1配置MySQL,使用加密的连接”。这部分还介绍了数字证书和密钥文件的自动生成和自动发现服务器的能力。

  • --ssl-ca=file_name

    证书的权威路径名(CA)PEM格式的证书文件。在服务器端,这个选择意味着--ssl

    向客户端不验证服务器证书建立到服务器的加密连接时,指定不--ssl-ca也没有--ssl-capath。服务器还验证客户根据任何适用规定建立客户帐户,它仍然使用任何--ssl-ca--ssl-capath在服务器端指定的选项值。

  • --ssl-capath=dir_name

    包含受信任的SSL证书权威的目录的路径名(CA)PEM格式的证书文件。在服务器端,这个选择意味着--ssl

    向客户端不验证服务器证书建立到服务器的加密连接时,指定不--ssl-ca也没有--ssl-capath。服务器还验证客户根据任何适用规定建立客户帐户,它仍然使用任何--ssl-ca--ssl-capath在服务器端指定的选项值。

    编译使用OpenSSL支持MySQL的分布--ssl-capath(这个选项6.4.4部分,“OpenSSL与wolfssl”)。分布编译使用wolfssl不要因为wolfssl看起来并不在任何目录和不遵循链式证书树。wolfssl要求的CA证书树被包含在一个单一的CA证书树和文件中的每个证书都有一个独特的subjectname值的所有组件。要解决这一wolfssl局限,将个人证书文件包含证书树到一个新的文件,指定文件的价值--ssl-ca选项

  • --ssl-cert=file_name

    SSL的公钥证书的文件的路径名PEM格式。在客户端,这个客户端公钥证书。在服务器端,这是服务器的公钥证书。在服务器端,这个选择意味着--ssl

  • --ssl-cipher=cipher_list

    允许连接加密的密码列表。如果列表中没有密码支持,加密的连接将无法工作。在服务器端,这个选择意味着--ssl

    最大的可移植性,cipher_list应一个或多个密码的名字,冒号分隔。实例:

    --ssl-cipher=AES128-SHA--ssl-cipher=DHE-RSA-AES128-GCM-SHA256:AES128-SHA

    OpenSSL支持指定密码更灵活的语法,如OpenSSL的文件http://www.openssl.org /文档/ / / ciphers.html男士一manmaster。wolfssl不,所以尝试使用扩展语法失败MySQL分配编译使用wolfssl。

    关于MySQL支持加密密码的信息,参见第6.4.6,“加密连接协议和密码”

  • --ssl-crl=file_name

    该文件包含证书吊销列表的PEM格式的路径名。在服务器端,这个选择意味着--ssl

    如果没有--ssl-crl也没有--ssl-crlpath是给定的,没有证书进行检查,即使CA路径包含证书吊销列表。

    编译使用OpenSSL支持MySQL的分布--ssl-crl(这个选项6.4.4部分,“OpenSSL与wolfssl”)。分布编译使用wolfssl不要因为吊销列表不工作的wolfssl。

  • --ssl-crlpath=dir_name

    证书吊销列表文件包含PEM格式的目录的路径名。在服务器端,这个选择意味着--ssl

    如果没有--ssl-crl也没有--ssl-crlpath是给定的,没有证书进行检查,即使CA路径包含证书吊销列表。

    编译使用OpenSSL支持MySQL的分布--ssl-crlpath(这个选项6.4.4部分,“OpenSSL与wolfssl”)。分布编译使用wolfssl不要因为吊销列表不工作的wolfssl。

  • --ssl-fips-mode={OFF|ON|STRICT}

    控制是否启用FIPS模式在客户端。这个--ssl-fips-mode期权不同于其他——SSLxxx选项,它不是用来建立加密连接,而是影响加密操作是允许的。看到6.6节,“FIPS支持”

    这些--ssl-fips-mode值是允许的:

    • OFF模式:fips disable。

    • ON:使fips模式

    • STRICT使:严格的FIPS模式

    笔记

    如果OpenSSL FIPS对象模块是不可用的,唯一被允许的值--ssl-fips-mode关闭。在这种情况下,设置--ssl-fips-mode打开(放)STRICT使客户产生在启动警告,在非FIPS模式操作。

  • --ssl-key=file_name

    的SSL私钥文件PEM格式的路径名。在客户端,这是客户端的私钥。在服务器端,这是服务器的私钥。在服务器端,这个选择意味着--ssl

    如果密钥文件的密码保护,程序会提示输入密码的用户。密码必须给出交互;它不能被存储在一个文件中。如果密码不正确,程序继续,如果不能读重点。

    为提高安全性,使用证书与至少2048位RSA密钥大小。

  • --ssl-mode=mode

    此选项仅用于客户端程序,而不是服务器。它指定了连接到服务器的安全状态。这些选项的值是允许的:

    • PREFERRED:如果服务器支持加密连接建立加密连接,返回到未加密的连接如果加密连接无法建立。这是默认的如果--ssl-mode没有指定

    • REQUIRED:如果服务器支持加密连接建立加密连接。如果一个加密的连接不能建立连接尝试失败。

    • VERIFY_CA:像必修的,但此外验证服务器证书权威机构(CA)证书和配置CA证书。如果没有找到匹配的CA证书有效的连接尝试失败。

    • VERIFY_IDENTITY:像作为_ verify,但另外执行身份验证的主机名检查主机名称,客户端使用连接,服务器发送到客户端的证书和身份的服务器:

      • 在MySQL 8.0.12,如果客户端使用OpenSSL 1.0.2或更高,客户检查是否主机名称,用于连接匹配一主题备用名称的值或值的服务器证书中的通用名称。

      • 否则,客户端检查是否主机名,用于连接普通名称值与服务器证书。

      如果有一个不匹配的连接失败。加密连接,此选项有助于防止中间人攻击。

      笔记

      主机名的身份验证不使用自签名证书由服务器自动创建工作,或手动使用mysql_ssl_rsa_setup(见第6.4.3.1,“创建SSL和RSA证书和使用MySQL”键)。这样的自签名证书不包含服务器名称为通用名称的价值。

    • DISABLED建立一个加密的连接

    这个--ssl-mode选择与CA证书的选项如下:

    要求一个MySQL账户使用加密连接,使用CREATE USER在创建帐户需要SSL条款,或使用ALTER USER对于现有的帐号添加需要SSL条款.通过使用客户的连接尝试都将被拒绝,除非MySQL支持加密连接和加密可以建立连接。

    这个REQUIRE条款允许其他加密相关的选项,可用于增强安全性的要求更严格的比安魂曲。更多细节关于命令选项可能或必须由指定的客户端连接使用的帐户配置为使用不同的REQUIRE选项,see the description of要求进入第13.7.1.3,“创建用户语法”

  • --tls-version=protocol_list

    客户程序,该协议允许客户端通过加密连接。价值是一个逗号分隔的列表包含一个或多个协议名称。例如:

    mysql --tls-version="TLSv1.1,TLSv1.2"
    

    可以指定此选项取决于用来编译MySQL的SSL库的协议。详情见第6.4.6,“加密连接协议和密码”

    在服务器端,使用tls_version系统变量来代替

6.4.3创建SSL和RSA证书和密钥

下面的讨论描述如何创建所需的文件SSL和RSA支持MySQL。文件的创建可以使用MySQL本身提供的设施,或通过调用OpenSSL命令直接

SSL证书和密钥文件使MySQL支持sencrypted连接使用SSL。看到第6.4.1配置MySQL,使用加密的连接”

RSA密钥文件使MySQL支持账户认证的加密连接安全密码交换sha256_passwordcaching_sha2_password插件看到第6.5.1.2,“SHA-256认证”,和第6.5.1.3,“缓存SHA-2认证”

6.4.3.1创建SSL和RSA证书和密钥使用MySQL

MySQL提供了这些方法来创建SSL证书和密钥文件和RSA密钥对的文件需要支持加密连接使用SSL加密连接和使用RSA的安全密码,如果那些文件丢失:

  • 服务器可以自动生成这些文件在启动MySQL编译使用OpenSSL的分布。

  • 用户可以调用mysql_ssl_rsa_setup本手动

  • 对于一些分布类型,如RPM包,mysql_ssl_rsa_setup数据目录初始化时调用。在这种情况下,MySQL分配不需要被编译使用OpenSSL只要OpenSSL命令是可用的

重要

服务器自动生成和mysql_ssl_rsa_setup有助于降低门槛,使用SSL使它更容易生成所需的文件。然而,这些方法产生的证书是自签名的,这可能不是很安全。你获得的经验,使用这样的文件后,将获得证书/密钥注册认证材料。

自动SSL和RSA文件生成

MySQL分布编译使用OpenSSL,MySQL服务器有能力自动生成SSL和RSA文件在启动时失踪。这个auto_generate_certssha256_password_auto_generate_rsa_keys,和caching_sha2_password_auto_generate_rsa_keys系统变量控制这些文件的自动生成。两变量被默认启用。他们可以在启动时启用,但不能设置在运行时检查。

在启动时,服务器自动生成服务器端和客户端的SSL证书和密钥文件中的数据目录,如果auto_generate_certs系统变量启用SSL选项以外,没有--ssl被指定,和服务器端SSL文件从数据目录失踪。这些文件使加密的客户端连接使用SSL;看第6.4.1配置MySQL,使用加密的连接”

  1. 服务器检查具有下列名称SSL文件数据目录:

    ca.pem
    server-cert.pem
    server-key.pem
    
  2. 如果其中任何一个文件,服务器创建没有SSL文件。否则,它创造了他们,再加上一些额外的文件:

    ca.pem               Self-signed CA certificate
    ca-key.pem           CA private key
    server-cert.pem      Server certificate
    server-key.pem       Server private key
    client-cert.pem      Client certificate
    client-key.pem       Client private key
    
  3. 如果服务器自动生成SSL文件,它使用的名称ca.pemserver-cert.pem,和server-key.pem文件设置相应的系统变量(ssl_cassl_certssl_key

在启动时,服务器自动生成RSA私有/公共密钥对文件中的数据目录,如果所有这些条件都是真实的sha256_password_auto_generate_rsa_keyscaching_sha2_password_auto_generate_rsa_keys系统变量是启用;没有指定RSA RSA文件选项;从数据目录失踪。这些密钥对文件启用安全密码交换的帐户通过未加密的连接使用RSAsha256_passwordcaching_sha2_password这个插件;第6.5.1.2,“SHA-256认证”,和第6.5.1.3,“缓存SHA-2认证”

  1. 服务器检查具有下列名称RSA文件数据目录:

    private_key.pem      Private member of private/public key pair
    public_key.pem       Public member of private/public key pair
    
  2. 如果任何这些文件,服务器不会产生RSA文件。否则,它创造了他们。

  3. 如果服务器自动生成RSA文件,它用自己的名字来设置相应的系统变量(sha256_password_private_key_pathsha256_password_public_key_pathcaching_sha2_password_private_key_pathcaching_sha2_password_public_key_path

SSL使用手册mysql_ssl_rsa_setup RSA文件生成

MySQL分布包括了mysql_ssl_rsa_setup实用程序可以调用手动生成SSL和RSA文件。本实用新型包括所有MySQL分布(是否编译使用OpenSSL或wolfssl),但它确实需要,OpenSSL命令是可用的。使用说明,见4.4.3“,”mysql_ssl_rsa_setup创建SSL / RSA文件”

SSL和RSA文件特征

SSL和RSA文件自动创建的服务器或通过调用mysql_ssl_rsa_setup有这些特点:

  • SSL和RSA密钥都有一个大小为2048位。

  • CA的证书是自签名的SSL。

  • SSL服务器和客户端证书的CA证书和密钥签名,使用sha256WithRSAEncryption签名算法

  • SSL证书使用这些通用名称(CN)值,与相应的证型(CA服务器、客户端):

    ca.pem:         MySQL_Server_suffix_Auto_Generated_CA_Certificate
    server-cert.pm: MySQL_Server_suffix_Auto_Generated_Server_Certificate
    client-cert.pm: MySQL_Server_suffix_Auto_Generated_Client_Certificate
    

    这个suffix价值是基于MySQL的版本号。对于生成的文件mysql_ssl_rsa_setup,后缀可以明确指定使用--suffix选项

    由服务器生成的文件,如果得到的CN值大于64的字符,_suffix酒店的名字是omitted份。

  • SSL的文件对国内空白值(C)、州或省(ST)、组织(O)、组织单元(OU)的名字和电子邮件地址。

  • SSL文件由服务器创建或mysql_ssl_rsa_setup的有效期为十年,从发生的时间。

  • RSA文件不过期

  • SSL文件有不同的编号为每个证书/密钥对(1的钙、2的服务器,3的客户端)。

  • 创建的文件自动被服务器的帐户拥有运行服务器。创建的文件使用mysql_ssl_rsa_setup是由用户调用,程序拥有。这可以在系统中支持的改变chown()如果程序是通过调用系统root--uid选择了指定谁应该拥有文件的用户。

  • 在UNIX和类UNIX系统中,文件访问模式是644证书文件(即世界可读性)和600密钥文件(即只有帐户运行的服务器访问)。

看到一个SSL证书的内容(例如,检查它的有效日期范围内),调用OpenSSL直接:

openssl x509 -text -in ca.pem
openssl x509 -text -in server-cert.pem
openssl x509 -text -in client-cert.pem

也可以使用SQL语句检查SSL证书过期信息:

mysql> SHOW STATUS LIKE 'Ssl_server_not%';
+-----------------------+--------------------------+
| Variable_name         | Value                    |
+-----------------------+--------------------------+
| Ssl_server_not_after  | Apr 28 14:16:39 2027 GMT |
| Ssl_server_not_before | May  1 14:16:39 2017 GMT |
+-----------------------+--------------------------+

6.4.3.2创建SSL证书和密钥使用OpenSSL

本节介绍了如何使用OpenSSL命令设置使用MySQL服务器和客户端的SSL证书和密钥文件。第一个示例显示了一个简化的程序,比如你可以从命令行使用。第二显示了一个脚本,包含更多的细节。第一个例子是用于Unix和使用OpenSSL这是一部分OpenSSL命令。第三个例子说明如何在Windows设置SSL文件。

笔记

有更容易的选择产生的SSL所需要的文件比这里所描述的过程:让服务器自动生成或使用mysql_ssl_rsa_setup程序看到第6.4.3.1,“创建SSL和RSA证书和使用MySQL”键

重要

你使用生成的证书和私钥文件的任何方法,用于服务器和客户端证书/密钥的名称值必须不同于用于CA证书的通用名称的价值。否则,证书和密钥文件将不使用OpenSSL的服务器编译工作。在这种情况下,一个典型的错误是:

ERROR 2026 (HY000): SSL connection error:
error:00000001:lib(0):func(0):reason(1)
例1:从UNIX命令行创建SSL文件

下面的例子展示了一组命令来创建MySQL服务器和客户端证书和密钥文件。你需要应对的一些提示OpenSSL命令。生成测试文件,你可以按下Enter键,所有提示。生成用于生产使用的文件,你应该提供非空的反应。

# Create clean environment
rm -rf newcerts
mkdir newcerts && cd newcerts

# Create CA certificate
openssl genrsa 2048 > ca-key.pem
openssl req -new -x509 -nodes -days 3600 \
        -key ca-key.pem -out ca.pem

# Create server certificate, remove passphrase, and sign it
# server-cert.pem = public key, server-key.pem = private key
openssl req -newkey rsa:2048 -days 3600 \
        -nodes -keyout server-key.pem -out server-req.pem
openssl rsa -in server-key.pem -out server-key.pem
openssl x509 -req -in server-req.pem -days 3600 \
        -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem

# Create client certificate, remove passphrase, and sign it
# client-cert.pem = public key, client-key.pem = private key
openssl req -newkey rsa:2048 -days 3600 \
        -nodes -keyout client-key.pem -out client-req.pem
openssl rsa -in client-key.pem -out client-key.pem
openssl x509 -req -in client-req.pem -days 3600 \
        -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem

生成证书后,验证:

openssl verify -CAfile ca.pem server-cert.pem client-cert.pem

你应该看到类似这样的回复:

server-cert.pem: OK
client-cert.pem: OK

看到一个证书的内容(例如,检查日期,证书的有效期范围内),调用OpenSSL这样地:

openssl x509 -text -in ca.pem
openssl x509 -text -in server-cert.pem
openssl x509 -text -in client-cert.pem

现在你有一组文件,可以使用如下:

  • ca.pem:使用此作为实参--ssl-ca在服务器和客户端。(CA证书,如果使用,必须在双方。是相同的)

  • server-cert.pemserver-key.pem:使用这些参数--ssl-cert--ssl-key在服务器端

  • client-cert.pemclient-key.pem:使用这些参数--ssl-cert--ssl-key在客户端

额外的使用说明,见第6.4.1配置MySQL,使用加密的连接”

例2:用一个脚本在UNIX创建SSL文件

下面是一个示例脚本显示了如何设置MySQL的SSL证书和密钥文件。执行脚本后,使用文件中描述了SSL连接第6.4.1配置MySQL,使用加密的连接”

DIR=`pwd`/openssl
PRIV=$DIR/private

mkdir $DIR $PRIV $DIR/newcerts
cp /usr/share/ssl/openssl.cnf $DIR
replace ./demoCA $DIR -- $DIR/openssl.cnf

# Create necessary files: $database, $serial and $new_certs_dir
# directory (optional)

touch $DIR/index.txt
echo "01" > $DIR/serial

#
# Generation of Certificate Authority(CA)
#

openssl req -new -x509 -keyout $PRIV/cakey.pem -out $DIR/ca.pem \
    -days 3600 -config $DIR/openssl.cnf

# Sample output:
# Using configuration from /home/monty/openssl/openssl.cnf
# Generating a 1024 bit RSA private key
# ................++++++
# .........++++++
# writing new private key to '/home/monty/openssl/private/cakey.pem'
# Enter PEM pass phrase:
# Verifying password - Enter PEM pass phrase:
# -----
# You are about to be asked to enter information that will be
# incorporated into your certificate request.
# What you are about to enter is what is called a Distinguished Name
# or a DN.
# There are quite a few fields but you can leave some blank
# For some fields there will be a default value,
# If you enter '.', the field will be left blank.
# -----
# Country Name (2 letter code) [AU]:FI
# State or Province Name (full name) [Some-State]:.
# Locality Name (eg, city) []:
# Organization Name (eg, company) [Internet Widgits Pty Ltd]:MySQL AB
# Organizational Unit Name (eg, section) []:
# Common Name (eg, YOUR name) []:MySQL admin
# Email Address []:

#
# Create server request and key
#
openssl req -new -keyout $DIR/server-key.pem -out \
    $DIR/server-req.pem -days 3600 -config $DIR/openssl.cnf

# Sample output:
# Using configuration from /home/monty/openssl/openssl.cnf
# Generating a 1024 bit RSA private key
# ..++++++
# ..........++++++
# writing new private key to '/home/monty/openssl/server-key.pem'
# Enter PEM pass phrase:
# Verifying password - Enter PEM pass phrase:
# -----
# You are about to be asked to enter information that will be
# incorporated into your certificate request.
# What you are about to enter is what is called a Distinguished Name
# or a DN.
# There are quite a few fields but you can leave some blank
# For some fields there will be a default value,
# If you enter '.', the field will be left blank.
# -----
# Country Name (2 letter code) [AU]:FI
# State or Province Name (full name) [Some-State]:.
# Locality Name (eg, city) []:
# Organization Name (eg, company) [Internet Widgits Pty Ltd]:MySQL AB
# Organizational Unit Name (eg, section) []:
# Common Name (eg, YOUR name) []:MySQL server
# Email Address []:
#
# Please enter the following 'extra' attributes
# to be sent with your certificate request
# A challenge password []:
# An optional company name []:

#
# Remove the passphrase from the key
#
openssl rsa -in $DIR/server-key.pem -out $DIR/server-key.pem

#
# Sign server cert
#
openssl ca -cert $DIR/ca.pem -policy policy_anything \
    -out $DIR/server-cert.pem -config $DIR/openssl.cnf \
    -infiles $DIR/server-req.pem

# Sample output:
# Using configuration from /home/monty/openssl/openssl.cnf
# Enter PEM pass phrase:
# Check that the request matches the signature
# Signature ok
# The Subjects Distinguished Name is as follows
# countryName           :PRINTABLE:'FI'
# organizationName      :PRINTABLE:'MySQL AB'
# commonName            :PRINTABLE:'MySQL admin'
# Certificate is to be certified until Sep 13 14:22:46 2003 GMT
# (365 days)
# Sign the certificate? [y/n]:y
#
#
# 1 out of 1 certificate requests certified, commit? [y/n]y
# Write out database with 1 new entries
# Data Base Updated

#
# Create client request and key
#
openssl req -new -keyout $DIR/client-key.pem -out \
    $DIR/client-req.pem -days 3600 -config $DIR/openssl.cnf

# Sample output:
# Using configuration from /home/monty/openssl/openssl.cnf
# Generating a 1024 bit RSA private key
# .....................................++++++
# .............................................++++++
# writing new private key to '/home/monty/openssl/client-key.pem'
# Enter PEM pass phrase:
# Verifying password - Enter PEM pass phrase:
# -----
# You are about to be asked to enter information that will be
# incorporated into your certificate request.
# What you are about to enter is what is called a Distinguished Name
# or a DN.
# There are quite a few fields but you can leave some blank
# For some fields there will be a default value,
# If you enter '.', the field will be left blank.
# -----
# Country Name (2 letter code) [AU]:FI
# State or Province Name (full name) [Some-State]:.
# Locality Name (eg, city) []:
# Organization Name (eg, company) [Internet Widgits Pty Ltd]:MySQL AB
# Organizational Unit Name (eg, section) []:
# Common Name (eg, YOUR name) []:MySQL user
# Email Address []:
#
# Please enter the following 'extra' attributes
# to be sent with your certificate request
# A challenge password []:
# An optional company name []:

#
# Remove the passphrase from the key
#
openssl rsa -in $DIR/client-key.pem -out $DIR/client-key.pem

#
# Sign client cert
#

openssl ca -cert $DIR/ca.pem -policy policy_anything \
    -out $DIR/client-cert.pem -config $DIR/openssl.cnf \
    -infiles $DIR/client-req.pem

# Sample output:
# Using configuration from /home/monty/openssl/openssl.cnf
# Enter PEM pass phrase:
# Check that the request matches the signature
# Signature ok
# The Subjects Distinguished Name is as follows
# countryName           :PRINTABLE:'FI'
# organizationName      :PRINTABLE:'MySQL AB'
# commonName            :PRINTABLE:'MySQL user'
# Certificate is to be certified until Sep 13 16:45:17 2003 GMT
# (365 days)
# Sign the certificate? [y/n]:y
#
#
# 1 out of 1 certificate requests certified, commit? [y/n]y
# Write out database with 1 new entries
# Data Base Updated

#
# Create a my.cnf file that you can use to test the certificates
#

cat <<EOF > $DIR/my.cnf
[client]
ssl-ca=$DIR/ca.pem
ssl-cert=$DIR/client-cert.pem
ssl-key=$DIR/client-key.pem
[mysqld]
ssl-ca=$DIR/ca.pem
ssl-cert=$DIR/server-cert.pem
ssl-key=$DIR/server-key.pem
EOF
例3:创建Windows SSL文件

OpenSSL下载Windows如果不是安装在你的系统。可用的软件包的概述,在这里可以看到:

http://www.slproweb.com/products/Win32OpenSSL.html

选择Win32或Win64 OpenSSL OpenSSL光光包,取决于你的架构(32位或64位)。默认的安装位置,将C:\OpenSSL-Win32C:\ openssl-win64,这取决于包下载。以下说明假定默认位置C:\OpenSSL-Win32。修改是必要的如果你使用64-bit包。

如果在安装过程中提示出现的消息'...critical component is missing: Microsoft Visual C++ 2008 Redistributables',取消安装,下载下面的包好,再根据你的架构(32位或64位):

安装额外的软件包后,重新启动安装程序OpenSSL。

在默认安装,离开C:\OpenSSL-Win32为安装路径,并保留默认的选项“OpenSSL DLL文件复制到Windows系统目录”挑选

当安装完成后,添加C:\OpenSSL-Win32\bin对Windows系统路径变量,你的服务器(取决于您的Windows版本,下面的路径设置的指令可能略有不同):

  1. 在Windows桌面上,右键单击我的电脑图标,并选择性能

  2. 选择高级标签从系统性能菜单上,单击环境变量按钮

  3. 系统变量,选择路径,然后单击编辑按钮这个编辑系统变量对话应该出现

  4. 添加';C:\OpenSSL-Win32\bin'到最后(注意分号)

  5. 3时报出版社的原因

  6. 检查OpenSSL被正确地整合到PATH变量,通过打开一个新的命令控制台(Start>Run>cmd.exe)和验证OpenSSL是可用的:

    Microsoft Windows [Version ...]
    Copyright (c) 2006 Microsoft Corporation. All rights reserved.
    
    C:\Windows\system32>cd \
    
    C:\>openssl
    OpenSSL> exit <<< If you see the OpenSSL prompt, installation was successful.
    
    C:\>
    

在OpenSSL已经安装使用说明与示例(见本节前面),有以下变化:

  • 把下面的UNIX命令:

    # Create clean environment
    rm -rf newcerts
    mkdir newcerts && cd newcerts
    

    在Windows环境下,使用这些命令代替:

    # Create clean environment
    md c:\newcerts
    cd c:\newcerts
    
  • 当一个'\'性格是在命令行的末尾显示,这“\”字符必须被删除,命令行输入的所有在一个单一的线。

证书和密钥文件生成后,使用SSL连接,看第6.4.1配置MySQL,使用加密的连接”

6.4.3.3使用OpenSSL创建RSA密钥

本节介绍了如何使用OpenSSL命令来设置RSA密钥文件,使MySQL支持账户认证的加密连接安全密码交换sha256_passwordcaching_sha2_password插件

笔记

有更容易的选择所需的文件生成RSA比这里所描述的过程:让服务器自动生成或使用mysql_ssl_rsa_setup程序看到第6.4.3.1,“创建SSL和RSA证书和使用MySQL”键

创建RSA私钥和公钥对文件,运行这些命令登录系统帐户用于运行MySQL服务器的文件将该帐户所拥有的:

openssl genrsa -out private_key.pem 2048
openssl rsa -in private_key.pem -pubout -out public_key.pem

这些命令创建2048位的密钥。创建强大的钥匙,用一个更大的价值。

然后对关键文件的访问模式。私钥应该由服务器只可读,而公钥可以自由分发到客户端的用户:

chmod 400 private_key.pem
chmod 444 public_key.pem

6.2.4 Opsssl versus Wolfsl

MySQL可以编译使用OpenSSL或wolfssl,两者都使加密连接基于OpenSSL API:

  • MySQL企业版编译使用OpenSSL二进制分布。这是不可能使用wolfssl MySQL企业版。

  • MySQL社区版编译使用OpenSSL二进制分布。

  • MySQL社区版源分布可以编译使用OpenSSL或wolfssl(见第6.4.5,“建立加密连接”支持MySQL

OpenSSL和wolfssl提供相同的基本功能,但是MySQL分布编译使用OpenSSL有额外的功能:

某些OpenSSL相关系统状态变量只有MySQL编译使用OpenSSL:

确定服务器是否被编译使用OpenSSL,检验这些变量的存在。例如,如果OpenSSL使用如果使用wolfssl空结果该语句返回的行:

SHOW STATUS LIKE 'Rsa_public_key';

6.4.5建筑MySQL加密连接支持

在MySQL服务器和客户程序之间使用加密的连接,你的系统必须支持OpenSSL或wolfssl:

  • MySQL企业版编译使用OpenSSL二进制分布。这是不可能使用wolfssl MySQL企业版。

  • MySQL社区版编译使用OpenSSL二进制分布。

  • MySQL社区版源分布可以编译使用OpenSSL或wolfssl。

如果你编译MySQL从源分布,CMake配置默认使用OpenSSL的分布。

编译使用OpenSSL,使用此程序:

  1. 确保OpenSSL的1.0.1或更高的安装在您的系统。如果安装OpenSSL的1.0.1版本低于,CMake在MySQL的配置时产生一个错误。如果有必要获得OpenSSL,访问http://www.openssl.org

  2. 这个WITH_SSLCMake选择确定用于编译MySQL的SSL库(见第2.8.4节,“MySQL源-配置选项”)。默认是-DWITH_SSL=system使用OpenSSL,这。为了使这个明确的,指定的选项CMake命令行。例如:

    cmake . -DWITH_SSL=system
    

    该命令配置分布使用OpenSSL库的安装。另外,要明确指定OpenSSL安装路径名,使用以下语法。可如果你有多个版本的OpenSSL安装是有用的,以防止CMake选择错误的人:

    cmake . -DWITH_SSL=path_name
    
  3. 编译和安装分布

使用wolfssl编译,下载wolfssl分布和应用一个小补丁。有关说明,见extra/README-wolfssl.txt文件

检查是否mysqld服务器支持加密连接,检查的价值have_ssl系统变量:

MySQL的&#62;SHOW VARIABLES LIKE 'have_ssl';--------------- ------- | variable_name |价值| --------------- ------- | have_ssl |是| --------------- -------

如果该值为YES,服务器支持加密连接。如果该值为禁用,服务器能够支持加密连接,但没有启动与适当的--ssl-xxx选项来启用加密连接无法使用;看第6.4.1配置MySQL,使用加密的连接”

确定服务器是否被编译使用OpenSSL或wolfssl,检查存在的任何系统或地位,只为OpenSSL存在变数。看到6.4.4部分,“OpenSSL与wolfssl”

6.4.6加密连接协议和密码

确定加密协议和密码是使用加密连接,使用下面的语句来检查的价值Ssl_versionSsl_cipher状态变量:

MySQL的&#62;SHOW SESSION STATUS LIKE 'Ssl_version';------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------SHOW SESSION STATUS LIKE 'Ssl_cipher';|变量name)--------------------------- _ |值|)--------------------------- | SSL RSA密码| DHE - _ AES128 - GCM - | SHA256)---------------------------

如果连接是不加密的,都有一个空值的变量。

MySQL支持加密连接使用TLSv1,TLSv1.1和tlsv1.2协议。

的价值tls_version系统变量决定哪个协议服务器允许使用那些可用的。这个tls_version价值是一个逗号分隔的列表包含一个或多个这些协议(不区分大小写):TLSv1,TLSv1.1 tlsv1.2。默认情况下,这个变量列出所有协议用来编译MySQL的SSL库支持。确定价值tls_version在运行时,使用此语句:

MySQL的&#62;SHOW GLOBAL VARIABLES LIKE 'tls_version';--------------- ----------------------- | _ name值变| | -------- ----------------------- | TLS _ | tlsv1版本,tlsv1.1,tlsv1.2 ----------------------- | ---------------

改变价值tls_version,它设置在服务器启动。例如,禁止连接,使用不太安全的TLSv1协议,在服务器上使用这些线my.cnf文件:

[mysqld]
tls_version=TLSv1.1,TLSv1.2

更加限制,只允许tlsv1.2连接设置tls_version这样地:

[mysqld]tls_version=TLSv1.2

客户程序,该--tls-version选项可以指定每个客户端调用允许TLS协议。值的格式是相同的tls_version

默认情况下,MySQL试图用最高的TLS协议版本,这取决于SSL库来编写服务器端和客户端,其中关键的尺寸,是否与服务器或客户端限制利用某些协议;例如,通过tls_version/--tls-version

  • 如果可能的话,TLSV1.2是用的。

  • tlsv1.2不与所有的密码有512比特或更小的密钥大小的工作。使用这个协议这一关键,使用--ssl-cipher指定的密码名称明确:

    aes128-shaaes128-sha256aes256-shaaes256-sha256camellia128-shacamellia256-shades-cbc3-shadhe-rsa-aes256-sharc4-md5rc4-shaseed-sha
  • 为提高安全性,使用证书与至少2048位RSA密钥大小。

如果服务器和客户端协议的能力,没有共同的协议,服务器终止连接请求。例如,如果服务器配置tls_version=TLSv1.1,TLSv1.2客户端调用,连接尝试将失败--tls-version=TLSv1,和老客户不支持--tls-version期权隐含的只支持TLSv1。

MySQL允许指定一个协议支持。这个列表是直接传递到下面的SSL库,最终由图书馆什么协议实际上可以从提供的列表。请参阅MySQL的源代码和ssl_ctx_new文件有关SSL库处理这。OpenSSL的,看SSL文档

确定一个给定的服务器支持密码,使用下面的语句来检查的价值Ssl_cipher_list状态变量:

显示会话状态像ssl_cipher_list”;

通过MySQL的SSL库密码的顺序很重要。更安全的密码被提到列表中的第一,和第一密码的证书选择提供支持。

MySQL通过密码列表的SSL库:

ECDHE-ECDSA-AES128-GCM-SHA256
ECDHE-ECDSA-AES256-GCM-SHA384
ECDHE-RSA-AES128-GCM-SHA256
ECDHE-RSA-AES256-GCM-SHA384
ECDHE-ECDSA-AES128-SHA256
ECDHE-RSA-AES128-SHA256
ECDHE-ECDSA-AES256-SHA384
ECDHE-RSA-AES256-SHA384
DHE-RSA-AES128-GCM-SHA256
DHE-DSS-AES128-GCM-SHA256
DHE-RSA-AES128-SHA256
DHE-DSS-AES128-SHA256
DHE-DSS-AES256-GCM-SHA384
DHE-RSA-AES256-SHA256
DHE-DSS-AES256-SHA256
ECDHE-RSA-AES128-SHA
ECDHE-ECDSA-AES128-SHA
ECDHE-RSA-AES256-SHA
ECDHE-ECDSA-AES256-SHA
DHE-DSS-AES128-SHA
DHE-RSA-AES128-SHA
TLS_DHE_DSS_WITH_AES_256_CBC_SHA
DHE-RSA-AES256-SHA
AES128-GCM-SHA256
DH-DSS-AES128-GCM-SHA256
ECDH-ECDSA-AES128-GCM-SHA256
AES256-GCM-SHA384
DH-DSS-AES256-GCM-SHA384
ECDH-ECDSA-AES256-GCM-SHA384
AES128-SHA256
DH-DSS-AES128-SHA256
ECDH-ECDSA-AES128-SHA256
AES256-SHA256
DH-DSS-AES256-SHA256
ECDH-ECDSA-AES256-SHA384
AES128-SHA
DH-DSS-AES128-SHA
ECDH-ECDSA-AES128-SHA
AES256-SHA
DH-DSS-AES256-SHA
ECDH-ECDSA-AES256-SHA
DHE-RSA-AES256-GCM-SHA384
DH-RSA-AES128-GCM-SHA256
ECDH-RSA-AES128-GCM-SHA256
DH-RSA-AES256-GCM-SHA384
ECDH-RSA-AES256-GCM-SHA384
DH-RSA-AES128-SHA256
ECDH-RSA-AES128-SHA256
DH-RSA-AES256-SHA256
ECDH-RSA-AES256-SHA384
ECDHE-RSA-AES128-SHA
ECDHE-ECDSA-AES128-SHA
ECDHE-RSA-AES256-SHA
ECDHE-ECDSA-AES256-SHA
DHE-DSS-AES128-SHA
DHE-RSA-AES128-SHA
TLS_DHE_DSS_WITH_AES_256_CBC_SHA
DHE-RSA-AES256-SHA
AES128-SHA
DH-DSS-AES128-SHA
ECDH-ECDSA-AES128-SHA
AES256-SHA
DH-DSS-AES256-SHA
ECDH-ECDSA-AES256-SHA
DH-RSA-AES128-SHA
ECDH-RSA-AES128-SHA
DH-RSA-AES256-SHA
ECDH-RSA-AES256-SHA
DES-CBC3-SHA

这些密码限制到位:

  • 下面的密码限制永久:

    !DHE-DSS-DES-CBC3-SHA
    !DHE-RSA-DES-CBC3-SHA
    !ECDH-RSA-DES-CBC3-SHA
    !ECDH-ECDSA-DES-CBC3-SHA
    !ECDHE-RSA-DES-CBC3-SHA
    !ECDHE-ECDSA-DES-CBC3-SHA
    
  • 下列密码限制永久:

    !aNULL
    !eNULL
    !EXPORT
    !LOW
    !MD5
    !DES
    !RC2
    !RC4
    !PSK
    !SSLv3
    

如果服务器开始使用兼容的证书使用任何上述限制密码或密码类,服务器开始支持禁用加密连接。

6.4.7连接到MySQL从Windows SSH远程

本节介绍了如何获得一个加密的连接到一个远程MySQL服务器。该信息是由David Carlson提供

  1. 在你的Windows机器上安装SSH客户端。对SSH客户比较,看http:///wiki/比较产生的_ of _ _ SSH客户端

  2. 启动Windows的SSH客户端。配置Host_Name = yourmysqlserver_URL_or_IP。配置userid=your_userid登录到您的服务器。这用户标识符值可能不为你的MySQL帐户的用户名相同。

  3. 设置端口转发。要么做一个远程转发(集local_port: 3306_:远程主机yourmysqlservername_or_ipremote_port:3306)或本地转发(集port: 3306HOST:Localhostremote port: 3306

  4. 保存一切,否则你将不得不重做一次。

  5. 登录到您的服务器,您刚刚创建的SSH会话。

  6. 在你的Windows机器上,启动一些ODBC应用程序(如Access)。

  7. 创建一个新文件在Windows和连接到MySQL的ODBC驱动程序使用相同的方式,你通常会做的,除了类型localhost对于MySQL服务器主机,不yourmysqlservername

在这一点上,你应该有一个ODBC连接到MySQL,使用加密的SSH。

6.5安全组件和插件

MySQL包括几个组件和插件,实现安全特性:

  • 用于认证试图通过客户端连接到MySQL服务器的插件。插件可用于多种认证协议。对认证过程的一般性讨论,看第6.3.10,“认证”。对于特定的身份验证插件的特点,看第6.5.1,验证“插件”

  • 一种实现密码强度的政策和评估潜在的密码强度的密码验证组件。看到第6.5.3,“密码验证组件”

  • 钥匙圈的插件,提供安全的敏感信息的存储。看到第6.5.4,“MySQL的钥匙”

  • (MySQL企业版只)MySQL企业审计,使用服务器的插件实现,采用开放的API使MySQL审计标准,基于策略的监控和记录的连接和查询活动具体执行MySQL服务器。为了满足Oracle审计规范,MySQL企业审计提供了一个开箱,易于使用的审计与合规解决方案是由内部和外部的监管准则的应用。

  • (MySQL企业版只)MySQL企业防火墙,应用层防火墙,使数据库管理员可以允许或拒绝基于匹配对接受声明模式白名单执行SQL语句。这有助于使MySQL服务器的攻击,如SQL注入或试图利用他们的合法查询工作负载的特性,在应用开发。

6.5.1认证插件

以下各节描述认证方法可在MySQL和实现这些方法的插件。对认证过程的一般性讨论,看第6.3.10,“认证”

插件的默认的值default_authentication_plugin系统变量

6.5.1.1本地认证

MySQL包括mysql_native_password插件,实现本地认证;即基于密码散列法使用的认证在认证介绍。

下表显示插件名称在服务器和客户端。

表6.12插件和库本地密码验证的名字

插件或文件插件或文件名
服务器端插件mysql_native_password
客户端插件mysql_native_password
库文件没有(插件内置)

以下各节提供安装和使用特定的本地认证信息:

关于MySQL认证的一般信息,看第6.3.10,“认证”

安装本地认证

这个mysql_native_password插件存在于服务器和客户端的形式:

  • 服务器端插件内置到服务器,不需要显式加载,不能禁用卸载它。

  • 客户端插件内置到libmysqlclient客户端库,可用于任何程序链接libmysqlclient

使用本地认证

MySQL客户端程序使用mysql_native_password默认情况下。这个--default-auth期权作为一个提示,客户端插件程序可以使用:

内核&#62;mysql --default-auth=mysql_native_password ...

6.5.1.2 SHA-256认证

MySQL提供了两个认证的插件,实现SHA-256散列用户帐户的密码:

  • sha256_password:实现了基本的SHA-256认证。

  • caching_sha2_password:implements SHA-256认证(像sha256_password),但使用缓存在服务器端获得更好的性能和更广泛的适用性的附加功能。

本节描述了原noncaching SHA-2认证插件。关于缓存插件的信息,参见第6.5.1.3,“缓存SHA-2认证”

重要

在MySQL 5.0,caching_sha2_password是默认的身份验证插件而不是mysql_native_password。有关此更改服务器的操作和与客户及连接器服务器兼容性的影响的信息,参见caching_sha2_password作为首选的身份验证插件

重要

连接到使用一个帐户,认证的服务器sha256_password插件,您必须使用TLS连接或未加密的连接,支持密码交换使用RSA密钥对,在本节后面介绍。无论哪种方式,这sha256_password插件使用MySQL的加密功能。看到6.4节,“使用加密的连接”

笔记

在名称sha256_passwordSHA256指的是256位的摘要长度的插件使用加密。在名称caching_sha2_password指的是更普遍的加密算法的二类,其中256位加密的一个实例。后者的名字选择离开可能消化未来扩张室长度不改变插件的名称。

下表显示插件名称在服务器和客户端。

表6.13插件库SHA-256认证名称

插件或文件插件或文件名
服务器端插件sha256_password
客户端插件sha256_password
库文件没有(插件内置)

以下各节提供安装和使用特定的SHA-256认证信息:

关于MySQL认证的一般信息,看第6.3.10,“认证”

安装SHA-256认证

这个sha256_password插件存在于服务器和客户端的形式:

  • 服务器端插件内置到服务器,不需要显式加载,不能禁用卸载它。

  • 客户端插件内置到libmysqlclient客户端库,可用于任何程序链接libmysqlclient

使用SHA-256认证

建立一个帐户使用的sha256_password对SHA-256密码散列的插件,使用下面的语句,其中password是理想的帐户密码:

创建用户的sha256user”@ &#39;localhost&#39;identified与sha256_password &#39;password&#39;;

服务器分配sha256_password插件的帐户和使用它使用SHA-256加密密码,在存储这些值插件authentication_string列的mysql.user系统表

前面的指令不假设sha256_password这是一个防火墙。如果sha256_password是默认的身份验证插件,简单CREATE USER语法可以用

与设置为默认身份验证插件启动服务器sha256_password,把这些线在服务器选项文件:

[mysqld]default_authentication_plugin=sha256_password

使sha256_password插件是由新帐户的默认使用。作为一个结果,它是可能的创建帐户和未命名的插件明确设置密码:

创建用户的sha256user &#39;@&#39;本地主机&#39;确定&#39;password&#39;;

设置的另一个后果default_authentication_pluginsha256_password是,使用一些其他的插件创建帐户,您必须指定明确的插件。例如,使用mysql_native_password插件,使用此语句:

创建用户的nativeuser”@ &#39;localhost&#39;identified与mysql_native_password &#39;password&#39;;

sha256_password支持安全传输连接sha256_password还支持使用RSA加密的连接,如果满足这些条件的加密的密码交换:

  • MySQL是编译使用OpenSSL。MySQL可以编译使用OpenSSL或yassl(见6.4.4部分,“OpenSSL与wolfssl”),和sha256_password分配使用包编译作品,但RSA支持需要OpenSSL。

  • MySQL服务器要连接配置为支持RSA(使用本节后面的RSA配置程序)。

RSA的支持具有这些特点:

客户使用sha256_password插件,密码是不会暴露明文连接服务器时。如何密码传输发生取决于一个安全的连接或使用RSA加密:

  • 如果连接是安全的,RSA密钥对是不必要的,是没有用的。这适用于使用TLS加密连接。密码发送明文但不能就因为连接是安全的。

  • 如果连接是不安全的,和一个RSA密钥对加密的连接仍然是可用的。这适用于未加密的连接没有TLS。RSA是仅用于客户端和服务器之间的密码,防止密码泄漏。当服务器接收加密的密码,它解密。争夺用于加密以防止重复攻击。

  • 如果一个安全的连接不使用RSA加密是不可用的,因为密码不能不暴露明文发送的连接尝试失败。

如前所述,RSA密码加密只如果MySQL编译使用OpenSSL提供。MySQL的编译使用wolfssl分布的含义是,使用SHA-256密码,客户必须使用加密连接访问服务器。看到第6.4.1配置MySQL,使用加密的连接”

笔记

使用RSA密码加密sha256_password,客户端和服务器都必须编译使用OpenSSL,不只是其中的一个。

假设MySQL已经编译使用OpenSSL,使用下面的过程来启用客户端连接过程中的密码交换的RSA密钥对的使用:

  1. 创建RSA私钥和公钥对文件使用说明第6.4.3,“创建SSL和RSA证书和密钥”

  2. 如果私钥和公钥文件位于数据目录和命名private_key.pempublic_key.pem(这个默认值sha256_password_private_key_pathsha256_password_public_key_path系统变量),服务器使用自动启动。

    否则,对名称的密钥文件明确,设置系统变量在服务器选项文件的密钥文件的名称。如果文件位于服务器的数据目录,你不需要指定完整路径名称:

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

    如果密钥文件不位于数据目录,或使他们的位置在系统变量的值显式,使用全路径名:

    [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状态变量的值。的价值会有所不同,在这里,而应该是空的:

    MySQL的&#62;SHOW STATUS LIKE 'Rsa_public_key'\G*************************** 1。行*************************** variable_name:rsa_public_key价值:-----开始公开密钥----- migfma0gcsqgsib3dqebaquaa4gnadcbiqkbgqdo9nrudd kvszgy7cnbzmnpwx6mve1pbjfxo7u18nj9lwc99du / e7lw6cvxw7vkrxpehbvquzgyunkf45nz / ckaajaalgjobcidmnvnyu54ot / 1lcs2xiyfadme8fcj64zwtnkby2gkt1imjuab5ogd5kjg8av7etkwyhhb0c30qidaqab -----端公钥-----

    如果该值为空,服务器发现一些关键文件的问题。检查诊断信息的错误日志。

在服务器配置了RSA密钥文件,帐户验证的sha256_password插件有使用这些关键文件连接到服务器的选择。如前所述,这些帐户可以使用安全连接(在这种情况下,RSA是不使用)或未加密的连接进行交换使用RSA密码。假设一个加密的连接使用。例如:

内核&#62;mysql --ssl-mode=DISABLED -u sha256user -p输入密码:password

此连接的尝试sha256user,服务器确定sha256_password是合适的身份验证插件调用它(因为这是指定的插件CREATE USER时间)。插件发现连接不加密的,因此需要密码才能使用RSA加密传输。在这种情况下,插件将RSA公钥给客户端,并使用它来加密密码,并将结果返回给服务器。插件使用RSA私钥在服务器端解密密码和接受或拒绝基于密码是否正确的连接。

服务器发送公钥给客户端的需要。然而,如果客户有一个RSA公钥服务器要求的本地副本的文件,它可以指定文件的使用--server-public-key-path选项:

内核&#62;mysql --ssl-mode=DISABLED -u sha256user -p --server-public-key-path=file_name输入密码:password

在文件命名的公钥值--server-public-key-path选择要在服务器端的文件名的键值相同sha256_password_public_key_path系统变量。如果密钥文件包含一个有效的公钥值但价值是不正确的,拒绝访问错误发生。如果密钥文件不包含一个有效的公共密钥,客户端程序不能使用它。在这种情况下,的sha256_password插件发送到客户端的公共密钥好像没有--server-public-key-path选项已被指定

客户端用户可以获得RSA公钥的两种方式:

  • 数据库管理员可以提供一份公钥文件。

  • 客户端用户可以连接到服务器的其他的方法可以使用SHOW STATUS LIKE 'Rsa_public_key'声明并保存在一个文件中返回的键值。

6.5.1.3缓存SHA-2认证

MySQL提供了两个认证的插件,实现SHA-256散列用户帐户的密码:

  • sha256_password:实现了基本的SHA-256认证。

  • caching_sha2_password:implements SHA-256认证(像sha256_password),但使用缓存在服务器端获得更好的性能和更广泛的适用性的附加功能。

本节描述缓存SHA-2认证插件。对原有的基本信息(noncaching)插件,看第6.5.1.2,“SHA-256认证”

重要

在MySQL 5.0,caching_sha2_password是默认的身份验证插件而不是mysql_native_password。有关此更改服务器的操作和与客户及连接器服务器兼容性的影响的信息,参见caching_sha2_password作为首选的身份验证插件

重要

连接到使用一个帐户,认证的服务器caching_sha2_password插件,你必须使用一个安全连接或未加密的连接,支持密码交换使用RSA密钥对,在本节后面介绍。无论哪种方式,这caching_sha2_password插件使用MySQL的加密功能。看到6.4节,“使用加密的连接”

笔记

在名称sha256_passwordSHA256指的是256位的摘要长度的插件使用加密。在名称caching_sha2_password指的是更普遍的加密算法的二类,其中256位加密的一个实例。后者的名字选择离开可能消化未来扩张室长度不改变插件的名称。

这个caching_sha2_password插件具有这些优点,相比sha256_password

  • 在服务器端,一个内存缓存可以更快的重新鉴定那些有连接以前当他们再次连接用户。

  • 基于RSA密码交换可不管SSL库对MySQL的连接。

  • 提供支持的客户端连接,使用Unix套接字文件和共享内存协议。

下表显示插件名称在服务器和客户端。

表6.14插件和库的SHA-2认证名称

插件或文件插件或文件名
服务器端插件caching_sha2_password
客户端插件caching_sha2_password
库文件没有(插件内置)

以下各节提供安装和使用特定的缓存SHA-2认证信息:

关于MySQL认证的一般信息,看第6.3.10,“认证”

安装SHA-2认证

这个caching_sha2_password插件存在于服务器和客户端的形式:

  • 服务器端插件内置到服务器,不需要显式加载,不能禁用卸载它。

  • 客户端插件内置到libmysqlclient客户端库,可用于任何程序链接libmysqlclient

服务器端插件的使用sha2_cache_cleaner作为一个帮助执行密码缓存管理审计插件。“Sha2”,像caching_sha2_password,是建立在不需要安装。

使用SHA-2认证

建立一个帐户使用的caching_sha2_passwordhashing SHA-256插件for the following statement的密码,使用,在password是理想的帐户密码:

创建用户的sha2user”@ &#39;localhost&#39;identified与caching_sha2_password &#39;password&#39;;

服务器分配caching_sha2_password插件的帐户和使用它使用SHA-256加密密码,在存储这些值插件authentication_string列的mysql.user系统表

前面的指令不假设caching_sha2_password这是一个防火墙。如果caching_sha2_password是默认的身份验证插件,简单CREATE USER语法可以用

与设置为默认身份验证插件启动服务器caching_sha2_password把这些线,选择在服务器的文件。

[mysqld]default_authentication_plugin=caching_sha2_password

使caching_sha2_password插件是由新帐户的默认使用。作为一个结果,它是可能的创建帐户和未命名的插件明确设置密码:

创建用户的sha2user &#39;@&#39;本地主机&#39;确定&#39;password&#39;;

设置的另一个后果default_authentication_plugincaching_sha2_password是,使用一些其他的插件创建帐户,您必须指定明确的插件。例如,使用mysql_native_password插件,使用此语句:

创建用户的nativeuser”@ &#39;localhost&#39;identified与mysql_native_password &#39;password&#39;;

caching_sha2_password支持安全传输连接。如果你按照本节稍后RSA配置程序,它还支持加密使用RSA加密的密码交换连接。RSA的支持具有这些特点:

客户使用caching_sha2_password插件,密码是不会暴露明文连接服务器时。如何密码传输发生取决于一个安全的连接或使用RSA加密:

  • 如果连接是安全的,RSA密钥对是不必要的,是没有用的。这适用于使用TLS加密的TCP连接,以及UNIX套接字文件和共享内存连接。密码发送明文但不能就因为连接是安全的。

  • 如果连接是不安全的,一种是使用RSA密钥对。这适用于未加密的TCP连接没有TLS和命名管道连接。RSA是仅用于客户端和服务器之间的密码,防止密码泄漏。当服务器接收加密的密码,它解密。争夺用于加密以防止重复攻击。

为了使客户端连接过程中的密码交换的RSA密钥对的使用,使用下面的过程:

  1. 创建RSA私钥和公钥对文件使用说明第6.4.3,“创建SSL和RSA证书和密钥”

  2. 如果私钥和公钥文件位于数据目录和命名private_key.pempublic_key.pem(这个默认值caching_sha2_password_private_key_pathcaching_sha2_password_public_key_path系统变量),服务器使用自动启动。

    否则,对名称的密钥文件明确,设置系统变量在服务器选项文件的密钥文件的名称。如果文件位于服务器的数据目录,你不需要指定完整路径名称:

    [mysqld]
    caching_sha2_password_private_key_path=myprivkey.pem
    caching_sha2_password_public_key_path=mypubkey.pem
    

    如果密钥文件不位于数据目录,或使他们的位置在系统变量的值显式,使用全路径名:

    [mysqld]
    caching_sha2_password_private_key_path=/usr/local/mysql/myprivkey.pem
    caching_sha2_password_public_key_path=/usr/local/mysql/mypubkey.pem
    
  3. 重新启动服务器,然后连接到它,并检查Caching_sha2_password_rsa_public_key状态变量的值。的价值会有所不同,在这里,而应该是空的:

    MySQL的&#62;SHOW STATUS LIKE 'Caching_sha2_password_rsa_public_key'\G*************************** 1。行*************************** variable_name:caching_sha2_password_rsa_public_key价值:-----开始公开密钥----- migfma0gcsqgsib3dqebaquaa4gnadcbiqkbgqdo9nrudd kvszgy7cnbzmnpwx6mve1pbjfxo7u18nj9lwc99du / e7lw6cvxw7vkrxpehbvquzgyunkf45nz / ckaajaalgjobcidmnvnyu54ot / 1lcs2xiyfadme8fcj64zwtnkby2gkt1imjuab5ogd5kjg8av7etkwyhhb0c30qidaqab -----端公钥-----

    如果该值为空,服务器发现一些关键文件的问题。检查诊断信息的错误日志。

在服务器配置了RSA密钥文件,帐户验证的caching_sha2_password插件有使用这些关键文件连接到服务器的选择。如前所述,这些帐户可以使用安全连接(在这种情况下,RSA是不使用)或未加密的连接进行交换使用RSA密码。假设一个加密的连接使用。例如:

内核&#62;mysql --ssl-mode=DISABLED -u sha2user -p输入密码:password

此连接的尝试sha2user,服务器确定caching_sha2_password是合适的身份验证插件调用它(因为这是指定的插件CREATE USER时间)。插件发现连接不加密的,因此需要密码才能使用RSA加密传输。然而,服务器不发送公钥给客户端,和客户端没有提供公共密钥,所以它无法加密密码和连接失败:

错误2061(hy000):身份验证插件的caching_sha2_password&#39;reported错误:认证需要安全连接。

从服务器请求的RSA公钥,指定--get-server-public-key选项:

内核&#62;mysql --ssl-mode=DISABLED -u sha2user -p --get-server-public-key输入密码:password

在这种情况下,服务器发送公钥给客户端,并使用它来加密密码,并将结果返回给服务器。插件使用RSA私钥在服务器端解密密码和接受或拒绝基于密码是否正确的连接。

另外,如果客户有一个RSA公钥服务器要求的本地副本的文件,它可以指定文件的使用--server-public-key-path选项:

内核&#62;mysql --ssl-mode=DISABLED -u sha2user -p --server-public-key-path=file_name输入密码:password

在这种情况下,客户端使用公钥加密的密码,并将结果返回给服务器。插件使用RSA私钥在服务器端解密密码和接受或拒绝基于密码是否正确的连接。

在文件命名的公钥值--server-public-key-path选择要在服务器端的文件名的键值相同caching_sha2_password_public_key_path系统变量。如果密钥文件包含一个有效的公钥值但价值是不正确的,拒绝访问错误发生。如果密钥文件不包含一个有效的公共密钥,客户端程序不能使用它。

客户端用户可以获得RSA公钥的两种方式:

  • 数据库管理员可以提供一份公钥文件。

  • 客户端用户可以连接到服务器的其他的方法可以使用SHOW STATUS LIKE 'Caching_sha2_password_rsa_public_key'声明并保存在一个文件中返回的键值。

SHA-2认证缓存操作

在服务器端,该caching_sha2_password插件使用一个更快的认证那些以前的客户连接的内存缓存。条目包括帐户名称和密码哈希对。缓存的工作原理是这样的:

  1. 当一个客户端连接,caching_sha2_password检查客户端是否和密码的一些缓存条目匹配。如果是这样的话,认证成功。

  2. 如果没有匹配的高速缓存条目,插件试图验证客户端的凭据在反对mysql.user系统表。如果成功了,caching_sha2_password在输入为客户端添加到哈希。否则,认证失败和被拒绝的连接是。

这样,当客户端第一次连接,认证对mysql.user表发生。当客户端连接之后,更快的验证缓存发生。

密码缓存操作比其他条目添加处理的sha2_cache_cleaner审计插件,执行这些行动的代表caching_sha2_password

  • 这将清除任何帐户,重命名或删除缓存条目,或任何帐户的凭据或认证插件的改变。

  • 它清空缓存时FLUSH PRIVILEGES定位器已执行

  • 它清空缓存在服务器关闭。(这意味着缓存不会持续在服务器重新启动。)

缓存清理作业影响后续的客户端连接的认证要求。为每一个用户帐户,第一个客户端连接后用户以下任何操作必须使用安全连接(使用TCP使用TLS证书,做了一个UNIX套接字文件,或共享内存)或RSA密钥对密码交换的基础:

FLUSH PRIVILEGES清除整个缓存和影响所有帐户的使用caching_sha2_password插件其他操作清晰具体的缓存条目,只影响该是行动的一部分,账户。

一旦用户认证成功,账户进入缓存和随后的连接不需要安全连接或RSA密钥对,直到另一个缓存清理事件发生影响的帐户。(当缓存可以使用,服务器使用一个挑战-响应机制,不使用明文密码传输,不需要一个安全的连接。)

6.5.1.4客户端明文认证

一个客户端身份验证插件可发送密码到服务器没有哈希或加密。这个插件是建立在MySQL客户端库。

下表显示了插件的名称。

表6插件和图书馆明文认证名称

插件或文件插件或文件名
服务器端插件没有,看到的讨论
客户端插件mysql_clear_password
库文件没有(插件内置)

许多MySQL的认证方法,客户端执行哈希或加密的密码发送给服务器。这使用户避免以明文发送密码。

哈希或加密认证方案,不需要服务器收到密码,进入在客户端完成。在这种情况下,客户端mysql_clear_password插件是用来发送密码以明文形式的服务器。没有相应的服务器端插件。相反,客户端插件可以通过任何服务器端插件,需要明文密码的应用。(例子是PAM和简单的LDAP身份验证插件;看第6.5.1.5,“可插入认证”,和第6.5.1.7,“LDAP认证”。)

下面的讨论提供了具体的明文认证使用信息。对于有关MySQL认证的一般信息,看第6.3.10,“认证”

笔记

以明文发送密码可能在某些配置中的安全问题。避免的问题,如果有任何可能的密码会被拦截,客户应该连接到使用方法,保护密码的MySQL服务器。可能性包括SSL(见6.4节,“使用加密的连接”)、IPSec、或私人网络。

让无意的使用mysql_clear_password插件不太可能,MySQL客户端必须显式启用。这可以在几个方面:

  • 设置LIBMYSQL_ENABLE_CLEARTEXT_PLUGIN环境变量的值,从Y,或Y。这支持the插件for all客户登录。

  • 这个MySQLmysqladminmysqlcheckmysqldumpMySQLShow,和mysqlslap客户端程序支持--enable-cleartext-plugin选项,使每一个调用基础插件。

  • 这个mysql_options()C API函数的支持mysql_enable_cleartext_plugin选项,使基于每一连接插件。另外,任何程序使用libmysqlclient读选项文件可以使插件包括使明文插件选择一个选项组的客户端库读取。

6.5.1.5 PAM认证

笔记

PAM认证是一个扩展包含在MySQL企业版,商业产品。要了解更多关于商业产品,看http://www.mysql.com /产品/

MySQL企业版支持的认证方法,使MySQL服务器使用PAM(可插入认证模块)对MySQL用户。PAM使系统使用一个标准的接口来访问各种认证方法,如UNIX密码或LDAP目录。

PAM认证提供了这些能力:

  • 外部认证:PAM认证使MySQL服务器接受来自外界的MySQL授权表定义用户的连接和验证使用支持PAM方法。

  • 代理用户支持:PAM认证可以返回到MySQL从不同的登录用户的用户名,基于群体的外部用户,提供认证字符串。这意味着,该插件可以返回MySQL用户定义权限外PAM认证的用户应该有。例如,一个用户命名joe可以连接并指定用户的权限开发商

PAM认证已经在Linux和MacOS的测试。

PAM的插件使用的MySQL服务器传递给它的信息(如用户名、主机名、密码和认证字符串),还有什么方法可以用于PAM查找。检查插件的用户凭据对PAM和回报'Authentication succeeded, Username is user_name'这是authentication failed

下表显示了插件和库文件的名称。文件名后缀可能在您的系统上的不同。该文件必须位于目录命名的plugin_dir系统变量。安装的信息,见安装可插入认证

PAM认证表6.16插件和库名称

插件或文件插件或文件名
服务器端插件authentication_pam
客户端插件mysql_clear_password
库文件authentication_pam.so

客户端与服务器端的明文的插件,插件与PAM是内置的libmysqlclient客户端库和包含在所有的分布,包括社区分布。客户端的明文插件在所有MySQL分布夹杂使客户从任何分布连接到服务器,服务器端插件加载。

以下各节提供安装和使用特定的PAM认证信息:

关于MySQL认证的一般信息,看第6.3.10,“认证”。的信息mysql_clear_password插件,看第6.5.1.4,“客户端明文认证”。代理用户信息,看第6.3.11”代理用户”

安装可插入认证

本节介绍如何安装PAM认证插件。关于安装插件的一般信息,看第5.6.1,“安装和卸载插件”

通过将服务器可用的插件库文件必须位于MySQL插件目录(目录命名的plugin_dir系统变量)。如果有必要,设置值plugin_dir在服务器启动告诉服务器插件目录位置。

插件库文件的基名称是authentication_pam。文件名后缀不同的平台(例如每,。所以UNIX和类UNIX系统,.dllfor Windows)。

在服务器启动时加载的插件,使用--plugin-load-add选项名称包含它的库文件。这个插件的加载方法,选择必须考虑每次服务器启动。例如,把这些线在服务器my.cnf文件(调整.so你的平台是必要的后缀):

[mysqld]plugin-load-add=authentication_pam.so

修改后的my.cnf,重新启动服务器以使新设置生效。

另外,在运行时登记的插件,使用此语句(调整.so后缀是必要的):

插件是安装_ PAM认证soname _ pam.so认证;

INSTALL PLUGIN加载插件立即,并记录它的mysql.plugins系统表,导致服务器负载为每个后续的正常启动。

to verify the插件安装,检查INFORMATION_SCHEMA.PLUGINS表或使用SHOW PLUGINS声明(见第2,“获取服务器插件的信息”)。例如:

mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
       FROM INFORMATION_SCHEMA.PLUGINS
       WHERE PLUGIN_NAME LIKE '%pam%';
+--------------------+---------------+
| PLUGIN_NAME        | PLUGIN_STATUS |
+--------------------+---------------+
| authentication_pam | ACTIVE        |
+--------------------+---------------+

如果插件初始化失败,检查诊断消息服务器错误日志。

联想到MySQL账户与PAM的插件,看使用PAM认证

卸载PAM认证

该方法用于卸载的PAM认证插件,取决于你如何安装它:

  • 如果你的插件安装在服务器启动时使用--plugin-load-add选项,重新启动服务器的选项。

  • 如果你安装的插件在运行时使用INSTALL PLUGIN它是安装在服务器重新启动。卸载它,用UNINSTALL PLUGIN

    authentication_pam卸载插件;
使用PAM认证

本节介绍了如何使用PAM认证插件连接MySQL客户端程序服务器。假定服务器正在运行的服务器端插件启用,如安装可插入认证

指在PAM认证插件IDENTIFIED WITH条款一CREATE USER声明中,使用的名称authentication_pam。。。。。。。例如:

CREATE USER user
  IDENTIFIED WITH authentication_pam
  AS 'authentication_string';

验证字符串指定以下类型的信息:

  • 帕姆支持的概念服务名称,这是一个名字,系统管理员可以配置为一个特定的应用程序的身份验证方法。可以有几个这样的应用一个单一的数据库服务器实例相关联,所以服务名称的选择是留下来的SQL应用程序开发者。当你定义一个帐户,应使用PAM认证,在认证字符串指定的服务名称。

  • PAM提供PAM模块返回服务器MySQL用户名以外,在登录时提供的登录名的方式。使用字符串验证控制登录名和MySQL的用户名称之间的映射。如果你想利用代理用户功能,认证字符串必须包含这种映射。

例如,如果服务名mysql用户在rootusers帕姆团体应该被映射到开发商data_entryMySQL的用户,分别使用这样的陈述:

创建用户userIDENTIFIED WITH authentication_pam  AS 'mysql, root=developer, users=data_entry';

对PAM认证插件认证字符串语法遵循这些规则:

  • 字符串由一个PAM服务名称,后跟一个由一个或多个关键字/值对每个指定的组名和MySQL用户名组映射表:

    pam_service_name[,group_name=mysql_user_name]...
    

    插件解析每个登录检查认证字符串。为了减少开销,保持尽可能短的字符串。

  • 每个group_name=mysql_user_name对必须使用逗号

  • 前导和尾随空格的双引号内不被忽略。

  • 非上市pam_service_namegroup_name,和mysql_user_name值可以包含除等号,逗号的话,或空间。

  • 如果一个pam_service_namegroup_name,或mysql_user_name值引用双引号,引号之间的一切都是价值的一部分。这是必要的,例如,如果该值包含空格字符。所有的文字都是法律除了双引号和反斜杠(\)。包括性格,逃避加上一个反斜杠。

如果插件成功验证登录名,它看起来在字符串验证一组映射表,如果存在的话,用它来返回一个不同的用户名基于群体的外部用户是一个成员的MySQL服务器:

  • 如果身份验证字符串不包含组映射列表,插件返回登录名。

  • 如果身份验证字符串包含一组映射表,检查每一个插件group_name=mysql_user_name对列表中从左到右,试图找到一个匹配的group_name在一个指定的身份验证的用户和组的非MySQL目录返回值mysql_user_name为它找到的第一个匹配。如果插件没有发现匹配的任何组,则返回登录名。如果插件没有可查找目录中的一组,它忽略了组映射列表返回登录名。

以下各节描述如何设置几个认证的情况下,使用PAM认证插件:

  • 没有代理用户。使用PAM只检查登录名和密码。每一个外部用户可以连接到MySQL服务器应该有一个匹配的MySQL帐户定义使用外部PAM认证。(一个MySQL账户user_name@host_name与外部用户,user_name必须登录名和host_name必须与主机的客户端连接。)认证可以由各种不同的PAM进行支持的方法。讨论如何使用传统的UNIX口令和LDAP。

    PAM认证,不通过代理的用户或组,需要mysql帐户具有相同的用户名为UNIX帐户。MySQL用户名限制为32个字符(见第6.2.3,“Grant Tables”),这限制了PAM nonproxy认证与最多32个字符的名字UNIX帐户。

  • 代理登录和组映射。在这种情况下,创建一个或几个MySQL账户定义不同的权限。(理想情况下,任何人都不应该直接使用这些帐户连接)然后定义一个默认的用户认证通过PAM使用映射方案(通常由用户在外部组)地图上的所有外部登录MySQL账户持有少数特权集。任何用户登录映射到一个MySQL账户和使用权限。讨论显示了如何设置使用UNIX的密码,但其他PAM方法如LDAP可以用来代替。

这些场景的变化是可能的。例如,你可以允许用户直接登录(无代理)但需要别人通过代理用户连接。

实例做如下假设。你可能需要你的系统是不同的设置作一些调整。

  • PAM配置目录/etc/pam.d

  • PAM的服务名称mysql,这意味着你必须建立一个PAM文件命名MySQL在PAM配置目录(如果不存在,创建文件)。如果你使用一个不同的服务名称mysql,文件名会有所不同,你必须在使用不同的名称auth_string&#39;条款CREATE USER声明.

  • 本实例使用一个登录名antonio和密码很秘密的。你想改变这些对应的用户身份认证。

PAM认证插件检查是否初始化时间AUTHENTICATION_PAM_LOG环境价值是在服务器的启动环境。如果是这样,该插件使诊断信息记录到标准输出。这取决于你的服务器启动时,消息可能会出现在控制台上或在错误日志。这些信息可以帮助调试PAM相关问题发生时,插件进行认证。有关更多信息,参见PAM认证调试

UNIX口令认证无代理用户

该认证方案使用PAM只检查Unix用户登录名和密码。每一个外部用户可以连接到MySQL服务器应该有一个匹配的MySQL帐户定义使用外部PAM认证。

  1. 验证Unix认证在PAM允许您登录antonio与密码很秘密的

  2. 建立PAM认证mysql服务创建一个文件名为pam.d / MySQL /等/。文件的内容是系统相关的,所以检查现有登录相关文件在/etc/pam.d目录,看看他们喜欢什么。在Linux的MySQL文件看起来像这样:

    #%PAM-1.0
    auth            include         password-auth
    account         include         password-auth
    

    Gentoo Linux的使用system-login而不是密码认证。MacOS,使用login而不是密码认证

    PAM文件格式可能在一些系统不同。例如,在Ubuntu和其他基于Debian的系统,而是使用这些文件的内容:

    @include common-auth
    @include common-account
    @include common-session-noninteractive
    
  3. 创建一个MySQL帐户使用相同的用户名为UNIX登录名和定义使用PAM认证插件:

    CREATE USER 'antonio'@'localhost'
      IDENTIFIED WITH authentication_pam AS 'mysql';
    GRANT ALL PRIVILEGES ON mydb.* TO 'antonio'@'localhost';
    
  4. 连接到MySQL服务器使用MySQL命令行客户端。例如:

    mysql --user=antonio --password --enable-cleartext-plugin mydb
    Enter password: verysecret
    

    服务器应允许连接和下面的查询应该返回的输出如图所示:

    mysql> SELECT USER(), CURRENT_USER(), @@proxy_user;
    +-------------------+-------------------+--------------+
    | USER()            | CURRENT_USER()    | @@proxy_user |
    +-------------------+-------------------+--------------+
    | antonio@localhost | antonio@localhost | NULL         |
    +-------------------+-------------------+--------------+
    

    这表明,antonio使用授予的特权安东尼奥MySQL的帐户,并没有发生代理。

笔记

客户端mysql_clear_password插件与服务器端通信发送密码到PAM插件明文MySQL服务器可以通过PAM。这是需要使用服务器端的PAM库,但可能在某些配置中的安全问题。这些措施使风险最小化:

  • 让无意的使用mysql_clear_password插件不太可能,MySQL客户端必须显式启用它;例如,与——使明文插件选项

  • 避免与密码曝光mysql_clear_password插件启用,MySQL客户端要连接到MySQL服务器使用安全连接。

对于附加的信息,参见第6.5.1.4,“客户端明文认证”,和第6.4.1配置MySQL,使用加密的连接”

笔记

在有些系统中,使用Unix认证/etc/shadow,一个通常已经限制访问权限的文件。这会导致MySQL基于PAM认证失败。不幸的是,PAM实现不允许区分密码不能检查(由于,例如,无法阅读/etc/shadow从)密码不匹配如果你的系统使用/etc/shadow,你可以使用这种方法MySQL访问它(假设MySQL服务器是运行在MySQL系统帐户):

  1. 创建一个shadow/etc/group

  2. 添加mysql用户对阴影/etc/group

  3. 分配/etc/group阴影组,使组读取权限:

    chgrp shadow /etc/shadow
    chmod g+r /etc/shadow
    
  4. 重新启动MySQL服务器。

LDAP身份验证没有代理用户

该认证方案使用PAM只检查用户的登录名和密码。每一个外部用户可以连接到MySQL服务器应该有一个匹配的MySQL帐户定义使用外部PAM认证。

  1. 验证LDAP认证在PAM允许您登录antonio与密码很秘密的

  2. 建立PAM认证mysql服务通过LDAP通过创建一个文件名为pam.d / MySQL /等/。文件的内容是系统相关的,所以检查现有登录相关文件在/etc/pam.d目录,看看他们喜欢什么。在Linux的MySQL文件看起来像这样:

    #%PAM-1.0
    auth        required    pam_ldap.so
    account     required    pam_ldap.so
    

    如果目标文件后缀PAM不同.so在你的系统上,替代正确的后缀。

    PAM文件格式可能在一些系统不同。

  3. MySQL帐户创建和连接到服务器中所描述的一样UNIX口令认证无代理用户

UNIX口令认证代理用户和组映射

这里描述的认证方案使用代理和组映射到地图连接MySQL数据库进行身份验证的用户使用PAM在其他MySQL账户定义不同的权限。用户不可以直接通过定义权限的帐户。相反,他们通过一个默认的代理用户验证使用的PAM,这样所有的外部登录映射到MySQL账户持有的特权。任何用户连接映射到其中一个MySQL账户的权限,确定数据库操作允许外部用户。

这里显示的程序使用UNIX口令认证。使用LDAP相反,看到的早期步骤LDAP身份验证没有代理用户

笔记

有关相关问题的信息/etc/shadow,看到UNIX口令认证无代理用户

  1. 验证Unix认证在PAM允许您登录antonio与密码很秘密的antonio是的一个成员rootusers群组

  2. 建立PAM认证mysql服务。把下面的pam.d / MySQL /等/

    #%PAM-1.0
    auth            include         password-auth
    account         include         password-auth
    

    Gentoo Linux的使用system-login而不是密码认证。MacOS,使用login而不是密码认证

    PAM文件格式可能在一些系统不同。例如,在Ubuntu和其他基于Debian的系统,而是使用这些文件的内容:

    @include common-auth
    @include common-account
    @include common-session-noninteractive
    
  3. 创建一个默认的代理用户(''@'')映射外部PAM用户代理帐户。它将从外部用户root帕姆组的developerMySQL帐户和从外部用户用户帕姆组的data_entryMySQL账户:

    CREATE USER ''@''  IDENTIFIED WITH authentication_pam  AS 'mysql, root=developer, users=data_entry';

    以下服务名称映射表时需要设置代理用户。否则,插件不能告诉如何映射PAM团体的名称到适当的代理用户名。

    笔记

    如果你的MySQL安装有匿名用户,他们可能会使用默认代理用户冲突。有关此问题的更多信息,并处理它的方式,看默认的代理用户和匿名用户冲突

  4. 创建代理帐户将用于访问数据库:

    CREATE USER 'developer'@'localhost' IDENTIFIED BY 'very secret password';
    GRANT ALL PRIVILEGES ON mydevdb.* TO 'developer'@'localhost';
    CREATE USER 'data_entry'@'localhost' IDENTIFIED BY 'very secret password';
    GRANT ALL PRIVILEGES ON mydb.* TO 'data_entry'@'localhost';
    

    如果你不让任何人知道这些帐户的密码,其他用户无法使用直接连接到MySQL服务器。相反,预计用户将使用PAM认证,他们将利用developer_输入日期通过基于PAM集团代理帐户。

  5. 格兰特PROXY对于代理的代理帐户的特权帐户:

    在线代理developer格兰特是是是是是是“localhost”格兰特是代理;在线日期输入localhost是_ @ @是是是是是是;
  6. 连接到MySQL服务器使用MySQL命令行客户端。例如:

    mysql --user=antonio --password --enable-cleartext-plugin mydb
    Enter password: verysecret
    

    的服务器进行身份验证的连接使用''@''帐户。the权限安东尼奥将取决于PAM组委员。如果antonio是的一个成员rootPAM,PAM的插件图root开发商MySQL用户名和返回的名称服务器。服务器验证''@''PROXY特权开发商允许连接。以下查询将返回的输出如图所示:

    mysql> SELECT USER(), CURRENT_USER(), @@proxy_user;
    +-------------------+---------------------+--------------+
    | USER()            | CURRENT_USER()      | @@proxy_user |
    +-------------------+---------------------+--------------+
    | antonio@localhost | developer@localhost | ''@''        |
    +-------------------+---------------------+--------------+
    

    这表明,antonio使用授予的特权开发商MySQL账户,代理通过默认代理用户帐户发生。

    如果antonio是不是该成员root但PAM组的成员users组,发生类似的过程,但插件地图用户组成员的data_entryMySQL用户名和返回的名称服务器。在这种情况下,安东尼奥《权利的辨别data_entryMySQL账户:

    MySQL的&#62;SELECT USER(), CURRENT_USER(), @@proxy_user;------------------- ---------------------- -------------- | user() | current_user() | @ @ proxy_user | ------------------- ---------------------- -------------- |安东尼奥@本地| data_entry @本地|“@”| ------------------- ---------------------- --------------
笔记

客户端mysql_clear_password插件与服务器端通信发送密码到PAM插件明文MySQL服务器可以通过PAM。这是需要使用服务器端的PAM库,但可能在某些配置中的安全问题。这些措施使风险最小化:

  • 让无意的使用mysql_clear_password插件不太可能,MySQL客户端必须显式启用它;例如,与——使明文插件选项

  • 避免与密码曝光mysql_clear_password插件启用,MySQL客户端要连接到MySQL服务器使用安全连接。

对于附加的信息,参见第6.5.1.4,“客户端明文认证”,和第6.4.1配置MySQL,使用加密的连接”

PAM认证调试

PAM认证插件检查是否初始化时间AUTHENTICATION_PAM_LOG环境设定(价值并不重要)。如果是这样,该插件使诊断信息记录到标准输出。这些信息可能有助于调试PAM相关问题发生时,插件进行认证。

一些消息包括参考PAM插件的源文件和行号,使插件来联系更紧密的位置在哪里发生的代码。

6.5.1.6 Windows认证

笔记

Windows认证是一个扩展包含在MySQL企业版,商业产品。要了解更多关于商业产品,看http://www.mysql.com /产品/

MySQL企业版支持Windows身份验证方法进行外部验证Windows,使MySQL服务器使用本地Windows服务进行身份验证的客户端连接。谁登录到Windows用户可以连接MySQL客户端程序基于环境信息的服务器没有指定一个额外的密码。

在认证握手客户端和服务器交换数据包。由于这种交换,服务器会创建一个安全上下文对象表示在Windows客户端的身份。这种认同包括客户帐户的名称。Windows认证使用客户的身份来检查它是否是一个给定的帐户或一个团体的成员。默认情况下,协商使用Kerberos进行身份验证,然后使用NTLM如果Kerberos是无效的。

Windows认证提供了这些能力:

  • 外部认证:Windows身份验证使MySQL服务器接受外界的人登录到Windows MySQL授权表定义用户的连接。

  • 代理用户支持:Windows身份验证可以返回到MySQL不同客户端的用户的用户名。这意味着,该插件可以返回定义权限认证的用户应该有外窗的MySQL用户。例如,一个用户命名joe可以连接并指定用户的权限开发商

下表显示了插件和库文件的名称。该文件必须位于目录命名的plugin_dir系统变量

表6.17为Windows身份验证插件和库名称

插件或文件插件或文件名
服务器端插件authentication_windows
客户端插件authentication_windows_client
库文件authentication_windows.dll

库文件只包含服务器端插件。客户端插件内置到libmysqlclient客户端库

服务器端的Windows身份验证插件包含在MySQL企业版。这是不包含在MySQL社区分布。客户端插件包含在所有的分布,包括社区分布。这允许客户从任何分配连接到服务器,服务器端插件加载。

Windows身份验证插件支持任何版本的MySQL 8支持Windows(见http://www.mysql.com/support/supportedplatforms/database.html

以下各节提供安装和使用特定的Windows认证信息:

关于MySQL认证的一般信息,看第6.3.10,“认证”。代理用户信息,看第6.3.11”代理用户”

安装Windows认证

本节介绍如何安装Windows身份验证插件。关于安装插件的一般信息,看第5.6.1,“安装和卸载插件”

通过将服务器可用的插件库文件必须位于MySQL插件目录(目录命名的plugin_dir系统变量)。如果有必要,设置值plugin_dir在服务器启动告诉服务器插件目录位置。

在服务器启动时加载的插件,使用--plugin-load-add选项名称包含它的库文件。这个插件的加载方法,选择必须考虑每次服务器启动。例如,把这些线在服务器my.cnf文件:

[mysqld]
plugin-load-add=authentication_windows.dll

修改后的my.cnf,重新启动服务器以使新设置生效。

另外,在运行时登记的插件,使用此语句:

INSTALL PLUGIN authentication_windows SONAME 'authentication_windows.dll';

INSTALL PLUGIN加载插件立即,并记录它的mysql.plugins系统表,导致服务器负载为每个后续的正常启动。

to verify the插件安装,检查INFORMATION_SCHEMA.PLUGINS表或使用SHOW PLUGINS声明(见第2,“获取服务器插件的信息”)。例如:

mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
       FROM INFORMATION_SCHEMA.PLUGINS
       WHERE PLUGIN_NAME LIKE '%windows%';
+------------------------+---------------+
| PLUGIN_NAME            | PLUGIN_STATUS |
+------------------------+---------------+
| authentication_windows | ACTIVE        |
+------------------------+---------------+

如果插件初始化失败,检查诊断消息服务器错误日志。

联想到MySQL帐户与Windows身份验证插件,看使用Windows认证

卸载Windows认证

该方法用于卸载Windows身份验证插件,取决于你如何安装它:

  • 如果你的插件安装在服务器启动时使用--plugin-load-add选项,重新启动服务器的选项。

  • 如果你安装的插件在运行时使用INSTALL PLUGIN它是安装在服务器重新启动。卸载它,用UNINSTALL PLUGIN

    _插件卸载Windows认证;

此外,删除,设置窗口插件相关的系统变量的任何启动选项。

使用Windows认证

Windows身份验证插件支持MySQL账户,谁已经登录到Windows用户可以无需指定一个额外的密码连接到MySQL服务器的使用。假定服务器正在运行的服务器端插件启用,如安装Windows认证。当DBA使服务器端插件和设置账户来使用它,客户可以使用这些帐户没有其他安装他们所需的连接。

是指在Windows身份验证插件IDENTIFIED WITH条款一CREATE USER声明中,使用的名称_ Windows认证。假设Windows用户Rafal塔莎应该被允许连接到MySQL,以及在任何用户Administrators电力用户群组这个设置,创建一个MySQL账户名sql_admin使用Windows身份验证插件:

创建用户sql_admin确定authentication_windows &#39; Rafal,塔莎,管理员,“超级用户”;

插件名称authentication_windows。the following the字符串作为关键词是认证字符串。它指定的Windows用户命名Rafal塔莎允许身份验证到服务器的MySQL用户sql_admin,作为在任何Windows用户管理员Power Users群组后者的名称包含空格,因此必须用双引号字符引用。

在你创造的sql_admin账户,用户登录到Windows会尝试连接到使用该帐户的服务器:

C:\>mysql --user=sql_admin

无需密码在这里。这个authentication_windows插件使用Windows安全API来检查Windows用户连接。如果用户指定拉法尔Tasha,或是在管理员Power Users组服务器授权访问和客户端认证_ SQL管理有什么特权授予sql_admin客户。否则,denies访问的服务器。

对于Windows身份验证插件认证字符串语法遵循这些规则:

  • 字符串由一个或多个用户映射,以逗号分隔。

  • 每个用户映射关联的Windows用户或组的名称与MySQL用户名:

    win_user_or_group_name=mysql_user_name
    win_user_or_group_name
    

    后者for the syntax,哦,哦mysql_user_name价值,隐性价值是由MySQL用户CREATE USER声明。因此,这些陈述是等价的:

    CREATE USER sql_admin  IDENTIFIED WITH authentication_windows  AS 'Rafal, Tasha, Administrators, "Power Users"';CREATE USER sql_admin  IDENTIFIED WITH authentication_windows  AS 'Rafal=sql_admin, Tasha=sql_admin, Administrators=sql_admin,      "Power Users"=sql_admin';
  • 每一个反斜杠('\')在价值必须增加一倍,因为反斜杠是MySQL字符串转义字符。

  • 前导和尾随空格的双引号内不被忽略。

  • 非上市win_user_or_group_namemysql_user_name值可以包含除等号,逗号的话,或空间。

  • 如果一个win_user_or_group_namemysql_user_name值引用双引号,引号之间的一切都是价值的一部分。这是必要的,例如,如果名称包含空格字符。在双引号内的所有字符都是双引号和反斜杠的法制。包括性格,逃避加上一个反斜杠。

  • win_user_or_group_name值使用常规语法为Windows的校长、本地或域中的。例子(注意反斜杠加倍):

    域\\用户。\\用户域\\组。\\ \\ wellknowngroup groupbuiltin

当调用服务器认证客户端,插件扫描认证字符串从左到右为用户或组匹配的Windows用户。如果有一个匹配,返回相应的插件mysql_user_nameMySQL服务器的。如果没有匹配,认证失败。

用户名匹配优先于名称的小组赛。假设Windows用户命名win_user是一个成员_集团和认证字符串看起来像这样:

'win_group = sql_user1, win_user = sql_user2'

什么时候win_user连接到MySQL服务器,有一场比赛都_集团win_user。该插件的用户进行身份验证,如sql_user2因为更具体的用户匹配优先于小组赛,尽管集团上市的认证字符串第一。

Windows身份验证的连接总是从同一台计算机上运行的服务器。跨计算机连接,计算机必须与Windows活动目录注册。如果他们在同一个Windows域,无需指定一个域名。它也可以允许连接不同的域,如下面的例子:

CREATE USER sql_accounting
  IDENTIFIED WITH authentication_windows
  AS 'SomeDomain\\Accounting';

在这里SomeDomain是另一个域的名称。反斜杠字符是翻了一番,因为它是在MySQL转义字符的字符串。

MySQL支持代理用户的概念,一个客户端可以连接和验证到MySQL服务器使用一个帐户,但同时连接有另一个帐户的特权(见第6.3.11”代理用户”)。假设你想让Windows用户使用一个单一的用户名连接但被映射到基于Windows用户和组名到特定的MySQL账户如下:

  • 这个local_userdomain_user MyDomain \本地和域映射到Windows用户应该local_wladMySQL账户

  • 用户在MyDomain\Developers域组映射到本地的MySQL的用户帐户。

  • 本地计算机管理员应该映射到local_adminMySQL账户

这个设置,创建一个Windows用户连接到代理帐户,并配置此帐户,用户和组映射到相应的MySQL账户(local_wlad本地的local_admin)。此外,格兰特MySQL账户适合他们所要执行的操作的权限。以下说明使用win_proxy作为代理帐户,并local_wlad本地的,和local_admin作为代理帐户

  1. 创建代理MySQL账户:

    CREATE USER win_proxy
      IDENTIFIED WITH  authentication_windows
      AS 'local_user = local_wlad,
          MyDomain\\domain_user = local_wlad,
          MyDomain\\Developers = local_dev,
          BUILTIN\\Administrators = local_admin';
    
    笔记

    如果你的MySQL安装有匿名用户,他们可能会使用默认代理用户冲突。有关此问题的更多信息,并处理它的方式,看默认的代理用户和匿名用户冲突

  2. 代理工作,代理帐户必须存在,所以他们创造:

    CREATE USER local_wlad IDENTIFIED BY 'wlad_pass';
    CREATE USER local_dev IDENTIFIED BY 'dev_pass';
    CREATE USER local_admin IDENTIFIED BY  'admin_pass';
    

    如果你不让任何人知道这些帐户的密码,其他用户无法使用直接连接到MySQL服务器。

    你也应该问题GRANT报表(未显示),给每个代理帐户所需的权限。

  3. 代理帐户必须具有PROXY每个代理帐户的特权:

    格兰特_ wlad赢得当地代理我们_代理;代理我们_格兰特赢得当地发展_代理;代理我们_格兰特赢得当地行政_代理;

现在的Windows用户local_userdomain_user MyDomain \可以连接到MySQL服务器win_proxy当认证有特权的帐户,在这种情况下,认证字符串,局部_ -瓦列。用户在MyDomain\Developers谁将为集团win_proxy具有的特权local_dev账户用户在内置\管理员集团有特权的local_admin账户

要配置身份验证,所有Windows用户谁没有自己的MySQL账户办理代理帐户,替代默认代理用户(''@''win_proxy在前面的说明。有关默认代理用户信息,看第6.3.11”代理用户”

使用Windows身份验证插件连接器/网络连接器/净6.4.4和更高的连接字符串,看使用Windows本地认证插件

在Windows身份验证插件提供的额外的控制authentication_windows_use_principal_nameauthentication_windows_log_level变量系统。See第5.1.7,服务器“系统变量”

6.5.1.7 LDAP认证

笔记

LDAP认证是一个扩展包含在MySQL企业版,商业产品。要了解更多关于商业产品,看http://www.mysql.com /产品/

MySQL企业版支持的认证方法,使MySQL服务器使用LDAP(轻量级目录访问协议)认证的MySQL用户访问目录服务如X.500。MySQL使用LDAP获取用户,凭证和组信息。

LDAP认证提供了这些能力:

  • 外部认证:LDAP认证使MySQL服务器接受来自外部LDAP目录MySQL授权表定义用户的连接。

  • 代理用户支持:LDAP认证可以返回到MySQL从不同的登录用户的用户名,基于外部用户的LDAP组。这意味着一个LDAP插件可以返回定义权限的外部LDAP身份验证的用户的MySQL用户应该。例如,一个用户命名joe可以连接并有MySQL用户命名的特权开发商If the LDAP Group forjoe开发商

  • 安全:使用TLS,到LDAP服务器的连接是安全的。

下表显示了插件和库文件的名称。文件名后缀可能在您的系统上的不同。该文件必须位于目录命名的plugin_dir系统变量

表6.18插件和库LDAP认证名称

插件或文件插件或文件名
服务器端插件的名字authentication_ldap_sasl_ _简单的LDAP认证
客户端插件的名字authentication_ldap_sasl_clientmysql_clear_password
库文件的名字authentication_ldap_sasl.so_ _ _ client.so SASL认证LDAPauthentication_ldap_simple.so

库文件只包括authentication_ldap_XXX插件。客户端mysql_clear_password插件内置到libmysqlclient客户端库

有两个服务器的LDAP插件,每一个作品与特定的客户端插件:

  • 服务器端authentication_ldap_simple插件执行简单的LDAP认证。通过账户,使用这个插件连接,客户端程序使用客户端mysql_clear_password插件,将密码以明文形式的服务器。没有密码哈希或加密使用,所以MySQL客户端和服务器之间的安全连接是防止密码曝光。

  • 服务器端authentication_ldap_sasl基于LDAP认证SASL插件执行。通过账户,使用这个插件连接,客户端程序使用客户端_ LDAP客户_ _ SASL认证插件客户端和服务器端插件使用SASL SASL LDAP消息在LDAP协议传输安全凭据,避免发送MySQL客户端和服务器之间的明文密码。

以下各节提供安装和使用特定的LDAP认证信息:

关于MySQL认证的一般信息,看第6.3.10,“认证”。的信息mysql_clear_password插件,看第6.5.1.4,“客户端明文认证”。代理用户信息,看第6.3.11”代理用户”

笔记

如果你的系统支持PAM和允许LDAP作为PAM认证方法,另一种方式来使用LDAP的MySQL用户认证是使用服务器端authentication_pam插件看到第6.5.1.5,“可插入认证”

低密度低密度脂蛋白的真实性

使用LDAP认证的MySQL,这些先决条件必须满足:

  • LDAP服务器必须使用LDAP身份验证插件与。

  • LDAP用户认证通过MySQL必须在目录的LDAP服务器管理的现状。

  • LDAP客户端库必须提供系统在服务器端authentication_ldap_sasl_ _简单的LDAP认证插件的使用。目前,支持库是Windows本地LDAP库,或在非Windows系统中的图书馆。

  • 使用基于LDAP身份验证SASL:

    • LDAP服务器必须配置为与SASL服务器通信。

    • SASL客户端库必须是可用的系统中,客户端authentication_ldap_sasl_client插件的使用。目前,唯一支持的图书馆是赛勒斯SASL库。

LDAP身份认证的MySQL用户如何工作

本节提供了一个概述了MySQL如何和LDAP认证的MySQL用户一起工作。举例说明如何设置MySQL账户使用特定的LDAP身份验证插件,看使用LDAP认证

客户端连接到MySQL服务器,提供MySQL客户端用户名和LDAP密码:

  • 对于简单的LDAP认证,客户端和服务器端通信插件插件明文。

  • 基于LDAP身份验证SASL,客户端和服务器端插件使用SASL消息在LDAP协议传输安全凭据,避免发送MySQL客户端和服务器之间的明文密码。

如果客户端用户名和主机名匹配任何MySQL帐户,连接被拒绝。

如果有一个匹配的MySQL账户认证对LDAP的发生。LDAP服务器找个条目匹配用户和认证对密码进入:

  • 如果MySQL账户名称的LDAP用户专有名称(DN),LDAP身份验证使用价值和由客户提供LDAP密码。(联想到LDAP的用户DN与MySQL账户,包括BY子句中CREATE USER语句创建帐户。)

  • 如果MySQL账户名称没有用户DN,LDAP身份验证使用客户端提供的用户名和密码访问。在这种情况下,认证插件结合使用根DN和密码凭据找到用户DN基于客户端的用户名的LDAP服务器,然后验证用户DN对LDAP密码。如果根DN和密码设置,但不正确的值,这与使用根证书失败,或是空的(不定)和LDAP服务器不允许匿名连接。

如果没有找到匹配的LDAP服务器或多个匹配,认证失败,客户端连接被拒绝。

如果LDAP服务器中查找一个匹配,LDAP认证成功(假设密码是正确的),LDAP服务器返回LDAP条目,和认证插件决定认证用户基于项的名称:

  • 如果LDAP条目有一组属性(默认情况下,该cn属性返回的插件),其值为“authenticated user name。

  • 如果LDAP条目没有组属性,认证插件返回客户端的用户名为认证用户的名称。

MySQL服务器将客户端的用户名和认证用户的名称来判断是否发生的客户端代理:

  • 如果名字是一样的,没有代理发生:MySQL帐户匹配客户端的用户名称是用于权限检查。

  • 如果名称不同,代理发生:MySQL看起来一个帐户匹配的认证用户的名称。该帐户成为代理用户进行权限检查。匹配客户端用户名mysql帐户作为外部代理用户。

安装LDAP认证

本节介绍如何安装LDAP身份验证插件。关于安装插件的一般信息,看第5.6.1,“安装和卸载插件”

通过将服务器可用的插件库文件必须位于MySQL插件目录(目录命名的plugin_dir系统变量)。如果有必要,设置值plugin_dir在服务器启动告诉服务器插件目录位置。

服务器端插件库文件的基名称authentication_ldap_sasl_ _简单的LDAP认证。文件名后缀不同的平台(例如每,.soUNIX和类UNIX系统,dllWindows)

在服务器启动时加载的插件,使用--plugin-load-add选择库文件包含它们的名字。这个插件的加载方法,选择必须考虑每次服务器启动。同时,指定任何插件提供的系统变量你想配置值。

每个服务器的LDAP插件提供一组变量,使其操作系统配置。设置这些是可选的,但是你必须设置指定服务器的主机变量(所以插件知道连接)和基准可分辨名称LDAP绑定操作(限制搜索范围,获得更快的搜索)。关于所有的LDAP系统变量的详细信息,参见第6.5.1.11,“可插拔认证系统变量”

加载插件和设置LDAP服务器主机和基于LDAP绑定操作可分辨名称放线如你这些my.cnf文件(调整。所以你的平台是必要的后缀):

[mysqld]
plugin-load-add=authentication_ldap_sasl.so
authentication_ldap_sasl_server_host=127.0.0.1
authentication_ldap_sasl_bind_base_dn="dc=example,dc=com"
plugin-load-add=authentication_ldap_simple.so
authentication_ldap_simple_server_host=127.0.0.1
authentication_ldap_simple_bind_base_dn="dc=example,dc=com"

修改后的my.cnf,重新启动服务器以使新设置生效。

另外,在运行时登记的插件,使用这些语句(调整.so后缀是必要的):

安装插件的LDAP认证_ _ SASL认证soname’_ LDAP _ sasl.so;安装插件_ LDAP认证_简单soname’_ _ simple.so LDAP认证;

INSTALL PLUGIN加载插件立即,并记录它的mysql.plugins系统表,导致服务器负载为每个后续的正常启动。

在运行时安装插件后,他们的系统变量成为可用,您可以添加到您的设置my.cnf为后续的插件配置文件启动。例如:

[mysqld]authentication_ldap_sasl_server_host=127.0.0.1authentication_ldap_sasl_bind_base_dn="dc=example,dc=com"authentication_ldap_simple_server_host=127.0.0.1authentication_ldap_simple_bind_base_dn="dc=example,dc=com"

修改后的my.cnf,重新启动服务器以使新设置生效。

to verify the插件安装,检查INFORMATION_SCHEMA.PLUGINS表或使用SHOW PLUGINS声明(见第2,“获取服务器插件的信息”)。例如:

mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
       FROM INFORMATION_SCHEMA.PLUGINS
       WHERE PLUGIN_NAME LIKE '%ldap%';
+----------------------------+---------------+
| PLUGIN_NAME                | PLUGIN_STATUS |
+----------------------------+---------------+
| authentication_ldap_sasl   | ACTIVE        |
| authentication_ldap_simple | ACTIVE        |
+----------------------------+---------------+

如果一个插件初始化失败,检查诊断消息服务器错误日志。

联想到MySQL账户LDAP插件,看使用LDAP认证

附加说明for SELinux

在系统运行16或EL,SELinux的启用,对SELinux策略改变才能使MySQL LDAP插件与LDAP服务沟通:

  1. 创建一个文件mysqlldap.te这些内容:

    module mysqlldap 1.0;require {        type ldap_port_t;        type mysqld_t;        class tcp_socket name_connect;}#============= mysqld_t ==============allow mysqld_t ldap_port_t:tcp_socket name_connect;
  2. 安全策略模块编译成二进制表示:

    checkmodule -M -m mysqlldap.te -o mysqlldap.mod
    
  3. 创建一个SELinux策略模块封装:

    semodule_package -m mysqlldap.mod  -o mysqlldap.pp
    
  4. 安装模块封装:

    semodule -i mysqlldap.pp
    
  5. 当SELinux策略变化了,重新启动MySQL服务器:

    service mysqld restart
    
卸载的LDAP认证

该方法用于卸载的LDAP身份验证插件,取决于你如何安装:

  • 如果你安装了插件在服务器启动时使用--plugin-load-add选项,重新启动服务器,没有这些选项。

  • 如果你安装的插件在运行时使用INSTALL PLUGIN,他们仍然安装在服务器重新启动。卸载它们,使用UNINSTALL PLUGIN

    卸载插件authentication_ldap_sasl;卸载插件authentication_ldap_simple;

此外,删除你my.cnf文件设置LDAP插件相关的系统变量的任何启动选项。

使用LDAP认证

本节介绍了如何使MySQL帐户连接到MySQL服务器使用LDAP认证。假定服务器是运行相应的服务器端插件启用,如安装LDAP认证,和相应的客户端插件可以在客户端主机。

本节不描述LDAP配置或管理。假定您熟悉这些话题。

有两个服务器的LDAP插件,每一个作品与特定的客户端插件:

  • 服务器端authentication_ldap_simple插件执行简单的LDAP认证。通过账户,使用这个插件连接,客户端程序使用客户端mysql_clear_password插件,将密码以明文形式的服务器。没有密码哈希或加密使用,所以MySQL客户端和服务器之间的安全连接是防止密码曝光。

  • 服务器端authentication_ldap_sasl基于LDAP认证SASL插件执行。通过账户,使用这个插件连接,客户端程序使用客户端_ LDAP客户_ _ SASL认证插件客户端和服务器端插件使用SASL SASL LDAP消息在LDAP协议传输安全凭据,避免发送MySQL客户端和服务器之间的明文密码。

对于MySQL用户LDAP认证的总体要求:

  • 必须为每个用户被认证LDAP目录条目。

  • 必须有一个MySQL用户帐户指定一个服务器端的LDAP身份验证插件和可选的名字相关联的LDAP用户专有名称(DN)。(联想到LDAP的用户DN与MySQL账户,包括BY子句中CREATE USER语句创建帐户。)如果帐户名称没有LDAP字符串,LDAP身份验证使用客户端指定的查找LDAP输入用户名。

  • 客户端程序连接使用适当的MySQL账户使用服务器端身份验证插件的连接方法。LDAP身份验证,连接需要MySQL用户名和LDAP密码。此外,对那些使用服务器端authentication_ldap_simple插件,调用客户端程序与——使明文插件选项可启用客户端mysql_clear_password插件

这里的指导假设下面的场景:

  • MySQL的用户betsy鲍里斯验证LDAP条目betsy_ldap鲍里斯_ LDAP,分别。(这是没有必要的,MySQL和LDAP用户名称不同,但使用不同的名字,这有助于澄清一个操作的上下文是MySQL或LDAP。)

  • 使用LDAP条目uid属性指定用户的名称。(这可能取决于不同的LDAP服务器。一些LDAP服务器使用cn用户名称而不是属性uid。)

  • 这些LDAP条目在目录的LDAP服务器托管是可用的,提供的可分辨名称值唯一地识别每个用户:

    uid=betsy_ldap,pwd=pwd1,ou=People,dc=example,dc=com
    uid=boris_ldap,pwd=pwd2,ou=People,dc=example,dc=com
    
  • CREATE USER语句创建MySQL账户名称在LDAP用户条款,说明MySQL账户认证对LDAP条目。

说明建立一个帐户使用LDAP认证取决于服务器的LDAP插件的使用。

简单的LDAP认证

配置一个简单的LDAP认证MySQL账户的CREATE USER声明必须指定_ _简单的LDAP认证插件,和可选的名字的LDAP用户专有名称(DN):

CREATE USER user
  IDENTIFIED WITH authentication_ldap_simple
  [BY 'LDAP user DN'];

假设一个MySQL的用户betsy这项在LDAP目录:

uid=betsy_ldap,pwd=pwd1,ou=People,dc=example,dc=com

然后语句创建MySQL帐户betsy看起来像这样:

CREATE USER 'betsy'@'localhost'  IDENTIFIED WITH authentication_ldap_simple  BY 'uid=betsy_ldap,ou=People,dc=example,dc=com';

指定的认证字符串BY条款不包括LDAP密码。必须提供的客户端用户在连接时。

通过提供的MySQL用户名和LDAP密码客户端连接到MySQL服务器,并通过启用客户端mysql_clear_password插件:

内核&#62;mysql --user=betsy --password --enable-cleartext-plugin输入密码:pwd1(betsy_ldap LDAP password)
笔记

客户端mysql_clear_password插件与服务器端_ _简单的LDAP认证插件通信发送密码以明文MySQL服务器可以通过对LDAP服务器。这是需要使用服务器端的LDAP库没有该,但可能在某些配置中的安全问题。这些措施使风险最小化:

  • 让无意的使用mysql_clear_password插件不太可能,MySQL客户端必须显式启用它;例如,与——使明文插件选项

  • 避免与密码曝光mysql_clear_password插件启用,MySQL客户端要连接到MySQL服务器使用安全连接。

更多信息,参见第6.5.1.4,“客户端明文认证”,和第6.4.1配置MySQL,使用加密的连接”

认证过程如下:

  1. 客户端插件发送betsypwd1作为客户端的用户名和密码到MySQL服务器的LDAP。

  2. 连接尝试匹配'betsy'@'localhost'账户服务器的LDAP插件发现该帐户已验证的字符串'uid=betsy_ldap,ou=People,dc=example,dc=com'名称LDAP的用户DN。插件将该字符串和LDAP密码到LDAP服务器。

  3. LDAP服务器的LDAP条目,forbetsy_ldap和密码匹配,所以LDAP认证成功。

  4. LDAP条目没有组属性,所以服务器端插件返回客户端的用户名(betsy)作为身份验证的用户。这是由客户提供的相同的用户名,所以没有代理时,客户端的会话使用“localhost”。特权帐户

有匹配的LDAP条目包含一组属性,该属性值都是经过身份验证的用户名称,如果值不同betsy,代理会发生。例如,使用组的属性,看用代理服务器的LDAP认证

CREATE USER声明中没有子句来指定betsy_ldapLDAP可分辨名称、身份验证尝试将使用客户端提供的用户名称(在这种情况下,贝特西)。In the absence of an LDCP entrybetsy,认证会失败

基于LDAP认证SASL

配置一个SASL LDAP认证MySQL账户的CREATE USER声明必须指定authentication_ldap_sasl插件,和可选的名字的LDAP用户专有名称(DN):

CREATE USER user
  IDENTIFIED WITH authentication_ldap_sasl
  [BY 'LDAP user DN'];

假设一个MySQL的用户boris这项在LDAP目录:

uid=boris_ldap,pwd=pwd2,ou=People,dc=example,dc=com

然后语句创建MySQL帐户boris看起来像这样:

CREATE USER 'boris'@'localhost'  IDENTIFIED WITH authentication_ldap_sasl  BY 'uid=boris_ldap,ou=People,dc=example,dc=com';

指定的认证字符串BY条款不包括LDAP密码。必须提供的客户端用户在连接时。

客户端连接到MySQL服务器提供的MySQL用户名和LDAP密码:

shell> mysql --user=boris --password
Enter password: pwd2 (boris_ldap LDAP password)

对于服务器端的authentication_ldap_sasl插件,客户端使用客户端_ LDAP客户_ _ SASL认证插件如果一个客户端程序没有找到客户端插件,指定--plugin-dir选项名称目录里的插件库文件安装。

认证过程boris类似于前面描述贝特西简单的LDAP认证,除了客户端和服务端插件使用SASL SASL LDAP消息在LDAP协议传输安全凭据,避免发送MySQL客户端和服务器之间的明文密码。

LDAP身份验证的用户DN后缀

LDAP身份验证插件允许字符串验证,以提供用户DN信息+人物在这个角色的缺失,认证字符串值被视为是无需修改。如果身份验证字符串开始 ,插件构建完整的用户DN值从账户的用户名为cn属性值,连同认证字符串(与 删除)。《冰认证为给定字符串的仓库mysql.user系统表,具有完整的用户DN建造在飞行前认证。

此帐户认证字符串没有+起初,它是作为完整的用户DN:

CREATE USER 'admin'  IDENTIFIED WITH authentication_ldap_simple  BY "cn=admin,ou=People,dc=example,dc=com";

此帐户认证字符串有+起初,它是作为只是完整的用户DN的一部分:

CREATE USER 'accounting'  IDENTIFIED WITH authentication_ldap_simple  BY "+ou=People,dc=example,dc=com";

在这种情况下,充分利用用户的DNaccounting作为cn属性一起验证字符串,屈服"cn=accounting,ou=People,dc=example,dc=com"

帐户名称,包括主机名,用户名是从客户端发送的用户名。(实际上,这是该帐户的名称,用户名称的一部分而忽略了主机名的一部分。)

用代理服务器的LDAP认证

这里描述的认证方案使用代理基于LDAP组属性值映射连接MySQL数据库进行身份验证的用户使用LDAP到其他MySQL账户定义不同的权限。用户不可以直接通过定义权限的帐户。相反,他们通过一个默认的代理用户认证LDAP,这样所有的外部登录映射到MySQL账户持有的特权。任何用户连接映射到其中一个MySQL账户的权限,确定数据库操作允许外部用户。

这里的指导假设下面的场景:

创建默认代理MySQL账户:

CREATE USER ''@'%'
  IDENTIFIED WITH authentication_ldap_sasl;

代理帐户的定义没有BY 'auth_string'条款名称LDAP的用户DN,这样当客户端连接,客户端的用户名作为用户名称搜索。匹配的LDAP条目预计将包括一组属性命名代理MySQL帐户定义权限的客户应该。

笔记

如果你的MySQL安装有匿名用户,他们可能会使用默认代理用户冲突。有关此问题的更多信息,并处理它的方式,看默认的代理用户和匿名用户冲突

创建代理帐户授予权限:

CREATE USER 'accounting'@'localhost' ACCOUNT LOCK;
CREATE USER 'front_office'@'localhost' ACCOUNT LOCK;

GRANT ALL PRIVILEGES
  ON accountingdb.*
  TO 'accounting'@'localhost';
GRANT ALL PRIVILEGES
  ON frontdb.*
  TO 'front_office'@'localhost';

格兰特PROXY对于代理的代理帐户的特权帐户:

格兰特会计&#39;@&#39;本地主机&#39; &#39;“”“%”代理;授权代理的front_office &#39;@&#39;本地主机&#39; &#39;“”“%”;

连接到MySQL服务器basha使用MySQL命令行客户端:

shell> mysql --user=basha --password
Enter password: pwd3 (basha LDAP password)

的服务器进行身份验证的连接使用''@'%'客户端的用户帐户,岜沙。匹配的LDAP条目组属性cn=accounting,所以会计奖学金。从用户的角度来看这一点basha,其结果是岜沙作为一个代理accounting岜沙assumes * * *的privilegesaccounting帐户。下面的查询返回的输出应:as shown

MySQL的&#62;SELECT USER(), CURRENT_USER(), @@proxy_user;----------------- ---------------------- -------------- | user() | current_user() | @ @ proxy_user | ----------------- ---------------------- -------------- |岜@本地|会计@本地|”@“%”| ----------------- ---------------------- --------------

这表明,basha使用授予的特权会计MySQL账户,代理通过默认代理用户帐户发生。

现在连接basil相反:

内核&#62;mysql --user=basil --password输入密码:pwd4(basil LDAP password)

认证过程basil类似于前面描述岜沙。在这种情况下,匹配的LDAP条目组属性cn=front_office,所以front_office奖学金。从用户的角度来看这一点basil,其结果是罗勒作为一个代理front_office罗勒assumes * * *的privilegesfront_office帐户。下面的查询返回的输出应:as shown

MySQL的&#62;SELECT USER(), CURRENT_USER(), @@proxy_user;----------------- ------------------------ -------------- | user() | current_user() | @ @ proxy_user | ----------------- ------------------------ -------------- |罗勒@本地| front_office @本地|”@“%”| ----------------- ------------------------ --------------

这表明,basil使用授予的特权front_officeMySQL账户,代理通过默认代理用户帐户发生。

6.5.1.8没有登录认证

这个mysql_no_login服务器端的身份验证插件可以防止所有的客户端连接到任何帐户使用它。对于这样一个插件的使用案例包括代理帐户,不允许直接登录,但只有通过代理帐户和帐户必须能够执行存储程序和视图特权不暴露那些普通用户访问权限。

下表显示了插件和库文件的名称。文件名后缀可能在您的系统上的不同。该文件必须位于目录命名的plugin_dir系统变量

表6.19插件和库没有登录认证的名字

插件或文件插件或文件名
服务器端插件mysql_no_login
客户端插件
库文件mysql_no_login.so

以下各节提供的安装和使用,具体没有登录认证信息:

关于MySQL认证的一般信息,看第6.3.10,“认证”。代理用户信息,看第6.3.11”代理用户”

安装没有登录认证

本节介绍如何安装没有登录认证插件。关于安装插件的一般信息,看第5.6.1,“安装和卸载插件”

通过将服务器可用的插件库文件必须位于MySQL插件目录(目录命名的plugin_dir系统变量)。如果有必要,设置值plugin_dir在服务器启动告诉服务器插件目录位置。

插件库文件的基名称是mysql_no_login。文件名后缀不同的平台(例如每,。所以UNIX和类UNIX系统,.dllfor Windows)。

在服务器启动时加载的插件,使用--plugin-load-add选项名称包含它的库文件。这个插件的加载方法,选择必须考虑每次服务器启动。例如,把这些线在服务器my.cnf文件(调整.so你的平台是必要的后缀):

[mysqld]plugin-load-add=mysql_no_login.so

修改后的my.cnf,重新启动服务器以使新设置生效。

另外,在运行时登记的插件,使用此语句(调整.so后缀是必要的):

安装插件mysql_no_login现在的mysql_no_login。”;

INSTALL PLUGIN加载插件立即,并记录它的mysql.plugins系统表,导致服务器负载为每个后续的正常启动。

to verify the插件安装,检查INFORMATION_SCHEMA.PLUGINS表或使用SHOW PLUGINS声明(见第2,“获取服务器插件的信息”)。例如:

mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
       FROM INFORMATION_SCHEMA.PLUGINS
       WHERE PLUGIN_NAME LIKE '%login%';
+----------------+---------------+
| PLUGIN_NAME    | PLUGIN_STATUS |
+----------------+---------------+
| mysql_no_login | ACTIVE        |
+----------------+---------------+

如果插件初始化失败,检查诊断消息服务器错误日志。

联想到MySQL账户没有登录插件,看不使用登录认证

卸载没有登录认证

该方法用于卸载没有登录认证插件,取决于你如何安装它:

  • 如果你的插件安装在服务器启动时使用--plugin-load-add选项,重新启动服务器的选项。

  • 如果你安装的插件在运行时使用INSTALL PLUGIN它是安装在服务器重新启动。卸载它,用UNINSTALL PLUGIN

    mysql_no_login卸载插件;
不使用登录认证

本节介绍了如何使用没有登录认证插件来防止连接MySQL客户端程序服务器。假定服务器正在运行的服务器端插件启用,如安装没有登录认证

指没有登录认证插件在IDENTIFIED WITH条款一CREATE USER声明中,使用的名称mysql_no_login

一个帐户验证使用mysql_no_login可作为定义者用于存储程序和视图对象。如果一个对象的定义还包括SQL SECURITY DEFINER,它执行与该帐户的权限。数据库管理员可以使用此行为提供机密或敏感,只有通过控制接口暴露数据。

下面的例子提供了一个简单的这些原则的说明。它定义了一个不允许客户端连接的帐户,并与它的视图仅暴露某些列的伙伴mysql.user

CREATE DATABASE nologindb;CREATE USER 'nologin'@'localhost'  IDENTIFIED WITH mysql_no_login;GRANT ALL ON nologindb.*  TO 'nologin'@'localhost';GRANT SELECT ON mysql.user  TO 'nologin'@'localhost';CREATE DEFINER = 'nologin'@'localhost'  SQL SECURITY DEFINER  VIEW nologindb.myview  AS SELECT User, Host FROM mysql.user;

提供受保护的访问从一个普通用户,这样做:

GRANT SELECT ON nologindb.myview
  TO 'ordinaryuser'@'localhost';

现在,普通用户可以使用视图来访问有限的信息了:

SELECT * FROM nologindb.myview;

由用户试图访问的其他的错误观点导致露柱,所有试图选择从用户授予访问它的不一样。

笔记

因为nologin帐户不能直接使用,操作需要设置对象的使用必须由root或类似的帐户,需要创建的对象的权限设置DEFINER价值观

一个帐户验证使用mysql_no_login可作为一个代理帐户的用户代理的基础:

——创建代理accountcreate用户proxy_base &#39;@&#39;本地主机&#39;确定mysql_no_login;——授予权限的代理accountgrant…“proxy_base &#39;@&#39;本地主机&#39;;--允许real_user是代理的代理的代理的accountgrant proxy_base &#39;@&#39;本地主机&#39; &#39; real_user &#39;@&#39;本地主机&#39;;

这使客户能够通过代理帐户访问MySQL(real_user)而不是通过直接连接的代理用户绕过代理机构(proxy_base

6.5.1.9插座对等证书认证

服务器端auth_socket身份验证插件认证客户端连接从本地主机通过Unix套接字文件。插件的使用so_peercred套接字选项来获得关于用户运行客户端程序的信息。因此,该插件只能用于对系统的支持SO_PEERCRED选项,如Linux

这个插件的源代码可以检查作为一个比较简单的例子演示了如何编写一个可加载验证插件。

下表显示了插件和库文件的名称。该文件必须位于目录命名的plugin_dir系统变量

表6.20插件和图书馆插座同伴凭据验证名称

插件或文件插件或文件名
服务器端插件auth_socket
客户端插件没有,看到的讨论
库文件auth_socket.so

以下各节提供安装和使用特定的认证信息插座:

关于MySQL认证的一般信息,看第6.3.10,“认证”

安装插座可插拔认证

本节介绍如何安装插座认证插件。关于安装插件的一般信息,看第5.6.1,“安装和卸载插件”

通过将服务器可用的插件库文件必须位于MySQL插件目录(目录命名的plugin_dir系统变量)。如果有必要,设置值plugin_dir在服务器启动告诉服务器插件目录位置。

在服务器启动时加载的插件,使用--plugin-load-add选项名称包含它的库文件。这个插件的加载方法,选择必须考虑每次服务器启动。例如,把这些线在服务器my.cnf文件:

[mysqld]
plugin-load-add=auth_socket.so

修改后的my.cnf,重新启动服务器以使新设置生效。

另外,在运行时登记的插件,使用此语句:

INSTALL PLUGIN auth_socket SONAME 'auth_socket.so';

INSTALL PLUGIN加载插件立即,并记录它的mysql.plugins系统表,导致服务器负载为每个后续的正常启动。

to verify the插件安装,检查INFORMATION_SCHEMA.PLUGINS表或使用SHOW PLUGINS声明(见第2,“获取服务器插件的信息”)。例如:

mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
       FROM INFORMATION_SCHEMA.PLUGINS
       WHERE PLUGIN_NAME LIKE '%socket%';
+-------------+---------------+
| PLUGIN_NAME | PLUGIN_STATUS |
+-------------+---------------+
| auth_socket | ACTIVE        |
+-------------+---------------+

如果插件初始化失败,检查诊断消息服务器错误日志。

联想到MySQL账户与插座插件,看使用套接字可插拔认证

卸载插座可插拔认证

该方法用于卸载插座认证插件,取决于你如何安装它:

  • 如果你的插件安装在服务器启动时使用--plugin-load-add选项,重新启动服务器的选项。

  • 如果你安装的插件在运行时使用INSTALL PLUGIN它是安装在服务器重新启动。卸载它,用UNINSTALL PLUGIN

    auth_socket卸载插件;
使用套接字可插拔认证

插座插件检查插座的用户名(操作系统的用户名称)配以客户端程序,服务器指定MySQL用户名。如果名称不匹配,插件检查插座的用户名匹配指定的名称authentication_string列的mysql.user表格行。如果找到匹配,该插件允许连接。这个authentication_string值可以指定使用为确定…条款CREATE USERALTER USER

假设一个MySQL帐户是一个系统的用户名为创建valerie谁会是经auth _插座通过socket文件从本地主机连接插件:

CREATE USER 'valerie'@'localhost' IDENTIFIED WITH auth_socket;

如果用户在本地主机上一个登录名stefanie调用MySQL与选择--user=valerie通过socket文件连接,服务器使用auth _插座authenticate to the客户端。插件determines that the the--user选项值的(瓦莱丽)不同于客户端的用户的名称(stephanie)和拒绝连接。如果一个用户命名瓦莱丽尝试同样的事情,这个插件发现用户的名字和MySQL用户名都valerie允许连接。然而,即使插件拒绝连接瓦莱丽如果连接使用不同的协议,如TCP / IP。

允许的valerie斯蒂芬妮系统用户通过socket文件连接使用的帐户访问MySQL,这可以通过两种方式:

  • 名用户帐户的创建时间,一前一后CREATE USERand the other,茶叶认证字符串:

    创建用户瓦莱丽&#39;@&#39;本地主机&#39;确定&#39;斯蒂芬妮&#39; auth_socket;
  • 如果你已经使用CREATE USER为单个用户创建帐户,使用ALTER USER加二用户:

    创建用户瓦莱丽&#39;@&#39;本地主机&#39;确定auth_socket;改变用户瓦莱丽&#39;@&#39;本地主机&#39;确定&#39;斯蒂芬妮&#39; auth_socket;

访问账户,两valerie斯蒂芬妮指定--user=valerie在连接时间

6.5.1.10测试认证

MySQL包括测试插件,支票帐户凭据和记录成功或失败的服务器错误日志。这是一个加载的插件(不是),使用前必须安装。

测试插件的源代码是从服务器的源分离,与内置的插件,所以它可以检查作为一个比较简单的例子演示了如何编写一个可加载验证插件。

笔记

这个插件是用于测试和开发的目的,并不是在生产环境中使用或接触到公共网络服务器。

下表显示了插件和库文件的名称。文件名后缀可能在您的系统上的不同。该文件必须位于目录命名的plugin_dir系统变量

表6.21插件和库的测试认证的名字

插件或文件插件或文件名
服务器端插件test_plugin_server
客户端插件auth_test_plugin
库文件auth_test_plugin.so

以下各节提供安装和使用特定的测试认证信息:

关于MySQL认证的一般信息,看第6.3.10,“认证”

安装测试认证

本节介绍如何安装测试认证插件。关于安装插件的一般信息,看第5.6.1,“安装和卸载插件”

通过将服务器可用的插件库文件必须位于MySQL插件目录(目录命名的plugin_dir系统变量)。如果有必要,设置值plugin_dir在服务器启动告诉服务器插件目录位置。

在服务器启动时加载的插件,使用--plugin-load-add选项名称包含它的库文件。这个插件的加载方法,选择必须考虑每次服务器启动。例如,把这些线在服务器my.cnf文件(调整.so你的平台是必要的后缀):

[mysqld]plugin-load-add=auth_test_plugin.so

修改后的my.cnf,重新启动服务器以使新设置生效。

另外,在运行时登记的插件,使用此语句(调整.so后缀是必要的):

测试插件安装插件_ auth服务器是_ soname _ _ plugin.so测试;

INSTALL PLUGIN加载插件立即,并记录它的mysql.plugins系统表,导致服务器负载为每个后续的正常启动。

to verify the插件安装,检查INFORMATION_SCHEMA.PLUGINS表或使用SHOW PLUGINS声明(见第2,“获取服务器插件的信息”)。例如:

mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
       FROM INFORMATION_SCHEMA.PLUGINS
       WHERE PLUGIN_NAME LIKE '%test_plugin%';
+--------------------+---------------+
| PLUGIN_NAME        | PLUGIN_STATUS |
+--------------------+---------------+
| test_plugin_server | ACTIVE        |
+--------------------+---------------+

如果插件初始化失败,检查诊断消息服务器错误日志。

联想到MySQL账户测试插件,看使用测试认证

卸载测试认证

该方法用于卸载测试认证插件,取决于你如何安装它:

  • 如果你的插件安装在服务器启动时使用--plugin-load-add选项,重新启动服务器的选项。

  • 如果你安装的插件在运行时使用INSTALL PLUGIN它是安装在服务器重新启动。卸载它,用UNINSTALL PLUGIN

    test_plugin_server卸载插件;
使用测试认证

使用测试认证的插件,创建一个账户名称,插件在IDENTIFIED WITH条款:

创建用户的testuser”@ &#39;localhost&#39;identified与test_plugin_serverby testpassword &#39; &#39;;

然后提供--user--password选项,当您连接到服务器。例如:

内核&#62;mysql --user=testuser --password输入密码:testpassword

插件读取密码从客户端接收并与中存储的值进行比较authentication_string该帐户的行中的列mysql.user表如果这两个值相匹配,该插件返回authentication_string值作为新的有效的用户ID。

你可以在一个消息指示成功的认证服务器的错误日志(注意,密码是报告的用户):

[Note] Plugin test_plugin_server reported:
'successfully authenticated user testpassword'

6.5.1.11认证系统变量

这些变量是不可用,除非安装相应的服务器端插件:

  • authentication_ldap_sasl系统变量的名称和形式authentication_ldap_sasl_xxx

  • authentication_ldap_simple系统变量的名称和形式_ _简单_ LDAP认证xxx

表6.22认证插件系统variablesummary


  • authentication_ldap_sasl_auth_method_name

    财产价值
    命令行格式--authentication-ldap-sasl-auth-method-name=value
    介绍8.0.11
    系统变量authentication_ldap_sasl_auth_method_name
    范围全球
    动态
    看到的是_提示应用
    类型字符串
    默认值SCRAM-SHA-1

    对于该LDAP认证,认证方法的名称。身份验证插件和LDAP服务器之间的通信则根据此身份验证方法。这些认证方法的值是允许的:

    • SCRAM-SHA-1:使用SASL认证挑战-响应机制,以确保密码的安全性。

      客户端authentication_ldap_sasl_client插件与该服务器,使用密码来创建一个挑战并取得高要求的缓冲区,然后通过这个缓冲区到服务器端authentication_ldap_sasl插件客户端和服务器端插件使用SASL SASL LDAP消息在LDAP协议传输安全凭据,避免发送MySQL客户端和服务器之间的明文密码。

  • authentication_ldap_sasl_bind_base_dn

    财产价值
    命令行格式--authentication-ldap-sasl-bind-base-dn=value
    介绍8.0.11
    系统变量authentication_ldap_sasl_bind_base_dn
    范围全球
    动态
    看到的是_提示应用
    类型字符串
    默认值NULL

    对于该LDAP认证,基地的专有名称(DN)。该变量可以用来固定在一定的位置限制搜索的范围(基地)在搜索树

    假设成员一组用户的条目都有这种形式:

    uid=user_name,pwd=user_password,ou=People,dc=example,dc=com
    

    和成员,另一组用户的条目都有这种形式:

    uid=user_name,pwd=user_password,ou=Admin,dc=example,dc=com
    

    然后搜索这样的不同基本DN值:

    • 如果基础DNou=People,dc=example,dc=com在第一集:只搜索找到用户条目。

    • 如果基础DNou=Admin,dc=example,dc=com:只搜索在第二组中找到用户条目。

    • 如果基础DNou=dc=example,dc=com:搜索在第一或第二集找到用户条目。

    在一般情况下,更具体的基本DN值导致更快的搜索,因为他们限制搜索范围更。

  • authentication_ldap_sasl_bind_root_dn

    财产价值
    命令行格式--authentication-ldap-sasl-bind-root-dn=value
    介绍8.0.11
    系统变量authentication_ldap_sasl_bind_root_dn
    范围全球
    动态
    看到的是_提示应用
    类型字符串
    默认值NULL

    对于该LDAP认证,根可分辨名称(DN)。这个变量是用于连接authentication_ldap_sasl_bind_root_pwd为证书认证的LDAP服务器进行搜索的目的。身份验证使用一个或两个LDAP绑定操作,具体取决于MySQL账户名称LDAP的用户DN:

    • 如果帐户不名用户DN:authentication_ldap_sasl执行一个初始LDAP结合使用authentication_ldap_sasl_bind_root_dnauthentication_ldap_sasl_bind_root_pwd。(这些都是空的默认情况下,如果他们没有设置LDAP服务器必须允许匿名连接。)由此结合LDAP处理是用于搜索的用户DN,基于客户端的用户名。authentication_ldap_sasl执行第二结合使用用户DN和客户提供的密码。

    • 如果帐户不名用户DN:第一绑定操作,在这种情况下是不必要的。authentication_ldap_sasl执行单结合使用用户DN和客户提供的密码。这是比如果MySQL帐户不指定一个LDAP的用户DN更快。

  • authentication_ldap_sasl_bind_root_pwd

    财产价值
    命令行格式--authentication-ldap-sasl-bind-root-pwd=value
    介绍8.0.11
    系统变量authentication_ldap_sasl_bind_root_pwd
    范围全球
    动态
    看到的是_提示应用
    类型字符串
    默认值NULL

    对于该LDAP认证,为根密码识别名。这个变量是用于连接authentication_ldap_sasl_bind_root_dn. See the description of that变量.

  • authentication_ldap_sasl_ca_path

    财产价值
    命令行格式--authentication-ldap-sasl-ca-path=value
    介绍8.0.11
    系统变量authentication_ldap_sasl_ca_path
    范围全球
    动态
    看到的是_提示应用
    类型字符串
    默认值NULL

    对于该LDAP认证,证书的权威文件的绝对路径。如果想要认证插件执行的LDAP服务器证书验证指定该文件。

    笔记

    除了设置authentication_ldap_sasl_ca_path变量的文件名,你必须添加相应的证书颁发机构的证书的文件,使authentication_ldap_sasl_tls系统变量

  • authentication_ldap_sasl_group_search_attr

    财产价值
    命令行格式--authentication-ldap-sasl-group-search-attr=value
    介绍8.0.11
    系统变量authentication_ldap_sasl_group_search_attr
    范围全球
    动态
    看到的是_提示应用
    类型字符串
    默认值cn

    对于该LDAP认证,该属性指定的组名,LDAP目录条目名称。如果authentication_ldap_sasl_group_search_attr有它的默认值cn搜索返回的,cn值作为组名。例如,如果一个LDAP条目UID价值user1有一个cn属性mygroup,搜索user1退货mygroup作为集团的名字

    这个变量应该是空字符串,如果你不想组或代理认证。

    如果组搜索属性isMemberOf,LDAP认证直接检索用户属性ismemberof价值与分配组信息。如果组搜索属性不isMemberOf,LDAP搜索所有组成员的用户。(后者是默认行为。)这种行为是基于LDAP组信息可以存储的方式有两种:1)一组条目有一个名为memberuidmember一个值,是一个用户名称;2)用户入口可以有一个名为ismemberof这是组名的值

  • authentication_ldap_sasl_group_search_filter

    财产价值
    命令行格式--authentication-ldap-sasl-group-search-filter=value
    介绍8.0.11
    系统变量authentication_ldap_sasl_group_search_filter
    范围全球
    动态
    看到的是_提示应用
    类型字符串
    默认值(|(&(objectClass=posixGroup)(memberUid=%s))(&(objectClass=group)(member=%s)))

    对于该LDAP,自定义组搜索过滤器。

    搜索筛选器值可以包含{UA}UD } {符号来表示用户的名字和完整的用户DN。例如,{UA}是一个用户名,如更换“管理员”,而{UD}是一个使用全DN如更换"uid=admin,ou=People,dc=example,dc=com"。下面的值是默认的,它支持OpenLDAP和活动目录:

    (|(&(objectClass=posixGroup)(memberUid={UA}))
      (&(objectClass=group)(member={UD})))
    

    在某些情况下,用户场景,memberOf是一个简单的用户属性,没有组信息。为增加灵活性,可选GA } {前缀可以使用群体搜索属性。任何一组属性与{ }前缀GA作为一组名称的用户属性。例如,一个价值{GA}MemberOf,如果群体价值是DN,在DN组第一属性值作为组名返回。

  • authentication_ldap_sasl_init_pool_size

    财产价值
    命令行格式--authentication-ldap-sasl-init-pool-size=value
    介绍8.0.11
    系统变量authentication_ldap_sasl_init_pool_size
    范围全球
    动态
    看到的是_提示应用
    类型整数
    默认值10
    最小值0
    最大值32767

    对于该LDAP认证,对LDAP服务器的连接池的初始大小。选择此变量基于并行认证请求到LDAP服务器的平均数的值。

    该插件使用authentication_ldap_sasl_init_pool_sizeauthentication_ldap_sasl_max_pool_size在一起的连接池管理:

    对插件系统变量设置的变化可能已经在池中的连接没有影响。例如,修改服务器的主机,端口,或TLS设置不影响现有的连接。然而,如果原始变量的值是无效的和连接池不能初始化,插件试图重新初始化池下LDAP请求。在这种情况下,新的系统变量值用于初始化的尝试。

    如果authentication_ldap_sasl_max_pool_size=0禁用池,每个LDAP连接的插件打开使用值的系统变量有当时。

  • authentication_ldap_sasl_log_status

    财产价值
    命令行格式--authentication-ldap-sasl-log-status=value
    介绍8.0.11
    系统变量authentication_ldap_sasl_log_status
    范围全球
    动态
    看到的是_提示应用
    类型整数
    默认值1
    最小值1
    最大值5

    对于该LDAP认证、日志记录级别。下表显示了允许值及其含义。

    表6.23为authentication_ldap_sasl_log_status日志级别

    期权价值消息记录类型
    1没有消息
    2错误消息
    3错误和警告消息
    4错误、警告和信息性消息
    5所有的消息

    在客户端,信息可以被记录到标准输出设置AUTHENTICATION_LDAP_CLIENT_LOG环境变量。允许和默认值是相同的authentication_ldap_sasl_log_status

    这个AUTHENTICATION_LDAP_CLIENT_LOG环境变量只适用于该LDAP认证。它没有效果,因为在这种情况下,简单的LDAP认证客户端插件mysql_clear_password哪知道,LDAP操作什么。

  • authentication_ldap_sasl_max_pool_size

    财产价值
    命令行格式--authentication-ldap-sasl-max-pool-size=value
    介绍8.0.11
    系统变量authentication_ldap_sasl_max_pool_size
    范围全球
    动态
    看到的是_提示应用
    类型整数
    默认值1000
    最小值0
    最大值32767

    对于该LDAP认证,对LDAP服务器的连接池的最大大小。禁用连接池,这个变量设置为0。

    这个变量是用于连接authentication_ldap_sasl_init_pool_size. See the description of that变量.

  • authentication_ldap_sasl_server_host

    财产价值
    命令行格式--authentication-ldap-sasl-server-host=value
    介绍8.0.11
    系统变量authentication_ldap_sasl_server_host
    范围全球
    动态
    看到的是_提示应用
    类型字符串

    对于该LDAP认证,LDAP服务器主机。允许的值,这个变量取决于认证方法:

  • authentication_ldap_sasl_server_port

    财产价值
    命令行格式--authentication-ldap-sasl-server-port=value
    介绍8.0.11
    系统变量authentication_ldap_sasl_server_port
    范围全球
    动态
    看到的是_提示应用
    类型整数
    默认值389
    最小值1
    最大值32376

    对于该LDAP认证,LDAP服务器的TCP/IP端口号。

  • authentication_ldap_sasl_tls

    财产价值
    命令行格式--authentication-ldap-sasl-tls=value
    介绍8.0.11
    系统变量authentication_ldap_sasl_tls
    范围全球
    动态
    看到的是_提示应用
    类型布尔
    默认值OFF

    对于该LDAP认证,是否通过插件连接到LDAP服务器是安全的。如果启用,此插件使用TLS安全地连接到LDAP服务器。如果你启用这个变量,你也可以设置authentication_ldap_sasl_ca_path变量

    MySQL LDAP插件支持STARTTLS的方法,使TLS顶上的一个普通的LDAP连接。这个ldaps方法是过时的和MySQL不支持。

  • authentication_ldap_sasl_user_search_attr

    财产价值
    命令行格式--authentication-ldap-sasl-user-search-attr=value
    介绍8.0.11
    系统变量authentication_ldap_sasl_user_search_attr
    范围全球
    动态
    看到的是_提示应用
    类型字符串
    默认值uid

    对于该LDAP认证,该属性指定用户的名称在LDAP目录条目名称。如果一个用户识别名是没有规定的,使用此属性的名称认证插件搜索。例如,如果authentication_ldap_sasl_user_search_attrUIDsearch for the user name,user1发现一个条目UID价值user1

  • authentication_ldap_simple_auth_method_name

    财产价值
    命令行格式--authentication-ldap-simple-auth-method-name=value
    介绍8.0.11
    系统变量authentication_ldap_simple_auth_method_name
    范围全球
    动态
    看到的是_提示应用
    类型字符串
    默认值SIMPLE

    对于简单的LDAP认证,认证方法的名称。身份验证插件和LDAP服务器之间的通信则根据此身份验证方法。这些认证方法的值是允许的:

    • SIMPLE:此身份验证方法使用一个或两个LDAP绑定操作,具体取决于MySQL账户名称LDAP用户识别名。看到的描述authentication_ldap_simple_bind_root_dn

    • AD-FOREST_ _简单的LDAP认证搜索所有的域的Active Directory林,执行LDAP绑定到每个Active Directory域直到用户在某些领域找到。

    笔记

    对于简单的LDAP认证,建议设置TLS参数要求与LDAP服务器的通信发生在安全连接。

  • authentication_ldap_simple_bind_base_dn

    财产价值
    命令行格式--authentication-ldap-simple-bind-base-dn=value
    介绍8.0.11
    系统变量authentication_ldap_simple_bind_base_dn
    范围全球
    动态
    看到的是_提示应用
    类型字符串
    默认值NULL

    对于简单的LDAP认证,基地的专有名称(DN)。该变量可以用来固定在一定的位置限制搜索的范围(基地)在搜索树

    假设成员一组用户的条目都有这种形式:

    uid=user_name,pwd=user_password,ou=People,dc=example,dc=com
    

    和成员,另一组用户的条目都有这种形式:

    uid=user_name,pwd=user_password,ou=Admin,dc=example,dc=com
    

    然后搜索这样的不同基本DN值:

    • 如果基础DNou=People,dc=example,dc=com在第一集:只搜索找到用户条目。

    • 如果基础DNou=Admin,dc=example,dc=com:只搜索在第二组中找到用户条目。

    • 如果基础DNou=dc=example,dc=com:搜索在第一或第二集找到用户条目。

    在一般情况下,更具体的基本DN值导致更快的搜索,因为他们限制搜索范围更。

  • authentication_ldap_simple_bind_root_dn

    财产价值
    命令行格式--authentication-ldap-simple-bind-root-dn=value
    介绍8.0.11
    系统变量authentication_ldap_simple_bind_root_dn
    范围全球
    动态
    看到的是_提示应用
    类型字符串
    默认值NULL

    对于简单的LDAP认证,根可分辨名称(DN)。这个变量是用于连接authentication_ldap_simple_bind_root_pwd为证书认证的LDAP服务器进行搜索的目的。身份验证使用一个或两个LDAP绑定操作,具体取决于MySQL账户名称LDAP的用户DN:

    • 如果帐户不名用户DN:authentication_ldap_simple执行一个初始LDAP结合使用authentication_ldap_simple_bind_root_dnauthentication_ldap_simple_bind_root_pwd。(这些都是空的默认情况下,如果他们没有设置LDAP服务器必须允许匿名连接。)由此结合LDAP处理是用于搜索的用户DN,基于客户端的用户名。_ _简单的LDAP认证执行第二结合使用用户DN和客户提供的密码。

    • 如果帐户不名用户DN:第一绑定操作,在这种情况下是不必要的。authentication_ldap_simple执行单结合使用用户DN和客户提供的密码。这是比如果MySQL帐户不指定一个LDAP的用户DN更快。

  • authentication_ldap_simple_bind_root_pwd

    财产价值
    命令行格式--authentication-ldap-simple-bind-root-pwd=value
    介绍8.0.11
    系统变量authentication_ldap_simple_bind_root_pwd
    范围全球
    动态
    看到的是_提示应用
    类型字符串
    默认值NULL

    对于简单的LDAP认证,为根密码识别名。这个变量是用于连接authentication_ldap_simple_bind_root_dn. See the description of that变量.

  • authentication_ldap_simple_ca_path

    财产价值
    命令行格式--authentication-ldap-simple-ca-path=value
    介绍8.0.11
    系统变量authentication_ldap_simple_ca_path
    范围全球
    动态
    看到的是_提示应用
    类型字符串
    默认值NULL

    对于简单的LDAP认证,证书的权威文件的绝对路径。如果想要认证插件执行的LDAP服务器证书验证指定该文件。

    笔记

    除了设置authentication_ldap_simple_ca_path变量的文件名,你必须添加相应的证书颁发机构的证书的文件,使authentication_ldap_simple_tls系统变量

  • authentication_ldap_simple_group_search_attr

    财产价值
    命令行格式--authentication-ldap-simple-group-search-attr=value
    介绍8.0.11
    系统变量authentication_ldap_simple_group_search_attr
    范围全球
    动态
    看到的是_提示应用
    类型字符串
    默认值cn

    对于简单的LDAP认证,该属性指定的组名,LDAP目录条目名称。如果authentication_ldap_simple_group_search_attr有它的默认值cn搜索返回的,cn值作为组名。例如,如果一个LDAP条目UID价值user1有一个cn属性mygroup,搜索user1退货mygroup作为集团的名字

    如果组搜索属性isMemberOf,LDAP认证直接检索用户属性ismemberof价值与分配组信息。如果组搜索属性不isMemberOf,LDAP搜索所有组成员的用户。(后者是默认行为。)这种行为是基于LDAP组信息可以存储的方式有两种:1)一组条目有一个名为memberuidmember一个值,是一个用户名称;2)用户入口可以有一个名为ismemberof这是组名的值

  • authentication_ldap_simple_group_search_filter

    财产价值
    命令行格式--authentication-ldap-simple-group-search-filter=value
    介绍8.0.11
    系统变量authentication_ldap_simple_group_search_filter
    范围全球
    动态
    看到的是_提示应用
    类型字符串
    默认值(|(&(objectClass=posixGroup)(memberUid=%s))(&(objectClass=group)(member=%s)))

    对于简单的LDAP认证、自定义组搜索过滤器。

    搜索筛选器值可以包含{UA}UD } {符号来表示用户的名字和完整的用户DN。例如,{UA}是一个用户名,如更换“管理员”,而{UD}是一个使用全DN如更换"uid=admin,ou=People,dc=example,dc=com"。下面的值是默认的,它支持OpenLDAP和活动目录:

    (|(&(objectClass=posixGroup)(memberUid={UA}))
      (&(objectClass=group)(member={UD})))
    

    在某些情况下,用户场景,memberOf是一个简单的用户属性,没有组信息。为增加灵活性,可选GA } {前缀可以使用群体搜索属性。任何一组属性与{ }前缀GA作为一组名称的用户属性。例如,一个价值{GA}MemberOf,如果群体价值是DN,在DN组第一属性值作为组名返回。

  • authentication_ldap_simple_init_pool_size

    财产价值
    命令行格式--authentication-ldap-simple-init-pool-size=value
    介绍8.0.11
    系统变量authentication_ldap_simple_init_pool_size
    范围全球
    动态
    看到的是_提示应用
    类型整数
    默认值10
    最小值0
    最大值32767

    对于简单的LDAP认证,对LDAP服务器的连接池的初始大小。选择此变量基于并行认证请求到LDAP服务器的平均数的值。

    该插件使用authentication_ldap_simple_init_pool_sizeauthentication_ldap_simple_max_pool_size在一起的连接池管理:

    对插件系统变量设置的变化可能已经在池中的连接没有影响。例如,修改服务器的主机,端口,或TLS设置不影响现有的连接。然而,如果原始变量的值是无效的和连接池不能初始化,插件试图重新初始化池下LDAP请求。在这种情况下,新的系统变量值用于初始化的尝试。

    如果authentication_ldap_simple_max_pool_size=0禁用池,每个LDAP连接的插件打开使用值的系统变量有当时。

  • authentication_ldap_simple_log_status

    财产价值
    命令行格式--authentication-ldap-simple-log-status=value
    介绍8.0.11
    系统变量authentication_ldap_simple_log_status
    范围全球
    动态
    看到的是_提示应用
    类型整数
    默认值1
    最小值1
    最大值5

    对于简单的LDAP认证、日志记录级别。下表显示了允许值及其含义。

    表6.24为authentication_ldap_simple_log_status日志级别

    期权价值消息记录类型
    1没有消息
    2错误消息
    3错误和警告消息
    4错误、警告和信息性消息
    5所有的消息

  • authentication_ldap_simple_max_pool_size

    财产价值
    命令行格式--authentication-ldap-simple-max-pool-size=value
    介绍8.0.11
    系统变量authentication_ldap_simple_max_pool_size
    范围全球
    动态
    看到的是_提示应用
    类型整数
    默认值1000
    最小值0
    最大值32767

    对于简单的LDAP认证,对LDAP服务器的连接池的最大大小。禁用连接池,这个变量设置为0.。

    这个变量是用于连接authentication_ldap_simple_init_pool_size. See the description of that变量.

  • authentication_ldap_simple_server_host

    财产价值
    命令行格式--authentication-ldap-simple-server-host=value
    介绍8.0.11
    系统变量authentication_ldap_simple_server_host
    范围全球
    动态
    看到的是_提示应用
    类型字符串

    对于简单的LDAP认证,LDAP服务器主机。允许的值,这个变量取决于认证方法:

    • authentication_ldap_simple_auth_method_name=SIMPLE:LDAP服务器主机可以是一个主机名或IP地址。

    • authentication_ldap_simple_auth_method_name=AD-FOREST。LDAP服务器主机可以是一个Active Directory域名。例如,一个LDAP服务器的URLLDAP://example.mem.local:389,服务器名称可以mem.local

      Active Directory林设置可以有多个域(LDAP服务器IP地址),可以发现使用DNS。在UNIX和类UNIX系统中,可能需要一些额外的设置与SRV记录,指定LDAP服务器的Active Directory域配置DNS服务器。假设你配置这些属性:

      • 名称服务器,提供关于活动目录域信息的IP地址10.172.166.100

      • LDAP服务器的名字ldap1.mem.local通过ldap3.mem.local和IP地址10.172.166.101通过10.172.166.103

      你想要的LDAP服务器被发现使用SRV搜索。例如,在命令行,命令这样的LDAP服务器列表:

      host -t SRV _ldap._tcp.mem.local
      

      执行DNS配置如下:

      1. 添加一行/etc/resolv.conf指定的名称服务器提供对Active Directory域信息:

        10.172.166.100域名
      2. 配置与LDAP服务器的名称服务器的SRV记录适当的区域文件:

        _ldap._tcp.mem.local. 86400 IN SRV 0 100 389 ldap1.mem.local.
        _ldap._tcp.mem.local. 86400 IN SRV 0 100 389 ldap2.mem.local.
        _ldap._tcp.mem.local. 86400 IN SRV 0 100 389 ldap3.mem.local.
        
      3. 可能还需要指定LDAP服务器的IP地址/etc/hosts如果服务器主机无法解决。例如,添加线这样的文件:

        10.172.166.101 ldap1.mem.local10.172.166.102 ldap2.mem.local10.172.166.103 ldap3.mem.local

      与DNS配置如刚才所描述的,服务器端的LDAP插件可以发现LDAP服务器将尝试验证在所有领域的认证成功或没有更多的服务器,直到。

      Windows不需要这样的设置,如刚才所描述的。在给定的LDAP服务器主机authentication_ldap_simple_server_host价值,Windows LDAP库搜索所有的域和尝试验证。

  • authentication_ldap_simple_server_port

    财产价值
    命令行格式--authentication-ldap-simple-server-port=value
    介绍8.0.11
    系统变量authentication_ldap_simple_server_port
    范围全球
    动态
    看到的是_提示应用
    类型整数
    默认值389
    最小值1
    最大值32376

    对于简单的LDAP认证,LDAP服务器的TCP/IP端口号。

  • authentication_ldap_simple_tls

    财产价值
    命令行格式--authentication-ldap-simple-tls=value
    介绍8.0.11
    系统变量authentication_ldap_simple_tls
    范围全球
    动态
    看到的是_提示应用
    类型布尔
    默认值OFF

    对于简单的LDAP认证,是否通过插件连接到LDAP服务器是安全的。如果启用,此插件使用TLS安全地连接到LDAP服务器。如果你启用这个变量,你也可以设置authentication_ldap_simple_ca_path变量

    MySQL LDAP插件支持STARTTLS的方法,使TLS顶上的一个普通的LDAP连接。这个ldaps方法是过时的和MySQL不支持。

  • authentication_ldap_simple_user_search_attr

    财产价值
    命令行格式--authentication-ldap-simple-user-search-attr=value
    介绍8.0.11
    系统变量authentication_ldap_simple_user_search_attr
    范围全球
    动态
    看到的是_提示应用
    类型字符串
    默认值uid

    对于简单的LDAP认证,该属性指定用户的名称在LDAP目录条目名称。如果一个用户识别名是没有规定的,使用此属性的名称认证插件搜索。例如,如果authentication_ldap_simple_user_search_attrUIDsearch for the user name,user1发现一个条目UID价值user1

6.5.2连接控制插件

MySQL服务器包括一个插件库,使管理员能够介绍给客户的服务器响应延迟增加后一定数量的连续失败的连接尝试。此功能提供了一种威慑,减慢了蛮力攻击,试图访问MySQL的用户帐户。插件库包含两插件:

  • CONNECTION_CONTROL检查传入的连接,并增加了一个延迟的服务器响应是必要的。这个插件也暴露出制度变量,使其操作进行配置和状态变量,提供了基本的监测信息。

    这个CONNECTION_CONTROL插件使用插件接口(见审计第28.2.4.8,“写作审计插件”)。收集信息,它向MYSQL_AUDIT_CONNECTION_CLASSMASK事件类,和过程独立的审计MYSQL_AUDIT_CONNECTION_CHANGE_USER子检查服务器是否应该在响应客户端的连接尝试引入延迟。

  • CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS实现了一个information_schema表暴露更详细的监控信息失败的连接尝试。

以下各节提供连接控制插件的安装和配置信息。的信息CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS表,看第24.37.1,“information_schema connection_control_failed_login_attempts表”

6.5.2.1连接控制插件的安装

本节介绍如何安装连接控制插件,CONNECTION_CONTROL_ connection failed _ _势力控制_登录。关于安装插件的一般信息,看第5.6.1,“安装和卸载插件”

通过将服务器可用的插件库文件必须位于MySQL插件目录(目录命名的plugin_dir系统变量)。如果有必要,设置值plugin_dir在服务器启动告诉服务器插件目录位置。

插件库文件的基名称是connection_control。文件名后缀不同的平台(例如每,。所以UNIX和类UNIX系统,.dllfor Windows)。

在服务器启动时加载的插件,使用--plugin-load-add选项名称包含这些库文件。这个插件的加载方法,选择必须考虑每次服务器启动。例如,把这些线在服务器my.cnf文件(调整.so你的平台是必要的后缀):

[mysqld]plugin-load-add=connection_control.so

修改后的my.cnf,重新启动服务器以使新设置生效。

另外,在运行时登记的插件,使用这些语句(调整.so后缀是必要的):

安装插件_ connection连接控制soname _ control.so插件连接;安装_调控_ failed _登录连接_ control.so soname _势力;

INSTALL PLUGIN加载插件立即,并记录它的mysql.plugins系统表,导致服务器负载为每个后续的正常启动。

to verify the插件安装,检查INFORMATION_SCHEMA.PLUGINS表或使用SHOW PLUGINS声明(见第2,“获取服务器插件的信息”)。例如:

mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
       FROM INFORMATION_SCHEMA.PLUGINS
       WHERE PLUGIN_NAME LIKE 'connection%';
+------------------------------------------+---------------+
| PLUGIN_NAME                              | PLUGIN_STATUS |
+------------------------------------------+---------------+
| CONNECTION_CONTROL                       | ACTIVE        |
| CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS | ACTIVE        |
+------------------------------------------+---------------+

如果一个插件初始化失败,检查诊断消息服务器错误日志。

如果插件此前已注册INSTALL PLUGIN或是装--plugin-load-add,您可以使用——连接控制--connection-control-failed-login-attempts在服务器启动选项来控制插件的激活。例如,在启动时加载的插件,并防止它们被删除在运行时,使用这些选项:

[mysqld]plugin-load-add=connection_control.soconnection-control=FORCE_PLUS_PERMANENTconnection-control-failed-login-attempts=FORCE_PLUS_PERMANENT

如果想要防止服务器运行没有一个给定的连接控制插件,使用期权价值FORCE永久性强制服务器启动如果插件没有初始化成功失败。

笔记

它可能没有其他的安装一个插件,但都必须安装全连接的控制能力。特别是,只安装CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS插件的用处不大,因为没有连接控制插件提供的数据填充CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS表,Retrievals from the表永远是空的。

连接延迟配置

使您配置操作的CONNECTION_CONTROL插件提供了几个系统变量:

完全禁止检查失败的连接尝试,集connection_control_failed_connections_threshold零。如果connection_control_failed_connections_threshold为零,通过许多连续失败的连接尝试的延迟量是零。此后,延迟量的失败次数超过阈值的企图,乘以connection_control_min_connection_delay毫秒。例如,在默认的connection_control_failed_connections_thresholdconnection_control_min_connection_delay值3和1000,分别,没有延迟的第一个连续三次失败的客户端连接尝试,对于第四延迟1000毫秒,2000毫秒的尝试失败,第五的失败尝试,等等,达到允许的最大延迟connection_control_max_connection_delay

你可以设置CONNECTION_CONTROL在服务器启动或运行时系统变量。假设你想允许连续4失败的连接尝试服务器启动延迟的响应之前,并增加1500毫秒的延迟每增加失败后。在服务器启动时设置相关的变量,把这些线在服务器my.cnf文件:

[mysqld]
plugin-load-add=connection_control.so
connection_control_failed_connections_threshold=4
connection_control_min_connection_delay=1500

建立和坚持的变量在运行时,使用这些语句:

SET PERSIST connection_control_failed_connections_threshold = 4;
SET PERSIST connection_control_min_connection_delay = 1500;

SET PERSIST设置运行MySQL实例的值。它还可以节省值被用于随后的重新启动服务器;看第13.7.5.1,”句法变量赋值”。更改运行MySQL实例的值而不保存它为随后的重新启动,使用GLOBAL关键词而不是坚持

这个connection_control_min_connection_delayconnection_control_max_connection_delay系统变量固定的最小值和最大值1000和2147483647,分别。此外,对各变量的允许值范围还取决于其他的当前值:

因此,为了使一些配置所需要的变化,您可能需要设置在一个特定的顺序的变量。假设当前的最小和最大延迟为1000和2000,而你想设置为3000和5000。你不能第一集connection_control_min_connection_delay3000因为那是大于当前connection_control_max_connection_delay值2000。相反,集connection_control_max_connection_delay五千,然后设置connection_control_min_connection_delay这3000

连接失效评估

CONNECTION_CONTROL插件安装,检查连接尝试与轨道是否成功或失败。为了这个目的,一个失败的连接尝试是指客户端的用户和主机匹配已知的MySQL帐户,但是提供的凭据不正确,或不匹配任何已知的帐户。

失败的连接数是基于用户/主机组合为每个连接的尝试。确定适用的用户名和主机名作为代理的考虑,出现如下:

  • 如果客户端用户代理另一个用户,代理用户的信息的使用。例如,如果external_user@example.com代理_ @ example.com的用户代理使用代理的用户连接数,external_user@example.com,而不是代理用户,_ @ example.com的用户代理。两external_user@example.com_ @ example.com的用户代理必须在有效的条目mysql.user系统表和它们之间的代理关系中必须定义mysql.proxies_priv系统表(见第6.3.11”代理用户”

  • 如果客户端用户不代表另一个用户,但不匹配mysql.user进入,计数采用CURRENT_USER()这项对应的值。例如,如果一个用户user1从主机连接host1.example.com比赛host1.example.com user1”进入,计数用user1@host1.example.com。如果用户匹配example.com 1 %。user1@%.com,或用户@ %进入相反,计数用user1@%.example.comuser1 @ % .com,或user1@%,分别

对于刚才所描述的情况下,连接尝试一些比赛mysql.user进入,并请求是否成功或失败取决于客户是否提供了正确的身份验证凭据。例如,如果客户提出了一个不正确的密码,连接尝试失败。

如果连接尝试不匹配mysql.user进入,尝试失败。在这种情况下,没有CURRENT_USER()可用的值和连接失败计数使用由客户端和客户端主机由服务器确定提供的用户名称。例如,如果客户端尝试连接的用户user2从主机host2.example.com用户名称的一部分,在客户端请求和服务器确定主机的信息是可用的。用于计数的用户/主机组合user2@host2.example.com

笔记

服务器维护信息,客户端可以连接到服务器(基本上是工会主值mysql.user条目)。如果客户端尝试从其他主机连接,服务器将拒绝在连接建立的早期尝试:

错误1130(hy000):主机host_name“不允许连接到MySQL服务器

因为这么早发生这种类型的排斥反应,CONNECTION_CONTROL不看,不算

连接故障监测

监视的连接失败,使用这些信息来源:

分配一个值connection_control_failed_connections_threshold在运行时将所有累积的失败连接计数器为零,具有这些明显的影响:

6.5.2.2连接控制系统和状态变量

本节描述系统状态变量的CONNECTION_CONTROL插件提供了使其操作进行配置和监控。

连接控制系统变量

如果CONNECTION_CONTROL插件安装,它暴露了这些系统变量:

连接控制状态变量

如果CONNECTION_CONTROL插件安装,它暴露了这个状态变量:

6.5.3密码验证组件

这个validate_password组件可以测试密码提高安全性。这部分将系统变量使您能够定义密码策略,和元件的监控状态变量。

笔记

在MySQL 8.0.4,validate_password插件是不是多余的验证局组件下面的说明描述了如何使用组件,没有插件。基于插件的说明,见密码验证插件进入MySQL 5.7参考手册

插件形式validate_password仍然是可用的但已废弃,将在未来版本的MySQL移除。MySQL装置使用的插件应该使用组件来代替过渡。看到第6.5.3.3,”过渡到密码验证组件”

这个validate_password组件实现这些功能:

例如,validate_password检查以下语句中的明文密码。默认的密码政策下,这就要求密码长度至少为8个字符,密码是弱和语句产生一个错误:

mysql> ALTER USER USER() IDENTIFIED BY 'abc';
ERROR 1819 (HY000): Your password does not satisfy the current
policy requirements

密码指定为散列值不检查,因为原来的密码值不可用于检查:

mysql> ALTER USER 'jeffrey'@'localhost'
       IDENTIFIED WITH mysql_native_password
       AS '*0D3CED9BEC10A777AEC23CCC353A8C08A633045E';
Query OK, 0 rows affected (0.01 sec)

配置密码校验、修改系统变量在表格的名称validate_password.xxx;这些是控制密码策略的参数。看到第6.5.3.2,“密码验证选项和变量”

如果validate_password没有安装,这_验证密码xxx系统变量是不可用的,密码在陈述不检查,及VALIDATE_PASSWORD_STRENGTH()函数总是返回0。例如,无插件安装,账户可以指定密码少于八个字符。

假设validate_password安装,实现了三级密码检查:MEDIUM,和。默认值是MEDIUM;要改变这一点,修改值validate_password.policy。政策的实施越来越严格的密码测试。以下说明指的默认参数值,可通过改变相应的系统变量修改。

此外,validate_password支持拒绝为当前会话的有效用户帐户的用户名称部分匹配密码的能力,无论是正向或反向。提供这种能力的控制,验证局暴露validate_password.check_user_name系统变量,这是默认启用。

6.5.3.1密码验证组件的安装和卸载

本节介绍了如何安装和卸载validate_password密码验证组件。关于安装和卸载组件的一般信息,看5.5节,“MySQL服务器组件”

笔记

如果你安装MySQL 8的使用yum库的MySQLMySQL的版本库,或Oracle提供的RPM包,的validate_password组件是默认启用后,你开始你的MySQL服务器的第一次。

5.7使用yum或rpm包升级到MySQL 8离开validate_password插件的地方。要从转变验证局插件的validate_password基于组件的,这第6.5.3.3,”过渡到密码验证组件”

通过服务器可用,组件库文件必须位于MySQL插件目录(目录命名的plugin_dir系统变量)。如果有必要,设置值plugin_dir在服务器启动告诉服务器组件的目录位置。

安装validate_password使用此语句:

安装组件:组件文件_ _密码/验证;

组件的安装是一次性的操作,不需要通过服务器启动。INSTALL COMPONENT荷载的构件,并记录它的mysql.component系统表使其在随后的服务器启动加载。

卸载validate_password使用此语句:

“文件/卸载组件:组件_ _密码验证;

UNINSTALL COMPONENT卸载组件,并撤销其从mysql.component系统表使之不被在随后的服务器启动加载。

6.5.3.2密码验证选项和变量

本节描述系统状态变量validate_password提供使其操作进行配置和监控。

密码验证组件的系统变量

如果validate_password组件启用,它暴露了一些系统变量,使密码校验配置:

MySQL的&#62;SHOW VARIABLES LIKE 'validate_password.%';Password.Polic.Polic.Polic.Inflic.Policy Controll Action Palestate Action Car Passord.Expert Car Car Car Co Car Co Car Co Co Co Co Co Co Co Co Co CA 1 DIN DOU CA 1 DOM CUR CA 1 DIN DOR ADOR ADOR

改变密码进行检查,你可以在服务器启动或在运行时设置这些系统变量。下面的列表描述了每个变量的含义。

  • validate_password.check_user_name

    财产价值
    命令行格式--validate-password.check-user-name
    介绍8.0.4
    系统变量validate_password.check_user_name
    范围全球
    动态
    看到的是_提示应用
    类型布尔
    默认值ON

    是否validate_password比较密码为当前会话的有效用户帐户的用户名称的一部分,拒绝他们,如果他们的比赛。这个变量是不可用,除非验证局安装

    默认情况下,validate_password.check_user_name启用。这个变量控制的用户名匹配的独立的价值validate_password.policy

    什么时候validate_password.check_user_name启用,它有这些作用:

    • 检查发生在所有情境validate_password被调用,包括使用诸如ALTER USERSET PASSWORD更改当前用户的密码,和功能,如调用VALIDATE_PASSWORD_STRENGTH()

    • 用于比较的用户名称是从价值观的USER()CURRENT_USER()为当前会话功能。一个含义是,用户有足够的权限设定一个用户的密码可以设置密码,用户名,用户密码不能设置为执行语句的用户的名称。例如,root @本地主机可以设置密码'jeffrey'@'localhost'“杰夫瑞”,但不能设置密码'root

    • 只有用户的一部分USER()CURRENT_USER()用函数值,而不是主机名的一部分。如果一个用户名称是空的,没有比较时。

    • 如果密码是用户名或它的反面一样,存在匹配和密码被拒绝。

    • 用户名匹配是大小写敏感的。密码和用户名值为二进制字符串逐字节比较。

    • 如果一个密码和用户名,VALIDATE_PASSWORD_STRENGTH()返回0不管其他验证局系统变量的设置

  • validate_password.dictionary_file

    财产价值
    介绍8.0.4
    系统变量validate_password.dictionary_file
    范围全球
    动态
    看到的是_提示应用
    类型文件名

    路径名的字典文件validate_password检查密码的使用。这个变量是不可用,除非验证局安装

    默认情况下,这个变量的值为空,词典检查不执行。字典检查时,变量的值必须是非空的。如果文件被命名为相对路径,它被解释为相对于服务器的数据目录。文件内容应小写,每行一个字。内容被视为一个字符集utf8。允许的最大文件大小为1MB。

    这本词典文件时应检查使用的密码,密码必须设置为2(政策STRONGSee the description of the);validate_password.policy系统变量。假设这是真的,每个子字符串的长度为4到100的密码是比较字典文件的话。任何匹配的密码被拒绝的原因。比较是不区分大小写。

    VALIDATE_PASSWORD_STRENGTH(),密码是对所有的政策进行检查,包括,所以强度评价包括查字典的validate_password.policy价值

    validate_password.dictionary_file可以在运行时设置和分配一个值使指定的文件无需重启服务器读取。

  • validate_password.length

    财产价值
    介绍8.0.4
    系统变量validate_password.length
    范围全球
    动态
    看到的是_提示应用
    类型整数
    默认值8
    最小值0

    最小字符数,validate_password需要密码了。这个变量是不可用,除非验证局安装

    这个validate_password.length最小值是其他几个相关的系统变量的一个函数。该值不能小于这个表达式的值:

    _计数验证验证_ password.number _ password.special _ char count(2×_案例验证_ password.mixed _ _ count)

    如果validate_password调整值validate_password.length由于上述的限制,它将消息写入错误日志。

  • validate_password.mixed_case_count

    财产价值
    介绍8.0.4
    系统变量validate_password.mixed_case_count
    范围全球
    动态
    看到的是_提示应用
    类型整数
    默认值1
    最小值0

    最小数量的小写和大写字符validate_password需要密码,如果密码政策是有介质或更强。这个变量是不可用,除非validate_password是的

    对于一个给定的validate_password.mixed_case_count值,密码必须有许多小写字符,而且许多大写字符。

  • validate_password.number_count

    财产价值
    介绍8.0.4
    系统变量validate_password.number_count
    范围全球
    动态
    看到的是_提示应用
    类型整数
    默认值1
    最小值0

    数字的最小数目的字符(数字)validate_password需要密码,如果密码政策是有介质或更强。这个变量是不可用,除非validate_password安装

  • validate_password.policy

    财产价值
    介绍8.0.4
    系统变量validate_password.policy
    范围全球
    动态
    看到的是_提示应用
    类型枚举
    默认值1
    有效值

    0

    1

    2

    密码策略的实施validate_password。这个变量是不可用,除非验证局是的

    validate_password.policy如何影响验证局使用它的其他策略设置系统变量,除了检查用户名密码,这是独立的控制validate_password.check_user_name

    这个validate_password.policy价值可以用数字值0,1,2指定,或相应的符号值MEDIUM。下表描述了测试的每个政策执行。对于长度测试所需长度的值validate_password.length系统变量。同样,对于其他的测试所需的值的其他_验证密码xxx变量.

    政策进行的测试
    0长度
    1介质长度;数字、小写字母、大写字母、特殊符号
    2长度;数字、小写/大写,和特殊字符;字典文件
  • validate_password.special_char_count

    财产价值
    介绍8.0.4
    系统变量validate_password.special_char_count
    范围全球
    动态
    看到的是_提示应用
    类型整数
    默认值1
    最小值0

    最小数量的非字母数字字符,validate_password需要密码,如果密码政策是有介质或更强。这个变量是不可用,除非validate_password安装

密码验证组件的状态变量

如果validate_password组件启用,它暴露了状态变量提供的操作信息:

MySQL的&#62;SHOW STATUS LIKE 'validate_password.%';----------------------------------------------- _ name变量值|最最| | ----------------------------------------------- |验证文件_ password.dictionary _ _ | 2018年最后_解析:1999-01-15 08 33:49 | |验证文件的话_ password.dictionary _ _ _ count | 1902年| ----------------------------------------------- ---------------------

The following the meaning of each表描述的状态变量。

密码验证插件选项
笔记

在MySQL 8.0.4,validate_password插件是不是多余的验证局组件这个validate_password插件是过时的、将在未来版本的MySQL移除。因此,它的选择也是过时的,将被删除。MySQL装置使用的插件应该使用组件来代替过渡。看到第6.5.3.3,”过渡到密码验证组件”

控制的激活validate_password插件,使用此选项:

密码验证插件系统变量
笔记

在MySQL 8.0.4,validate_password插件是不是多余的验证局组件这个validate_password插件是过时的、将在未来版本的MySQL移除。因此,它的系统变量也被废弃,将被删除。使用的相应的系统变量验证局组件;看密码验证组件的系统变量。MySQL装置使用的插件应该使用组件来代替过渡。看到第6.5.3.3,”过渡到密码验证组件”

复活节鉴定
笔记

在MySQL 8.0.4,validate_password插件是不是多余的验证局组件这个validate_password插件是过时的、将在未来版本的MySQL移除。因此,其状态变量也废弃,将被删除。使用的相应的状态变量验证局组件;看密码验证组件的状态变量。MySQL装置使用的插件应该使用组件来代替过渡。看到第6.5.3.3,”过渡到密码验证组件”

6.5.3.3过渡到密码验证组件

笔记

在MySQL 8.0.4,validate_password插件是不是多余的验证局组件这个validate_password插件是过时的、将在未来版本的MySQL移除。

这是目前使用的MySQL安装validate_password插件要过渡到使用验证局组件代替。为此,请使用以下过程。该程序安装组件之前卸载插件,避免了一个时间窗口,在此期间没有出现密码验证。(组件和插件可以同时安装。在这种情况下,服务器尝试使用该组件,落回插件组件是否可用。)

  1. 安装validate_password组成:

    安装组件:组件文件_ _密码/验证;
  2. 测试validate_password组件以确保它的工作预期。如果你需要设置任何_验证密码xxx系统变量,你可以在运行时使用这样做设置全局。(任何选项文件的变化,必须进行下一步。执行)

  3. 调整任何引用的插件系统,状态变量是指相应的组件系统和状态变量。假设你配置的插件,在使用一个选项文件这样的启动:

    [mysqld]
    validate-password=FORCE_PLUS_PERMANENT
    validate_password_dictionary_file=/usr/share/dict/words
    validate_password_length=10
    validate_password_number_count=2
    

    一个调整的选项文件,omit--validate-password选项(仅适用于插件,而不是组件),并修改系统变量的引用:

    [mysqld]validate_password.dictionary_file=/usr/share/dict/wordsvalidate_password.length=10validate_password.number_count=2

    类似的调整是应用程序在运行时需要参考validate_password插件系统和状态变量

  4. 卸载validate_password插件:

    validate_password卸载插件;

    如果validate_password插件是在使用一个服务器启动时加载--plugin-load--plugin-load-add选项,忽略服务器启动程序选项。例如,如果选择在服务器选项文件中列出的文件,删除它。

  5. 重新启动服务器

6.5.4 MySQL的钥匙圈

MySQL服务器支持一个钥匙圈服务,使内部服务器组件和插件来安全地存储敏感信息供以后检索。基于插件的实现:

警告

这个keyring_filekeyring_encrypted_file加密密钥管理插件是不打算作为一个合规解决方案。安全标准,如PCI,FIPS,和其他需要使用密钥管理系统的安全管理,保护关键的金库或硬件安全模块(HSM)加密密钥。

用钥匙在mysql中包括:

  • 这个InnoDB存储引擎使用密匙存储关键表空间加密。InnoDB可以使用任何插件支持的钥匙圈。

  • MySQL企业审计使用密匙存储审计日志文件加密的密码。审计日志插件可以使用任何插件支持的钥匙圈。

一般的钥匙圈的安装说明,看第6.5.4.1,“钥匙插件安装”。具体到一个给定的密匙信息插件,见一节描述的插件。

有关使用钥匙UDF的信息,参见第6.5.4.8,“通用钥匙的密钥管理功能”

钥匙圈的插件和UDF访问一个钥匙圈服务提供服务器组件接口的钥匙圈。有关访问密钥环的插件服务写钥匙插件的信息,参见第28.3.2,“钥匙”服务,和第28.2.4.12,“写作钥匙插件”

6.5.4.1钥匙插件安装

消费者需要一个钥匙圈钥匙圈服务插件。MySQL提供了这些插件的选择:

  • keyring_file:一个插件存储密匙文件中的数据服务器的本地主机。在所有MySQL分布可用。

  • keyring_encrypted_file:一个插件存储密匙数据以加密的服务器主机的本地文件。MySQL企业版的发行版。

  • keyring_okv:一个插件,使用KMIP兼容后端密匙存储产品如Oracle密钥库和金雅拓SafeNet KeySecure电器。MySQL企业版的发行版。

  • keyring_aws:一个与亚马逊网络服务的密钥管理服务作为后端的密钥生成和使用密钥存储本地文件的插件。MySQL企业版的发行版。

本节介绍如何安装你选择的钥匙圈插件。关于安装插件的一般信息,看第5.6.1,“安装和卸载插件”

如果你打算使用钥匙圈用户自定义函数(UDF)与钥匙圈插件连接,安装后安装使用UDF钥匙的使用说明第6.5.4.8,“通用钥匙的密钥管理功能”

通过将服务器可用的插件库文件必须位于MySQL插件目录(目录命名的plugin_dir系统变量)。如果有必要,设置值plugin_dir在服务器启动告诉服务器插件目录位置。

每个插件安装类似钥匙圈。以下说明使用keyring_file。一个钥匙圈插件用户可以替代它的名字keyring_file

这个keyring_file插件库文件的基名称是keyring_file。文件名后缀不同的平台(例如每,.soUNIX和类UNIX系统,dllfor Windows)。

笔记

只有一个钥匙圈插件应该是一次启用。使多个钥匙圈插件是不支持的,结果可能不会如预期。

到此插件必须加载早期服务器启动序列期间,服务器组件可以访问它自己的初始化过程中必要的。例如,在InnoDB存储引擎使用密匙加密的密匙表空间,所以插件必须装和之前InnoDB初始化

加载插件,使用--early-plugin-load选项名称包含它的插件库文件。例如,在平台上的插件库文件后缀。所以在服务器上使用这些线,my.cnf文件(调整。所以你的平台是必要的后缀):

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

在启动服务器之前,检查你选择的钥匙圈插件是否允许或要求额外的配置说明:

执行任何插件的具体配置后,验证插件安装。与MySQL服务器运行,检查INFORMATION_SCHEMA.PLUGINS表或使用SHOW PLUGINS声明(见第2,“获取服务器插件的信息”)。例如:

mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
       FROM INFORMATION_SCHEMA.PLUGINS
       WHERE PLUGIN_NAME LIKE 'keyring%';
+--------------+---------------+
| PLUGIN_NAME  | PLUGIN_STATUS |
+--------------+---------------+
| keyring_file | ACTIVE        |
+--------------+---------------+

如果插件初始化失败,检查诊断消息服务器错误日志。

如果没有钥匙插件时可用服务器组件试图访问密钥环的服务,该服务不能被分。因此,组件可能无法初始化或有限功能的初始化。例如,如果InnoDB发现有加密的表空间时,它初始化,它试图访问密钥环。如果钥匙不可用,InnoDB只能访问未加密的表空间。确保InnoDB可以访问加密的表空间为好,使用--early-plugin-load加载密钥环的插件

插件可以通过其他方法加载,如--plugin-load--plugin-load-add选择或INSTALL PLUGIN声明。然而,钥匙圈插件加载使用这些方法可太晚在服务器启动序列的某些服务器组件,如InnoDB

  • 插件加载使用--plugin-load--plugin-load-add发生后InnoDB初始化

  • 插件安装使用INSTALL PLUGIN是注册在mysql.plugin系统表和随后的服务器会自动加载启动。然而,因为mysql.plugin是一个InnoDB表,任何插件命名可以加载在启动后InnoDB初始化

6.5.4.2使用keyring_file基于文件的插件

这个keyring_file插件是一个钥匙圈,钥匙圈的插件存储文件中的数据服务器的本地主机。

警告

这个keyring_file加密密钥管理插件是不打算作为一个合规解决方案。安全标准,如PCI,FIPS,和其他需要使用密钥管理系统的安全管理,保护关键的金库或硬件安全模块(HSM)加密密钥。

安装keyring_file插件,使用一般的安装说明,发现钥匙圈第6.5.4.1,“钥匙插件安装”,加上配置的具体信息keyring_file在这里找到

在服务器启动过程中可用,keyring_file必须加载使用--early-plugin-load选项这个keyring_file_data系统变量可选配置使用的文件的位置keyring_file数据存储插件。默认值是特定于平台的。配置文件的位置明确,设置变量值在启动。例如,在服务器上使用这些线my.cnf文件(调整。所以你的平台是必要的后缀和文件位置):

[mysqld]
early-plugin-load=keyring_file.so
keyring_file_data=/usr/local/mysql/mysql-keyring/keyring

钥匙操作的事务:keyring_file插件使用备份文件中以确保它可以回滚到原始文件的写操作,如果手术失败。备份文件的名字和值的相同keyring_file_data以系统变量备份

有关更多信息keyring_file_data,看到第6.5.4.11,“钥匙系统变量”

确保密钥刷新只有正确的密匙存储文件存在,keyring_file存储在文件中的钥匙圈SHA-256校验。更新文件之前,插件验证,它包含的预期校验。

这个keyring_file插件支持,包括标准的服务接口的功能钥匙圈。钥匙操作的功能表现在两水平接近:

例(使用UDF):

SELECT keyring_key_generate('MyKey', 'AES', 32);
SELECT keyring_key_remove('MyKey');

关键类型允许的keyring_file描述第6.5.4.7,“支持Keyring Key Types”

6.5.4.3使用keyring_encrypted_file钥匙插件

笔记

这个keyring_encrypted_file插件是一个扩展包含在MySQL企业版,商业产品。要了解更多关于商业产品,看http://www.mysql.com /产品/

这个keyring_encrypted_file插件是一个密匙存储密匙插件数据以加密的服务器主机的本地文件。这个插件可以作为MySQL 5.7.21。

警告

这个keyring_encrypted_file加密密钥管理插件是不打算作为一个合规解决方案。安全标准,如PCI,FIPS,和其他需要使用密钥管理系统的安全管理,保护关键的金库或硬件安全模块(HSM)加密密钥。

安装keyring_encrypted_file插件,使用一般的安装说明,发现钥匙圈第6.5.4.1,“钥匙插件安装”,加上配置的具体信息keyring_encrypted_file在这里找到

在服务器启动过程中可用,keyring_encrypted_file必须加载使用--early-plugin-load选项要加密的密匙数据文件中指定的密码,设置keyring_encrypted_file_password系统变量。(如果没有指定在服务器启动密码是强制性的,keyring_encrypted_file初始化失败的。)keyring_encrypted_file_data系统变量可选配置使用的文件的位置keyring_encrypted_file数据存储插件。默认值是特定于平台的。配置文件的位置明确,设置变量值在启动。例如,在服务器上使用这些线my.cnf文件(调整。所以你的平台是必要的,代替你选择的密码后缀和文件位置):

[mysqld]
early-plugin-load=keyring_encrypted_file.so
keyring_encrypted_file_data=/usr/local/mysql/mysql-keyring/keyring-encrypted
keyring_encrypted_file_password=password

因为my.cnf文件存储密码时写如图所示,它应该有一个限制性的模式,仅用于运行MySQL服务器的帐户访问。

钥匙操作的事务:keyring_encrypted_file插件使用备份文件中以确保它可以回滚到原始文件的写操作,如果手术失败。备份文件的名字和值的相同keyring_encrypted_file_data以系统变量备份

额外的信息有关的系统变量用于配置keyring_encrypted_file插件,看第6.5.4.11,“钥匙系统变量”

确保密钥刷新只有正确的密匙存储文件存在,keyring_encrypted_file存储在文件中的钥匙圈SHA-256校验。更新文件之前,插件验证,它包含的预期校验。此外,keyring_encrypted_file使用AES加密文件的内容在写文件,解密文件内容在阅读文件。

这个keyring_encrypted_file插件支持,包括标准的服务接口的功能钥匙圈。钥匙操作的功能表现在两水平接近:

例(使用UDF):

SELECT keyring_key_generate('MyKey', 'AES', 32);
SELECT keyring_key_remove('MyKey');

关键类型允许的keyring_encrypted_file描述第6.5.4.7,“支持Keyring Key Types”

6.5.4.4使用keyring_okv KMIP插件

笔记

这个keyring_okv插件是一个扩展包含在MySQL企业版,商业产品。要了解更多关于商业产品,看http://www.mysql.com /产品/

密钥管理互操作协议(KMIP)使密码密钥的密钥管理服务器和客户机之间的通信。这个keyring_okv钥匙圈插件使用KMIP 1.1协议的安全通信,作为一个KMIP客户后端。钥匙扣的材料是完全由后台生成的,不是由keyring_okv。该插件与这些KMIP兼容产品:

  • Oracle密钥库

  • 金雅拓SafeNet KeySecure电器

这个keyring_okv插件支持,包括标准的服务接口的功能钥匙圈。钥匙操作的功能表现在两水平接近:

例(使用UDF):

SELECT keyring_key_generate('MyKey', 'AES', 32);
SELECT keyring_key_remove('MyKey');

关键类型允许的keyring_okv描述第6.5.4.7,“支持Keyring Key Types”

安装keyring_okv插件,使用一般的安装说明,发现钥匙圈第6.5.4.1,“钥匙插件安装”,加上配置的具体信息keyring_okv在这里找到

一般keyring_okv配置

regardless of which kmip back end thekeyring_okv插件使用密匙存储的keyring_okv_conf_dir系统变量配置使用的目录的位置keyring_okv对它的支持文件。默认值是空的,所以你必须设置变量在插件可以与KMIP后端配置正确的目录名称。除非你这样做,keyring_okv将消息写入错误日志服务器启动时,它无法沟通时:

[警告]插件keyring_okv报道:“keyring_okv到beinitialized,请点keyring_okv_conf_dir变量一个directorycontaining Oracle密钥库的配置文件和SSL的材料

这个keyring_okv_conf_dir变量名称的目录,必须包含以下项目:

  • okvclient.ora:一个文件包含的KMIP后端与细节keyring_okv交流会

  • ssl:一个目录包含证书和私钥文件的要求建立安全连接后端KMIP:ca.pemcert.pem,和key.pem。如果密钥文件的密码保护的ssl目录可以包含单行文本文件命名password.txt包含所需的解密密钥文件的密码。

okvclient.ora文件和SSL的证书和密钥文件目录是必需的keyring_okv正常工作。该程序用于这些文件在配置目录取决于KMIP后端使用keyring_okv,其他地方所描述的

设计目录keyring_okv作为其支持文件的位置应该有一个限制性的模式,仅用于运行MySQL服务器的帐户访问。例如,在UNIX和类UNIX系统中,使用/usr/local {钥匙/ MySQL的MySQL目录,下面的命令(执行root)创建目录,并设置其模式和所有权:

cd /usr/local mysqlmkdir MySQL的钥匙圈okvchmod 750 MySQL的钥匙圈okvchown mysql mysql的钥匙圈钥匙圈okvchgrp OKV

在服务器启动过程中可用,keyring_okv必须加载使用--early-plugin-load选项同时,设置keyring_okv_conf_dir系统变量来告诉keyring_okv在哪里可以找到它的配置目录。例如,在服务器上使用这些线my.cnf文件(调整。所以后缀和你的平台是必要的目录位置):

[mysqld]
early-plugin-load=keyring_okv.so
keyring_okv_conf_dir=/usr/local/mysql/mysql-keyring-okv

有关更多信息keyring_okv_conf_dir,看到第6.5.4.11,“钥匙系统变量”

配置Oracle密钥库keyring_okv

这里的讨论假定您熟悉Oracle密钥库。一些相关的信息来源:

Oracle密钥库的术语,使用Oracle密钥库来存储和检索对象称为终端客户的安全。与Oracle密钥库沟通,需要登记的一个端点,端点注册下载并安装支持文件。

下面的过程进行了简要总结,建立过程keyring_okv使用Oracle密钥库:

  1. 创建用于配置目录keyring_okv插件使用

  2. 登记与Oracle密钥库端点获得入学令牌。

  3. 使用注册标记获得okvclient.jar客户端软件下载

  4. 安装客户端软件来填充keyring_okv配置目录包含Oracle密钥库支持文件。

使用以下过程配置keyring_okvOracle密钥库一起工作。这说明了如何使用Oracle密钥库相互作用。详情访问Oracle密钥库现场咨询Oracle密钥库管理员指南。

  1. 创建配置目录将包含Oracle密钥库支持文件,确保keyring_okv_conf_dir系统变量设置为名称的目录(详情见一般keyring_okv配置

  2. 登录到Oracle密钥库管理控制台为用户系统管理员角色。

  3. 选择端点到端点的标签页。在终端页面,单击“添加”。

  4. 提供所需的端点信息点击登记。端点类型应该是其他。在注册标记注册成功的结果。

  5. 从俄罗斯人的关键的伺服伺服。

  6. 再次连接到Oracle密钥库服务器,这个时间没有登录。使用端点招生报名请求令牌okvclient.jar软件下载。将该文件保存到您的系统。

  7. 安装okvclient.jar使用下面的命令文件(你必须有JDK 1.4或更高):

    okvclient.jar JAR(Javadir_name[五]

    the following the name目录-d选择在哪个位置安装文件。这个v选项,如果给定的,原因是产生的日志信息,可能是有用的如果命令失败。

    当命令要求一个Oracle密钥库端点的密码,不提供一个。相反,按回车。(结果是没有密码时将需要的端点连接Oracle密钥库。)

  8. 前面的命令产生一个okvclient.ora文件,应在该位置命名的文件夹下D在前面的选项java -jar命令:

    install_dir/conf/okvclient.ora
    

    文件内容包括线看起来像这样:

    SERVER=host_ip:port_num
    STANDBY_SERVER=host_ip:port_num
    

    这个keyring_okv插件试图与服务器主机上运行指定的沟通服务器变量和后退STANDBY_SERVER如果失败:

    • 对于SERVER变量,在设置okvclient.ora文件是强制性的

    • 对于STANDBY_SERVER变量,在设置okvclient.ora文件是可选的

  9. 去Oracle密钥库的安装目录并运行此命令测试设置:

    okvutil/bin/okvutil list
    

    输出应该是这个样子:

    Unique ID                               Type            Identifier
    255AB8DE-C97F-482C-E053-0100007F28B9	Symmetric Key	-
    264BF6E0-A20E-7C42-E053-0100007FB29C	Symmetric Key	-
    

    一个新的Oracle密钥库服务器(一个没有任何关键的服务器),输出看起来像这样相反,表明有保险库中没有钥匙:

    no objects found
    
  10. 使用此命令来提取ssl从包含SSL材料目录okvclient.jar文件:

    jar xf okvclient.jar ssl
    
  11. 复制Oracle密钥库文件的支持(okvclient.ora文件和SSL目录)到配置目录

  12. (可选)如果你想密码保护密钥文件,使用说明keyring_okv密钥文件密码保护

完成上述程序后,重新启动MySQL服务器。它加载的keyring_okv插件keyring_okv使用文件的配置目录与Oracle密钥库沟通。

配置金雅拓SafeNet KeySecure电器keyring_okv

金雅拓SafeNet KeySecure电器采用KMIP协议(版本1.1、1.2)。这个keyring_okv钥匙圈插件(支持KMIP 1.1)可以使用KeySecure作为密匙的KMIP后端存储。

使用以下过程配置keyring_okv和KeySecure一起工作。描述了如何与KeySecure。详情咨询命名部分添加KMIP服务器KeySecure用户指南

  1. 创建配置目录将包含keySecure支持文件,并确保keyring_okv_conf_dir系统变量设置为名称的目录(详情见一般keyring_okv配置

  2. 在配置目录,创建一个子目录名为ssl用于存储所需的SSL证书和密钥文件。

  3. 在配置目录,创建一个文件名为okvclient.ora。它应该有下列格式:

    SERVER=host_ipport_numSTANDBY_SERVER=host_ipport_num

    例如,如果KeySecure在主机198.51.100.20运行和侦听端口9002,这okvclient.ora文件看起来像这样:

    SERVER=198.51.100.20:9002STANDBY_SERVER=198.51.100.20:9002
  4. 连接到keySecure管理控制台与证书颁发机构访问凭证管理员。

  5. Navigate to Security >> Local CAs and create a local certificate authority (CA).

  6. 去信任的CA列表。选择默认,单击属性。然后选择编辑受信任的证书颁发机构列表并添加Ca刚刚创建的。

  7. 下载CA和保存在ssl目录作为一个文件名为ca.pem

  8. Navigate to Security >> Certificate Requests and create a certificate. Then you will be able to download a compressed焦油含证书PEM文件

  9. 提取的PEM文件从下载的文件。例如,如果文件名是csr_w_pk_pkcs8.gz解压并打开它,使用这个命令:

    焦油zxvf CSR _ W _ _ pkcs8.gz PK

    结果从两文件提取操作:certificate_request.pemprivate_key_pkcs8.pem

  10. 使用此OpenSSL命令解密密钥的创建一个文件名为key.pem

    OpenSSL pkcs8 - private_key_pkcs8.pem出key.pem
  11. 复制key.pem文件到SSL目录

  12. 复制的证书要求certificate_request.pem到剪贴板

  13. Navigate to Security >> Local CAs. Select the same CA that you created earlier (the one you downloaded to create theCA.pem文件),并点击登录请求。从剪贴板粘贴证书请求,选择一个客户端证书的目的(密钥环是keySecure客户端)点击登录请求,并。其结果是一个选择的CA签署的证书中新的一页。

  14. 复制签名的证书复制到剪贴板,然后保存剪贴板的内容作为一个文件名为cert.pemSSL目录

  15. (可选)如果你想密码保护密钥文件,使用说明keyring_okv密钥文件密码保护

完成上述程序后,重新启动MySQL服务器。它加载的keyring_okv插件keyring_okv使用文件的配置目录与KeySecure。

keyring_okv密钥文件密码保护

你可以选择保护密钥文件密码,提供一个含有密码使密钥文件被解密文件。这么做,改变位置的ssl目录并执行这些步骤:

  1. 加密key.pem密钥文件。例如,使用下面的命令,并在提示输入加密密码:

    内核&#62;openssl rsa -des3 -in key.pem -out key.pem.new输入:输入阶段质子交换膜燃料电池质子交换膜检验通通段:
  2. 在单行文本文件命名保存密码password.txtSSL目录

  3. 验证文件的加密密钥可以解密,使用下面的命令。解密的文件应该在控制台上显示:

    shell> openssl rsa -in key.pem.new -passin file:password.txt
    
  4. 删除原来的key.pem文件重命名key.pem.newkey.pem

  5. 改变所有制和新的接入方式key.pem文件和password.txt文件以确保它们具有相同的限制,在其他的文件ssl目录

6.5.4.5使用亚马逊网络服务的钥匙圈keyring_aws插件

笔记

这个keyring_aws插件是一个扩展包含在MySQL企业版,商业产品。要了解更多关于商业产品,看http://www.mysql.com /产品/

这个keyring_aws插件是一个与亚马逊Web服务通信的密钥管理服务(AWS公里)钥匙插件作为一个后端的密钥生成和使用密钥存储本地文件。所有钥匙的材料是由AWS服务器专门生成的,不是由keyring_aws

keyring_aws可在这些平台:

  • Debian 8

  • el7

  • MacOS 10

  • O x 10.10 and 10.11

  • 聚氧乙烯十二

  • Ubuntu 14.04和16.04

  • Windows

这里的讨论假定您熟悉一般AWS特别与知识管理系统。一些相关的信息来源:

以下各节提供的配置信息和使用keyring_aws钥匙圈插件:

keyring_aws配置

安装keyring_aws使用插件,发现一般安装说明第6.5.4.1,“钥匙插件安装”在这里,一起发现插件特定的配置信息。

插件库文件包含keyring_aws插件和用户自定义函数(UDF),keyring_aws_rotate_cmk()keyring_aws_rotate_keys()

配置keyring_aws,你必须得到一个秘密访问键提供的凭据与AWS公里通信并将其写入一个配置文件:

  1. 创建一个AWS公里帐户。

  2. 使用AWS公里创建一个秘密访问密钥和秘密访问键。访问密钥用来验证您的身份,您的应用程序。

  3. 使用AWS管理帐户创建一个客户主密钥(CMK)ID在MySQL启动设置keyring_aws_cmk_id系统变量的CMK ID值。这个变量是强制性的,没有默认。(它的值可以在运行时改变,如果需要使用SET GLOBAL。)

  4. 如果需要,创建目录中的配置文件将位于。目录中应该有一个限制性的模式,仅用于运行MySQL服务器的帐户访问。例如,在UNIX和类UNIX系统中,使用/usr/local/mysql/mysql-keyring/keyring_aws_conf作为文件名,下面的命令(执行root)创建它的父目录,设置目录模式和所有权:

    shell> cd /usr/local/mysql
    shell> mkdir mysql-keyring
    shell> chmod 750 mysql-keyring
    shell> chown mysql mysql-keyring
    shell> chgrp mysql mysql-keyring
    

    在MySQL启动设置keyring_aws_conf_file系统变量/usr/local MySQL / MySQL /钥匙圈钥匙圈_ AWS _ conf显示配置文件位置的服务器。

  5. 准备keyring_aws配置文件,其中应包含两行:

    • 线路1:秘密访问密钥ID

    • 线路2:秘密访问键

    例如,如果密钥IDwwwwwwwwwwwwwEXAMPLE最关键的是xxxxxxxxxxxxx / yyyyyyy / zzzzzzzz examplekey,配置文件看起来像这样:

    wwwwwwwwwwwwwEXAMPLE
    xxxxxxxxxxxxx/yyyyyyy/zzzzzzzzEXAMPLEKEY
    

在服务器启动过程中可用,keyring_aws必须加载使用--early-plugin-load选项这个keyring_aws_cmk_id系统变量是强制性的,配置客户的主密钥(CMK)从AWS的KMS服务器获得的ID。这个keyring_aws_conf_filekeyring_aws_data_file系统变量可以配置使用的文件的位置keyring_aws插件和数据存储的配置信息。文件位置变量的默认值是特定于平台的。配置位置明确,在启动设置变量值。例如,在服务器上使用这些线my.cnf文件(调整。所以你的平台是必要的后缀和文件位置):

[mysqld]
early-plugin-load=keyring_aws.so
keyring_aws_cmk_id='arn:aws:kms:us-west-2:111122223333:key/abcd1234-ef56-ab12-cd34-ef56abcd1234'
keyring_aws_conf_file=/usr/local/mysql/mysql-keyring/keyring_aws_conf
keyring_aws_data_file=/usr/local/mysql/mysql-keyring/keyring_aws_data

对于keyring_aws插件启动成功,配置文件必须存在并且包含有效的秘密访问关键信息,初始化为前面描述的。存储文件需要不存在。如果它不,keyring_aws试图创建它(以及它的父目录,如果必要的话)。

额外的信息有关的系统变量用于配置keyring_aws插件,看第6.5.4.11,“钥匙系统变量”

启动MySQL服务器,安装相关的UDFkeyring_aws插件这是一次性操作,通过执行下面的语句执行(调整。所以就足够了你的平台

CREATE FUNCTION keyring_aws_rotate_cmk RETURNS INTEGER SONAME 'keyring_aws.so';
CREATE FUNCTION keyring_aws_rotate_keys RETURNS INTEGER SONAME 'keyring_aws.so';
keyring_aws操作

在插件的启动,keyring_aws插件读取AWS秘密访问键ID和密钥的配置文件。它还读取任何加密密钥包含在其存储文件到内存缓存。

在操作过程中,keyring_aws保持在内存缓存中存储文件加密密钥和使用本地持久存储。每个钥匙操作的事务:keyring_aws无论是成功的关键变化在内存缓存和密匙存储文件,或操作失败和钥匙状态保持不变。

确保密钥刷新只有正确的密匙存储文件存在,keyring_aws存储在文件中的钥匙圈SHA-256校验。更新文件之前,插件验证,它包含的预期校验。

这个keyring_aws插件支持,包括标准的服务接口的功能钥匙圈。钥匙操作执行这些功能都可以在两个层次:

例(使用UDF):

SELECT keyring_key_generate('MyKey', 'AES', 32);
SELECT keyring_key_remove('MyKey');

此外,该keyring_aws_rotate_cmk()keyring_aws_rotate_keys()UDF延伸到此插件接口提供AWS相关能力覆盖不到的服务接口标准的钥匙圈。这些能力只能通过调用UDF。没有相应的C语言核心服务功能。

关键类型允许的keyring_aws描述第6.5.4.7,“支持Keyring Key Types”

keyring_aws凭据更改

假设keyring_aws插件已经正确初始化在服务器启动时,它有可能改变用于AWS公里通信的凭据:

  1. 使用AWS管理创建一个新的秘密访问密钥和秘密访问键。

  2. 存储新的凭据在配置文件(文件名的keyring_aws_conf_file系统变量)。文件格式是先前所描述的。

  3. 重新初始化keyring_aws插件使它重新读取配置文件。假设新的证书是有效的,该插件初始化成功。

    有两种方法来初始化插件:

    • 重新启动服务器。这是简单的,有没有副作用,但不适合安装所需的最小服务器的停机时间与尽可能少的重启。

    • 重新初始化插件无需重新启动服务器通过执行下面的语句(调整.so你的平台是必要的后缀):

      卸载插件keyring_aws;安装插件keyring_aws现在的keyring_aws。”;
      笔记

      此外,在运行时加载的插件,INSTALL PLUGIN已在注册插件,它的副作用mysql.plugin系统表。因此,如果你决定停止使用keyring_aws,不足以消除--early-plugin-load从用于启动服务器选项的设置选项。停止插件加载初期,但服务器仍然尝试加载它时,它会在启动序列,它加载的插件的注册点mysql.plugin

      因此,如果你执行UNINSTALL PLUGININSTALL PLUGIN序列描述更改AWS公里的凭据,然后停止使用keyring_aws,有必要执行UNINSTALL PLUGIN再次注销插件除了去除--early-plugin-load选项

6.5.4.6迁移键之间的Keyring Keystores

MySQL服务器支持的运行模式,使底层库的钥匙钥匙圈之间的迁移。这使DBA到MySQL的安装从一个钥匙圈插件切换到另一个。迁移服务器(即服务器启动密钥迁移模式)不接受客户端的连接。相反,它只能运行足够长的时间来迁移键,然后退出。迁移服务器报告错误到控制台(标准错误输出)。

它是可以执行脱机或联机密钥迁移:

  • 如果你确信没有运行服务器上的本地主机使用的源或目标密钥库,离线迁移是可能的。在这种情况下,迁移服务器可以修改密钥没有运行服务器修改密钥内容中迁移的可能性。

  • 如果在本地主机上运行的服务器使用的源或目标密钥库,必须进行在线迁移。在这种情况下,迁移服务器连接到正在运行的服务器和指示它暂停钥匙操作而关键的迁移是在进步。

一个密钥迁移操作的结果是,目的地的密钥库中包含有在迁移之前的钥匙,再加上钥匙从源库。源库是相同的迁移前后因为钥匙被复制,没有感动。如果要复制已经存在于目标密钥库的关键,发生了一个错误,目的是恢复其迁移前的状态中。

用户调用服务器密钥迁移模式不能root系统的用户,必须有权限读写密钥文件。

执行密钥迁移操作,确定哪些关键的迁移选项是必需的。迁移选项说明钥匙插件,以及是否执行离线或在线迁移:

  • 表示源和目的地的钥匙圈插件,指定这些选项:

    这些选项告诉服务器运行在关键的迁移模式。这两个选项是所有密钥迁移操作的强制性。源和目的的插件必须不同,和迁移服务器必须同时支持插件。

  • 离线迁移,没有额外的密钥迁移选项是必需的。

    警告

    不执行离线迁移涉及密钥库,使用运行的服务器。

  • 一个在线迁移,一些正在运行的服务器目前使用的源或目标的密钥库。指定密钥迁移选项说明如何连接到正在运行的服务器。这是必要的,迁移服务器可以连接到正在运行的服务器,告诉它停留的钥匙圈使用迁移操作期间。

    使用下列选项意味着在线迁移:

关于密钥迁移选项的更多细节,参见第6.5.4.10,“钥匙命令选项”

确定关键的迁移选项,如刚才所描述的开始迁移服务器,可能有其他的选择。记住以下几点:

  • 其他服务器选项可能是必需的,如两匙扣插件的配置参数。例如,如果keyring_file是一个插件,您必须设置keyring_file_data系统变量如果钥匙数据文件的位置不是默认位置。其他选项可能需要以及钥匙圈。指定这些选项的一种方法是使用--defaults-file这个选项文件,包含所需的选项。

  • 如果你调用迁移服务器从不同于通常用于运行MySQL系统帐户,它会创建密匙文件或目录,在正常运行的服务器无法访问。假设mysqld运行正常的mysql系统的用户,但你调用迁移服务器同时登录为伊莎贝尔。任何新的目录或文件的迁移服务器创建将归isabel。随后的启动将失败,当服务器运行的MySQL系统的用户试图访问的文件系统对象所拥有的isabel

    为了避免这个问题,在开始迁移服务器root系统用户提供--user=user_name选项,在user_name通常用于运行MySQL系统帐户。

  • 迁移服务器预计路径名称选项的值是全路径。相对路径名可能不会如你所期望的解决。

离线密钥迁移实例的命令行:

mysqld --defaults-file=/usr/local/mysql/etc/my.cnf
  --keyring-migration-source=keyring_file.so
  --keyring-migration-destination=keyring_encrypted_file.so
  --keyring_encrypted_file_password=password

网络密钥迁移实例的命令行:

mysqld --defaults-file=/usr/local/mysql/etc/my.cnf
  --keyring-migration-source=keyring_file.so
  --keyring-migration-destination=keyring_encrypted_file.so
  --keyring_encrypted_file_password=password
  --keyring-migration-host=localhost
  --keyring-migration-user=root
  --keyring-migration-password=root_password

关键迁移服务器执行如下的迁移操作:

  1. (在线迁移)连接到正在运行的服务器使用连接选项。用于连接的帐户必须有需要修改全局的特权keyring_operations系统变量(ENCRYPTION_KEY_ADMIN此外无论是SYSTEM_VARIABLES_ADMINSUPER

  2. (在线迁移)禁用keyring_operations在运行的服务器。(运行服务器必须支持keyring_operations。)

  3. 载源和目的的钥匙圈插件。

  4. 从源到目的地的钥匙圈钥匙复制钥匙。

  5. 卸下钥匙插件

  6. (在线迁移)使keyring_operations在运行的服务器

  7. (在线迁移)断开运行的服务器。

  8. 出口.

如果在关键的迁移发生错误,被复制到目标插件的任何键都去掉,留下目标密钥不变。

重要

一个在线迁移操作,迁移服务器需要启用和禁用keyring_operations在运行的服务器。然而,如果迁移服务器存在异常(例如,如果有人强行终止它),它是可能的keyring_operations已经不会再对运行服务器启用,让它无法执行钥匙操作。在这种情况下,它可能需要连接到正在运行的服务器,使keyring_operations手动

一个成功的在线密钥迁移操作后,运行服务器可能需要重新启动:

  • 如果正在运行的服务器是使用源库,它不需要迁移后的重新启动。

  • 如果正在运行的服务器是使用源库在迁移之前要迁移后的使用目的的密钥库,它必须重新使用目的的钥匙圈插件并重启。

  • 如果正在运行的服务器是使用目标密钥并将继续使用它,它应该是在迁移到负载迁移到目的地的所有密钥密钥库重新启动。

笔记

MySQL服务器密钥迁移模式支持暂停一个正在运行的服务器。如果多个关键服务器使用所涉及的密钥进行密钥迁移,使用此程序:

  1. 手动连接到每个运行的服务器的设置keyring_operations=OFF

  2. 使用迁移服务器执行离线密钥迁移。

  3. 手动连接到每个运行的服务器的设置keyring_operations=ON

所有正在运行的服务器必须支持keyring_operations=ON系统变量

6.5.4.7支持Keyring Key Types

MySQL支持不同类型的密钥生成密匙(加密算法)和长度。可用的类型主要取决于安装的插件是钥匙圈。一个给定的插件也可以一键式密钥长度的限制。

表6.25,“钥匙插件密钥类型”总结关键类型的插件允许每匙扣。长度的单位是字节。一个关键的生成使用一个用户自定义函数(UDF)的钥匙了第6.5.4.8,“通用钥匙的密钥管理功能”,长度不能超过2048字节,由于该UDF接口的局限性。

表6.25匙扣插件的主要类型

插件名称允许Key Type允许密钥长度Key Type
keyring_encrypted_file

AES

DSA

RSA

无特殊限制

无特殊限制

无特殊限制

keyring_file

AES

DSA

RSA

无特殊限制

无特殊限制

无特殊限制

keyring_okvAES16, 24, 32
keyring_awsAES16, 24, 32

6.5.4.8通用钥匙的密钥管理功能

MySQL服务器支持一个钥匙圈服务,使内部服务器组件和插件来安全地存储敏感信息供以后检索。

MySQL服务器还包括钥匙圈钥匙管理SQL接口,作为一套通用的用户自定义函数(UDF),实现访问功能由内部的钥匙圈提供服务。keyring udf是包含在插件库文件,其中也包含了keyring_udf插件,必须启用UDF调用之前。这些能够被使用,一个钥匙圈插件等keyring_filekeyring_okv必须启用

UDFs在这里描述的是通用的,用任何钥匙插件。一个给定的钥匙圈插件可能有自己的UDF,仅用于插件;看第6.5.4.9,”插件特定的密钥的密钥管理功能”

以下各节提供的钥匙圈UDF安装说明和演示如何使用它们。关于钥匙的服务功能通过UDF调用信息,看第28.3.2,“钥匙”服务。。。。。。。通用密钥环的信息,见第6.5.4,“MySQL的钥匙”

6.5.4.8.1安装或卸载通用钥匙功能

本节介绍如何安装或卸载的用户自定义函数(UDF)钥匙圈,这是实施一个插件库文件,还包含一个keyring_udf插件关于安装或卸载插件和UDF的一般信息,看第5.6.1,“安装和卸载插件”,和第28.4.2.5,“UDF编译和安装”

钥匙圈钥匙圈的UDF使密钥管理操作,但keyring_udf插件也必须因为UDF无法正确安装工作。尝试使用UDF无keyring_udf插件导致的错误

通过将服务器可用的插件库文件必须位于MySQL插件目录(目录命名的plugin_dir系统变量)。如果有必要,设置值plugin_dir在服务器启动告诉服务器插件目录位置。

插件库文件的基名称是keyring_udf。the file name for example(后缀为平台,differs。所以UNIX和类UNIX系统,.dllWindows)

安装keyring_udf插件和UDF的使用INSTALL PLUGINCREATE FUNCTION报表(调整。所以就足够了你的平台

INSTALL PLUGIN keyring_udf SONAME 'keyring_udf.so';
CREATE FUNCTION keyring_key_generate RETURNS INTEGER SONAME 'keyring_udf.so';
CREATE FUNCTION keyring_key_fetch RETURNS STRING SONAME 'keyring_udf.so';
CREATE FUNCTION keyring_key_length_fetch RETURNS INTEGER SONAME 'keyring_udf.so';
CREATE FUNCTION keyring_key_type_fetch RETURNS STRING SONAME 'keyring_udf.so';
CREATE FUNCTION keyring_key_store RETURNS INTEGER SONAME 'keyring_udf.so';
CREATE FUNCTION keyring_key_remove RETURNS INTEGER SONAME 'keyring_udf.so';

如果插件和UDF使用主复制服务器,安装在所有从服务器以及避免复制问题。

一旦安装完毕,如刚才所描述的,这keyring_udf插件和UDF保持安装到卸载。删除它们,使用UNINSTALL PLUGINDROP FUNCTION声明:

卸载插件keyring_udf;降功能keyring_key_generate;降功能keyring_key_fetch;降功能keyring_key_length_fetch;降功能keyring_key_type_fetch;降功能keyring_key_store;降功能keyring_key_remove;
6.5.4.8.2使用通用钥匙功能

在使用用户自定义函数(UDF),钥匙圈安装根据提供的指令第6.5.4.8.1,“安装或卸载通用钥匙功能”

keyring udf是受这些约束:

  • 使用UDF的钥匙,keyring_udf插件必须启用。否则,发生了一个错误:

    错误1123(hy000):无法初始化函数keyring_key_generate’;此功能需要keyring_udf插件没有安装,请安装

    安装keyring_udf插件,看第6.5.4.8.1,“安装或卸载通用钥匙功能”

  • 钥匙圈钥匙圈的UDF调用服务函数(见第28.3.2,“钥匙”服务)。又用什么钥匙的服务功能插件安装(例如,keyring_filekeyring_okv)。因此,使用任何钥匙的UDF,一些潜在的钥匙圈插件必须启用。否则,发生了一个错误:

    ERROR 3188 (HY000): Function 'keyring_key_generate' failed because
    underlying keyring service returned an error. Please check if a
    keyring plugin is installed and that provided arguments are valid
    for the keyring you are using.
    

    安装一个钥匙圈插件,看第6.5.4.1,“钥匙插件安装”

  • 使用任何钥匙的UDF,用户必须拥有全球EXECUTE的特权。否则,错误发生。

    错误1123(hy000):无法初始化函数keyring_key_generate”;用户不能执行此功能。用户需要有执行

    授予全球EXECUTE特权用户,使用此语句:

    授予执行*。*user

    另外,你应该尽量避免让全球EXECUTE特权,同时仍允许用户访问特定的密钥管理操作,包装存储程序可以定义(一种技术,在本节后面介绍)。

  • 一个密钥存储在密钥环由给定用户可后来只有相同的用户操作。那就是,值了CURRENT_USER()在关键操作的时间函数必须具有相同的值时,关键是存储在钥匙圈。(这个约束规则为实例键全,操纵的钥匙圈UDF使用如创造的InnoDB支持表空间加密。)

    为了使多个用户在同一个键进行操作,包装存储程序可以定义(一种技术,在本节后面介绍)。

  • Keyring UDFs支持的密钥类型和长度下的插件支持,钥匙圈,钥匙不能超过字节的附加约束(16384位),由于该UDF接口的局限性。看到第6.5.4.7,“支持Keyring Key Types”

创建一个新的随机密钥并将其存储在钥匙圈,叫keyring_key_generate(),通过它的密钥ID,随着关键型(加密方法)和字节长度。下面的调用创建一个2048位DSA加密密钥命名美奇钥匙

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

一种返回值表示成功。如果钥匙不能创造,返回值是NULL和一个错误的发生。一个原因可能是潜在的钥匙圈插件不支持指定的关键字组合类型和密钥长度;看第6.5.4.7,“支持Keyring Key Types”

能够检查返回类型无论是否发生错误,使用SELECT ... INTO @var_name测试变量的值:

MySQL的&#62;SELECT keyring_key_generate('', '', -1) INTO @x;错误3188(hy000):功能keyring_key_generate失败becauseunderlying钥匙服务返回一个错误。请检查是否akeyring插件安装,设置参数适用于您正在使用的钥匙圈。MySQL &#62;SELECT @x;| ------“零X | ------ | | MySQL &#62;。SELECT keyring_key_generate('x', 'AES', 16) INTO @x;MySQL的&#62;SELECT @x;------ | @ x | | 1 |??????

这种技术也适用于其他的钥匙圈UDF,失败返回值和错误。

ID传递到keyring_key_generate()提供了一种方法,它指的是在随后的UDF的关键要求。例如,使用密钥ID作为一个字符串或字节长度为整数的检索类型:

MySQL的&#62;SELECT keyring_key_type_fetch('MyKey');--------------------------------- | keyring_key_type_fetch(&#39;mykey”)| --------------------------------- | DSA | --------------------------------- MySQL &#62;SELECT keyring_key_length_fetch('MyKey');----------------------------------- | keyring_key_length_fetch(&#39;mykey”)| ----------------------------------- | 256 | -----------------------------------

检索一个关键值,通过密钥IDkeyring_key_fetch()。下面的示例使用HEX()显示的核心价值,因为它可能包含不可打印字符。该示例还使用简洁的快捷键,但是要注意长键提供更好的安全性:

MySQL的&#62;SELECT keyring_key_generate('MyShortKey', 'DSA', 8);---------------------------------------------- | keyring_key_generate(&#39;myshortkey &#39;、&#39; DSA,8)| ---------------------------------------------- | 1 | ---------------------------------------------- MySQL &#62;SELECT HEX(keyring_key_fetch('MyShortKey'));-------------------------------------- | hex(keyring_key_fetch(&#39;myshortkey &#39;))| -------------------------------------- | 1db3b0fc3328a24c | --------------------------------------

钥匙圈UDF治疗关键ID,类型,和值的二进制字符串,所以比较是区分大小写的。例如,入侵检测MyKey的myKey引用不同的钥匙

删除一个键,通过密钥IDkeyring_key_remove()

MySQL的&#62;SELECT keyring_key_remove('MyKey');----------------------------- | keyring_key_remove(&#39;mykey”)| ----------------------------- | 1 | -----------------------------

混淆和存储您提供密钥,通过密钥ID,类型和值keyring_key_store()

MySQL的&#62;SELECT keyring_key_store('AES_key', 'AES', 'Secret string');| keyring _ ------------------------------------------------------(key _商店_ AES AES密钥,秘密,柱| ------------------------------------------------------ |)1 | ------------------------------------------------------

如前所述,用户必须具有全球EXECUTE特权给钥匙UDFs,和用户存储在密钥环的关键首先必须是相同的用户执行后续操作的关键后,确定从CURRENT_USER()每一个UDF调用有效值。允许关键操作,谁没有全球用户EXECUTE谁可能没有权限或是最关键的业主,使用这种技术:

  1. 定义包装存储程序封装所需的关键业务和有DEFINER价值等于拥有的关键

  2. 格兰特EXECUTE对于特定的存储方案,他们应该能够调用他们的个人用户特权。

  3. 如果操作的封装实现存储程序不包括密钥生成,事先创建任何必要的密钥,使用帐号命名为DEFINER在存储程序的定义

这项技术使键可在用户间共享并提供DBA更细粒度的控制谁可以做钥匙,没有给全球的特权。

下面的示例演示如何设置共享密钥命名SharedKey这是由DBA拥有,和get_shared_key()存储功能,提供当前的核心价值。该值可以由任何用户与检索EXECUTE该功能的特权,这是创造的key_schema图式

从MySQL管理帐户('root'@'localhost'在这个例子中),创建访问键的行政架构和存储功能:

MySQL的&#62;CREATE SCHEMA key_schema;MySQL的&#62;CREATE DEFINER = 'root'@'localhost'FUNCTION key_schema.get_shared_key()RETURNS BLOB READS SQL DATARETURN keyring_key_fetch('SharedKey');

从行政帐户,确保共享密钥存在:

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

从行政帐户,创建一个普通用户的帐户密钥访问被授予:

mysql> CREATE USER 'key_user'@'localhost'
       IDENTIFIED BY 'key_user_pwd';

key_user帐户验证,没有适当的EXECUTE特权,新帐户无法访问共享密钥:

MySQL的&#62;SELECT HEX(key_schema.get_shared_key());错误1370(42000):执行命令拒绝用户key_user”@ &#39;localhost&#39;for常规的key_schema get_shared_key”。

从行政帐户,格兰特EXECUTEkey_user对于存储功能:

mysql> GRANT EXECUTE ON FUNCTION key_schema.get_shared_key
       TO 'key_user'@'localhost';

key_user账户,确认的关键是现在可:

MySQL的&#62;SELECT HEX(key_schema.get_shared_key());---------------------------------- | hex(key_schema。get_shared_key())| ---------------------------------- | 9bafb9e75ceeb013 | ----------------------------------
6.5.4.8.3通用钥匙圈函数参考

每个通用钥匙的用户定义函数(UDF),本节描述了它的目的,调用序列,和返回值。关于这些UDF可以调用条件的信息,参见6.5.4.8.2”部分,采用通用钥匙功能”

  • keyring_key_fetch()

    给定一个密钥ID,deobfuscates和回报的关键值。

    语法:

    STRING keyring_key_fetch(STRING key_id)
    

    争论:

    • key_id在关键的ID字符串

    返回值:

    返回值成功的关键,NULL如果该键不存在,或无效的和失败的错误

    笔记

    钥匙圈值检索使用keyring_key_fetch()限制为2048字节,由于该UDF接口的局限性。一个钥匙圈价值比长度可以用一个钥匙圈服务功能存储更长(见第28.3.2,“钥匙”服务),但如果检索使用keyring_key_fetch()锥尾两个2048个字节。

    例子:

    mysql> SELECT keyring_key_generate('RSA_key', 'RSA', 16);
    +--------------------------------------------+
    | keyring_key_generate('RSA_key', 'RSA', 16) |
    +--------------------------------------------+
    |                                          1 |
    +--------------------------------------------+
    mysql> SELECT HEX(keyring_key_fetch('RSA_key'));
    +-----------------------------------+
    | HEX(keyring_key_fetch('RSA_key')) |
    +-----------------------------------+
    | 91C2253B696064D3556984B6630F891A  |
    +-----------------------------------+
    mysql> SELECT keyring_key_type_fetch('RSA_key');
    +-----------------------------------+
    | keyring_key_type_fetch('RSA_key') |
    +-----------------------------------+
    | RSA                               |
    +-----------------------------------+
    mysql> SELECT keyring_key_length_fetch('RSA_key');
    +-------------------------------------+
    | keyring_key_length_fetch('RSA_key') |
    +-------------------------------------+
    |                                  16 |
    +-------------------------------------+
    

    该示例使用HEX()显示的核心价值,因为它可能包含不可打印字符。该示例还使用简洁的快捷键,但是要注意长键提供更好的安全性。

  • keyring_key_generate()

    生成一个给定的ID,类型,新的随机密钥的长度,并将其存储在钥匙圈。的类型和长度的值必须是由下面的钥匙圈插件支持的值一致,用钥匙不能超过2048字节的附加约束(16384位),由于该UDF接口的局限性。对于允许的类型/插件,看第28.3.2,“钥匙”服务

    语法:

    STRING keyring_key_generate(STRING key_id, STRING key_type, INTEGER key_length)
    

    争论:

    • key_id在关键的ID字符串

    • key_type:键类型为字符串

    • key_length:在字节的密钥长度为整数。最大长度为2048。

    返回值:

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

    例子:

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

    给定一个密钥ID,返回键的长度。

    语法:

    INTEGER keyring_key_length_fetch(STRING key_id)
    

    争论:

    • key_id在关键的ID字符串

    返回值:

    作为成功的一个整数返回字节密钥长度,NULL如果该键不存在,或无效的和失败的错误

    例子:

    看到的描述keyring_key_fetch()

  • keyring_key_remove()

    移除与给定ID从钥匙圈钥匙。

    语法:

    INTEGER keyring_key_remove(STRING key_id)
    

    争论:

    • key_id在关键的ID字符串

    返回值:

    返回1成功,或NULL失败

    例子:

    mysql> SELECT keyring_key_remove('AES_key');
    +-------------------------------+
    | keyring_key_remove('AES_key') |
    +-------------------------------+
    |                             1 |
    +-------------------------------+
    
  • keyring_key_store()

    混淆和存储在密钥环的关键。

    语法:

    INTEGER keyring_key_store(STRING key_id, STRING key_type, STRING key)
    

    争论:

    • key_id在关键的ID字符串

    • key_type:键类型为字符串

    • key的关键值的字符串

    返回值:

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

    例子:

    mysql> SELECT keyring_key_store('new key', 'DSA', 'My key value');
    +-----------------------------------------------------+
    | keyring_key_store('new key', 'DSA', 'My key value') |
    +-----------------------------------------------------+
    |                                                   1 |
    +-----------------------------------------------------+
    
  • keyring_key_type_fetch()

    给定一个密钥ID,返回键类型。

    语法:

    STRING keyring_key_type_fetch(STRING key_id)
    

    争论:

    • key_id在关键的ID字符串

    返回值:

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

    例子:

    看到的描述keyring_key_fetch()

6.5.4.9插件特定的密钥的密钥管理功能

每一个钥匙圈插件特定的用户定义函数(UDF),本节描述了它的目的,调用序列,和返回值。关于通用钥匙UDF的信息,参见第6.5.4.8,“通用钥匙的密钥管理功能”

  • keyring_aws_rotate_cmk()

    这是与keyring_aws插件它的使用要求SUPER特权

    keyring_aws_rotate_cmk()旋转的掌握客户的关键(CMK)。旋转变化,AWS的KMS使用后续数据加密运算的关键。AWS公里保持以前的博文的版本,所以密钥生成旋转后继续使用以前的新升电子厂解密。

    旋转的变化在AWS的KMS使用CMK值但不改变指的是它的ID,所以不需要改变keyring_aws_cmk_id系统变量在调用keyring_aws_rotate_cmk()

    语法:

    INTEGER keyring_aws_rotate_cmk()
    

    争论:

    返回值:

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

  • keyring_aws_rotate_keys()

    这是与keyring_aws插件它的使用要求SUPER特权

    keyring_aws_rotate_keys()存储在钥匙转动keyring_aws存储文件命名的keyring_aws_data_file系统变量。旋转发送一个密钥存储在文件系统使用AWS的价值重新加密keyring_aws_cmk_id系统变量的值为CMK、纽约和存储加密密钥的文件。

    keyring_aws_rotate_keys()用于密钥重新加密的情况下:

    • 旋转的博文后,通过调用;keyring_aws_rotate_cmk()UDF

    • 在改变keyring_aws_cmk_id系统变量不同的关键值

    语法:

    INTEGER keyring_aws_rotate_keys()
    

    争论:

    返回值:

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

6.5.4.10钥匙命令选项

MySQL支持以下的钥匙圈相关的命令行选项:

6.5.4.11钥匙系统变量

MySQL的钥匙圈插件支持下列系统变量。用它来配置插件操作钥匙圈。这些变量是不可用,除非安装相应的插件(见钥匙圈第6.5.4.1,“钥匙插件安装”

  • keyring_aws_cmk_id

    财产价值
    命令行格式--keyring-aws-cmk-id
    介绍8.0.11
    系统变量keyring_aws_cmk_id
    范围全球
    动态
    看到的是_提示应用
    类型字符串

    客户的主密钥(CMK)身份获得AWS的KMS服务器和使用的keyring_aws插件这个变量是不可用,除非是安装插件,但是如果是安装,这个变量的值是强制性的。

  • keyring_aws_conf_file

    财产价值
    命令行格式--keyring-aws-conf-file
    介绍8.0.11
    系统变量keyring_aws_conf_file
    范围全球
    动态
    看到的是_提示应用
    类型文件名
    默认值platform specific

    对配置文件的位置keyring_aws钥匙圈插件。这个变量是不可用,除非是安装插件。

    在插件启动,keyring_aws将AWS秘密访问键ID和密钥配置文件。对于keyring_aws插件启动成功,配置文件必须存在并且包含有效的秘密访问关键信息,初始化为描述第6.5.4.5,“用keyring_aws Amazon Web Services的钥匙圈插件”

    默认的文件名是keyring_aws_conf,位于默认密钥环文件目录。这个默认目录的位置是在同一keyring_file_data系统变量。看那变化的细节描述,以及考虑考虑,如果你手动创建目录。

  • keyring_aws_data_file

    财产价值
    命令行格式--keyring-aws-data-file
    介绍8.0.11
    系统变量keyring_aws_data_file
    范围全球
    动态
    看到的是_提示应用
    类型文件名
    默认值platform specific

    用于存储文件的位置keyring_aws钥匙圈插件。这个变量是不可用,除非是安装插件。

    在插件启动时,如果指定的值keyring_aws_data_file指定的文件不存在,该keyring_aws插件试图创建它(以及它的父目录,如果必要的话)。如果文件不存在,keyring_aws读取任何加密密钥文件中包含的内存缓存。keyring_aws不在内存缓存中未加密的钥匙。

    默认的文件名是keyring_aws_data,位于默认密钥环文件目录。这个默认目录的位置是在同一keyring_file_data系统变量。看那变化的细节描述,以及考虑考虑,如果你手动创建目录。

  • keyring_aws_region

    财产价值
    命令行格式--keyring-aws-region
    介绍8.0.11
    系统变量keyring_aws_region
    范围全球
    动态
    看到的是_提示应用
    类型枚举
    默认值us-east-1
    有效值

    ap-northheast-1

    ap-northheast-2

    ap-south-1

    ap-southeast-1

    ap-southeast-2

    eu-central-1

    eu-west-1

    sa-east-1

    us-east-1

    us-west-1

    us-west-2

    AWS区域

  • keyring_encrypted_file_data

    财产价值
    命令行格式--keyring-encrypted-file-data=file_name
    介绍8.0.11
    系统变量keyring_encrypted_file_data
    范围全球
    动态
    看到的是_提示应用
    类型文件名
    默认值platform specific

    数据的路径名的文件用于数据的安全存储keyring_encrypted_file插件这个变量是不可用,除非是安装插件。文件位置应在目录中只使用了插件是钥匙圈。例如,不能将数据目录下的文件。

    钥匙操作的事务:keyring_encrypted_file插件使用备份文件中以确保它可以回滚到原始文件的写操作,如果手术失败。备份文件的名字和值的相同keyring_encrypted_file_data以系统变量备份

    不要使用相同的keyring_encrypted_file对于多个MySQL实例的数据文件。每个实例都应该有自己独特的数据文件。

    默认的文件名是keyring_encrypted,位于一个目录,具体取决于平台的价值INSTALL_LAYOUTCMake选项,如下表所示。指定文件的默认目录明确如果你从源代码构建,使用INSTALL_MYSQLKEYRINGDIRCMake选项

    INSTALL_LAYOUT价值默认keyring_encrypted_file_data价值
    DEBSLESsvr4/var/lib/mysql-keyring/keyring_encrypted
    否则keyring/keyring_encryptedCMAKE_INSTALL_PREFIX价值

    在插件启动时,如果指定的值keyring_encrypted_file_data指定的文件不存在,该keyring_encrypted_file插件试图创建它(以及它的父目录,如果必要的话)。

    如果你手动创建目录,它应该有一个限制性的模式,仅用于运行MySQL服务器的帐户访问。例如,在UNIX和类UNIX系统中,使用/usr/local/mysql/mysql-keyring目录,下面的命令(执行root)创建目录,并设置其模式和所有权:

    cd /usr/local/mysql
    mkdir mysql-keyring
    chmod 750 mysql-keyring
    chown mysql mysql-keyring
    chgrp mysql mysql-keyring
    

    如果keyring_encrypted_file插件无法创建或访问它的数据文件,它写一个错误的信息,错误日志。如果试图运行时分配keyring_encrypted_file_data在一个错误的结果,变量的值保持不变。

    重要

    一旦keyring_encrypted_file插件创建数据文件并开始使用,重要的是不要删除文件。文件的丢失会造成数据加密使用的密钥无法访问。(这是允许重命名或移动文件,只要改变你的价值keyring_encrypted_file_data匹配。)

  • keyring_encrypted_file_password

    财产价值
    命令行格式--keyring-encrypted-file-password=password
    介绍8.0.11
    系统变量keyring_encrypted_file_password
    范围全球
    动态
    看到的是_提示应用

    使用的密码keyring_encrypted_file插件这个变量是不可用,除非是安装插件。密码是强制性插件操作;如果没有指定在服务器启动,keyring_encrypted_file初始化失败

    如果这个变量是一个选项指定的文件,文件应该有一个限制性的模式,仅用于运行MySQL服务器的帐户访问。

    重要

    一旦keyring_encrypted_file_password值已设置,改变它不转动钥匙的密码,可以使服务器无法访问。如果提供的是一个不正确的密码,keyring_encrypted_file插件无法加载密钥加密密钥环文件。

    密码值不能在运行时显示SHOW VARIABLES或性能Schenaglobal_variables表的显示值是模糊的因为。

  • keyring_file_data

    财产价值
    命令行格式--keyring-file-data=file_name
    系统变量keyring_file_data
    范围全球
    动态
    看到的是_提示应用
    类型文件名
    默认值platform specific

    数据的路径名的文件用于数据的安全存储keyring_file插件这个变量是不可用,除非是安装插件。文件位置应在目录中只使用了插件是钥匙圈。例如,不能将数据目录下的文件。

    钥匙操作的事务:keyring_file插件使用备份文件中以确保它可以回滚到原始文件的写操作,如果手术失败。备份文件的名字和值的相同keyring_file_data以系统变量备份

    不要使用相同的keyring_file对于多个MySQL实例的数据文件。每个实例都应该有自己独特的数据文件。

    默认的文件名是keyring,位于一个目录,具体取决于平台的价值INSTALL_LAYOUTCMake选项,如下表所示。指定文件的默认目录明确如果你从源代码构建,使用INSTALL_MYSQLKEYRINGDIRCMake选项

    INSTALL_LAYOUT价值默认keyring_file_data价值
    DEBSLESsvr4/var/lib/mysql-keyring/keyring
    否则keyring/keyringCMAKE_INSTALL_PREFIX价值

    在插件启动时,如果指定的值keyring_file_data指定的文件不存在,该keyring_file插件试图创建它(以及它的父目录,如果必要的话)。

    如果你手动创建目录,它应该有一个限制性的模式,仅用于运行MySQL服务器的帐户访问。例如,在UNIX和类UNIX系统中,使用/usr/local/mysql/mysql-keyring目录,下面的命令(执行root)创建目录,并设置其模式和所有权:

    cd /usr/local/mysql
    mkdir mysql-keyring
    chmod 750 mysql-keyring
    chown mysql mysql-keyring
    chgrp mysql mysql-keyring
    

    如果keyring_file插件无法创建或访问它的数据文件,它写一个错误的信息,错误日志。如果试图运行时分配keyring_file_data在一个错误的结果,变量的值保持不变。

    重要

    一旦keyring_file插件创建数据文件并开始使用,重要的是不要删除文件。例如,InnoDB使用文件来存储用于解密表中的数据,使用主密钥InnoDB表空间加密;看第15.7.11,“InnoDB表空间加密”。文件的丢失会造成这样的表的数据无法访问。(这是允许重命名或移动文件,只要改变你的价值keyring_file_data匹配。)建议您创建一个单独的密钥数据备份文件后立即创建第一个加密表前和万能钥匙旋转后。

  • keyring_okv_conf_dir

    财产价值
    命令行格式--keyring-okv-conf-dir=dir_name
    介绍8.0.11
    系统变量keyring_okv_conf_dir
    范围全球
    动态
    看到的是_提示应用
    类型目录名称
    默认值empty string

    存储配置信息的目录的路径名keyring_okv插件这个变量是不可用,除非是安装插件。位置应该是一个目录只使用了考虑keyring_okv插件例如,不能将数据目录下的目录。

    默认的keyring_okv_conf_dir值为空。对于keyring_okv插件能够访问Oracle密钥库,该值必须设置为一个目录包含Oracle密钥库配置SSL的材料。有关设置该目录的说明,见第6.5.4.4,“用keyring_okv KMIP插件”

    目录中应该有一个限制性的模式,仅用于运行MySQL服务器的帐户访问。例如,在UNIX和类UNIX系统中,使用/usr/local/mysql/mysql-keyring-okv目录,下面的命令(执行root)创建目录,并设置其模式和所有权:

    cd /usr/local/mysql
    mkdir mysql-keyring-okv
    chmod 750 mysql-keyring-okv
    chown mysql mysql-keyring-okv
    chgrp mysql mysql-keyring-okv
    

    如果指定的值keyring_okv_conf_dir指定的目录不存在,或不包含配置信息,使连接到Oracle密钥库被建立,keyring_okv写一个错误的信息,错误日志。如果试图运行时分配keyring_okv_conf_dir在一个错误的结果,变量值和钥匙操作保持不变。

  • keyring_operations

    财产价值
    介绍8.0.4
    系统变量keyring_operations
    范围全球
    动态
    看到的是_提示应用
    类型布尔
    默认值ON

    是否启用钥匙操作。这个变量是密钥迁移操作过程中使用的。看到第6.5.4.6,“迁徙的键之间的Keyring Keystores”。需要修改这个变量的权限ENCRYPTION_KEY_ADMIN此外无论是SYSTEM_VARIABLES_ADMINSUPER

6.5.5 MySQL企业审计

笔记

MySQL企业审计是一个扩展包含在MySQL企业版,商业产品。要了解更多关于商业产品,看http://www.mysql.com /产品/

MySQL企业版包括MySQL企业审计,实现服务器插件命名audit_log。MySQL企业审计采用开放API使MySQL审计标准,基于策略的监控,记录,和阻断连接和查询活动具体执行MySQL服务器。为了满足Oracle审计规范,MySQL企业审计提供了一个开箱,易于使用的审计与合规解决方案是由内部和外部的监管准则的应用。

安装时,审计插件允许MySQL服务器产生一个包含服务器活动的审计记录日志文件。日志内容包括当客户端连接和断开,和什么样的行动,他们的表现而连接,例如,数据库和表的访问。

你安装插件后(见审计第6.5.5.2,“安装或卸载MySQL企业审计”),写一个日志文件。默认情况下,文件名为audit.log在服务器数据目录。改变文件的名字,设置audit_log_file在服务器启动系统变量。

默认情况下,日志文件的内容写入新的XML格式,无压缩或加密。选择文件格式设置audit_log_format在服务器启动系统变量。对文件的格式和内容的详细信息,参见第6.5.5.4,审计日志文件格式”

关于如何控制记录发生的更多信息,包括审计日志文件命名格式选择,看第6.5.5.5,审计日志记录控制”。执行审计事件过滤,看第6.5.5.6,审计日志过滤”。用于配置审计日志插件的参数描述,看第6.5.5.8.4,审计日志选项和变量”

如果审计日志插件启用,性能架构(见第25章,MySQL性能模式它具有仪器)。确定相关的仪器,用这个查询:

SELECT NAME FROM performance_schema.setup_instruments
WHERE NAME LIKE '%/alog/%';

6.5.5.1审计日志组件

MySQL企业审计是基于审计日志插件及相关部件:

  • 服务器端插件命名audit_log探讨审计事件和决定写他们的审计日志。

  • 用户定义的函数可以过滤定义控制日志行为操作,加密密码,和日志文件的读取。

  • 表中的mysql系统数据库提供过滤器和用户帐户数据的持久性存储。

  • 系统变量,使审计日志的配置和状态变量的运行提供操作信息。

  • 一个AUDIT_ADMIN特权使用户管理审核日志。

6.5.5.2安装或卸载MySQL企业审计

本节介绍如何安装或卸载MySQL企业审计,这是使用审核日志插件和相关组件的描述第6.5.5.1,审计日志组件”。关于安装插件的一般信息,看第5.6.1,“安装和卸载插件”

笔记

如果安装的audit_log插件是一些最小的开销即使禁用。为了避免这种开销,不安装MySQL企业审计,除非你想用它。

通过将服务器可用的插件库文件必须位于MySQL插件目录(目录命名的plugin_dir系统变量)。如果有必要,设置值plugin_dir在服务器启动告诉服务器插件目录位置。

安装MySQL企业审计,看在share你的MySQL安装目录选择脚本,是适合你的平台。可用的脚本用来指插件库文件的后缀是不同的:

  • audit_log_filter_win_install.sql:选择此脚本使用Windows系统dllas the file name的后缀。

  • audit_log_filter_linux_install.sql:选择此脚本使用Linux系统和类似系统。所以as the file name的后缀。

运行脚本如下。这里的例子使用Linux的安装脚本。对你的系统进行相应的替代。

shell> mysql -u root -p < audit_log_filter_linux_install.sql
Enter password: (enter root password here)
笔记

在MySQL 8.0.12,新的MySQL的安装,USER主机列中的audit_log_user通过MySQL企业审计表有定义好对应的定义用户Host列中的mysql.user系统表。升级到一个MySQL企业审计已经安装的安装,建议您修改表的定义如下:

ALTER TABLE mysql.audit_log_user
  DROP FOREIGN KEY audit_log_user_ibfk_1;
ALTER TABLE mysql.audit_log_filter
  CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_as_ci;
ALTER TABLE mysql.audit_log_user
  CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_as_ci;
ALTER TABLE mysql.audit_log_user
  MODIFY COLUMN USER VARCHAR(32);
ALTER TABLE mysql.audit_log_user
  ADD FOREIGN KEY (FILTERNAME) REFERENCES mysql.audit_log_filter(NAME);

to verify the插件安装,检查INFORMATION_SCHEMA.PLUGINS表或使用SHOW PLUGINS声明(见第2,“获取服务器插件的信息”)。例如:

mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
       FROM INFORMATION_SCHEMA.PLUGINS
       WHERE PLUGIN_NAME LIKE 'audit%';
+-------------+---------------+
| PLUGIN_NAME | PLUGIN_STATUS |
+-------------+---------------+
| audit_log   | ACTIVE        |
+-------------+---------------+

如果插件初始化失败,检查诊断消息服务器错误日志。

安装MySQL企业审核后,您可以使用--audit-log随后服务器启动控制选项audit_log插件的激活。例如,为了阻止插件被删除在运行时,使用此选项:

[mysqld]
audit-log=FORCE_PLUS_PERMANENT

如果想要防止服务器运行未经审计的插件,使用--audit-log一个值FORCE_PLUS_PERMANENT强制服务器启动如果插件没有初始化成功失败。

重要

默认情况下,以规则为基础的审计日志过滤日志的任何用户不可审计事件。这不同于传统的审计日志的行为,记录所有用户的所有可审计事件(见第6.5.5.7,“传统模式的审计日志过滤”)。如果你想产生规则过滤日志的一切行为,创建一个简单的过滤器,使测井和分配的默认帐户:

SELECT audit_log_filter_set_filter('log_all', '{ "filter": { "log": true } }');
SELECT audit_log_filter_set_user('%', 'log_all');

分配给过滤器%用于从任何帐户,没有显式地指定过滤器连接(最初是真正的所有账户)。

一旦安装如前所述,MySQL企业审计仍然安装到卸载。将其删除,执行下面的语句:

DROP TABLE IF EXISTS mysql.audit_log_filter;
DROP TABLE IF EXISTS mysql.audit_log_user;
UNINSTALL PLUGIN audit_log;
DROP FUNCTION audit_log_filter_set_filter;
DROP FUNCTION audit_log_filter_remove_filter;
DROP FUNCTION audit_log_filter_set_user;
DROP FUNCTION audit_log_filter_remove_user;
DROP FUNCTION audit_log_filter_flush;
DROP FUNCTION audit_log_encryption_password_get;
DROP FUNCTION audit_log_encryption_password_set;
DROP FUNCTION audit_log_read;
DROP FUNCTION audit_log_read_bookmark;

6.5.5.3 MySQL企业审计的安全注意事项

默认情况下,审计日志文件的日志插件制作的内容是不加密的,可能包含敏感信息,如SQL语句的文本。出于安全原因,审计日志文件应该被写入目录只能访问MySQL服务器和用户提供了一个正当的理由来查看日志。默认的文件名是audit.log在数据目录。这可以通过设置audit_log_file在服务器启动系统变量。其他审计日志文件可能存在由于日志旋转。

对于额外的安全性,使审计日志文件加密。看到审核日志文件加密

6.5.5.4审计日志文件格式

MySQL服务器调用日志插件写入日志文件的审核记录审核事件发生时。通常第一个审计记录编写插件启动后,包含服务器的描述和启动选项。以下那一个元素代表事件如客户端连接和断开的事件,执行SQL语句,等等。只有顶层的陈述记录,不是语句内存储的程序如触发器或存储过程。通过这样的语句引用的文件内容LOAD DATA INFILE没有登录

选择日志格式,审核日志插件使用写日志文件,设置audit_log_format在服务器启动系统变量。这些格式都可以:

默认情况下,日志文件的内容写入新的XML格式,无压缩或加密。

笔记

在考虑改变日志格式时,关于问题的信息,参见审计日志文件格式

以下各节描述了可用的审计日志格式:

旧式的XML日志文件格式

这里是老式的XML格式的日志文件(样本audit_log_format=OLD),而略为可读性:

<?xml version="1.0" encoding="gb3212"?><AUDIT>  <AUDIT_RECORD    TIMESTAMP="2017-10-16T14:25:00 UTC"    RECORD_ID="1_2017-10-16T14:25:00"    NAME="Audit"    SERVER_ID="1"    VERSION="1"    STARTUP_OPTIONS="--port=3306"    OS_VERSION="i686-Linux"    MYSQL_VERSION="5.7.21-log"/>  <AUDIT_RECORD    TIMESTAMP="2017-10-16T14:25:24 UTC"    RECORD_ID="2_2017-10-16T14:25:00"    NAME="Connect"    CONNECTION_ID="4"    STATUS="0"    STATUS_CODE="0"    USER="root"    OS_LOGIN=""    HOST="localhost"    IP="127.0.0.1"    COMMAND_CLASS="connect"    CONNECTION_TYPE="SSL/TLS"    PRIV_USER="root"    PROXY_USER=""    DB="test"/>...  <AUDIT_RECORD    TIMESTAMP="2017-10-16T14:25:24 UTC"    RECORD_ID="6_2017-10-16T14:25:00"    NAME="Query"    CONNECTION_ID="4"    STATUS="0"    STATUS_CODE="0"    USER="root[root] @ localhost [127.0.0.1]"    OS_LOGIN=""    HOST="localhost"    IP="127.0.0.1"    COMMAND_CLASS="drop_table"    SQLTEXT="DROP TABLE IF EXISTS t"/>...  <AUDIT_RECORD    TIMESTAMP="2017-10-16T14:25:24 UTC"    RECORD_ID="8_2017-10-16T14:25:00"    NAME="Quit"    CONNECTION_ID="4"    STATUS="0"    STATUS_CODE="0"    USER="root"    OS_LOGIN=""    HOST="localhost"    IP="127.0.0.1"    COMMAND_CLASS="connect"    CONNECTION_TYPE="SSL/TLS"/>  <AUDIT_RECORD    TIMESTAMP="2017-10-16T14:25:32 UTC"    RECORD_ID="12_2017-10-16T14:25:00"    NAME="NoAudit"    SERVER_ID="1"/></AUDIT>

审计日志文件写入XML,使用gb3212(每个字符4个字节)。根元素<AUDIT>。根元素包含<AUDIT_RECORD>元素,其中每个提供关于审计事件信息。当审计日志插件开始写入一个新的日志文件,编写XML声明开放<AUDIT>根元素标签。当插件关闭日志文件,它将关闭</AUDIT>根元素标签。结束标记不存在而打开的文件。

属性<AUDIT_RECORD>具有这些特征的元素:

  • 一些属性出现在每一个<AUDIT_RECORD>元素别人都是可选的,可以根据审计记录类型。

  • 在一个属性的顺序<AUDIT_RECORD>元是没有保证的

  • 属性值是不固定长度。长值可能被截断在属性描述表明了以后。

  • 这个<&#62;",和&#38;字符编码为&lt;&#62;&quot;,和&#38;,分别。nul字节(U 00)被编码为?人物

  • 文字不是有效的XML字符编码使用数字字符引用。有效的XML字符:

    #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
    

下面的属性都是强制性的<AUDIT_RECORD>元素:

  • NAME

    一个字符串,生成审核事件类型指令,如命令,从客户端接收服务器。

    例子:NAME="Query"

    一些常见的NAME价值观:

    审计在审计开始,这可能是服务器启动timeconnect当一个客户端连接,也被称为记录查询的SQL语句(直接执行SQL语句)制备制备;其次是SQL语句的执行executeexecute;通常遵循prepareshutdown服务器shutdownquit当客户disconnectsnoaudit审计已关闭

    可能的值Auditbinlog转储Change user接近地Connect Out连接Create DB守护进程Debug延迟插入Drop DB执行Fetch字段列表Init DBLong DataNOAUDITPing准备Processlist查询Quit刷新Register Slave重置为Set option关机Sleep统计Table Dump时间

    除了"Audit"“NoAudit”,这些值对应于COM_xxx上市的指令值我_ command.hHeader file .For example,"Create DB"“更改用户”对应COM_CREATE_DBcom_change_user,分别

  • RECORD_ID

    对审计记录的唯一标识符。该值是从一个序列号和时间戳的格式组成,SEQ_TIMESTAMP。当审计日志插件打开审计日志文件,初始化序列号的审计日志文件的大小,然后递增序列的每个记录记录1。时间戳是UTC的价值YYYY-MM-DDThh:mm:ss格式显示日期和时间,审核日志插件打开文件。

    例子:RECORD_ID="12_2017-10-16T14:25:00"

  • TIMESTAMP

    一个字符串,UTC的价值YYYY-MM-DDThh:mm:ss UTC格式表示的日期和时间当审计事件发生。例如,对应于从客户端收到一个SQL语句执行的事件有时间戳语句结束后发生的价值,不在接收时。

    例子:TIMESTAMP="2017-10-16T14:25:32 UTC"

下面的属性是可选的<AUDIT_RECORD>元素他们中的许多人只发生在特定值的元素姓名属性

  • COMMAND_CLASS

    一个字符串,指示该类型执行的操作。

    例子:COMMAND_CLASS="drop_table"

    该值对应的statement/sql/xxx指令计数器;例如,xxxdrop_tableselectDROP TABLESELECT报表,分别。下面的语句显示可能的名字:

    选择替换(event_name,声明/ SQL / &#39;,&#39;)是从performance_schema.events_statements_summary_global_by_event_namewhere event_name喜欢声明/ SQL / %是的名字;
  • CONNECTION_ID

    一个无符号整数表示客户端连接标识符。这是返回的值相同CONNECTION_ID()在会话功能

    例子:CONNECTION_ID="127"

  • CONNECTION_TYPE

    在连接到服务器的安全状态。允许值TCP/IP(TCP/IP建立了未加密的连接),SSL / TLS(TCP/IP建立加密连接),Socket(UNIX套接字文件连接),命名管道(Windows命名管道连接),和Shared Memory(Windows共享内存连接)。

    例子:CONNECTION_TYPE="SSL/TLS"

  • DB

    一个字符串,默认的数据库名称。

    例子:DB="test"

  • HOST

    一个字符串,客户端的主机名。

    例子:HOST="localhost"

  • IP

    一个字符串,客户端的IP地址。

    例子:IP="127.0.0.1"

  • MYSQL_VERSION

    一个字符串,MySQL服务器版本。这是该值相同VERSION()函数或version系统变量

    例子:MYSQL_VERSION="5.7.21-log"

  • OS_LOGIN

    一个字符串,在认证过程中使用的外部用户的名字,如设置用于验证客户端插件。与本地(内置)MySQL认证,或如果插件没有设置的值,该属性是空的。价值是相同的external_user系统变量(参见第6.3.11”代理用户”

    例子:OS_LOGIN="jeffrey"

  • OS_VERSION

    一个字符串的操作系统的服务器上建立和运行。

    例子:OS_VERSION="x86_64-Linux"

  • PRIV_USER

    一个字符串,用户服务器认证客户端。这是服务器使用权限检查用户的名字,它可能不同于USER价值

    例子:PRIV_USER="jeffrey"

  • PROXY_USER

    一个字符串,代理用户(见第6.3.11”代理用户”)。如果用户代理是不起作用的价值是空的。

    例子:PROXY_USER="developer"

  • SERVER_ID

    一个无符号整数表示服务器ID。这是该值相同server_id系统变量

    例子:SERVER_ID="1"

  • SQLTEXT

    一个字符串,一个SQL语句的文本。该值可以是空的。长值可能被截断。字符串,如审计日志文件本身,是用gb3212(每个字符4个字节),所以价值可转换的结果。例如,原来的声明可能是从客户端接收到的字符串作为SJIS。

    例子:SQLTEXT="DELETE FROM t1"

  • STARTUP_OPTIONS

    一个字符串的选项,在命令行给出或选项中的文件时,MySQL服务器启动。

    例子:STARTUP_OPTIONS="--port=3306 --log-output=FILE"

  • STATUS

    一个无符号整数表示命令状态:0成功,返回非零值时发生了一个错误。这是该值相同mysql_errno()C API函数。看到描述状态代码关于它是如何不同于STATUS

    审计日志不包含SQLSTATE值或错误消息。看到不同的错误代码,该协会SQLSTATE值,和消息,看到第三,“服务器错误代码和消息”

    警告还没有登录

    例子:STATUS="1051"

  • STATUS_CODE

    一个无符号整数表示命令状态:0成功,1如果出现了一个错误。

    这个STATUS_CODEValue Differs from the地位价值:STATUS_CODE0错误的成功和1,这与审计室ez_collector消费兼容。地位是的价值mysql_errno()C API函数。这是为成功和非零误差,因而未必是一错误。

    例子:STATUS_CODE="0"

  • USER

    一个字符串,客户端发送的用户名。这可能与PRIV_USER价值

  • VERSION

    一个无符号整数表示的审计日志文件格式的版本。

    例子:VERSION="1"

新样式的XML日志文件格式

这里是新型的XML格式的日志文件(样本audit_log_format=NEW),而略为可读性:

<?xml version="1.0" encoding="gb3212"?><AUDIT> <AUDIT_RECORD>  <TIMESTAMP>2017-10-16T14:06:33 UTC</TIMESTAMP>  <RECORD_ID>1_2017-10-16T14:06:33</RECORD_ID>  <NAME>Audit</NAME>  <SERVER_ID>1</SERVER_ID>  <VERSION>1</VERSION>  <STARTUP_OPTIONS>/usr/local/mysql/bin/mysqld    --socket=/usr/local/mysql/mysql.sock    --port=3306</STARTUP_OPTIONS>  <OS_VERSION>i686-Linux</OS_VERSION>  <MYSQL_VERSION>5.7.21-log</MYSQL_VERSION> </AUDIT_RECORD> <AUDIT_RECORD>  <TIMESTAMP>2017-10-16T14:09:38 UTC</TIMESTAMP>  <RECORD_ID>2_2017-10-16T14:06:33</RECORD_ID>  <NAME>Connect</NAME>  <CONNECTION_ID>5</CONNECTION_ID>  <STATUS>0</STATUS>  <STATUS_CODE>0</STATUS_CODE>  <USER>root</USER>  <OS_LOGIN/>  <HOST>localhost</HOST>  <IP>127.0.0.1</IP>  <COMMAND_CLASS>connect</COMMAND_CLASS>  <CONNECTION_TYPE>SSL/TLS</CONNECTION_TYPE>  <PRIV_USER>root</PRIV_USER>  <PROXY_USER/>  <DB>test</DB> </AUDIT_RECORD>... <AUDIT_RECORD>  <TIMESTAMP>2017-10-16T14:09:38 UTC</TIMESTAMP>  <RECORD_ID>6_2017-10-16T14:06:33</RECORD_ID>  <NAME>Query</NAME>  <CONNECTION_ID>5</CONNECTION_ID>  <STATUS>0</STATUS>  <STATUS_CODE>0</STATUS_CODE>  <USER>root[root] @ localhost [127.0.0.1]</USER>  <OS_LOGIN/>  <HOST>localhost</HOST>  <IP>127.0.0.1</IP>  <COMMAND_CLASS>drop_table</COMMAND_CLASS>  <SQLTEXT>DROP TABLE IF EXISTS t</SQLTEXT> </AUDIT_RECORD>... <AUDIT_RECORD>  <TIMESTAMP>2017-10-16T14:09:39 UTC</TIMESTAMP>  <RECORD_ID>8_2017-10-16T14:06:33</RECORD_ID>  <NAME>Quit</NAME>  <CONNECTION_ID>5</CONNECTION_ID>  <STATUS>0</STATUS>  <STATUS_CODE>0</STATUS_CODE>  <USER>root</USER>  <OS_LOGIN/>  <HOST>localhost</HOST>  <IP>127.0.0.1</IP>  <COMMAND_CLASS>connect</COMMAND_CLASS>  <CONNECTION_TYPE>SSL/TLS</CONNECTION_TYPE> </AUDIT_RECORD>... <AUDIT_RECORD>  <TIMESTAMP>2017-10-16T14:09:43 UTC</TIMESTAMP>  <RECORD_ID>11_2017-10-16T14:06:33</RECORD_ID>  <NAME>Quit</NAME>  <CONNECTION_ID>6</CONNECTION_ID>  <STATUS>0</STATUS>  <STATUS_CODE>0</STATUS_CODE>  <USER>root</USER>  <OS_LOGIN/>  <HOST>localhost</HOST>  <IP>127.0.0.1</IP>  <COMMAND_CLASS>connect</COMMAND_CLASS>  <CONNECTION_TYPE>SSL/TLS</CONNECTION_TYPE> </AUDIT_RECORD> <AUDIT_RECORD>  <TIMESTAMP>2017-10-16T14:09:45 UTC</TIMESTAMP>  <RECORD_ID>12_2017-10-16T14:06:33</RECORD_ID>  <NAME>NoAudit</NAME>  <SERVER_ID>1</SERVER_ID> </AUDIT_RECORD></AUDIT>

审计日志文件写入XML,使用gb3212(每个字符4个字节)。根元素<AUDIT>。根元素包含<AUDIT_RECORD>元素,其中每个提供关于审计事件信息。当审计日志插件开始写入一个新的日志文件,编写XML声明开放<AUDIT>根元素标签。当插件关闭日志文件,它将关闭</AUDIT>根元素标签。结束标记不存在而打开的文件。

元素内<AUDIT_RECORD>具有这些特征的元素:

  • 一些元素出现在每一个<AUDIT_RECORD>元素别人都是可选的,可以根据审计记录类型。

  • 在一个元素的阶<AUDIT_RECORD>元是没有保证的

  • 元素的值是不固定长度。长值可能被截断在元描述表明了以后。

  • 这个<&#62;",和&#38;字符编码为&lt;&#62;&quot;,和&#38;,分别。nul字节(U 00)被编码为?人物

  • 文字不是有效的XML字符编码使用数字字符引用。有效的XML字符:

    #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
    

以下内容都是强制性的<AUDIT_RECORD>元素:

  • <NAME>

    一个字符串,生成审核事件类型指令,如命令,从客户端接收服务器。

    例子:

    <NAME>Query</NAME>
    

    一些常见的<NAME>价值观:

    审计在审计开始,这可能是服务器启动timeconnect当一个客户端连接,也被称为记录查询的SQL语句(直接执行SQL语句)制备制备;其次是SQL语句的执行executeexecute;通常遵循prepareshutdown服务器shutdownquit当客户disconnectsnoaudit审计已关闭

    可能的值Auditbinlog转储Change user接近地Connect Out连接Create DB守护进程Debug延迟插入Drop DB执行Fetch字段列表Init DBLong DataNOAUDITPing准备Processlist查询Quit刷新Register Slave重置为Set option关机Sleep统计Table Dump时间

    除了AuditNOAUDIT,这些值对应于COM_xxx上市的指令值我_ command.hHeader file .For example,Create DB更改用户对应COM_CREATE_DBcom_change_user,分别

  • <RECORD_ID>

    对审计记录的唯一标识符。该值是从一个序列号和时间戳的格式组成,SEQ_TIMESTAMP。当审计日志插件打开审计日志文件,初始化序列号的审计日志文件的大小,然后递增序列的每个记录记录1。时间戳是UTC的价值YYYY-MM-DDThh:mm:ss格式显示日期和时间,审核日志插件打开文件。

    例子:

    <RECORD_ID>12_2017-10-16T14:06:33</RECORD_ID>
    
  • <TIMESTAMP>

    一个字符串,UTC的价值YYYY-MM-DDThh:mm:ss UTC格式表示的日期和时间当审计事件发生。例如,对应于从客户端收到一个SQL语句执行的事件有<TIMESTAMP>语句结束后发生的价值,不在接收时。

    例子:

    <TIMESTAMP>2017-10-16T14:09:45 UTC</TIMESTAMP>
    

这些元素是可选<AUDIT_RECORD>元素它们大多只与特定的<NAME>元素的值

  • <COMMAND_CLASS>

    一个字符串,指示该类型执行的操作。

    例子:

    <COMMAND_CLASS>drop_table</COMMAND_CLASS>
    

    该值对应的statement/sql/xxx指令计数器;例如,xxxdrop_tableselectDROP TABLESELECT报表,分别。下面的语句显示可能的名字:

    选择替换(event_name,声明/ SQL / &#39;,&#39;)是从performance_schema.events_statements_summary_global_by_event_namewhere event_name喜欢声明/ SQL / %是的名字;
  • <CONNECTION_ID>

    一个无符号整数表示客户端连接标识符。这是返回的值相同CONNECTION_ID()在会话功能

    例子:

    <CONNECTION_ID>127</CONNECTION_ID>
    
  • <CONNECTION_TYPE>

    在连接到服务器的安全状态。允许值TCP/IP(TCP/IP建立了未加密的连接),SSL / TLS(TCP/IP建立加密连接),Socket(UNIX套接字文件连接),命名管道(Windows命名管道连接),和Shared Memory(Windows共享内存连接)。

    例子:

    <CONNECTION_TYPE>SSL/TLS</CONNECTION_TYPE>
    
  • <DB>

    一个字符串,默认的数据库名称。

    例子:

    <DB>test</DB>
    
  • <HOST>

    一个字符串,客户端的主机名。

    例子:

    <HOST>localhost</HOST>
    
  • <IP>

    一个字符串,客户端的IP地址。

    例子:

    <IP>127.0.0.1</IP>
    
  • <MYSQL_VERSION>

    一个字符串,MySQL服务器版本。这是该值相同VERSION()函数或version系统变量

    例子:

    <MYSQL_VERSION>5.7.21-log</MYSQL_VERSION>
    
  • <OS_LOGIN>

    一个字符串,在认证过程中使用的外部用户的名字,如设置用于验证客户端插件。与本地(内置)MySQL认证,或如果插件没有设置的值,该元素是空的。价值是相同的external_user系统变量(参见第6.3.11”代理用户”

    例子:

    <OS_LOGIN>jeffrey</OS_LOGIN>
    
  • <OS_VERSION>

    一个字符串的操作系统的服务器上建立和运行。

    例子:

    <OS_VERSION>x86_64-Linux</OS_VERSION>
    
  • <PRIV_USER>

    一个字符串,用户服务器认证客户端。这是服务器使用权限检查用户名,并可能与<USER>价值

    例子:

    <PRIV_USER>jeffrey</PRIV_USER>
    
  • <PROXY_USER>

    一个字符串,代理用户(见第6.3.11”代理用户”)。如果用户代理是不起作用的价值是空的。

    例子:

    <PROXY_USER>developer</PROXY_USER>
    
  • <SERVER_ID>

    一个无符号整数表示服务器ID。这是该值相同server_id系统变量

    例子:

    <SERVER_ID>1</SERVER_ID>
    
  • <SQLTEXT>

    一个字符串,一个SQL语句的文本。该值可以是空的。长值可能被截断。字符串,如审计日志文件本身,是用gb3212(每个字符4个字节),所以价值可转换的结果。例如,原来的声明可能是从客户端接收到的字符串作为SJIS。

    例子:

    <SQLTEXT>DELETE FROM t1</SQLTEXT>
    
  • <STARTUP_OPTIONS>

    一个字符串的选项,在命令行给出或选项中的文件时,MySQL服务器启动。第一个选项是服务器可执行文件的路径。

    例子:

    <STARTUP_OPTIONS>/usr/local/mysql/bin/mysqld
      --port=3306 --log-output=FILE</STARTUP_OPTIONS>
    
  • <STATUS>

    一个无符号整数表示命令状态:0成功,返回非零值时发生了一个错误。这是该值相同mysql_errno()C API函数。看到描述<STATUS_CODE>关于它是如何不同于<STATUS>

    审计日志不包含SQLSTATE值或错误消息。看到不同的错误代码,该协会SQLSTATE值,和消息,看到第三,“服务器错误代码和消息”

    警告还没有登录

    例子:

    <STATUS>1051</STATUS>
    
  • <STATUS_CODE>

    一个无符号整数表示命令状态:0成功,1如果出现了一个错误。

    这个STATUS_CODEValue Differs from the地位价值:STATUS_CODE0错误的成功和1,这与审计室ez_collector消费兼容。地位是的价值mysql_errno()C API函数。这是为成功和非零误差,因而未必是一错误。

    例子:

    <STATUS_CODE>0</STATUS_CODE>
    
  • <USER>

    一个字符串,客户端发送的用户名。这可能与<PRIV_USER>价值

    例子:

    <USER>root[root] @ localhost [127.0.0.1]</USER>
    
  • <VERSION>

    一个无符号整数表示的审计日志文件格式的版本。

    例子:

    <VERSION>1</VERSION>
    
JSON的审计日志文件格式

对JSON格式的审计记录(audit_log_format=JSON日志文件的形式),the高兴了JSON每个数组元素代表一个审计事件作为一个数组JSON键/值对哈希。完整的事件记录的例子出现在本节稍后。以下是摘录部分事件:

【{“时间戳”:“2018-01-15 13:50:01”、“身份证”:0、“阶级”:“审计”、“事件”:“启动”,…},{“时间戳”:“2018-01-15 15:02:32”、“身份证”:0,“阶级”:“连接”、“事件”:“连接”,…},…{“时间戳”:“2018-01-15 17:37:26”、“身份证”:0,“阶级”:“table_access”、“事件”:“插入”,…}…]

审计日志文件写入使用gb3212(每个字符4个字节)。当审计日志插件开始写入一个新的日志文件,它将开放[数组标记。当插件关闭日志文件,它将关闭]数组标记。结束标记不存在而打开的文件。

在审计记录的项目有以下特点:

  • 一些项目出现在每一个审计记录。别人都是可选的,可以根据审计记录类型。

  • 一个审计记录中的项目顺序不一定。

  • 项目的值是不固定长度。长值可能被截断在物品描述表示以后。

  • 这个"\字符编码为\",分别

3 . The following examples show the JSS object格式for different event types(as indicated by the)class事件项目),而略为可读性:

审核的启动事件:

{ "timestamp": "2018-01-15 14:21:56",
  "id": 0,
  "class": "audit",
  "event": "startup",
  "connection_id": 0,
  "startup_data": { "server_id": 1,
                    "os_version": "i686-Linux",
                    "mysql_version": "5.7.21-log",
                    "args": ["/usr/local/mysql/bin/mysqld",
                             "--loose-audit-log-format=JSON",
                             "--log-error=log.err",
                             "--pid-file=mysqld.pid",
                             "--port=3306" ] } }

当审计日志插件开始由于服务器启动时(而不是在运行时启用),connection_id设置为零,并账户login是不存在的

审计关闭事件:

{ "timestamp": "2018-01-15 14:28:20",
  "id": 3,
  "class": "audit",
  "event": "shutdown",
  "connection_id": 0,
  "shutdown_data": { "server_id": 1 } }

当审计日志插件卸载由于关闭服务器(而不是禁用运行时),connection_id设置为零,并账户login是不存在的

连接或更改用户事件:

{ "timestamp": "2018-01-15 14:23:18",
  "id": 1,
  "class": "connection",
  "event": "connect",
  "connection_id": 5,
  "account": { "user": "root", "host": "localhost" },
  "login": { "user": "root", "os": "", "ip": "::1", "proxy": "" },
  "connection_data": { "connection_type": "ssl",
                       "status": 0,
                       "db": "test" } }

断开的事件:

{ "timestamp": "2018-01-15 14:24:45",
  "id": 3,
  "class": "connection",
  "event": "disconnect",
  "connection_id": 5,
  "account": { "user": "root", "host": "localhost" },
  "login": { "user": "root", "os": "", "ip": "::1", "proxy": "" },
  "connection_data": { "connection_type": "ssl" } }

查询事件:

{ "timestamp": "2018-01-15 14:23:35",
  "id": 2,
  "class": "general",
  "event": "status",
  "connection_id": 5,
  "account": { "user": "root", "host": "localhost" },
  "login": { "user": "root", "os": "", "ip": "::1", "proxy": "" },
  "general_data": { "command": "Query",
                    "sql_command": "show_variables",
                    "query": "SHOW VARIABLES",
                    "status": 0 } }

表访问事件(阅读、删除、插入、更新):

{ "timestamp": "2018-01-15 14:23:41",
  "id": 0,
  "class": "table_access",
  "event": "insert",
  "connection_id": 5,
  "account": { "user": "root", "host": "localhost" },
  "login": { "user": "root", "os": "", "ip": "127.0.0.1", "proxy": "" },
  "table_access_data": { "db": "test",
                         "table": "t1",
                         "query": "INSERT INTO t1 (i) VALUES(1),(2),(3)",
                         "sql_command": "insert" } }

以下列表中的项目出现在JSON格式的审计记录的最高水平:每一项的值是一个标量或JSON搞砸.对于有一个哈希值的物品,描述只列出项目名称在哈希。对于二级哈希项目更完整的描述,在本节稍后看到。

  • account

    与该事件相关的MySQL账户。该值是一个哈希包含这些物品的价值相当于CURRENT_USER()在部分功能:用户host

    例子:

    "account": { "user": "root", "host": "localhost" }
    
  • class

    一个字符串表示事件类。该类定义了事件的类型,在一起event这项specifies subclass的事件。

    例子:

    "class": "connection"
    

    下表显示了允许的组合class事件价值观

    表6.26审计日志类和事件的组合

    类的值允许事件值
    auditstartup关机
    connectionconnectchange_userdisconnect
    generalstatus
    table_access_dataread删除insert更新

  • connection_data

    有关客户端连接信息。该值是一个哈希包含这些项目:connection_type地位db。这个项目只发生审计记录与价值connection

    例子:

    "connection_data": { "connection_type": "ssl",
                         "status": 0,
                         "db": "test" }
    
  • connection_id

    一个无符号整数表示客户端连接标识符。这是返回的值相同CONNECTION_ID()在会话功能

    例子:

    "connection_id": 5
    
  • event

    一个字符串,该事件类的子类。子类定义的事件类型,当加class项目指定的事件类。更多信息,见项目描述

    例子:

    "event": "connect"
    
  • general_data

    关于执行的语句或命令信息。该值是一个哈希包含这些项目:command_ SQL命令query地位。这个项目只发生审计记录与class价值综合

    例子:

    "general_data": { "command": "Query",
                      "sql_command": "show_variables",
                      "query": "SHOW VARIABLES",
                      "status": 0 }
    
  • id

    一个无符号整数表示一个事件ID。

    例子:

    "id": 2
    

    审计记录具有相同的timestamp的价值,他们的身份证件价值观的区别,形成序列。在审计日志,timestamp/身份证件对,是独特的。这些对书签标识事件的地点在日志。

  • login

    信息指示客户端连接到服务器。该值是一个哈希包含这些项目:user操作系统ip代理

    例子:

    "login": { "user": "root", "os": "", "ip": "::1", "proxy": "" }
    
  • shutdown_data

    关于审计日志插件终止信息。该值是一个哈希包含这些项目:server_id这个项目只发生审计记录event审计shutdown很好

    例子:

    "shutdown_data": { "server_id": 1 }
    
  • startup_data

    关于审计日志插件的初始化信息。该值是一个哈希包含这些项目:server_id我们_版本mysql_versionargs。这个项目只发生审计记录class事件audit创业公司,分别

    例子:

    "startup_data": { "server_id": 1,
                      "os_version": "i686-Linux",
                      "mysql_version": "5.7.21-log",
                      "args": ["/usr/local/mysql/bin/mysqld",
                               "--loose-audit-log-format=JSON",
                               "--log-error=log.err",
                               "--pid-file=mysqld.pid",
                               "--port=3306" ] }
    
  • table_access_data

    一个访问表中的信息。该值是一个哈希包含这些项目:dbquery_ SQL命令,这个项目只发生审计记录与class价值table_access

    例子:

    "table_access_data": { "db": "test",
                           "table": "t1",
                           "query": "INSERT INTO t1 (i) VALUES(1),(2),(3)",
                           "sql_command": "insert" }
    
  • timestamp

    一个字符串,UTC的价值YYYY-MM-DD hh:mm:ss格式表示的日期和时间当审计事件发生。例如,对应于从客户端收到一个SQL语句执行的事件有时间戳语句结束后发生的价值,不在接收时。

    例子:

    "timestamp": "2018-01-15 13:50:01"
    

    审计记录具有相同的timestamp的价值,他们的身份证件价值观的区别,形成序列。在审计日志,timestamp/身份证件对,是独特的。这些对书签标识事件的地点在日志。

在以JSON格式的审计记录的顶级项目相关的哈希值出现这些东西:

  • args

    一系列的选项,在命令行给出或选项中的文件时,MySQL服务器启动。第一个选项是服务器可执行文件的路径。

    例子:

    "args": ["/usr/local/mysql/bin/mysqld",
             "--loose-audit-log-format=JSON",
             "--log-error=log.err",
             "--pid-file=mysqld.pid",
             "--port=3306" ]
    
  • command

    一个字符串,生成审核事件类型指令,如命令,从客户端接收服务器。

    例子:

    "command": "Query"
    
  • connection_type

    在连接到服务器的安全状态。允许值tcp/ip(TCP/IP建立了未加密的连接),SSL(TCP/IP建立加密连接),socket(UNIX套接字文件连接),named_pipe(Windows命名管道连接),和shared_memory(Windows共享内存连接)。

    例子:

    "connection_type": "tcp/tcp"
    
  • db

    一个字符串代表一个数据库名称。为connection_data,它是默认的数据库。为_接入_日期表,它是数据库表

    例子:

    "db": "test"
    
  • host

    一个字符串,客户端的主机名。

    例子:

    "host": "localhost"
    
  • ip

    一个字符串,客户端的IP地址。

    例子:

    "ip": "::1"
    
  • mysql_version

    一个字符串,MySQL服务器版本。这是该值相同VERSION()函数或version系统变量

    例子:

    "mysql_version": "5.7.21-log"
    
  • os

    一个字符串,在认证过程中使用的外部用户的名字,如设置用于验证客户端插件。与本地(内置)MySQL认证,或如果插件没有设置的值,该属性是空的。价值是相同的external_user系统变量。见第6.3.11”代理用户”

    例子:

    "os": "jeffrey"
    
  • os_version

    一个字符串的操作系统的服务器上建立和运行。

    例子:

    "os_version": "i686-Linux"
    
  • proxy

    一个字符串,代理用户(见第6.3.11”代理用户”)。如果用户代理是不起作用的价值是空的。

    例子:

    "proxy": "developer"
    
  • query

    一个字符串,一个SQL语句的文本。该值可以是空的。长值可能被截断。字符串,如审计日志文件本身,是用gb3212(每个字符4个字节),所以价值可转换的结果。例如,原来的声明可能是从客户端接收到的字符串作为SJIS。

    例子:

    "query": "DELETE FROM t1"
    
  • server_id

    一个无符号整数表示服务器ID。这是该值相同server_id系统变量

    例子:

    "server_id": 1
    
  • sql_command

    一个字符串,表示SQL语句的类型。

    例子:

    "sql_command": "insert"
    

    该值对应的statement/sql/xxx指令计数器;例如,xxxdrop_tableselectDROP TABLESELECT报表,分别。下面的语句显示可能的名字:

    选择替换(event_name,声明/ SQL / &#39;,&#39;)是从performance_schema.events_statements_summary_global_by_event_namewhere event_name喜欢声明/ SQL / %是的名字;
  • status

    一个无符号整数表示命令状态:0成功,返回非零值时发生了一个错误。这是该值相同mysql_errno()C API函数

    审计日志不包含SQLSTATE值或错误消息。看到不同的错误代码,该协会SQLSTATE值,和消息,看到第三,“服务器错误代码和消息”

    警告还没有登录

    例子:

    "status": 1051
    
  • table

    一个字符串表名

    例子:

    "table": "t1"
    
  • user

    一个字符串,用户名称。根据不同的项目有不同的意义在其中user发生:

    • account项目,用户是一个字符串,用户服务器认证客户端。这是服务器使用权限检查用户名。

    • login项目,用户是一个字符串,客户端发送的用户名。

    例子:

    "user": "root"
    

6.5.5.5审计日志记录控制

本节介绍了如何控制审计日志的一般特征,如文件的审核日志插件写事件,写事件的格式,以及是否压缩和加密功能。

有关用户定义函数和系统变量影响审计日志的更多信息,参见第6.5.5.8.2,审计日志功能”,和第6.5.5.8.4,审计日志选项和变量”

审计日志插件也可以控制审计事件写入审核日志文件的内容或事件事件起源的解释。看到第6.5.5.6,审计日志过滤”

审核日志文件名称

控制审计日志文件名称,设置audit_log_file在服务器启动系统变量。默认情况下,名称是audit.log在服务器数据目录。出于安全原因,审计日志文件应该被写入目录只能访问MySQL服务器和用户提供了一个正当的理由来查看日志。

插件解释audit_log_file价值是由基地名称和一个可选的后缀。如果压缩或加密功能,有效的文件名(该名称实际上用于创建日志文件)不同于配置文件的名称是因为它有附加后缀:

  • 如果压缩是启用插件添加一个后缀.gz

  • 如果启用加密插件添加一个后缀.enc

有效的审计日志文件名产生的名字加入可压缩和加密的配置文件名后缀后。例如,如果配置audit_log_fileaudit.log,有效的文件名是下列值之一:

audit.log        Not compressed or encrypted
audit.log.gz     Compressed
audit.log.enc    Encrypted
audit.log.gz.enc Compressed and encrypted

审计日志插件执行一定的动作,在初始化和终止基于审计日志文件的名称:

  • 在初始化期间,检查插件文件是否与审计日志文件名已经存在,那么它重命名。(在这种情况下,插件假定以前的服务器调用意外退出与审计日志插件运行。)插件,然后写一个新的空的审计日志文件。

  • 在终止,该插件将审计日志文件。

  • 当重命名时(无论是在插件初始化或终止),重命名的文件有一个时间戳插在其基本名称前后缀。例如,如果文件名是audit.log,插件重命名它的值如中文名称:20180115T14633 log。时间戳是UTC的价值YYYYMMDDThhmmss格式

审计日志文件格式

控制审计日志文件格式设置audit_log_format在服务器启动系统变量。默认情况下,格式是(新型的XML格式)。有关每个格式的详细信息,参见第6.5.5.4,审计日志文件格式”

如果你改变audit_log_format,建议你也改变audit_log_file。否则,将有两套日志文件具有相同名称但不同格式的基础。

审核日志文件压缩

审核日志文件压缩可以使任何日志格式。

控制是否启用审核日志文件压缩,设置audit_log_compression在服务器启动系统变量。允许值(不压缩;默认)和GZIP(GNU zip压缩)。

如果压缩和加密功能,加密前压缩发生。恢复原来的文件操作,先解密,然后将它解压缩。看到审计日志文件手动解压缩和解密

审核日志文件加密

审计日志文件可以加密任何日志格式启用。加密是基于用户定义的密码。要使用此功能,MySQL的钥匙一定是因为审计日志存储使用启用密码。任何钥匙插件可以使用;请示,看第6.5.4,“MySQL的钥匙”

控制是否审计日志文件启用加密设置audit_log_encryption在服务器启动系统变量。允许值(没有加密;默认)和AES(ES-256-CBC Ci弗Enry吸附)。

设置或获取加密密码,使用这些自定义函数(UDF):

  • 设置加密密码,调用audit_log_encryption_password_set(),存储密码的钥匙圈,重命名当前日志文件,并开始一个新的日志文件,用新密码加密。重命名的文件有一个时间戳插在其基本名称前后缀。例如,如果文件名是audit.log.enc,插件重命名它的值如audit.20180115T140633.log.enc。时间戳是UTC的价值YYYYMMDDThhmmss格式

    以前写的日志文件不重新用新密码加密。记得以前的密码你应该对这些文件解密。

  • 获取当前的加密密码,调用audit_log_encryption_password_get(),从而找回密码的钥匙。

对于第一个服务器启动后日志启用加密审计日志插件在钥匙圈自动生成初始密码加密存储。发现这个密码,调用audit_log_encryption_password_get()

有关审计日志加密功能,看第6.5.5.8.2,审计日志功能”

如果压缩和加密功能,加密前压缩发生。恢复原来的文件操作,先解密,然后将它解压缩。看到审计日志文件手动解压缩和解密

审计日志文件手动解压缩和解密

审计日志文件可以解压和解密使用标准工具。这应该是唯一的,已经关闭,不再使用日志文件做的,那个不是插件是目前审计日志写入日志文件。你能认识到封闭的日志文件,因为他们将已更名的审核日志插件文件名中包含一个时间戳。

为了这场讨论,请承担这一点。audit_log_file是集audit.log。在这种情况下,一个封闭的审计日志文件有一个这样的名字:

audit.timestamp.log        Not compressed or encrypted
audit.timestamp.log.gz     Compressed
audit.timestamp.log.enc    Encrypted
audit.timestamp.log.gz.enc Compressed and encrypted

解压缩压缩日志文件手动,使用解压缩gzip D或等价的命令。例如:

gunzip -c audit.timestamp.log.gz > audit.timestamp.log

解密加密的日志文件操作,使用OpenSSL的命令。例如:

openssl enc -d -aes-256-cbc -pass pass:password -md sha256
    -in audit.timestamp.log.enc -out audit.timestamp.log

如果压缩和加密是日志审计功能,压缩发生在加密。在这种情况下,文件名.gz电子海图词缀,对应于这些操作发生的顺序。恢复原来的文件操作,在反向进行操作。即先解密文件,然后将它解压缩:

openssl enc -d -aes-256-cbc -pass pass:password -md sha256
    -in audit.timestamp.log.gz.enc -out audit.timestamp.log.gz
gunzip -c audit.timestamp.log.gz > audit.timestamp.log
审计日志记录写入策略

审计日志插件可以使用任何日志写的几个策略。无论策略,记录发生的基础上尽力,不能保证一致性。

指定写策略,设置audit_log_strategy在服务器启动系统变量。默认情况下,战略价值异步和插件日志异步缓冲,如果缓冲区已满的等待。告诉插件不等待可能是(PERFORMANCE)或登录同步,也可以使用文件系统缓存(半同步)或强迫输出与sync()电话后每个写请求(同步

异步写策略的audit_log_buffer_size系统变量的字节缓冲区大小。设置在服务器启动这个变量改变缓冲区大小。插件使用一个缓冲区,它分配在初始化和删除时,它终止。插件不分配这个缓冲nonasynchronous写策略。

异步日志策略具有这些特点:

  • 对服务器的性能和可伸缩性的影响最小。

  • 线程生成审核事件,在尽可能短的时间内阻塞;即时间分配缓冲区加上时间复制事件缓冲区。

  • 输出到缓冲区。一个单独的线程从缓冲区处理写入到日志文件。

异步日志记录,日志文件的完整性可能会受到影响,如果问题发生在写入文件或者插件不完全关闭(例如,如果在服务器主机意外退出)。为了减少这种风险,集audit_log_strategy用同步记录

一个缺点PERFORMANCE战略是它滴事件缓冲区满后。对于服务器负载很重,审计日志可能有失踪事件。

审计日志文件空间管理和名称旋转

审核日志文件变得非常大,消耗大量的磁盘空间的潜力。使其日志文件使用的空间管理,审核日志插件提供的audit_log_rotate_on_sizeaudit_log_flush系统变量,控制审计日志文件的旋转和冲洗。旋转可以做手动或自动根据文件大小。

人工审核日志文件旋转。默认情况下,audit_log_rotate_on_size=0没有日志除了你所执行手动旋转。在这种情况下,审计日志插件关闭和重新打开日志文件时audit_log_flush价值的变化从禁用,启用。日志文件重命名必须完成外部的服务器。假设日志文件名audit.log你想保持3最新日志文件的名称,通过循环audit.log.1.xml通过audit.log.3.xml。在Unix上,旋转手动执行这样的:

  1. 从命令行,重命名当前日志文件:

    mv audit.log.2.xml audit.log.3.xml
    mv audit.log.1.xml audit.log.2.xml
    mv audit.log audit.log.1.xml
    

    在这一点上,该插件还写入当前日志文件,并改名为audit.log.1.xml

  2. 连接到服务器并刷新日志文件所以插件关闭和重开一个新的audit.log文件:

    SET GLOBAL audit_log_flush = ON;
笔记

对JSON格式的日志,审计日志文件重命名手动使他们无法阅读日志功能,因为审计日志插件不再可以确定它们的日志文件序列的一部分(见审计日志文件阅读)。考虑设置audit_log_rotate_on_size大于0使用基于尺寸的旋转而。

基于审计日志文件尺寸自动旋转。如果audit_log_rotate_on_size大于零,设置audit_log_flush有没有效果。相反,每当一个写入日志文件使其规模超过audit_log_rotate_on_size价值,审计日志插件关闭文件,重命名,并打开一个新的日志文件。

当插件重命名原始文件,重命名的文件有一个时间戳插在其基本名称前后缀。例如,如果文件名是audit.log,插件重命名它的值如中文名称:20180115T14633 log。时间戳是UTC的价值YYYYMMDDThhmmss格式

笔记

基于日志文件旋转大小,重命名日志文件不停转动的名字序列结束。相反,他们都有唯一的名字和积累下去。为了避免过多的使用空间,删除旧的文件定期备份起来,首先是必要的。

审计日志文件阅读

审计日志插件让书签和JSON格式的审计日志文件阅读。(这些功能并不适用于写日志格式文件)

当审计日志插件的初始化和配置为JSON测井,以含审核日志文件的目录(取决于audit_log_file值)的位置搜索可读的审计日志文件。要做到这一点,它的使用价值audit_log_file确定文件的基名称和后缀值,然后寻找符合以下模式文件名的文件,在[…]显示可选的文件名部分:

basename[.timestamp].suffix[.gz][.enc]

插件打开每一个匹配的文件,检查是否真的含有JSON的审计记录,并将他们从每个文件的第一个记录的时间戳来建立一个列表,须使用日志阅读功能的日志文件。

在序列文件改名为手动并没有前面的模式匹配包括插件不能,或是一个不同于当前的密码口令加密。

从审计日志读取事件,利用这些用户自定义函数(UDF):

  • audit_log_read_bookmark()返回一个JSON字符串表示最近写入审核日志事件书签。这个书签是适合通过audit_log_read()表明,函数从哪里开始阅读。例如书签:

    { "timestamp": "2018-01-15 21:03:44", "id": 0 }
    
  • audit_log_read()读取审计日志事件并返回JSON含审计事件数组字符串。

例子audit_log_read()使用当前书签调用:

MySQL的&#62;SELECT audit_log_read(audit_log_read_bookmark());----------------------------------------------------------------------- | audit_log_read(audit_log_read_bookmark())| ----------------------------------------------------------------------- | [ {“时间戳”:“2018-01-15 22:41:24”、“身份证”:0、“阶级”:“连接”,…| -----------------------------------------------------------------------

在每个事件audit_log_read()返回值是一个JSON哈希,除了最后一个数组元素可以是JSON无效的显示没有价值可阅读以下事件。例如:

[
  { "timestamp": "2018-01-15 22:08:08", "id": 10,
    "class": "general", "event": "status",
    ...
  },
  {
    "timestamp": "2018-01-15 22:08:08", "id": 11,
    "class": "connection", "event": "disconnect",
    ...
  },
  {
    "timestamp": "2018-01-15 13:39:33", "id": 0,
    "class": "connection", "event": "connect",
    ...
  },
  {
    "timestamp": "2018-01-15 13:39:33", "id": 1,
    "class": "general", "event": "status",
    ...
  },
  {
    "timestamp": "2018-01-15 13:39:33", "id": 2,
    "class": "connection", "event": "disconnect",
    ...
  },
  null
]

使用audit_log_read()这样地:

  • 对于第一个电话audit_log_read()在一个会话中,通过书签指示从哪里开始阅读。

  • 如果返回的数组的最终价值是不JSON无效的价值,有更多的事件后,那些刚刚读audit_log_read()可以称为无或书签的论点。没有理由,阅读继续下一个未读事件。一个书签的说法,阅读继续从书签。

  • 如果返回的数组的值是JSON无效的价值,没有更多的事件去读下一个电话audit_log_read()必须包括一个书签的论点。

书签是一个JSON散列表示和读多少。在书签值以下项目显著(其他项目被忽略):

  • timestamp身份证件:位置在第一个事件的审计日志阅读。两者都必须完全指定的位置。

  • max_array_length:从日志读取的最大事件数。如果省略,默认是读到日志的结束或者直到读取缓冲区已满,以先到者为准。

无论从日志读取函数返回的结果是一个二进制字符串。使用功能要求的多进制的字符串(如功能操作JSON值),将其转换为utf8mb4。假设一个书签有价值:

mysql> SELECT @mark := audit_log_read_bookmark() AS mark;
+-------------------------------------------------+
| mark                                            |
+-------------------------------------------------+
| { "timestamp": "2018-01-15 16:10:28", "id": 2 } |
+-------------------------------------------------+

打电话audit_log_read()这个书签可以返回多个事件。设置事件的读取次数限制audit_log_read(),将书签utf8mb4,然后给它添加一个max_array_length一个价值1的项目。例如,使用前面的书签、转换和修改如下:

mysql> SET @mark = CONVERT(@mark USING utf8mb4);
mysql> SET @mark := JSON_SET(@mark, '$.max_array_length', 1);
mysql> SELECT @mark;
+----------------------------------------------------------------------+
| @mark                                                                |
+----------------------------------------------------------------------+
| {"id": 2, "timestamp": "2018-01-15 16:10:28", "max_array_length": 1} |
+----------------------------------------------------------------------+

修改后的书签,当通过audit_log_read()结果,产生一个审计记录。

设置的字节数的限制,audit_log_read()读取、设置audit_log_read_buffer_size系统变量。在MySQL 8.0.12,这个变量有一个默认的32KB,可在运行时设置。每个客户端设置会话值audit_log_read_buffer_size适当的使用audit_log_read()。MySQL 8.0.12之前,audit_log_read_buffer_size有一个默认1MB,影响到所有的客户,可以在服务器启动的变化。

每次调用audit_log_read()返回作为符合缓冲区大小的许多可用的项目,跳绳,不适合在缓冲区大小的物品。鉴于这种行为,考虑到这些因素,在评估应用程序的适当的缓冲区大小:

  • 这是一个权衡的电话间audit_log_read()和返回的项目每通电话。一个较小的缓冲区大小,调用返回的项目较少,所以更多的电话是必要的。一个更大的缓冲区大小,调用返回更多的项目,因此需要较少的电话。

  • 一个较小的缓冲区大小,如32KB的默认大小,有一个更大的机会,项目将超过缓冲区的大小和audit_log_read()将跳过它们。跳过项目生成的警告。

有关审计日志的阅读功能,看第6.5.5.8.2,审计日志功能”

6.5.5.6审计日志过滤

笔记

本节介绍了如何审核日志过滤作为如果安装审计日志插件和相应的审核表和UDFs。如果安装了插件,但不伴随审计表和UDF,插件运行在传统的过滤方式,描述第6.5.5.7,“传统模式的审计日志过滤”。传统模式是过滤行为的是MySQL 5.7.13之前;那是,在过滤规则的介绍。

在传统的过滤方式,过滤他们的状态或事件事件起源帐户审计日志插件已经控制审核事件记录的能力。扩展当前的过滤能力:

  • 审核事件可以使用这些特征过滤:

    • 用户帐户

    • 审计事件类

    • 审计事件类

    • 价值活动领域如显示运行状态或SQL语句执行

  • 审计是基于规则过滤:

    • 一个过滤器的定义创建一套审计规则。定义可以被配置为包括或排除事件日志基于特征描述。

    • 过滤规则有阻断能力(中止)排位赛事件的执行能力,除了现有的事件日志。

    • 多个过滤器可以被定义,和任何给定的滤波器可以分配任意数量的用户帐户。

    • 它可以定义一个默认的过滤器来使用,没有显式地指定过滤器的任何用户帐户。

  • 审计显示,过滤器可以被定义,并使用基于用户自定义函数(UDF)SQL界面改性。

  • 审计过滤器定义存储在表mysql系统数据库

  • 在一个给定的会话,只读的值audit_log_filter_id系统变量指示过滤器已被分配给会话。

笔记

默认情况下,以规则为基础的审计日志过滤日志的任何用户不可审计事件。记录所有用户的所有可审计事件,使用以下语句,并创建一个简单的过滤器,使测井和分配的默认帐户:

SELECT audit_log_filter_set_filter('log_all', '{ "filter": { "log": true } }');
SELECT audit_log_filter_set_user('%', 'log_all');

分配给过滤器%用于从任何帐户,没有显式地指定过滤器连接(最初是真正的所有账户)。

下面简要地总结了实施审计过滤控制SQL接口的UDF:

  • audit_log_filter_set_filter()定义:在filter

  • audit_log_filter_remove_filter():拆卸过滤器

  • audit_log_filter_set_user():开始过滤用户帐户

  • audit_log_filter_remove_user()停止过滤用户帐户:

  • audit_log_filter_flush()手动修改:冲洗过滤器进行过滤表的影响

关于滤波函数用法的例子和完整的详细信息,参见第6.5.5.6.1,使用审核日志过滤功能”,和第6.5.5.8.2,审计日志功能”

审计日志过滤功能是受这些约束:

  • 使用任何的过滤功能,audit_log插件必须启用。否则,发生了一个错误:

    MySQL &#62;选择audit_log_filter_flush();---------------------------------------------------------------------------- | audit_log_filter_flush() | ---------------------------------------------------------------------------- |错误:audit_log插件没有安装安装插件的语法。| ----------------------------------------------------------------------------

    审核表也必须存在或发生错误:

    mysql> SELECT audit_log_filter_flush();
    +--------------------------------------------------+
    | audit_log_filter_flush()                         |
    +--------------------------------------------------+
    | ERROR: Could not reinitialize audit log filters. |
    +--------------------------------------------------+
    

    安装audit_log插件,看第6.5.5.2,“安装或卸载MySQL企业审计”

  • 使用任何过滤功能,用户必须具备SUPER特权。否则,发生了一个错误:

    MySQL的&#62;SELECT audit_log_filter_flush()\G*************************** 1。行*************************** audit_log_filter_flush():错误:请求“user1”@ &#39;localhost忽视”。需要执行的操作super_acl

    授予SUPER特权的用户帐户,使用该语句:

    格兰特超级*。*user

    另外,你应该尽量避免使SUPER特权,同时仍允许用户访问特定的过滤功能,包装存储程序可以定义。这种技术被描述在UDFs的语境中的钥匙6.5.4.8.2”部分,采用通用钥匙功能”;可用于过滤UDF

  • 这个audit_log插件运行在传统模式,如果是安装但不创建陪同审核表和功能。插件将这些信息在服务器启动错误日志:

    [Warning] Plugin audit_log reported: 'Failed to open the audit log filter tables.'
    [Warning] Plugin audit_log reported: 'Audit Log plugin supports a filtering,
    which has not been installed yet. Audit Log plugin will run in the legacy
    mode, which will be disabled in the next release.'
    

    在传统模式下,过滤可以基于事件的叙述或地位。详情见第6.5.5.7,“传统模式的审计日志过滤”

6.5.5.6.1使用审核日志过滤功能

在使用审核日志的用户自定义函数(UDF),安装根据提供的指令第6.5.5.2,“安装或卸载MySQL企业审计”。这个SUPER特权是需要使用所有这些功能。

审计日志过滤功能使滤波控制通过提供一个接口来创建、修改和删除过滤器,定义和指定过滤器的用户帐户。

过滤器的定义JSON价值观。有关使用JSON数据在MySQL数据库中,看到11.6节,“JSON数据类型”。这一部分展示了一些简单的滤波器的定义。关于过滤器定义的更多信息,参见第6.5.5.6.2,“写日志筛选器定义”

当连接到,审计日志插件决定使用新会话的当前筛选作业寻找用户帐户名称过滤:

  • 如果过滤器被分配给用户,审计日志使用的过滤器。

  • 否则,如果没有用户特定的过滤器配置的存在,但有一个过滤指定的默认帐户(%审计日志),使用默认的过滤器。

  • 否则,审计日志选择没有审计事件从会话处理。

如果在会话过程中发生变化的用户操作(见第27.7.7.3,“mysql_change_user()”),会话的过滤任务使用相同的规则对于新用户更新。

默认情况下,没有户口有过滤指定的,所以没有处理的可审计事件发生的任何账户。

假设你希望默认是只记录连接相关的活动(例如,看到连接,更改用户,并断开事件,而不是SQL语句执行时,用户连接)。为了实现这一目标,定义一个过滤器(此处显示的命名log_conn_events),使测井对事件的联系类,并将过滤的默认帐户,以%帐户名称:

SET @f = '{ "filter": { "class": { "name": "connection" } } }';SELECT audit_log_filter_set_filter('log_conn_events', @f);SELECT audit_log_filter_set_user('%', 'log_conn_events');

现在的审计日志使用默认帐户过滤器从任何帐户,没有明确定义的过滤器连接。

一种过滤明确指定给特定用户帐户或帐户,定义过滤器,然后把它分配给相关账户:

SELECT audit_log_filter_set_filter('log_all', '{ "filter": { "log": true } }');
SELECT audit_log_filter_set_user('user1@localhost', 'log_all');
SELECT audit_log_filter_set_user('user2@localhost', 'log_all');

现在全记录启用user1@localhost“localhost和视图的权限。。从其他帐户连接继续使用默认帐户过滤。

能够将用户帐户从当前的过滤器,要么洗过滤器或指定一个不同的过滤器:

  • 洗滤从用户帐户:

    SELECT audit_log_filter_remove_user('user1@localhost');
    

    过滤当前会话的账户不受影响。从账户的后续连接过滤使用默认帐户过滤器,如果有一个,不登录,否则。

  • 指定一个不同的过滤器的用户帐户:

    SELECT audit_log_filter_set_filter('log_nothing', '{ "filter": { "log": false } }');
    SELECT audit_log_filter_set_user('user1@localhost', 'log_nothing');
    

    过滤当前会话的账户不受影响。从项目的后续连接正在使用新的过滤器过滤。在这里显示的过滤器,这意味着没有记录新的连接user1@localhost

审计日志过滤、用户名和主机名比较是区分大小写的。这不同于权限检查比较,其主机名的比较是不区分大小写。

删除一个过滤器,这样做:

SELECT audit_log_filter_remove_filter('log_nothing');

拆卸过滤器也unassigns从任何用户谁已分配,包括那些用户的当前会话。

过滤UDF只是描述影响审计过滤立即更新在审核日志表mysql系统数据库存储过滤器和用户帐户(见第6.5.5.8.1,审计日志表”)。它也可以修改审核日志表直接使用报表等INSERTUPDATE,和DELETE,但这种变化不影响滤波立即。冲洗你的变化,使他们的操作,调用audit_log_filter_flush()

SELECT audit_log_filter_flush();

确定滤波器已分配给当前会话,检查只读会话值audit_log_filter_id系统变量。如果该值为0,无滤波器分配。一个非零值表明内部维护的ID指定的过滤器:

MySQL的&#62;SELECT @@audit_log_filter_id;----------------------- | @ @ audit_log_filter_id | ----------------------- | 2 | -----------------------
6.5.5.6.2编写审核日志筛选器定义

过滤器的定义JSON价值观。有关使用JSON数据在MySQL数据库中,看到11.6节,“JSON数据类型”

过滤器定义的这种形式,在actions如何过滤发生:

{“过滤器”:actions}

下面的讨论描述了允许构造滤波器定义。

记录所有事件

明确地启用或禁用所有事件记录,使用log在过滤元件:

{“过滤”:{“日志”:真} }

这个log值可以是真正的false

前面的过滤器,使所有事件记录。它相当于:

{
  "filter": { }
}

日志行为取决于log价值与价值event指定项目:

  • log指定,使用给定的值

  • 没有log指定的日志真正的如果没有class事件项目是指定的,和false否则,(在这案例,event可以包括自己日志项目)

记录特定事件类

登录一个特定的类的事件,使用class在过滤元件,其姓名表示类的名称来登录域:

{
  "filter": {
    "class": { "name": "connection" }
  }
}

这个name值可以是联系general,或table_access登录连接,一般,或表访问事件,分别。

前面的过滤器使事件日志connection类它相当于下面的滤波器日志项目明确:

{
  "filter": {
    "log": false,
    "class": { "log": true,
               "name": "connection" }
  }
}

对多类启用记录,定义class值为JSON数组元素的类的名称:

{“过滤”:{“类”:[ {“名字”:“连接”},{“名字”:“一般”},{“名字”:“table_access”} } } ]
笔记

当多个实例的一个给定的项目出现在一个滤波器的定义相同的水平,项目的价值可以组合成的这个项目的一个实例在一个数组的值。前面的定义可以这样写:

{
  "filter": {
    "class": [
      { "name": [ "connection", "general", "table_access" ] }
    ]
  }
}
记录特定事件类

选择特定的事件类,使用event项目包含一个姓名项目名称的子类。所选事件的默认行为event项目是日志。例如,该滤波器能够指定的事件类测井:

{“过滤”:{“类”:[ {“名字”:“连接”、“事件”:[ {“名字”:“连接”},{“名字”:“断开”}】},{“名字”:“一般”},{“名字”:“table_access”、“事件”:[ {“名字”:“插入”},{“名字”:“删除”},{“名字”:“更新”} } } } ] ]

这个event项目还可以包含显式日志项目是否合格的事件日志to indicate to。这event项目选择多个事件和行为为他们明确指出测井:

“Event”:[ {”:“read”,“log”,“log”:false },{”},{”}“插入”,“log”:true },{”}“del删除”,“log”:true },{“name”:“update”,“log”:true } ] ]

这个event项目还可以指示是否阻止了资格赛,如果它包含一个中止项目详情见阻止特定事件的执行

表6.27,“事件类和子类的组合”本文探讨了在允许的值为每个事件类收藏指正.

表6.27事件类和子类的组合

事件类事件子类描述
connectionconnect连接发起(成功或失败)
connectionchange_user用户认证与不同的用户/密码会话期间
connectiondisconnect连接终止
generalstatus通用操作信息
table_accessread表中读取报表,如SELECTINSERT INTO ... SELECT
table_accessdelete表中删除报表,如DELETETRUNCATE TABLE
table_accessinsert表的INSERT语句,如INSERTREPLACE
table_accessupdate表格更新语句,如UPDATE

表为“日志和中止的特点,每个事件类和子类组合”它描述了每个事件是否可以登录收藏指正或中止。

表6.28日志和中止的特点每个事件类和子类的组合

事件类事件子类可以登录可以中止
connectionconnect
connectionchange_user
connectiondisconnect
generalstatus
table_accessread
table_accessdelete
table_accessinsert
table_accessupdate

包容性和排他性的日志

过滤器可以包容或排斥的模式定义:

  • 包容模式只记录明确指定项目。

  • 独占模式记录一切但明确指定项目。

在执行包含日志,日志全球和特定类的启用日志记录。这种过滤日志connect断开事件在connection类,和事件的综合

{
  "filter": {
    "log": false,
    "class": [
      {
        "name": "connection",
        "event": [
          { "name": "connect", "log": true },
          { "name": "disconnect", "log": true }
        ]
      },
      { "name": "general", "log": true }
    ]
  }
}

履行独家记录,使记录全球禁用特定类测井。该过滤器日志以外的所有事件在general

{“过滤”:{“日志”:真的,“阶级”:{“名字”:“一般”,“日志”:假} } }

这种过滤日志change_user事件在联系类,和table_access事件

{“过滤”:{“日志”:真的,“阶级”:[ {“名字”:“连接”、“事件”:[ {“名字”:“连接”、“日志”:假},{“名字”:“断开”,“日志”:假}】},{“名字”:“一般”,“日志”:假} } } ]
测试事件字段的值

基于特定事件字段的值指定启用日志记录,field项目内日志项目说明字段名称和其期望值:

{
  "filter": {
    "class": {
    "name": "general",
      "event": {
        "name": "status",
        "log": {
          "field": { "name": "general_command.str", "value": "Query" }
        }
      }
    }
  }
}

每个事件包含事件类的特定领域,可以从内部访问过滤器执行自定义过滤。

一个连接事件表明在连接相关的活动发生在一个阶段,如一个用户连接到服务器或从服务器断开。表6.29,连接事件字段”表示允许字段连接事件。

表6.29连接事件字段

字段名称字段类型描述
status整数

事件状态:

好:0

否则:失败

connection_id无符号整数连接ID
user.str字符串用户名称指定身份验证期间
user.length无符号整数用户名长度
priv_user.str字符串身份验证的用户名(账号)
priv_user.length无符号整数认证用户的名称长度
external_user.str字符串外部用户的名字(由第三方认证插件提供)
external_user.length无符号整数外部用户名称长度
proxy_user.str字符串代理服务器的用户名
proxy_user.length无符号整数代理用户名称长度
host.str字符串连接用户主机
host.length无符号整数连接用户主机的长度
ip.str字符串连接用户的IP地址
ip.length无符号整数连接用户的IP地址的长度
database.str字符串数据库名称指定在连接时间
database.length无符号整数数据库名称长度
connection_type整数

连接类型:

"::undefined":定义

"::tcp/ip":TCP / IP

"::socket"插座:

"::named_pipe":命名管道

"::ssl"加密:TCP / IP with

"::shared_memory":共享内存


这个"::xxx"价值符号伪常数,可以给予而不是字面上的数值。他们必须引用的字符串是区分大小写的。

一般事件指示操作的状态代码和它的细节。表6.30,“一般事件的领域”表示允许的领域一般事件。

表6.30一般事件的领域

字段名称字段类型描述
general_error_code整数

事件状态:

好:0

否则:失败

general_thread_id无符号整数连接线程的ID
general_user.str字符串用户名称指定身份验证期间
general_user.length无符号整数用户名长度
general_command.str字符串命令名称
general_command.length无符号整数命令名称长度
general_query.str字符串SQL语句文本
general_query.length无符号整数SQL语句的文本长度
general_host.str字符串主机名
general_host.length无符号整数主机名称的长度
general_sql_command.str字符串SQL命令的类型名称
general_sql_command.length无符号整数SQL命令的类型名称的长度
general_external_user.str字符串外部用户的名字(由第三方认证插件提供)
general_external_user.length无符号整数外部用户名称长度
general_ip.str字符串连接用户的IP地址
general_ip.length无符号整数连接用户的IP地址长度

general_command.str显示命令名称:查询Execute退出,或Change user

与一般的事件general_command.str字段设置为查询Execute包含一般_ _ command.str SQL设置一个值,指定的SQL命令的类型:alter_dbalter_db_upgradeadmin_commands,等等。这些值可以看作性能架构仪器显示这句话的最后一个组成部分:

MySQL的&#62;SELECT NAME FROM performance_schema.setup_instrumentsWHERE NAME LIKE 'statement/sql/%' ORDER BY NAME;--------------------------------------- |名字| --------------------------------------- |声明/ SQL / alter_db | |声明/ SQL / alter_db_upgrade | |声明/ SQL / alter_event | |声明/ SQL / alter_function | |声明/ SQL / alter_instance | |声明/ SQL / alter_procedure | |声明/ SQL / alter_server |…

表访问事件提供有关特定表的信息访问。表6.31、表访问事件的领域”表示允许字段表访问事件。

表6.31表访问事件字段

字段名称字段类型描述
connection_id无符号整数事件连接ID
sql_command_id整数SQL命令ID
query.str字符串SQL语句文本
query.length无符号整数SQL语句的文本长度
table_database.str字符串数据库名称与事件
table_database.length无符号整数数据库名称长度
table_name.str字符串表名与事件
table_name.length无符号整数表名长度

下面的列表显示的语句产生的表访问事件:

  • read事件:

    • SELECT

    • INSERT ... SELECT(表中引用选择条款)

    • REPLACE ... SELECT(表中引用选择条款)

    • UPDATE ... WHERE(表中引用哪里条款)

    • HANDLER ... READ

  • delete事件:

    • DELETE

    • TRUNCATE TABLE

  • insert事件:

    • INSERT

    • INSERT ... SELECT(表中引用插入条款)

    • REPLACE

    • REPLACE ... SELECT(表中引用更换条款

    • LOAD DATA INFILE

    • LOAD XML INFILE

  • update事件:

    • UPDATE

    • UPDATE ... WHERE(表中引用更新条款)

阻止特定事件的执行

event项目可以包括中止项目是否阻止了资格赛执行。例如,abort使规则写入特定的SQL语句块的执行。

这个abort项目必须出现在一个事件项目。例如:

"event": {
  "name": qualifying event subclass names
  "abort": condition
}

事件子类所name项目的中止行动是真还是假,取决于condition评价。如果两个空调evaluates威胁事件,《冰封闭。否则,继续执行的事件。

这个condition规范可以是简单的真正的false,也可以是更复杂的,评价取决于事件的特征。

该过滤块INSERTUPDATE,和DELETE声明:

{“过滤”:{“类”:{“名字”:“table_access”、“事件”:{“名字”:[“插入”、“修改”、“删除”],“中止”:真} } } }

这种更复杂的过滤块相同的语句,但只有一个特定的表(finances.bank_account):

{“过滤”:{“类”:{“名字”:“table_access”、“事件”:{“名字”:[“插入”、“修改”、“删除”],“中止”:{“”:[ {“场”:{“名字”:“table_database。STR”、“价值”:“财政”} },{“场”:{“名字”:“table_name。STR”、“价值”:“bank_account”} } } } } } } ]

语句匹配的过滤器阻止错误返回给客户端:

ERROR 1045 (28000): Statement was aborted by an audit log filter

并不是所有的事件都会被封锁(见表为“日志和中止的特点,每个事件类和子类组合”)。一个事件,不能审核日志写入错误日志,而不是阻止它的警告。

试图定义一个过滤器,abort项目出现在其他地方比在事件项,出现错误

逻辑运算符

逻辑运算符(andnot)可用于日志项目这允许更先进的过滤配置建设:

{
  "filter": {
    "class": {
      "name": "general",
      "event": {
        "name": "status",
        "log": {
          "or": [
            {
              "and": [
                { "field": { "name": "general_command.str",    "value": "Query" } },
                { "field": { "name": "general_command.length", "value": 5 } }
              ]
            },
            {
              "and": [
                { "field": { "name": "general_command.str",    "value": "Execute" } },
                { "field": { "name": "general_command.length", "value": 7 } }
              ]
            }
          ]
        }
      }
    }
  }
}
引用预定义变量

是指在一个预定义的变量log条件,使用变量这项试验,对一个给定的值相等:

{
  "filter": {
    "class": {
      "name": "general",
      "event": {
        "name": "status",
        "log": {
          "variable": {
            "name": "audit_log_connection_policy_value", "value": "::none"
          }
        }
      }
    }
  }
}

每个预定义变量对应一个系统变量。通过编写测试预定义变量的过滤器,你可以通过设置相应的系统变量修改过滤操作,而无需重新定义过滤器。例如,通过写作测试值的过滤器audit_log_connection_policy_value预定义的变量,你可以通过改变的值修改过滤操作audit_log_connection_policy系统变量

这个audit_log_xxx_policy系统变量用于传统模式的审计日志(见第6.5.5.7,“传统模式的审计日志过滤”)。以规则为基础的审计日志过滤,这些变量保持可见的(例如,使用SHOW VARIABLES),但它们的变更没有影响,除非你写的过滤器结构,是指他们的含。

下面的列表描述了允许预定义变量variable项目

  • audit_log_connection_policy_value

    这个变量对应的值audit_log_connection_policy系统变量。该值是一个无符号整数。表6.32,“audit_log_connection_policy_value价值”显示允许的值和相应的audit_log_connection_policy价值观

    表6.32 audit_log_connection_policy_value值

    价值Outting Audit Conference I log career Connection Connection Action Policy value
    0“::没有”NONE
    1“::错误”ERRORS
    2“::”ALL

    这个"::xxx"价值符号伪常数,可以给予而不是字面上的数值。他们必须引用的字符串是区分大小写的。

  • audit_log_policy_value

    这个变量对应的值audit_log_policy系统变量。该值是一个无符号整数。表6.33,“audit_log_policy_value价值”显示允许的值和相应的audit_log_policy价值观

    表6.33 audit_log_policy_value值

    价值相应的audit_log_policy价值
    0“::没有”NONE
    1“::登录”LOGINS
    2“::”ALL
    3“::查询”QUERIES

    这个"::xxx"价值符号伪常数,可以给予而不是字面上的数值。他们必须引用的字符串是区分大小写的。

  • audit_log_statement_policy_value

    这个变量对应的值audit_log_statement_policy系统变量。该值是一个无符号整数。表5,“audit_log_statement_policy_value价值”显示允许的值和相应的audit_log_statement_policy价值观

    表6.34 audit_log_statement_policy_value值

    价值相应的audit_log_statement_policy价值
    0“::没有”NONE
    1“::错误”ERRORS
    2“::”ALL

    这个"::xxx"价值符号伪常数,可以给予而不是字面上的数值。他们必须引用的字符串是区分大小写的。

引用预定义的功能

指在一个预定义的函数log条件,使用功能项目,以nameargs值指定函数名和参数,分别:

{
  "filter": {
    "class": {
      "name": "general",
      "event": {
        "name": "status",
        "log": {
          "function": {
            "name": "find_in_include_list",
            "args": [ { "string": [ { "field": "user.str" },
                                    { "string": "@"},
                                    { "field": "host.str" } ] } ]
          }
        }
      }
    }
  }
}

指定的功能name项目应该是函数名,没有括号或参数列表。在参数args项,如果有,必须在函数描述的顺序列出了。参数可以是预定义的变量,事件域,或字符串或数值常数。

前面的过滤器决定是否记录general地位根据当前用户是否是在事件audit_log_include_accounts系统变量。用户在使用领域的构造事件。

下面的列表描述了允许预定义的函数function项目

  • audit_log_exclude_accounts_is_null()

    检查是否audit_log_exclude_accounts系统变量无效的。这个功能可以帮助定义对应于传统的审计日志实现过滤器时。

    争论:

  • audit_log_include_accounts_is_null()

    检查是否audit_log_include_accounts系统变量无效的。这个功能可以帮助定义对应于传统的审计日志实现过滤器时。

    争论:

  • debug_sleep(millisec)

    睡眠对于给定的毫秒数。这个功能是在绩效测量的应用。

    debug_sleep()可用于调试版本只

    争论:

    • millisec:作为一个无符号整数的睡眠的毫秒数。

  • find_in_exclude_list(account)

    检查是否存在一个帐户字符串在审核日志中排除列表(的价值audit_log_exclude_accounts系统变量

    争论:

    • account用户帐户:名称的字符串。

  • find_in_include_list(account)

    检查是否存在一个帐户字符串在审核日志中包含的值的列表(audit_log_include_accounts系统变量

    争论:

    • account用户帐户:名称的字符串。

  • string_find(text, substr)

    检查是否substr价值是包含在文本值。这房子是敏感的搜索。

    争论:

    • text:对搜索的文本字符串。

    • substr:子串查找文本

更换用户过滤

在某些情况下,可以动态地改变滤波器的定义。为此,定义filter在现有的配置滤波器。。。。。。。例如:

{
  "filter": {
    "id": "main",
    "class": {
      "name": "table_access",
      "event": {
        "name": [ "update", "delete" ],
        "log": false,
        "filter": {
          "class": {
            "name": "general",
            "event" : { "name": "status",
                        "filter": { "ref": "main" } }
          },
          "activate": {
            "or": [
              { "field": { "name": "table_name.str", "value": "temp_1" } },
              { "field": { "name": "table_name.str", "value": "temp_2" } }
            ]
          }
        }
      }
    }
  }
}

一个新的过滤器被激活时,activate元素在亚滤波计算真正的。使用activate在一个顶层滤波器是不允许的

一个新的过滤器可以通过使用原始的更换ref在子项指原滤波器身份证件

过滤显示的工作就像这:

  • 这个main过滤器等table_access事件,要么update删除

  • 如果update删除table_access事件发生在temp_1temp_2表,过滤器的更换(没有内部身份证件,因为没有必要提及明确)。

  • 如果该命令结束的信号(general/地位事件),写入审核日志文件和滤波器是一个条目被替换的main滤波器

过滤器是日志语句,更新或删除任何有用的temp_1temp_2表,例如这一个:

UPDATE temp_1, temp_3 SET temp_1.a=21, temp_3.a=23;

该语句生成多table_access对,但审计log file will contain only .综合/status条目.

笔记

任何id定义中使用的值就只定义评价。他们没有任何的价值audit_log_filter_id系统变量

6.5.5.7传统模式的审计日志过滤

笔记

本节描述了传统审计日志过滤,它适用于如果audit_log插件安装但未陪同审核表和UDFs需要规则过滤。

审计日志插件可以过滤审计事件。这使您可以控制是否审核事件写入的状态或事件事件起源帐户审计日志文件。状态过滤发生分别连接事件和声明事件。

事件过滤的账户

审计事件过滤基于源帐户,设置一个系统变量在服务器启动或运行时:

变量的值可以是NULL或一个字符串包含一个或多个用逗号分隔的帐户名,每user_name@host_name格式。由于偏差,波斯变量是无效的在这种情况下,不考虑,过滤了审计发生的所有账户。

修改audit_log_include_accountsaudit_log_exclude_accounts只影响连接创建修改后,不存在连接。

例如:只对日志审计使user1user2本地主机账户,设置audit_log_include_accounts这样的系统变量:

SET GLOBAL audit_log_include_accounts = 'user1@localhost,user2@localhost';

只有一个audit_log_include_accountsaudit_log_exclude_accounts可以是非—无效的一次:

-- This sets audit_log_exclude_accounts to NULL
SET GLOBAL audit_log_include_accounts = value;

-- This fails because audit_log_include_accounts is not NULL
SET GLOBAL audit_log_exclude_accounts = value;

-- To set audit_log_exclude_accounts, first set
-- audit_log_include_accounts to NULL
SET GLOBAL audit_log_include_accounts = NULL;
SET GLOBAL audit_log_exclude_accounts = value;

如果你检查任何变量的值,注意,SHOW VARIABLES显示器无效的为空字符串。为了避免这种情况,使用SELECT相反:

MySQL的&#62;SHOW VARIABLES LIKE 'audit_log_include_accounts';---------------------------- ------- | variable_name |价值| ---------------------------- ------- | audit_log_include_accounts | | ---------------------------- ------- MySQL &#62;SELECT @@audit_log_include_accounts;------------------------------ | @ @ audit_log_include_accounts | ------------------------------ |空| ------------------------------

如果一个用户名或主机名需要报价,因为它包含一个逗号,空格,或其他特殊字符,使用单引号引用它。如果变量值本身是使用单引号,单引号或者双内逃加一个反斜杠。下面的语句都使当地的日志审计root帐户是等效的,即使报价方式不同:

SET GLOBAL audit_log_include_accounts = 'root@localhost';SET GLOBAL audit_log_include_accounts = '''root''@''localhost''';SET GLOBAL audit_log_include_accounts = '\'root\'@\'localhost\'';SET GLOBAL audit_log_include_accounts = "'root'@'localhost'";

最后声明将不会工作,如果ANSI_QUOTESSQL模式是因为在该模式下双引号表示字符串引用标识符引用启用,不。

事件过滤状态

过滤审计事件基于现状,在服务器启动或运行时设置以下系统变量。这些变量只适用于传统的审计日志过滤。JSON的审计日志过滤,不同的状态变量应用;看第6.5.5.8.4,审计日志选项和变量”

每个变量的取值ALL(记录所有相关的事件;这是默认的),错误(只记录失败的事件),或NONE(不记录事件)。例如,记录所有的声明事件只是连接失败事件,使用这些设置:

SET GLOBAL audit_log_statement_policy = ALL;SET GLOBAL audit_log_connection_policy = ERRORS;

另一个政策变量,audit_log_policy,是可用的但不起多控制权audit_log_connection_policyaudit_log_statement_policy。它只能被设置在服务器启动。在运行时,它是一个只读的变量。它需要一个值全部(所有日志事件;这是默认的),LOGINS(日志连接事件),查询(log statement events),orNONE(不记录事件)。那些价值观、审计日志插件记录所有选定的事件没有区别是成功或失败。使用audit_log_policy在启动时的工作原理如下:

6.5.5.8审计日志参考

下面的讨论作为一个参考MySQL企业审计组件:

安装审计日志表和函数,使用提供的指令第6.5.5.2,“安装或卸载MySQL企业审计”。除非安装这些组件,该audit_log插件运行在传统模式。看到第6.5.5.7,“传统模式的审计日志过滤”

6.5.5.8审计log tables

MySQL企业审计中使用的表mysql对滤波和用户帐户数据持久存储系统数据库。表只能由有权限的用户访问数据库。表格的使用InnoDB存储引擎

如果这些表是失踪的audit_log插件运行在传统模式。看到第6.5.5.7,“传统模式的审计日志过滤”

这个audit_log_filter表存储滤波器定义。这些列的表:

  • NAME

    筛选器名称

  • FILTER

    与过滤器名称关联的过滤器的定义。定义存储JSON价值观

这个audit_log_user表存储用户帐户信息。这些列的表:

  • USER

    一个帐户的用户名的一部分。一个帐户user1@localhost,的用户部分user1

  • HOST

    一个帐户的主机名的一部分。一个帐户user1@localhost,的主机部分localhost

  • FILTERNAME

    指定的帐户名的过滤器。筛选器名员工账户中定义的过滤器audit_log_filter

6.5.5.8.2审计日志功能

本节介绍,每个审计日志的用户自定义函数(UDF),其目的,调用序列,和返回值。关于这些UDF可以调用条件的信息,参见第6.5.5.6,审计日志过滤”

每个审计日志的UDF返回OK成功,误差:message失败

这些审计日志udf是可用的:

  • audit_log_encryption_password_get()

    检索当前审计日志加密密码为二进制字符串。密码是从MySQL的钥匙拿来,必须启用或发生错误。任何钥匙插件可以使用;请示,看第6.5.4,“MySQL的钥匙”

    有关审计日志加密,看审核日志文件加密

    语法:

    STRING audit_log_encryption_password_get()
    

    争论:

    返回值:

    成功的密码字符串(最多766个字节),或NULL和失败的错误

    例子:

    mysql> SELECT audit_log_encryption_password_get();
    +-------------------------------------+
    | audit_log_encryption_password_get() |
    +-------------------------------------+
    | secret                              |
    +-------------------------------------+
    
  • audit_log_encryption_password_set()

    在MySQL的钥匙圈审核日志加密密码存储设置,必须启用或发生错误。任何钥匙插件可以使用;请示,看第6.5.4,“MySQL的钥匙”

    有关审计日志加密,看审核日志文件加密

    语法:

    INTEGER audit_log_encryption_password_set()
    

    争论:

    密码的字符串。允许的最大长度为766字节。

    返回值:

    1 for Success for failure,0。

    例子:

    mysql> SELECT audit_log_encryption_password_set(password);
    +---------------------------------------------+
    | audit_log_encryption_password_set(password) |
    +---------------------------------------------+
    | 1                                           |
    +---------------------------------------------+
    
  • audit_log_filter_flush()

    调用任何其他影响经营审计日志过滤过滤UDF立即更新审核日志表。如果你修改这些表直接用语句等内容INSERTUPDATE,和DELETE,变动不影响过滤立即。冲洗你的变化,使他们的操作,调用audit_log_filter_flush()

    audit_log_filter_flush()影响所有当前会话和分离他们从以往的过滤器。当前会话不再登录,除非他们连接,或者执行一个改变用户操作。

    如果函数失败,返回错误消息和日志被禁用,直到下一次成功的电话audit_log_filter_flush()

    语法:

    STRING audit_log_filter_flush()
    

    争论:

    返回值:

    OK成功,误差:message失败

    例子:

    mysql> SELECT audit_log_filter_flush();
    +--------------------------+
    | audit_log_filter_flush() |
    +--------------------------+
    | OK                       |
    +--------------------------+
    
  • audit_log_filter_remove_filter()

    给定一个筛选器名称,从滤波器的电流设置删除过滤器。该滤波器不存在它是不是一个错误。

    如果删除过滤器是分配给任何用户,这些用户停止过滤(他们是从audit_log_user表)。终端过滤包含那些用户当前会话:他们从过滤器不再记录分离。

    语法:

    STRING audit_log_filter_remove_filter(STRING filter_name)
    

    争论:

    • filter_name:过滤器名称作为字符串。

    返回值:

    OK成功,误差:message失败

    例子:

    mysql> SELECT audit_log_filter_remove_filter('SomeFilter');
    +----------------------------------------------+
    | audit_log_filter_remove_filter('SomeFilter') |
    +----------------------------------------------+
    | OK                                           |
    +----------------------------------------------+
    
  • audit_log_filter_remove_user()

    给定一个用户账号,导致用户不再被分配到一个过滤器。这是不是一个错误,如果用户没有指定过滤器。过滤当前会话的用户不受影响。为用户建立新的连接,使用默认帐户过滤器过滤,如果有一个,不登录,否则。

    如果名字%的功能,删除默认帐户的过滤器,用于没有明确指定过滤器的任何用户帐户。

    语法:

    STRING audit_log_filter_remove_user(STRING user_name)
    

    争论:

    • user_name:用户帐户的名称作为一个字符串user_name@host_name格式,或%代表默认帐户

    返回值:

    OK成功,误差:message失败

    例子:

    mysql> SELECT audit_log_filter_remove_user('user1@localhost');
    +-------------------------------------------------+
    | audit_log_filter_remove_user('user1@localhost') |
    +-------------------------------------------------+
    | OK                                              |
    +-------------------------------------------------+
    
  • audit_log_filter_set_filter()

    给定一个筛选器名称和定义,对滤波器的电流设置增加了过滤器。如果过滤器已经存在并且是当前任何的会议,这些会议是从过滤分离,不再记录。这是因为新的过滤器的定义有一个新的过滤器,不同于以前的ID的ID

    语法:

    STRING audit_log_filter_set_filter(STRING filter_name, STRING definition)
    

    争论:

    • filter_name:过滤器名称作为字符串。

    • definition该滤波器的定义为:JSON价值

    返回值:

    OK成功,误差:message失败

    例子:

    mysql> SET @f = '{ "filter": { "log": false } }';
    mysql> SELECT audit_log_filter_set_filter('SomeFilter', @f);
    +-----------------------------------------------+
    | audit_log_filter_set_filter('SomeFilter', @f) |
    +-----------------------------------------------+
    | OK                                            |
    +-----------------------------------------------+
    
  • audit_log_filter_set_user()

    给定一个用户帐户名和筛选器名称指定过滤器的用户。一个用户只能分配一个过滤器,如果用户已经指定了一个过滤器,任务是更换。过滤当前会话的用户不受影响。新的连接正在使用新的过滤器过滤。

    作为一个特殊的情况下,这个名字%表示默认帐户。过滤器用于从没有显式地指定过滤器的任何用户帐户的连接。

    语法:

    STRING audit_log_filter_set_user(STRING user_name, STRING filter_name)
    

    争论:

    • user_name:用户帐户的名称作为一个字符串user_name@host_name格式,或%代表默认帐户

    • filter_name:过滤器名称作为字符串。

    返回值:

    OK成功,误差:message失败

    例子:

    mysql> SELECT audit_log_filter_set_user('user1@localhost', 'SomeFilter');
    +------------------------------------------------------------+
    | audit_log_filter_set_user('user1@localhost', 'SomeFilter') |
    +------------------------------------------------------------+
    | OK                                                         |
    +------------------------------------------------------------+
    
  • audit_log_read()

    读取审计日志事件并返回一个二进制JSON含审计事件数组字符串。如果审计日志格式不JSON,发生了一个错误

    返回值中的每个事件都是一个JSON哈希,除了最后一个数组元素可以是JSON无效的显示没有价值可阅读以下事件。

    对于第一个电话audit_log_read()在一个会话中,通过书签指示从哪里开始阅读。如果返回的数组的最终价值是不JSON无效的价值,有更多的事件后,那些刚刚读audit_log_read()可以称为无或书签的论点。没有理由,阅读继续下一个未读事件。一个书签的说法,阅读继续从书签。

    如果返回的数组的值是JSON无效的价值,没有更多的事件去读下一个电话audit_log_read()必须包括一个书签的论点。

    获取最近写入的事件一个书签,叫audit_log_read_bookmark()

    有关审计日志的阅读功能,看审计日志文件阅读

    语法:

    STRING audit_log_read([STRING arg])
    

    争论:

    arg:一个可选的书签,表示为一个字符串JSON散列表示和读多少。在下面的项目是重要的精氨酸价值(其他项目被忽略):

    • timestamp身份证件:位置在第一个事件的审计日志阅读。两者都必须完全指定的位置。

    • max_array_length:从日志读取的最大事件数。如果省略,默认是读到日志的结束或者直到读取缓冲区已满,以先到者为准。

    返回值:

    一个二进制JSON含有成功审核事件数组或字符串,无效的和失败的错误

    例子:

    mysql> SELECT audit_log_read(audit_log_read_bookmark());
    +-----------------------------------------------------------------------+
    | audit_log_read(audit_log_read_bookmark())                             |
    +-----------------------------------------------------------------------+
    | [ {"timestamp":"2018-01-15 22:41:24","id":0,"class":"connection", ... |
    +-----------------------------------------------------------------------+
    
  • audit_log_read_bookmark()

    返回一个值JSON字符串表示最近写入审核日志事件书签。如果审计日志格式不JSON,发生了一个错误

    书签是一个JSON哈希时间戳id项目说明在审计日志事件的位置。适用于通过audit_log_read()表明,函数从哪里开始阅读。

    有关审计日志的阅读功能,看审计日志文件阅读

    语法:

    STRING audit_log_read_bookmark()
    

    争论:

    返回值:

    一个二进制JSON含有成功的书签的字符串,或无效的和失败的错误

    例子:

    mysql> SELECT audit_log_read_bookmark();
    +-------------------------------------------------+
    | audit_log_read_bookmark()                       |
    +-------------------------------------------------+
    | { "timestamp": "2018-01-15 21:03:44", "id": 0 } |
    +-------------------------------------------------+
    
6.5.5.8.3审计日志选项和变量引用

表6审计日志选项和变量引用

姓名命令行选项文件系统无功状态变量变量范围动态
审计
audit_log_buffer_size全球
审计范围全球
audit_log_current_session
audit_log_current_size全球
audit_log_event_max_drop_size全球
audit_log_events全球
audit_log_events_filtered全球
audit_log_events_lost全球
audit_log_events_written全球
audit_log_exclude_accounts全球
audit_log_file全球
audit_log_flush全球
audit_log_format全球
audit_log_include_accounts全球
audit_log_policy全球
一次审计全球
audit_log_statement_policy全球
audit_log_strategy全球
audit_log_total_size全球
audit_log_write_waits全球

6.5.5.8.4审计日志选项和变量

本节介绍的命令和系统变量,MySQL企业审计控制操作。如果在启动时指定的值是不正确的audit_log插件可能无法正确初始化与服务器不加载它。在这种情况下,服务器可能也因为它不会承认他们产生其他审计日志设置错误消息。

控制审计日志插件的激活,使用此选项:

如果审计日志插件启用,它暴露了一些系统变量,控制过度采伐许可证:

mysql> SHOW VARIABLES LIKE 'audit_log%';
+-----------------------------+--------------+
| Variable_name               | Value        |
+-----------------------------+--------------+
| audit_log_buffer_size       | 1048576      |
| audit_log_connection_policy | ALL          |
| audit_log_current_session   | OFF          |
| audit_log_exclude_accounts  |              |
| audit_log_file              | audit.log    |
| audit_log_filter_id         | 0            |
| audit_log_flush             | OFF          |
| audit_log_format            | NEW          |
| audit_log_include_accounts  |              |
| audit_log_policy            | ALL          |
| audit_log_rotate_on_size    | 0            |
| audit_log_statement_policy  | ALL          |
| audit_log_strategy          | ASYNCHRONOUS |
+-----------------------------+--------------+

你可以设置这些变量在服务器启动,并在运行时他们中的一些人。那些仅为传统模式的审计日志过滤可以这么说。

  • audit_log_buffer_size

    财产价值
    命令行格式--audit-log-buffer-size=value
    介绍8.0.11
    系统变量audit_log_buffer_size
    范围全球
    动态
    看到的是_提示应用
    类型整数
    默认值1048576
    最小值4096
    最大值(64位平台)18446744073709547520
    最大值(32位平台)4294967295

    当审计日志插件写入事件日志时,它使用一个缓冲区来存储事件内容写作之前。这个变量控制缓冲区的大小,以字节为单位。服务器调整值为4096的倍数。插件使用一个缓冲区,它分配在初始化和删除时,它终止。插件分配缓冲区只有测井是异步的。

  • audit_log_compression

    财产价值
    命令行格式--audit-log-compression=value
    介绍8.0.11
    系统变量audit_log_compression
    范围全球
    动态
    看到的是_提示应用
    类型枚举
    默认值NONE
    有效值

    NONE

    GZIP

    为审核日志文件的压缩类型。允许值NONE(不压缩;默认)和gzip(GNU zip压缩)。有关更多信息,参见审核日志文件压缩

  • audit_log_connection_policy

    财产价值
    命令行格式--audit-log-connection-policy=value
    介绍8.0.11
    系统变量audit_log_connection_policy
    范围全球
    动态
    看到的是_提示应用
    类型枚举
    默认值ALL
    有效值

    ALL

    ERRORS

    NONE

    笔记

    这个变量只适用于传统模式的审计日志过滤(见第6.5.5.7,“传统模式的审计日志过滤”

    政策如何控制审计日志插件写入其日志文件的连接事件。下表显示了允许值。

    价值描述
    ALL所有的连接事件日志
    ERRORS只记录失败的连接事件
    NONE不连接的事件日志
    笔记

    在服务器启动时,任何明确的价值audit_log_connection_policy如果可以重写audit_log_policy还规定,如第6.5.5.5,审计日志记录控制”

  • audit_log_current_session

    财产价值
    介绍8.0.11
    系统变量audit_log_current_session
    范围全球会议
    动态
    看到的是_提示应用
    类型布尔
    默认值depends on filtering policy

    不管日志审计是当前会话启用。这个变量的值是只读的会话。它设置会话开始时的值audit_log_include_accountsaudit_log_exclude_accounts系统变量。审计日志插件使用会话值确定是否审核事件的会议。(这是一个全球价值,但插件不使用它。)

  • audit_log_encryption

    财产价值
    命令行格式--audit-log-encryption=value
    介绍8.0.11
    系统变量audit_log_encryption
    范围全球
    动态
    看到的是_提示应用
    类型枚举
    默认值NONE
    有效值

    NONE

    AES

    为审核日志文件加密类型。允许值NONE(没有加密;默认)和AES(aes-256-cbc密码加密)。有关更多信息,参见审核日志文件加密

  • audit_log_exclude_accounts

    财产价值
    命令行格式--audit-log-exclude-accounts=value
    介绍8.0.11
    系统变量audit_log_exclude_accounts
    范围全球
    动态
    看到的是_提示应用
    类型字符串
    默认值NULL
    笔记

    这个变量只适用于传统模式的审计日志过滤(见第6.5.5.7,“传统模式的审计日志过滤”

    该帐户的事件不应该被记录。该值应NULL或一个字符串包含一个或多个用逗号分隔的帐户名称。有关更多信息,参见第6.5.5.6,审计日志过滤”

    修改audit_log_exclude_accounts只影响连接创建修改后,不存在连接。

  • audit_log_file

    财产价值
    命令行格式--audit-log-file=file_name
    介绍8.0.11
    系统变量audit_log_file
    范围全球
    动态
    看到的是_提示应用
    类型文件名
    默认值audit.log

    基地名称和后缀的文件,审核日志插件写事件。默认值是audit.log,无论记录格式。有后缀名对应的格式,设置名称明确,选择一个不同的后缀(例如,audit.xmlXML格式,audit.jssonFor Json Forformat .

    如果价值audit_log_file是一个相对路径名,插件解释它相对于数据目录。如果该值是一个完整的路径名,插件的使用价值是。一个完整的路径名可能有用,如果它希望找到审计文件在一个单独的文件系统或目录。出于安全原因,审计日志文件应该被写入目录只能访问MySQL服务器和用户提供了一个正当的理由来查看日志。

    详情如何审核日志插件解释audit_log_file价值和文件重命名,发生在插件初始化和终止规则,看审核日志文件名称

    审计日志插件使用含有审核日志文件的目录(取决于audit_log_file值)的位置搜索可读的审计日志文件。从这些日志文件和当前文件,插件构建一个列表的那些受使用审核日志书签和阅读功能。看到审计日志文件阅读

  • audit_log_filter_id

    财产价值
    介绍8.0.11
    系统变量audit_log_filter_id
    范围全球会议
    动态
    看到的是_提示应用
    类型整数

    这个变量的值表示为当前会话的会话ID的内部维护的审核过滤。值为0表示该会话没有过滤分。

  • audit_log_flush

    财产价值
    介绍8.0.11
    系统变量audit_log_flush
    范围全球
    动态
    看到的是_提示应用
    类型布尔
    默认值OFF

    当这个变量设置为启用(1或ON),审核日志插件关闭和打开它的日志文件,把它。(值保持关闭所以,你不需要禁用它明确之前,使它再次执行另一个冲水。)使这个变量没有影响,除非audit_log_rotate_on_size0。有关更多信息,参见第6.5.5.5,审计日志记录控制”

  • audit_log_format

    财产价值
    命令行格式--audit-log-format=value
    介绍8.0.11
    系统变量audit_log_format
    范围全球
    动态
    看到的是_提示应用
    类型枚举
    默认值NEW
    有效值

    OLD

    NEW

    JSON

    审核日志文件格式。允许值OLD(旧风格XML),(新型XML;默认),和JSON。有关每个格式的详细信息,参见第6.5.5.4,审计日志文件格式”

    笔记

    在考虑改变日志格式时,关于问题的信息,参见审计日志文件格式

  • audit_log_include_accounts

    财产价值
    命令行格式--audit-log-include-accounts=value
    介绍8.0.11
    系统变量audit_log_include_accounts
    范围全球
    动态
    看到的是_提示应用
    类型字符串
    默认值NULL
    笔记

    这个变量只适用于传统模式的审计日志过滤(见第6.5.5.7,“传统模式的审计日志过滤”

    占的事件应该记录。该值应NULL或一个字符串包含一个或多个用逗号分隔的帐户名称。有关更多信息,参见第6.5.5.6,审计日志过滤”

    修改audit_log_include_accounts只影响连接创建修改后,不存在连接。

  • audit_log_policy

    财产价值
    命令行格式--audit-log-policy=value
    介绍8.0.11
    系统变量audit_log_policy
    范围全球
    动态
    看到的是_提示应用
    类型枚举
    默认值ALL
    有效值

    ALL

    LOGINS

    QUERIES

    NONE

    笔记

    这个变量只适用于传统模式的审计日志过滤(见第6.5.5.7,“传统模式的审计日志过滤”

    政策如何控制审计日志插件写入事件日志文件中的。下表显示了允许值。

    价值描述
    ALL记录所有事件
    LOGINS只记录登录事件
    QUERIES查询事件日志
    NONE日志什么(禁用审计流)

    audit_log_policy只能设置在服务器启动。在运行时,它是一个只读的变量。其他两个系统变量,audit_log_connection_policyaudit_log_statement_policy提供更精细的控制,过度采伐政策和可以设置在启动或运行时。如果你使用audit_log_policy而其他两个变量启动,服务器用其值来设置这些变量。关于政策变量及其交互的更多信息,参见第6.5.5.5,审计日志记录控制”

  • audit_log_read_buffer_size

    财产价值
    命令行格式--audit-log-read-buffer-size=#
    介绍8.0.11
    系统变量(>= 8.0.11)audit_log_read_buffer_size
    范围(>= 8.0.12)全球会议
    范围(8.0.11)全球
    动态(>= 8.0.12)
    动态(8.0.11)
    看到的是_提示应用(>= 8.0.11)
    类型整数
    默认值(>= 8.0.12)32768
    默认值(8.0.11)1048576
    最小值(>= 8.0.12)32768
    最小值(8.0.11)1024
    最大值4194304

    缓冲区大小的阅读从审计日志文件的字节。《audit_log_read()函数读取不超过多少字节。日志文件的阅读只是JSON测井格式支持。有关更多信息,参见审计日志文件阅读

    在MySQL 8.0.12,这个变量有一个默认的32KB,可在运行时设置。每个客户端设置会话值audit_log_read_buffer_size适当的使用audit_log_read()。MySQL 8.0.12之前,audit_log_read_buffer_size有一个默认1MB,影响到所有的客户,可以在服务器启动的变化。

  • audit_log_rotate_on_size

    财产价值
    命令行格式--audit-log-rotate-on-size=N
    介绍8.0.11
    系统变量audit_log_rotate_on_size
    范围全球
    动态
    看到的是_提示应用
    类型整数
    默认值0

    如果audit_log_rotate_on_size值为0,审计日志插件不执行日志文件自动旋转。相反,使用audit_log_flush关闭并重新打开点播日志。在这种情况下,手动重命名文件外部服务器之前冲洗。

    如果audit_log_rotate_on_size值大于0,通过旋转自动日志文件大小发生。每当一个写入日志文件使其规模超过audit_log_rotate_on_size价值,审计日志插件关闭当前日志文件,重命名,并打开一个新的日志文件。

    为更多的信息关于审计日志文件旋转,看审计日志文件空间管理和名称旋转

    如果你设置这个变量的值是不是4096的倍数,这是截断到最近的多。(因此,它设置为小于4096的值都设置为0,没有发生旋转的效果,除了手动。)

  • audit_log_statement_policy

    财产价值
    命令行格式--audit-log-statement-policy=value
    介绍8.0.11
    系统变量audit_log_statement_policy
    范围全球
    动态
    看到的是_提示应用
    类型枚举
    默认值ALL
    有效值

    ALL

    ERRORS

    NONE

    笔记

    这个变量只适用于传统模式的审计日志过滤(见第6.5.5.7,“传统模式的审计日志过滤”

    政策如何控制审计日志插件写入事件日志文件中的声明。下表显示了允许值。

    价值描述
    ALL所有陈述事件日志
    ERRORS只记录失败的声明事件
    NONE不要停下来
    笔记

    在服务器启动时,任何明确的价值audit_log_statement_policy如果可以重写audit_log_policy还规定,如第6.5.5.5,审计日志记录控制”

  • audit_log_strategy

    财产价值
    命令行格式--audit-log-strategy=value
    介绍8.0.11
    系统变量audit_log_strategy
    范围全球
    动态
    看到的是_提示应用
    类型枚举
    默认值ASYNCHRONOUS
    有效值

    ASYNCHRONOUS

    PERFORMANCE

    SEMISYNCHRONOUS

    SYNCHRONOUS

    测井方法在审计日志插件的使用。这些策略的值是允许的:

    • ASYNCHRONOUS:异步登录。在输出缓冲区等空间。

    • PERFORMANCE:异步登录。降要求的输出缓冲区没有足够的空间。

    • SEMISYNCHRONOUS:日志同步。允许缓存由操作系统。

    • SYNCHRONOUS:日志同步。呼叫(同步)在每一个请求

6.5.5.8.5审计日志状态变量

如果审计日志插件启用,它暴露了几个变量,提供可操作的信息。这些变量可用于传统模式审核过滤和JSON方式审核过滤。

6.5.5.9审计日志的限制

MySQL企业审计是受这些限制:

  • 只有SQL语句记录。改变了没有SQL API,如memcached,Node.jss和NDB API,没有登录。

  • 只有顶层的陈述记录,不是语句内存储的程序如触发器或存储过程。

  • 通过这样的语句引用的文件内容LOAD DATA INFILE没有登录

NDB集群它可以使用MySQL企业审计与MySQL NDB集群,符合下列条件:

  • 要记录所有的变化必须使用SQL接口。不使用SQL接口的变化,如那些由NDB API,memcached,提供或ClusterJ,没有登录。

  • 插件必须安装在每个MySQL服务器用于集群上执行SQL。

  • 审计插件数据必须聚集在用所有的MySQL服务器集群。这种聚合是应用程序或用户的责任。

6.5.6 MySQL企业防火墙

笔记

MySQL企业防火墙是一个扩展包含在MySQL企业版,商业产品。要了解更多关于商业产品,看http://www.mysql.com /产品/

MySQL企业版包括MySQL企业防火墙,应用层防火墙,使数据库管理员可以允许或拒绝基于匹配对接受声明模式白名单执行SQL语句。这有助于使MySQL服务器的攻击,如SQL注入或试图利用他们的合法查询工作负载的特性,在应用开发。

每个MySQL帐户注册的防火墙都有它自己的表白,使保护针对每个帐户。对于一个给定的账户,防火墙能够记录、保护、检测模式,培养在接受语句模式,积极防范不可接受或不可接受的陈述语句,被动探测。图说明了防火墙的过程在每一个模式来陈述。

图6.1 MySQL企业防火墙的操作

Flow chart showing how MySQL Enterprise Firewall processes incoming SQL statements in recording, protecting, and detecting modes.

以下各节描述了MySQL企业防火墙的组成,讨论如何安装和使用,并提供参考信息的组件。

6.5.6.1 MySQL企业防火墙组件

MySQL企业防火墙是基于实现这些组件的插件库:

  • 服务器端插件命名MYSQL_FIREWALL检查SQL语句之前执行,基于其在内存中缓存,以决定是否执行或拒绝每一个语句。

  • 服务器端插件命名MYSQL_FIREWALL_USERSMySQL _ _防火墙白名单实施INFORMATION_SCHEMA表观为防火墙提供数据缓存。

  • 系统表firewall_usersfirewall_whitelistmysql数据库提供的防火墙数据持久存储。

  • 存储过程命名sp_set_firewall_mode()sp_reload_firewall_rules()执行任务,例如注册MySQL账户的防火墙,建立自己的操作模式,以及缓存和系统底层数据表之间的防火墙管理转移。

  • 一组用户定义的函数提供了一个SQL级API对低水平的任务,如同步缓存基础系统表。

  • 系统变量,使防火墙的配置和状态变量的运行提供操作信息。

  • FIREWALL_ADMINFIREWALL_USER权限允许用户执行任何用户的防火墙规则,和自己的防火墙规则,分别。

6.5.6.2安装或卸载MySQL企业防火墙

MySQL企业防火墙的安装是一次性操作,安装的组件描述第6.5.6.1,MySQL企业防火墙组件”。安装可以使用图形界面或手动执行:

  • 在Windows中,MySQL的安装程序包括一个选项,使你的MySQL企业防火墙。

  • MySQL Workbench 6.3.4或更高,可以安装MySQL企业防火墙,启用或禁用或卸载安装防火墙,防火墙。

  • 手动MySQL企业防火墙的安装需要运行一个脚本位于share你的MySQL安装目录。

笔记

如果安装了防火墙,MySQL企业涉及一些最小的开销即使禁用。为了避免这种开销,不安装防火墙,除非你想用它。

笔记

MySQL企业防火墙不与查询缓存一起工作。如果查询缓存启用,禁用它在安装防火墙(见站点配置

使用说明,见第6.5.6.3,使用MySQL企业防火墙”。参考信息,看第6.5.6.4,MySQL企业防火墙参考”

安装MySQL企业防火墙

如果MySQL企业防火墙已经从旧版本的MySQL的安装,卸载它使用了在本节的后面然后重新启动服务器之前安装当前版本的说明。在这种情况下,还需要配置重新登记。

在Windows中,你可以使用MySQL的安装程序来安装MySQL企业防火墙,如图6.2,“MySQL企业防火墙的安装Windows”。查看使企业防火墙复选框。(网络访问打开防火墙端口有不同的目的。它指的是Windows防火墙和Windows控件是否阻断TCP / IP端口上的MySQL服务器侦听客户端连接。)

图6.2 MySQL企业防火墙的安装在Windows

Content is described in the surrounding text.

安装MySQL企业防火墙使用MySQL Workbench 6.3.4或更高,看MySQL企业防火墙界面

安装MySQL企业防火墙手动,看在share你的MySQL安装目录选择脚本,是适合你的平台。可用的脚本用来指插件库文件的后缀是不同的:

  • win_install_firewall.sql:选择此脚本使用Windows系统dllas the file name的后缀。

  • linux_install_firewall.sql:选择此脚本使用Linux系统和类似系统。所以as the file name的后缀。

安装脚本创建在默认的数据库存储过程,所以选择要使用的数据库。然后运行脚本如下,命名选定的数据库命令行上。下面的示例使用mysql数据库和Linux的安装脚本。对你的系统进行相应的替换。

内核&#62;mysql -u root -p mysql < linux_install_firewall.sql输入密码:(enter root password here)

安装MySQL企业防火墙或者使用图形界面或手动应启用防火墙。验证,连接到服务器并执行该语句:

mysql> SHOW GLOBAL VARIABLES LIKE 'mysql_firewall_mode';
+---------------------+-------+
| Variable_name       | Value |
+---------------------+-------+
| mysql_firewall_mode | ON    |
+---------------------+-------+
卸载MySQL企业防火墙

MySQL企业防火墙可以使用MySQL Workbench或手动卸载。

卸载MySQL企业防火墙使用MySQL Workbench 6.3.4或更高,看MySQL企业防火墙界面

卸载MySQL企业防火墙手动,执行下面的语句。假定存储过程中创建的mysql数据库调整DROP PROCEDURE如果报表适当程序在不同的数据库中创建。

表MySQL。firewall_whitelist;表MySQL。firewall_users;卸载插件mysql_firewall;卸载插件mysql_firewall_whitelist;卸载插件mysql_firewall_users;降功能set_firewall_mode;降功能normalize_statement;降功能read_firewall_whitelist;降功能read_firewall_users;降功能mysql_firewall_flush_status;下降过程sp_set_firewall_mode;下降过程mysql.sp_reload_firewall_rules MySQL;

6.5.6.3使用MySQL企业防火墙

在使用MySQL企业防火墙,安装它根据提供的指令第6.5.6.2,“安装或卸载MySQL企业防火墙”。同时,MySQL企业防火墙不与查询缓存一起工作;如果是启用禁用查询缓存(见站点配置

本节介绍了如何使用SQL语句配置MySQL企业防火墙。另外,MySQL Workbench 6.3.4以上提供防火墙控制图形界面。看到MySQL企业防火墙界面

启用或禁用防火墙,设置mysql_firewall_mode系统变量。默认情况下,启用时安装防火墙。控制初始防火墙状态明确,你可以设置变量在服务器启动。例如,为了使一个选项文件防火墙,使用这些线:

[mysqld]mysql_firewall_mode=ON

它也可以禁用或启用运行时防火墙:

mysql> SET GLOBAL mysql_firewall_mode = OFF;
mysql> SET GLOBAL mysql_firewall_mode = ON;

除了全球/关闭防火墙模式,每个帐户注册的防火墙有其自身的运作模式。一个帐户记录模式,防火墙应用的学习指纹,这是可接受的语句模式,结合在一起,形成一个白名单。训练结束后,开关防火墙保护模式使MySQL对偏离指纹报表访问。额外的培训,开关防火墙回到录音模式需要新的报表模式更新白名单。入侵检测模式可将可疑语句错误日志,但不拒绝访问。

防火墙的维护每个帐户的基础上的白名单规则,使这些保护策略实施:

  • 一个应用程序,具有独特的保护要求,将其配置为使用一个帐户,不得用于其他目的。

  • 这是相关的,共享保护要求的应用,将它们配置为一组使用相同的帐户。

防火墙的操作是基于SQL语句规范摘要的形式转换。防火墙消化就像声明消化的性能架构使用(见25.9节,“性能架构声明消化和采样”)。然而,不同的性能模式,有关消化系统相关变量max_digest_length

从注册帐号连接,防火墙将每个输入语句的归一化形式和过程根据账户模式:

  • 在记录模式下,防火墙增加了归一化的声明帐户的白名单规则。

  • 在保护模式下,防火墙比较归一化的声明帐户的白名单规则。如果有一个匹配,声明通过服务器继续处理它。否则,服务器将拒绝语句并返回一个错误给客户。防火墙也将拒绝声明错误日志如果mysql_firewall_trace系统变量是启用

  • 在检测模式下,防火墙匹配语句作为保护模式,但将不匹配的语句错误日志没有拒绝访问。

有一个模式的账户OFF或不与防火墙注册被忽略的。

使用MySQL企业防火墙的保护,遵循这些步骤:

  1. 登记户口放在记录模式。

  2. 连接到使用注册帐户的MySQL服务器,执行语句,要学。这建立账户的名单被接受的陈述。

  3. 注册帐户切换到保护模式。

下面的示例演示如何使用防火墙登记一个账户,使用防火墙来学习,接受的陈述,并保护帐户对不可接受的语句的执行。例帐户,'fwuser'@'localhost',是用于访问表中的应用sakila数据库(这个数据库是可用的dev.mysql.com http:/ / / / index-other.html DOC。)

笔记

用户的帐户名和主机部分分开为报表等CREATE USERGRANT,而与防火墙组件指定使用一个帐户,将它命名为一个单引号的字符串fwuser“localhost”

命名的帐户作为一个单引号的字符串的防火墙组件意味着你不能使用帐户有嵌入式大会@人物的用户名称

在下面的过程中使用管理MySQL账户执行的步骤,除了那些指定的注册帐户执行防火墙。默认的数据库应sakila语句执行使用注册账号。

  1. 如果需要,创建帐户受到保护(选择一个合适的密码)并授予它的权限为sakila数据库:

    MySQL的&#62;CREATE USER 'fwuser'@'localhost' IDENTIFIED BY 'fWp@3sw0rd';MySQL的&#62;GRANT ALL ON sakila.* TO 'fwuser'@'localhost';
  2. 使用sp_set_firewall_mode()存储过程与防火墙和记录模式的地方登记的帐户(如果程序位于比其他数据库MySQL,相应调整表):

    mysql> CALL mysql.sp_set_firewall_mode('fwuser@localhost', 'RECORDING');
    

    它在执行的过程中,存储过程调用防火墙的用户自定义函数,这可能会产生自己的输出。

  3. 使用注册账号,连接到服务器,然后执行一些语句,它是合法的:

    mysql> SELECT first_name, last_name FROM customer WHERE customer_id = 1;
    mysql> UPDATE rental SET return_date = NOW() WHERE rental_id = 1;
    mysql> SELECT get_customer_balance(1, NOW());
    

    防火墙将在账户名单摘要的形式并记录报表。

    笔记

    直到帐户执行记录模式的报表,它的白名单是空的,这相当于拒绝ALL如果切换到保护模式,该帐户将被有效地禁止执行语句。

  4. 在这一点上,用户和白名单信息缓存,可以在防火墙中看到INFORMATION_SCHEMA

    MySQL的&#62;SELECT MODE FROM INFORMATION_SCHEMA.MYSQL_FIREWALL_USERSWHERE USERHOST = 'fwuser@localhost';----------- |模式| ----------- |记录| ----------- MySQL &#62;SELECT RULE FROM INFORMATION_SCHEMA.MYSQL_FIREWALL_WHITELISTWHERE USERHOST = 'fwuser@localhost';+----------------------------------------------------------------------------+| RULE                                                                       |+----------------------------------------------------------------------------+| SELECT `first_name` , `last_name` FROM `customer` WHERE `customer_id` = ?  || SELECT `get_customer_balance` ( ? , NOW ( ) )                              || UPDATE `rental` SET `return_date` = NOW ( ) WHERE `rental_id` = ?          || SELECT @@`version_comment` LIMIT ?                                         |+----------------------------------------------------------------------------+
    笔记

    这个@@version_comment规则来自于报表自动发送的MySQL当您连接到服务器的客户端的注册用户。

    它是匹配的应用条件下列车重要的防火墙。例如,一个给定的MySQL连接器将报表服务器在一个确定服务器的特性和功能的连接开始。如果一个应用程序通常是通过连接器,列车防火墙那样,太。让那些最初的陈述成为与应用程序关联的帐户的白名单的一部分。

  5. 使用存储过程注册用户切换到保护模式:

    mysql> CALL mysql.sp_set_firewall_mode('fwuser@localhost', 'PROTECTING');
    
    重要

    切换帐户了RECORDING模式同步防火墙缓存数据的基础MySQL持久性存储系统的数据库表。如果你不为用户谁正在记录模式切换,缓存的白名单数据不写入系统表和将丢失当服务器重启。

  6. 使用注册账户,执行一些可接受和不可接受的陈述。防火墙与每个人对账户的白名单和接受或拒绝它。

    这句话不是一个训练语句相同但产生相同的归一化的声明作为其中的一种,因此防火墙接受它:

    mysql> SELECT first_name, last_name FROM customer WHERE customer_id = '48';
    +------------+-----------+
    | first_name | last_name |
    +------------+-----------+
    | ANN        | EVANS     |
    +------------+-----------+
    

    这些陈述不匹配任何白名单和每一个错误的结果:

    mysql> SELECT first_name, last_name FROM customer WHERE customer_id = 1 OR TRUE;
    ERROR 1045 (28000): Statement was blocked by Firewall
    mysql> SHOW TABLES LIKE 'customer%';
    ERROR 1045 (28000): Statement was blocked by Firewall
    mysql> TRUNCATE TABLE mysql.slow_log;
    ERROR 1045 (28000): Statement was blocked by Firewall
    

    防火墙也将拒绝陈述错误日志如果mysql_firewall_trace系统变量是启用。例如:

    [注]插件mysql_firewall报道:为fwuser @本地&#39;access否认。原因:在白名单中没有匹配。声明:截断表` MySQL `。` slow_log `”

    你可以在你的努力确定攻击源,利用这些日志信息。

  7. 你可以登录不匹配的语句为可疑没有拒绝访问。为此,将帐户中的入侵检测模式:

    mysql> CALL mysql.sp_set_firewall_mode('fwuser@localhost', 'DETECTING');
    
  8. 使用注册账号,连接到服务器,然后执行一个语句,不符合白名单:

    mysql> SHOW TABLES LIKE 'customer%';
    +------------------------------+
    | Tables_in_sakila (customer%) |
    +------------------------------+
    | customer                     |
    | customer_list                |
    +------------------------------+
    

    在检测模式下,防火墙允许不匹配的语句执行而将消息写入错误日志:

    [Note] Plugin MYSQL_FIREWALL reported:
    'SUSPICIOUS STATEMENT from 'fwuser@localhost'. Reason: No match in whitelist.
    Statement: SHOW TABLES LIKE ? '
    
  9. 评估防火墙活动,检查其状态变量:

    mysql> SHOW GLOBAL STATUS LIKE 'Firewall%';
    +----------------------------+-------+
    | Variable_name              | Value |
    +----------------------------+-------+
    | Firewall_access_denied     | 3     |
    | Firewall_access_granted    | 4     |
    | Firewall_access_suspicious | 1     |
    | Firewall_cached_entries    | 4     |
    +----------------------------+-------+
    

    变量说明语句的拒绝,接受的数量,记录为可疑,并添加到缓存,分别。这个Firewall_access_granted算是因为4的@ @ @法语版声明发出的MySQL客户每三次你用它来作为注册用户连接,加上SHOW TABLES声明,不堵塞检测模式

要一个帐户,额外的培训是必要的,切换到录音模式,然后再执行语句添加到白名单模式后保护。

6.5.6.4 MySQL企业防火墙参考

下面的讨论作为一个参考MySQL企业防火墙组件:

6.5.6.4.1 MySQL企业防火墙表

MySQL企业防火墙维护帐户信息和白名单。它使用INFORMATION_SCHEMA表提供的意见纳入缓存数据,表中MySQL系统的数据库来存储这些数据在持久的形式。当启用时,防火墙基础运营决策对缓存的数据。

这个INFORMATION_SCHEMA表格可由任何人。这个MySQL表只能由有权限的用户访问数据库。

这个INFORMATION_SCHEMA.MYSQL_FIREWALL_USERSmysql.firewall_users表列出注册防火墙账户及其运作模式。这些列的表:

  • USERHOST

    随着防火墙注册一个账户。每个账户的格式user_name@host_name代表实际用户和主机名的服务器认证。模式和网络掩码不应该注册时使用的用户。

  • MODE

    目前的防火墙运行模式的帐户。允许的模式值OFF检测PROTECTING录制,和RESET。关于其意义的细节,看描述_集SP(_ _防火墙模式)进入第6.5.6.4.2,MySQL企业防火墙程序和功能”

这个INFORMATION_SCHEMA.MYSQL_FIREWALL_WHITELISTmysql.firewall _白名单表列出了防火墙和白名单注册账户。这些列的表:

  • USERHOST

    随着防火墙注册一个账户。格式为用户帐户表同。

  • RULE

    归一化的声明帐户可接受的语句模式说明。一个帐户名单是其规则的结合。

  • ID

    一个整数列是表的主键。本栏在MySQL 8.0.12添加。

6.5.6.4.2 MySQL企业防火墙程序和功能

MySQL企业防火墙存储执行任务,例如注册MySQL账户的防火墙程序,建立自己的操作模式,以及缓存和系统底层数据表之间的防火墙管理转移。它也有一套用户自定义函数(UDF)API为低级别的任务如同步缓存与底层的系统表提供了一个SQL级。

正常情况下,存储过程实现用户界面。UDF是由存储过程的调用,而不是直接由用户。

调用存储过程时的默认数据库不包含程序的数据库,用数据库名称限定的程序名称。例如:

CALL mysql.sp_set_firewall_mode(user, mode);

下面的列表描述了每个防火墙存储过程和UDF:

  • sp_reload_firewall_rules(user)

    此存储过程使用防火墙udf来重新注册帐号和加载在内存中存储的规则,它的规则mysql.firewall_whitelist表本程序提供了个人账户防火墙的操作控制。

    这个user参数名受影响的帐户,为一个字符串user_name@host_name格式

    例子:

    CALL mysql.sp_reload_firewall_rules('fwuser@localhost');
    
    警告

    这个程序设置帐户模式RESET,从而清除帐户和设置白名单的方式关闭。如果帐户模式不OFF之前的sp_reload_firewall_rules()打电话,使用sp_set_firewall_mode()恢复以前的模式,重装后的规则。例如,如果该帐户是保护模式,这不再是真实的在调用sp_reload_firewall_rules()你必须将它设置为保护再次明确

  • sp_set_firewall_mode(user, mode)

    此存储过程注册一个MySQL帐户与防火墙建立运作模式。程序也调用防火墙UDF需要缓存和基础系统表之间的防火墙的数据传输。这个过程可称为即使mysql_firewall_mode系统变量关闭,虽然设置帐户模式没有操作影响而禁用防火墙。

    这个user参数名受影响的帐户,为一个字符串user_name@host_name格式

    这个mode是用户的操作模式,为一个字符串。这些模式的值是允许的:

    • OFF防火墙:disable the for the account。

    • DETECTING:入侵检测模式:写可疑(不匹配)语句错误日志,但不拒绝访问。

    • PROTECTING:通过匹配传入报表对帐户的白名单保护帐户。

    • RECORDING:培养模式:对账单记录可接受。输入语句不立即失败,语法错误都记录成为该帐户的白名单规则部分。

    • RESET:明确帐户的白名单和设置账户模式关闭

    交换一个帐户的任何模式但RECORDING将防火墙缓存的数据基础MySQL持久性存储系统的数据库表。开关模式OFF录制重新加载白名单的mysql.firewall_whitelist表到缓存中

    如果帐户有一个空的白名单,设置其模式PROTECTING生产是一个结果集返回一个错误消息,而不是SQL错误:

    MySQL的&#62;CALL mysql.sp_set_firewall_mode('a@b','PROTECTING');---------------------------------------------------------------------- | set_firewall_mode(arg_userhost,arg_mode)| ---------------------------------------------------------------------- |错误:保护要求一个“B模式但白名单是空的。| ----------------------------------------------------------------------一行集(0.02秒)查询好,为受影响的行(0.02秒)
  • mysql_firewall_flush_status()

    该自定义重置几个防火墙状态变量为0:

    Firewall_access_denied
    Firewall_access_granted
    Firewall_access_suspicious
    

    例子:

    SELECT mysql_firewall_flush_status();
    
  • normalize_statement(stmt)

    这个UDF规范SQL语句用于白名单规则的摘要的形式。

    例子:

    SELECT normalize_statement('SELECT * FROM t1 WHERE c1 > 2');
    
  • read_firewall_users(user, mode)

    这集的UDF更新防火墙用户缓存通过SELECT声明对mysql.firewall_users

    例子:

    SELECT read_firewall_users('fwuser@localhost', 'RECORDING')
    FROM mysql.firewall_users;
    
  • read_firewall_whitelist(user, rule)

    这集的UDF更新记录语句缓存通过SELECT声明对mysql.firewall _白名单

    例子:

    SELECT read_firewall_whitelist('fwuser@localhost', 'RECORDING')
    FROM mysql.firewall_whitelist;
    
  • set_firewall_mode(user, mode)

    UDF管理用户的缓存和建立用户操作模式。

    例子:

    SELECT set_firewall_mode('fwuser@localhost', 'RECORDING');
    
6.5.6.4.3 MySQL企业防火墙系统变量

MySQL企业防火墙支持下列系统变量。用它来配置防火墙的操作。这些变量是不可用,除非安装防火墙(见第6.5.6.2,“安装或卸载MySQL企业防火墙”

6.5.6.4.4 MySQL企业防火墙状态变量

MySQL企业防火墙支持以下状态变量。使用它们来获得关于防火墙运行状态信息。这些变量是不可用,除非安装防火墙(见第6.5.6.2,“安装或卸载MySQL企业防火墙”)。防火墙状态变量被设置为0时MYSQL_FIREWALL插件安装或启动服务器。他们中的许多人都将重置为零的mysql_firewall_flush_status()UDF(这第6.5.6.4.2,MySQL企业防火墙程序和功能”

6.6 fips支持

MySQL支持FIPS模式,如果编译使用OpenSSL,和OpenSSL库和FIPS对象模块可在运行时。

FIPS模式在服务器端应用的服务器进行加密操作。这包括复制(主/从和组复制)和X插件,它运行在服务器。FIPS模式也适用于试图通过客户端连接到服务器。

以下各节描述了FIPS模式及如何利用它在MySQL:

FIPS概述

联邦信息处理标准140-2(FIPS 140-2)描述了一种可按联邦安全标准(美国政府)用于保护敏感或有价值的信息加密模块机构。认为可以接受这样的联邦使用加密模块必须认证的FIPS 140-2。如果一个系统用于保护敏感数据缺乏适当的FIPS 140-2认证,联邦机构不能购买。

产品如OpenSSL可以使用FIPS模式,尽管OpenSSL库本身是没有验证的FIPS。相反,OpenSSL库使用OpenSSL FIPS对象模块,使基于OpenSSL的FIPS模式运行应用程序。

关于OpenSSL FIPS和实施的一般信息,这些信息可能是有用的:

重要

FIPS模式密码操作如更长的密钥长度的加密算法,在可接受的限制条件限制或要求。对于OpenSSL,确切的FIPS行为依赖于OpenSSL的版本。有关详细信息,请参阅OpenSSL FIPS用户指南。

在MySQL FIPS模式系统的要求

MySQL支持FIPS模式,这些系统要求必须满足:

  • 在生成时,MySQL必须编译使用OpenSSL。FIPS模式不能如果编译使用不同的SSL库使用MySQL。

  • 在运行时,OpenSSL库和OpenSSL FIPS对象模块必须提供共享对象(动态链接)。可以建立静态链接的OpenSSL的对象,但不使用MySQL。

FIPS模式已经过测试,在el7 MySQL,但可能对其他系统。

如果你的平台或操作系统提供的OpenSSL FIPS对象模块,你可以使用它。否则,你可以建立OpenSSL库和FIPS从源对象模块。在OpenSSL FIPS用户指南使用说明(见FIPS概述

在MySQL配置FIPS模式

MySQL实现FIPS模式在服务器端和客户端的控制:

  • 这个ssl_fips_mode系统变量控制服务器是否运行在FIPS模式。

  • 这个--ssl-fips-mode客户端选项控制是否一个给定的MySQL客户端运行在FIPS模式。

这个ssl_fips_mode系统变量--ssl-fips-mode客户选项允许这些值:

  • OFF模式:fips disable。

  • ON:使fips模式

  • STRICT使:严格的FIPS模式

在服务器端,数字ssl_fips_mode值的0, 1,和2是等价的关闭ON,和严格不,不

重要

一般来说,STRICT施加更多的限制比打开(放),但MySQL本身没有进行特定的代码比其他指定OpenSSL FIPS模式价值。在FIPS模式准确的行为ON严格依赖于OpenSSL的版本。有关详细信息,请参阅OpenSSL FIPS用户指南(见FIPS概述

笔记

如果OpenSSL FIPS对象模块是不可用的,唯一被允许的值ssl_fips_mode--ssl-fips-mode关闭。发生错误,试图将FIPS模式为不同的值。

FIPS模式在服务器端应用的服务器进行加密操作。这包括复制(主/从和组复制)和X插件,它运行在服务器。

FIPS模式也适用于试图通过客户端连接到服务器。启用时,可以在客户端或服务器端,它制约所支持的加密算法可供选择。然而,启用FIPS模式并不要求必须使用加密的连接,或者用户凭据进行加密。例如,如果启用FIPS模式,需要强大的加密算法。特别是,MD5是受限制的,所以要建立加密连接使用加密密码等RC4-MD5不工作。但有关于FIPS模式防止建立加密连接什么。(这样做,你可以使用要求条款CREATE USERALTER USER为特定的用户帐户或组require_secure_transport系统变量影响所有账户。)