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只是一个编程辅助的文档工具,并没有什么特殊的地方,但是它的出现确实能让人提升效率,一般返回的答案都是正确答案。

相关推荐
m0_748240251 小时前
【Spring Boot】统一数据返回
java·spring boot·后端
陈老师还在写代码1 小时前
介绍下SpringBoot常用的依赖项
java·spring boot·后端
潇湘秦1 小时前
Oracle CDB自动处理表空间不足脚本
数据库·oracle
梓沂1 小时前
Oracle中与 NLS(National Language Support,国家语言支持) 相关的参数
数据库·oracle
angen20181 小时前
mysql 存储过程和自定义函数 详解
数据库·mysql
雾里看山2 小时前
【MySQL】 表的约束(上)
android·mysql·adb
007php0072 小时前
Docker、Ollama、Dify 及 DeepSeek 安装配置与搭建企业级本地私有化知识库实践
运维·服务器·开发语言·后端·docker·容器·云计算
魏翾蒨2 小时前
VBA语言的数据可视化
开发语言·后端·golang
m0_748239332 小时前
深入解析Spring Boot中的@ConfigurationProperties注解
java·spring boot·后端
m0_748249543 小时前
DRGDIP 2.0时代下基于PostgreSQL的成本管理实践与探索(上)
数据库·postgresql·区块链