mysql8 jdbc驱动_MYSQL 8安全篇

密码认证组件

MYSQL是一个组件式架构,MYSQL 8.0+默认启用了密码校验组件validate_password,它强迫你设置很复杂的密码以保证数据库安全,对于个人来说,你不能设置如123456这样的密码,当你在设置这样的密码的时候会报如下错误:

 ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

笔者认为这对于个人学习而言非常碍事,解决方案有两种:

  • 修改密码认证策略

  • 卸载密码认证组件

修改密码认证策略

官方文档

  1. 查看当前认证策略

     mysql> SHOW VARIABLES LIKE 'validate_password.%';

    16500ef5803e2302669fa7858539251a.png 16500ef5803e2302669fa7858539251a.png 7ff56e22a60b12e568ebca875dbf8050.png

    这几个认证策略就不一一解释了,就是字面意思。

  2. 修改认证策略

    其他的参数照着改就行,最后最好重启一下服务器。

  • 设置密码长度为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_passwordsha256_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中,用户名相同,连接主机不同被认为是两个账号。

aaacc85bf6d1740b06680f55fafc3503.png

%表示这个账号可从任何IP地址连接到服务器端。

默认情况下MYSQL只创建了'root'@'localhost'这个账号,这只能从本地连接到数据库,如果要远程连接需要创建新的用户,连接主机IP设为%,笔者这里创建了replroot两个可从远程连接的账户。

下面是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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值