密码认证组件
MYSQL是一个组件式架构,MYSQL 8.0+默认启用了密码校验组件validate_password
,它强迫你设置很复杂的密码以保证数据库安全,对于个人来说,你不能设置如123456
这样的密码,当你在设置这样的密码的时候会报如下错误:
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
笔者认为这对于个人学习而言非常碍事,解决方案有两种:
修改密码认证策略
卸载密码认证组件
修改密码认证策略
官方文档
查看当前认证策略
mysql> SHOW VARIABLES LIKE 'validate_password.%';
这几个认证策略就不一一解释了,就是字面意思。
修改认证策略
其他的参数照着改就行,最后最好重启一下服务器。
设置密码长度为4个字符
mysql> SET GLOBAL validate_password_length = 4;
设置认证策略低级
SET GLOBAL validate_password_policy=LOW;
卸载密码认证组件
官方文档
笔者觉得MYSQL 8.0+默认的密码认证策略非常碍事,所以直接卸载掉了;
卸载密码认证组件
UNINSTALL COMPONENT 'file://component_validate_password';
安装密码认证组件
INSTALL COMPONENT 'file://component_validate_password';
密码加密方式
官方文档
问题
在MYSQL 8.0中包含了一下三种加密插件
caching_sha2_password
sha256_password
mysql_native_password
与mysql_native_password
插件相比,caching_sha2_password
和sha256_password
身份验证插件提供了更安全的密码加密。且caching_sha2_password
在性能上优于sha256_password
,因此在MYSQL 8.0中caching_sha2_password
成为了默认的加密插件。
MYSQL 8.0+的服务端的加密方式的改变对客户端是不可见的,因此当用户使用旧版的客户端连接服务器是通常会报以下错误:
Authentication plugin 'caching_sha2_password' is not supported
Authentication plugin 'caching_sha2_password' cannot be loaded:dlopen(/usr/local/mysql/lib/plugin/caching_sha2_password.so, 2):image not found
Warning: mysqli_connect(): The server requested authenticationmethod unknown to the client [caching_sha2_password]
我想,应该有很多Java程序员在使用JDBC连接数据库时报过这些错误,笔者就曾经遇到过这些问题,使用navicat怎么都连不上数据库,但是使用mysql
命令行就可以进入数据库,这就是问题所在。
解决办法
升级客户端
修改默认加密插件
修改现有账户的加密方式
升级客户端
既然服务端修改了加密方式,那客户端就要适配这种改变。
标准MySQL客户端(如mysql和 mysqladmin)都是 基于libmysqlclient的,MySQL 8.0(8.0.4或更高版本)或者 MySQL 5.7(5.7.23或更高版本)都兼容这种改变。
MySQL Connector/C++ 1.1.11或更高版本或8.0.7或更高版本。
MySQL Connector/J 8.0.9或更高版本。
MySQL Connector/NET 8.0.10或更高版本(通过传统的MySQL协议)。
MySQL Connector/Node.js 8.0.9或更高版本。
修改默认加密插件
在服务端,默认的加密插件由default_authentication_plugin
参数决定,因此修改这个参数就可以修改默认的加密插件
修改MYSQL配置文件:
/etc/my.cnf
vim /etc/my.cnf...[mysqld]default_authentication_plugin=mysql_native_password...
也可以在服务器启动时添加命令行参数
--default-authentication-plugin=mysql_native_password 加上 --initialize选项 或者 --initialize-insecure选项
这种方法是为了兼容那些旧版本客户端能连接到新版本的MYSQL服务器,最好的做法是不要更改服务端参数,而是升级客户端,对于Java程序员来说,升级MYSQL驱动到8.0.9或更高的版本。
修改现有账户的加密方式
在MYSQL安装的时候默认创建了'root'@'localhost'
账号,因此只要修改了账户的加密方式旧版的客户端就可以通过此账号密码连接数据库。
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
访问控制和账户管理
用户名和密码
官方文档
默认情况下,MYSQL将用户名和连接主机信息存储在user
表,位于mysql
系统数据库中。
注意
在MYSQL中,用户名相同,连接主机不同被认为是两个账号。
%
表示这个账号可从任何IP地址连接到服务器端。
默认情况下MYSQL只创建了'root'@'localhost'
这个账号,这只能从本地连接到数据库,如果要远程连接需要创建新的用户,连接主机IP设为%
,笔者这里创建了repl
和root
两个可从远程连接的账户。
下面是MYSQL关于用户名和账户的一些注意事项:
MYSQL的用户名最大长度限制为32字符长度,这是一种硬编码,无法更改。
MYSQL的账户密码通过加密插件加密后存储在
user
表中。如果用户名和密码使用了非ASCII字符,那么可以在连接时通过
MYSQL_SET_CHARSET_NAME
选项指定。MYSQL不支持
ucs2
,utf16
,utf32
,这三种字符集。如果在命令行中通过
--password
或-p
选项指定密码,那么密码与选项之间不允许有空白。$ mysql -u finley -p db_name
以上
db_name
会认为是连接的数据库名而不是密码。$ mysql -u finley -ppassword db_name
MYSQL特权
官方文档
MYSQL中的特权是MYSQL用来判断账户是否具有能执行某种操作的凭证。
MYSQL中特权分三类:
管理员特权,这是全局特权,可以操作整个服务器资源,
root
用户就是管理员特权,可以操作所有资源数据库特权,适用于数据库及其中的所有对象。可以为特定数据库或全局授予这些特权,以便将它们应用于所有数据库。
可以为数据库中的特定对象,数据库中给定类型的所有对象(例如数据库中的所有表)或所有对象的全局对象授予表,索引,视图和存储例程等数据库对象的特权。所有数据库中给定类型的对象。
特权分类
MYSQL特权分为静态特权和动态特权,特权是静态的(内置于服务器中)还是动态的(在运行时定义)对MYSQL行为有不同的影响。特权是静态还是动态会影响将其授予用户帐户和角色的可用性。
MYSQL的特权信息存储在mysql
数据库中,具体的数据表下一章会介绍。
静态特权
特权 | 表中字段 | 上下文 |
---|---|---|
ALL PRIVILEGES |
Synonym for “all privileges” | Server administration |
ALTER |
Alter_priv |
Tables |
ALTER ROUTINE |
Alter_routine_priv |
Stored routines |
CREATE |
Create_priv |
Databases, tables, or indexes |
CREATE ROLE |
Create_role_priv |
Server administration |
CREATE ROUTINE |
Create_routine_priv |
Stored routines |
CREATE TABLESPACE |
Create_tablespace_priv |
Server administration |
CREATE TEMPORARY TABLES |
Create_tmp_table_priv |
Tables |
CREATE USER |
Create_user_priv |
Server administration |
CREATE VIEW |
Create_view_priv |
Views |
DELETE |
Delete_priv |
Tables |
DROP |
Drop_priv |
Databases, tables, or views |
DROP ROLE |
Drop_role_priv |
Server administration |
EVENT |
Event_priv |
Databases |
EXECUTE |
Execute_priv |
Stored routines |
FILE |
File_priv |
File access on server host |
GRANT OPTION |
Grant_priv |
Databases, tables, or stored routines |
INDEX |
Index_priv |
Tables |
INSERT |
Insert_priv |
Tables or columns |
LOCK TABLES |
Lock_tables_priv |
Databases |
PROCESS |
Process_priv |
Server administration |
PROXY |
See proxies_priv table |
Server administration |
REFERENCES |
References_priv |
Databases or tables |
RELOAD |
Reload_priv |
Server administration |
REPLICATION CLIENT |
Repl_client_priv |
Server administration |
REPLICATION SLAVE |
Repl_slave_priv |
Server administration |
SELECT |
Select_priv |
Tables or columns |
SHOW DATABASES |
Show_db_priv |
Server administration |
SHOW VIEW |
Show_view_priv |
Views |
SHUTDOWN |
Shutdown_priv |
Server administration |
SUPER |
Super_priv |
Server administration |
TRIGGER |
Trigger_priv |
Tables |
UPDATE |
Update_priv |
Tables or columns |
USAGE |
Synonym for "no privileges" |
Server administration |
动态特权
特权 | 上下文 |
---|---|
APPLICATION_PASSWORD_ADMIN |
Dual password administration |
AUDIT_ADMIN |
Audit log administration |
BACKUP_ADMIN |
Backup administration |
BINLOG_ADMIN |
Backup and Replication administration |
BINLOG_ENCRYPTION_ADMIN |
Backup and Replication administration |
CLONE_ADMIN |
Clone administration |
CONNECTION_ADMIN |
Server administration |
ENCRYPTION_KEY_ADMIN |
Server administration |
FIREWALL_ADMIN |
Firewall administration |
FIREWALL_USER |
Firewall administration |
GROUP_REPLICATION_ADMIN |
Replication administration |
INNODB_REDO_LOG_ARCHIVE |
Redo log archiving administration |
NDB_STORED_USER |
NDB Cluster |
PERSIST_RO_VARIABLES_ADMIN |
Server administration |
REPLICATION_APPLIER |
PRIVILEGE_CHECKS_USER for a replication channel |
REPLICATION_SLAVE_ADMIN |
Replication administration |
RESOURCE_GROUP_ADMIN |
Resource group administration |
RESOURCE_GROUP_USER |
Resource group administration |
ROLE_ADMIN |
Server administration |
SESSION_VARIABLES_ADMIN |
Server administration |
SET_USER_ID |
Server administration |
SHOW_ROUTINE |
Serve |