Mysql的安全管理

概述

新年初始,万象更新,新年的学习目标希望自己把Lnmp这套基础知识在扎实的学一遍,尤其是之前不曾接触到的盲区,做一个知识扫盲的过程,安全方面一直被中小企业忽略的一环,面向AI学习Mysql安全管理。

密码安全

权限授予的原则:

  • 使用不用的用户
  • 权限最小原则
  • 避免使用root

1.mysql 修改当前登录用户的密码的命令,比如我们想把密码修改成2024@zy126***

mysql 复制代码
ALTER USER USER() IDENTIFIED BY '2024@zy126***';

2.修改普通用户的密码:

mysql 复制代码
ALTER USER 'stark' @'%' IDENTIFIED BY '2024@zy126***';

3.给用户设置随机密码:

mysql 复制代码
CREATE USER 'demo01' @'localhost' IDENTIFIED BY random PASSWORD;

密码管理的最佳实践

1、强制使用强密码,首先安装插件,validate_password是一个用于密码验证的插件。它提供了一系列的参数来定义密码的强度要求,有助于增强数据库用户账户的安全性。通过配置这些参数,可以强制用户设置符合特定规则的密码,如密码长度、包含字符的种类等。

检查插件是否已安装,可以使用SHOW PLUGINS;命令查看

mysql 复制代码
# v8.0 安装命令
install component 'file://component_validate_password';

# v5.7 安装命令
INSTALL PLUGIN validate_password SONAME 'validate_password.so';

2、查看插件信息:

mysql 复制代码
SHOW GLOBAL VARIABLES LIKE 'validate_password%'

+--------------------------------------+--------+
| Variable_name                        | Value  |
+--------------------------------------+--------+
| validate_password_check_user_name    | OFF    |
| validate_password_dictionary_file    |        |
| validate_password_length             | 8      |
| validate_password_mixed_case_count   | 1      |
| validate_password_number_count       | 1      |
| validate_password_policy             | MEDIUM |
| validate_password_special_char_count | 1      |
+--------------------------------------+--------+
7 rows in set (0.01 sec)

在这里对参数进行一些解释:

  • validate_password_policy : 该参数用于指定密码策略,决定密码需要满足的强度级别:
    • 0 或 LOW:只检查密码长度。密码长度由validate_password_length参数决定。这是最低强度的密码策略要求。
    • 1 或 MEDIUM:在检查密码长度的基础上,还要求密码至少包含一个数字、一个小写字母、一个大写字母和一个特殊字符。特殊字符是指非字母数字字符,例如!@#$%^&*()等。这是比较适中的密码策略强度。
    • 2 或 STRONG:是最严格的密码策略。除了满足 MEDIUM 策略的要求外,还要求密码不能是简单的字典单词(通过内置字典检查)。这可以防止用户使用容易被猜到的常见单词作为密码。
  • validate_password_length : 用于设置密码的最小长度,修改长度的Sql语句SET GLOBAL validate_password_length = 8;
  • validate_password_mixed_case_count : 规定密码中至少要包含的大小写字母对数。例如,如果设置为 1,那么密码中至少要有一个大写字母和一个小写字母(一对大小写字母)。
  • validate_password_number_count : 指定密码中至少要包含的数字个数。例如,设置为 1 时,密码中至少要有一个数字。
  • validate_password_special_char_count : 定义密码中至少要包含的特殊字符个数。特殊字符如!@#$%^&*()等。比如设置为 1 时,密码中至少要有一个特殊字符。
  • validate_password_check_user_name : 这是一个布尔值参数。通过设置这个参数,可以防止用户使用用户名作为密码这种不安全的做法。例如,SET GLOBAL validate_password_check_user_name = ON;可以禁止用户使用用户名作为密码。
mysql 复制代码
CREATE USER 'demo01' @'localhost' IDENTIFIED BY 'Pd';

安装插件后简单的密码就不允许设置了,会产生错误信息1819 - Your password does not satisfy the current policy requirements

root 忘记密码

1、在Mysql配置文件的mysqld 加入skip-grant-tables,请注意要加在第一行才会生效: 2、重新启动Mysql服务service mysql restart/etc/init.d/mysql restart: 3、执行Sql语句new_password作为Root的新密码,执行以后别忘了返回配置文件去掉skip-grant-tables,这句的意思是不做密码校验,只是为了忘记root密码而临时启用的。

mysql 复制代码
UPDATE mysql.USER  SET authentication_string = PASSWORD ( 'new_password' )  WHERE USER = 'root';

用户资源限制

Mysql不仅对密码进行限制,还有对资源进行限制,对用户访问进行资源的隔离策略:

  • MAX_QUERIES_PER_HOUR : 每小时限制多少次查询
  • MAX_UPDATES_PER_HOUR : 每小时限制多少次更新
  • MAX_CONNECTIONS_PER_HOUR : 账户每小时可以连接到服务器的次数
  • MAX_USER_CONNECTIONS:一个账号同时连接到服务器的数量

1、创建用户时限制资源

mysql 复制代码
CREATE USER 'demo03' @'localhost' IDENTIFIED BY 'Pd11121dd('
WITH MAX_QUERIES_PER_HOUR 500
MAX_UPDATES_PER_HOUR 100
MAX_USER_CONNECTIONS 50
MAX_CONNECTIONS_PER_HOUR 50;

2、修改现有用户的资源限制

mysql 复制代码
ALTER USER 'demo03' @'localhost'
WITH MAX_QUERIES_PER_HOUR 500;

3、重置资源使用计数

  • FLUSH PRIVILEGES: 这个命令主要用于重新加载权限表信息。当你修改了用户权限相关的内容(如通过GRANT或REVOKE操作)后,MySQL 服务器会将这些权限更改缓存在内存中。FLUSH PRIVILEGES命令会使服务器重新读取权限表,从而更新缓存的权限信息。

虽然它不是直接重置连接资源计数,但在某些情况下间接影响连接相关的资源管理。例如,当你对用户的连接权限进行了调整,执行此命令可以让新的权限设置立即生效,从而可能改变后续用户连接的行为和资源计数方式。

  • FLUSH HOSTS:用于清除主机缓存信息。MySQL 会为每个连接的主机维护一些统计信息,如连接尝试次数等。如果一个主机的连接尝试由于错误(如超过max_connect_errors限制)而被阻止,使用FLUSH HOSTS可以清除这些阻止信息,允许该主机再次尝试连接。

  • RESET QUERY CACHE: 如果你的 MySQL 服务器启用了查询缓存(在 MySQL 5.7 中默认是启用的,但在后续版本中有变化),查询缓存会存储查询结果以提高性能。RESET QUERY CACHE命令用于清除查询缓存中的所有内容。

Sql Mode

Sql Mode 对数据的操作有很大的影响,不用的Sql Mode对同一条Sql语句的执行结果也有很大的不同。

1、建议启用严格模式,可以避免错误数据启用 2、建议启用ONLY_FULL_GROUP_BY 3、升级或迁移时,注意Sql mode 新老环境是否一致

mysql 复制代码
## 添加Sql Mode选项
SET SESSION sql_mode = sys.list_add ( @@SESSION.sql_mode, 'ONLY_FULL_GROUP_BY' );

## 删除Sql Mode选项
SET SESSION sql_mode = sys.list_drop ( @@SESSION.sql_mode, 'ONLY_FULL_GROUP_BY' );

查看Sql mode
SELECT @@sql_mode;

Sql mode的修改有两种,一种是修改Mysql的配置文件,需要重启Mysql服务,一种是直接执行Sql语句

mysql 复制代码
[mysqld]
sql_mode = SONLY_FULL_GROUP_BY,TRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

面向AI提问

AI很火,他向一股潮流席卷着四面八荒,其实对于它要充满客观,技术的变化,万变不离其宗。用好AI的关键在于交互时交互的文档用词会不会准确。

1、创建用户和赋权

Mysql5.7 创建一个新用户,用户名是stark,host是%,密码是 2025@stark^2!-0 权限是对所有库都有增删改查四个权限,帮我写一个sql语句:

mysql 复制代码
-- 创建用户并设置指定密码
CREATE USER 'stark'@'%' IDENTIFIED BY '2025@stark^2!-0';
-- 授予对所有数据库的增删改查权限
GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO 'stark'@'%';
-- 刷新权限,使设置生效
FLUSH PRIVILEGES;

2.回收Mysql用户权限

Mysql5.7 用户名是stark,host是% 收回对所有数据库的 DELETE 权限,请帮我写sql语句

mysql 复制代码
REVOKE DELETE ON *.* FROM 'stark'@'%';
FLUSH PRIVILEGES;

3.Sql语句对角色的操作

Mysql5.7 创建角色 名称 developer_role 授予对某个数据库 spaces 的增删改查的权限 将角色赋予用户 stark ,请帮我写sql语句

mysql 复制代码
-- 创建角色
CREATE ROLE developer_role;
-- 授予角色对spaces数据库的增删改查权限
GRANT SELECT, INSERT, UPDATE, DELETE ON spaces.* TO developer_role;
-- 将角色赋予用户stark
GRANT developer_role TO 'stark'@'%';

4.密码试错

Mysql5.7 创建用户 stark02,host是% ,使用密码 2025@stark^2!-0 限制连续输错4次密码会被锁定,锁3天 请我帮我写CREATE USER语句帮我实现

有时间AI返回的也不正确,比如下面的Sql语句:

mysql 复制代码
-- 创建用户并设置密码
CREATE USER 'stark02'@'%' IDENTIFIED BY '2025@stark^2!-0';

-- 设置密码验证策略相关参数(针对全局生效,你也可以针对具体用户来设置,此处示例全局方式)
SET GLOBAL validate_password_number_of_trials = 4;
SET GLOBAL validate_password_lock_time = 3 * 24 * 60 * 60;

-- 刷新权限使设置生效(针对密码验证策略相关参数的设置生效)
FLUSH PRIVILEGES;

5.限制资源

Mysql 5.7 创建用户stark03 密码使用 Udfg_as81 限制每小时最多500次查询 每小时最多100次更新 用一条Create user语句帮我实现

AI 对问题4、5 都没有很好的一个正确返回,所以在使用AI时,不需要神话AI,AI只是一个编程辅助的文档工具,并没有什么特殊的地方,但是它的出现确实能让人提升效率,一般返回的答案都是正确答案。

相关推荐
API_Zevin8 分钟前
如何优化亚马逊广告以提高ROI?
大数据·开发语言·前端·后端·爬虫·python·学习
北极熊的咆哮13 分钟前
Go语言的 的编程环境(programming environment)基础知识
开发语言·后端·golang
白露与泡影44 分钟前
Spring Boot中的 6 种API请求参数读取方式
java·spring boot·后端
_Soy_Milk1 小时前
Golang,Let‘s GO!
开发语言·后端·golang
1-programmer1 小时前
【Go研究】Go语言脚本化的可行性——yaegi项目体验
开发语言·后端·golang
我自是年少韶华倾负1 小时前
Mysql数据实时同步到Es上
数据库·mysql·elasticsearch
阿木Coding1 小时前
MySQL大厂面试题之——事务篇
mysql
长安不及十里1 小时前
Spring Security 搭建一套基于 JWT 的 OAuth 2.0 架构
数据库·spring·架构
努力的小雨1 小时前
KES(KingBaseES)集群部署实战
数据库·后端
~小安同学2 小时前
Redis下载与安装
数据库