概述
新年初始,万象更新,新年的学习目标希望自己把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只是一个编程辅助的文档工具,并没有什么特殊的地方,但是它的出现确实能让人提升效率,一般返回的答案都是正确答案。