MySQL安全加固

安全加固

禁止MySQL以管理员的身份账号权限运行

#用普通账户运行mysqld#加固方法:
my.cnf配置文件中配置user=mysql

是否存在密码为空的用户

#1、sql_mode启用 NO_CREATE_AUTO_USER,这个参数(NO_CREATE_AUTO_USER)禁止自动创建密码为空的用户
show variables like '%sql_mode%';#2、系统表查询
select Host,user,authentication_string from mysql.user
where LENGTH(authentication_string)<=0or authentication_string is null;#若存在空密码的数据库用户,则执行如下命令设置数据库用户密码,且密码必须满足密码策略的要求:
set password for 'user'@'host' = password('yourpassword');
set password for 'testtest'@'192.168.56.1' = password('testtest');

检查数据库用户的密码是否为弱口令

有些人为了方便,可能会把数据库用户的密码设置为弱口令,现在的数据库会以mysql5加密算法加密口令,可以去MD5解密的平台输入密文,看能否得出明文。

https://www.cmd5.com/

https://www.somd5.com/

密码过期时间(密码有效期)

SET GLOBAL default_password_lifetime = 180;select user from mysql.user where password_lifetime is null;
alter user '用户名'@'%' password expire interval 90 day;

密码复杂度配置(validate-password插件)

安装插件

INSTALL PLUGIN validate_password SONAME 'validate_password.so';

相关参数

[mysqld]
plugin-load = "validate_password.so"
validate-password = FORCE_PLUS_PERMANENT
validate_password_length = 8 
validate_password_policy = 1 
validate_password_mixed_case_count = 1 
validate_password_number_count = 1 
validate_password_special_char_count = 1

validate-password 值为FORCE_PLUS_PERMANENT 表示强制启用该插件,并且不能被卸载。

validate_password_policy 表示密码策略,有三个值,与其对应的策略见下表:

密码策略
0 或 LOW校验密码长度变量
1 或 MEDIUM校验密码长度、数字、小写/大写和特殊字符4个变量
2 或 STRONG校验密码长度、数字、小写/大写、特殊字符和字典文件5个变量

简言之,对于密码数字、小写/大写和特殊字符这三个变量,只有当密码策略为中或强时才是有效的。

那么最低要求配置如下

效果:密码不能与用户名一致,密码长度8位以上(包含8位)、至少有一个数字、一个大写字母、一个小写字母、一个特殊字符。

mysql> show 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.00 sec)                          

登录失败和连接超时设置(connection_control插件)

mysql有个连接超时的插件,相当于登录失败锁定策略,可根据业务需要进行最低配置。

默认配置如下:

mysql> show variables like "%connection_control%";
+-------------------------------------------------+-------+
| Variable_name                                   | Value |
+-------------------------------------------------+-------+
| connection_control_failed_connections_threshold | 3     |
| connection_control_max_connection_delay         | 86400 |
| connection_control_min_connection_delay         | 1000  |
+-------------------------------------------------+-------+
3 rows in set (0.00 sec)

connection_control_failed_connections_threshold
失败尝试的次数,默认为3,表示当连接失败3次后启用连接控制0表示不开启
connection_control_max_connection_delay
响应延迟的最大时间
connection_control_min_connection_delay
响应延迟的最小时间,默认1000微秒,1秒

然后是超时时间设置。

查看和设置 连接超时相关的两个参数interactive_timeout和wait_timeout,其值应当至多为30分钟。

show global variables like 'interactive_timeout';
show global variables like 'wait_timeout'; set global interactive_timeout=1800;
set global wait_timeout=1800;

interactive_timeout:交互式连接超时时间(mysql工具、mysqldump等)
wait_timeout:非交互式连接超时时间、默认的连接mysql api程序、jdbc连接数据库等

简单来说,通过mysql客户端连接数据库是交互式连接,通过jdbc连接数据库是非交互式连接。

启用ssl

mysql> show variables like '%ssl';
+---------------+----------+
| Variable_name | Value    |
+---------------+----------+
| have_openssl  | DISABLED |
| have_ssl      | DISABLED |
+---------------+----------+
2 rows in set (0.01 sec)

远程管理限制

远程连接管理配置方法:

GRANT ALL PRIVILEGES ON <databases-name>.* TO 'user'@'<ip>' IDENTIFIED BY '<password>' WITH GRANT OPTION;
FLUSH PRIVILEGES;-- 举例,给数据库用户teacher分配student数据库,只允许192.168.56.%网段远程连接并设置口令为Admin123。
GRANT ALL PRIVILEGES ON student.* TO 'teacher'@'192.168.56.%' IDENTIFIED BY 'Admin123' WITH GRANT OPTION;
FLUSH PRIVILEGES;

会话连接数配置

mysql> show variables like "%connections";
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| max_connections      | 100   |
| max_user_connections | 0     |
+----------------------+-------+
2 rows in set (0.01 sec)

max_connections是对整个服务器的用户做出限制,

max_user_connections是对每个用户的限制,

为0表示不限制。

启用日志审计

mysql默认启用日志审计,记录的内容也符合相关安全要求,此项默认符合。

查看日志启用情况

查看变量,看相关日志是否启用show variables like ‘log%’;

或看mysql的配置文件,看相关日志的配置情况(根据业务需要启用相关日志和设置日志保存路径。)

# * Logging and Replication
#
# Both location gets rotated by the cronjob.
# Be aware that this log type is a performance killer.
# As of 5.1 you can enable the log at runtime!
#通用日志,将所有到达MySQL Server的SQL语句记录下来
general_log_file        = var/log/mysql/mysql.log
general_log             = 1
log_timestamps = SYSTEM
#
# Error log - should be very few entries.
#错误日志,文件内容不会很多
log_error = var/log/mysql/error.log
#
# Here you can see queries with especially long duration
#慢查询日志,记录SQL执行语句(执行时间超过2秒才会记录)
slow_query_log          = 1
slow_query_log_file     = var/log/mysql/mysql-slow.log
long_query_time = 2
log-queries-not-using-indexes
#
# The following can be used as easy to replay backup logs or for replication.
# note: if you are setting up a replication slave, see README.Debian about
#       other settings you may need to change.
#二进制日志
server-id               = 1
log_bin                 = var/log/mysql/mysql-bin.log
expire_logs_days        = 10
max_binlog_size   = 100M
#binlog_do_db           = include_database_name
#binlog_ignore_db       = include_database_name

来看一下日志内容,日志默认是分天存储的,一天一个文件并压缩保存。

  • 相关日志(主要是查询日志和错误日志)应留存6个月以上。
  • 日志记录的日期和时间应当是正确的,服务器需开启了NTP服务进行时间校对。
#Linux 检查NTP服务时间同步情况
ntpq -p -n
ntpstat

禁止mysql对系统文件进行读写操作

local_infile变量表示能否使用load data local infile命令。该变量默认为ON。该变量为OFF时,禁用客户端使用load data local infile命令。避免通过数据库查询语句造成的任意文件读写漏洞。

执行如下SQL语句:

show variables like 'local_infile';-- 在/etc/my.cnf配置文件中修改
[mysqld] 
local_infile = 0

用户权限合理分配

执行下面语句,查看各账户和权限分配情况。请根据业务需求进行合理的权限分配,应遵循三权分立原则(分为系统管理员、安全管理员、安全审计员等,并检查系统各用户所属的权限组。如:系统管理员不能进行业务操作、审计操作审计员不能进行业务操作、系统管理操作安全员不能进行添加账号操作等)

select user,host,account_locked from mysql.user;
show grants for 'user'@'host';
select * from mysql.user where user='user' and host='host' \G;

说明:

  • 不能存在特权用户
  • 不存在越权访问情况(绕过访问控制策略)
  • mysql 数据库应当只允许root用户进行访问和管理

其他

  • 最小权限原则
    • 对于数据库,可以一个数据库用户分配一个数据库
    • 对于mysql进程,不得以root用户运行,默认是采用了mysql用户运行。
  • 更改默认开放端口3306
  • 站库分离

参考资料

MySQL 用户安全加固策略

https://www.modb.pro/db/1749249761291096064

https://www.modb.pro/db/583239

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/42797.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于AOP的数据字典实现:实现前端下拉框的可配置更新

作者&#xff1a;后端小肥肠 创作不易&#xff0c;未经允许严禁转载。 目录 1. 前言 2. 数据字典 2.1. 数据字典简介 2.2. 数据字典如何管理各模块的下拉框 3. 数据字典核心内容解读 3.1. 表结构 3.2. 核心代码 3.2.1. 根据实体类名称获取下属数据字典 3.2.2. 数据字…

回顾 DTC 2024 大会——聚焦数据技术创新:揭秘下一代纯实时搜索引擎 INFINI Pizza

2024 年 4 月 12 日至 13 日&#xff0c;备受瞩目的第十三届“数据技术嘉年华”&#xff08;DTC2024&#xff09;在北京新云南皇冠假日酒店盛大开幕。本次大会由中国 DBA 联盟&#xff08;ACDU&#xff09;与墨天轮社区联合主办&#xff0c;以“智能云原生一体化——DB 与 AI 协…

在先企业字号被申请注册成商标!

今天一网友联系普推商标知产老杨&#xff0c;说自己注册的商标被某公司无效宣告了&#xff0c;去年联系老杨时&#xff0c;当时就给说这个商标名称存在风险&#xff0c;与别人的字号权存在高度近似&#xff0c;而且是同行业同地区在后面注册的。 十几年前某公司先成功注册成字号…

Ubuntu 安装CGAL

一、什么是CGAL CGAL&#xff08;Computational Geometry Algorithms Library&#xff09;是一个广泛使用的开源库&#xff0c;主要用于计算几何算法的实现。该库提供了一系列高效、可靠和易于使用的几何算法和数据结构&#xff0c;适用于各种应用领域。以下是 CGAL 的主要功能…

postcss-pxtorem

postcss-pxtorem屏幕自适应 //安装插件 npm install postcss postcss-pxtorem --save-dev//在根目录中新增postcss.config.cjs或postcss.config.js文件&#xff0c;并写上如下代码 module.exports {plugins: {"postcss-pxtorem": {rootValue: 16,selectorBlackList…

如何利用Java Stream API简化集合操作?

如何利用Java Stream API简化集合操作&#xff1f; 大家好&#xff0c;我是微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; Java Stream API是Java 8引入的一种新的抽象概念&#xff0c;用于对集合对象进行函数式风格的操作…

算力共享和联邦学习的关系

目录 算力 共享和联邦学习的关系 算力共享 联邦学习 算力共享与联邦学习的关系 算力 共享和联邦学习的关系 算力共享和联邦学习之间存在着紧密的关系,它们都是现代数据处理和机器学习领域中的重要概念,尤其在处理大规模数据和保护数据隐私方面发挥着关键作用。 算力共享…

JD-GUI下载和使用

JD-GUI是专门查看jar包的&#xff0c;包括source.jar和doc.jar。JD-GUI可以把.class文件反编译为可编辑的.java文件&#xff0c;有图形化界面。 github下载地址&#xff1a;https://github.com/java-decompiler/jd-gui/releases 下载windows版本的zip包&#xff0c;如下图&…

智能化代码审查系统设计

设计一个智能化代码审查系统&#xff0c;特别是针对Java开发&#xff0c;需要综合考虑多个维度来提升代码质量、提高审查效率&#xff0c;并促进团队间的协作。以下是该系统设计的关键要素和功能特性&#xff1a; 系统架构 客户端-服务器架构&#xff1a;前端提供友好的Web界面…

2477. 到达首都的最少油耗

Problem: 2477. 到达首都的最少油耗 文章目录 思路解题过程复杂度Code 思路 为了解决这个问题&#xff0c;我们使用深度优先搜索&#xff08;DFS&#xff09;算法来遍历给定的树形结构。在这个过程中&#xff0c;我们维护两个数组&#xff0c;size 和 cost&#xff0c;分别用于…

破局 AI 2.0 时代:利用 AI 提升自我核心竞争力

文章目录 破局 AI 2.0 时代&#xff1a;利用 AI 提升自我核心竞争力1. AI 2.0 时代1.1 特点1.2 发展1.3 影响 2. AI 2.0 时代的机遇 & 挑战2.1 AI 对行业市场的冲击2.2 挑战变为机遇2.3 不同场景下的 AI 效能提升2.3.1 自动化办公任务2.3.2 提升学习效率2.3.3 创意生成与内…

Golang 网络编程socket+tcp+udp

Part 26 - 网络编程 网络编程分类 基于 TCP/IP 的 Socket编程基于 HTTP 的 HTTP 编程 端口 0是保留端口1-1024是知名端口 21&#xff1a;ftp22&#xff1a;ssh23&#xff1a;telnet24&#xff1a;smtp80&#xff1a;http 1025-65535是动态端口 Socket 的使用流程 服务端 监…

LabVIEW光谱测试系统

在现代光通信系统中&#xff0c;光谱分析是不可或缺的工具。开发了一种基于LabVIEW的高分辨率光谱测试系统&#xff0c;通过对可调谐激光器、可编程光滤波器和数据采集系统的控制&#xff0c;实现了高效、高精度的光谱测量。 项目背景 随着光通信技术的迅速发展&#xff0c;对…

仿哔哩哔哩视频app小程序模板源码

仿哔哩哔哩视频app小程序模板源码 粉色的哔哩哔哩手机视频网页&#xff0c;多媒体视频类微信小程序ui前端模板下载。包含&#xff1a;视频主页和播放详情页。 仿哔哩哔哩视频app小程序模板源码

thinkphp6/8 验证码

html和后台验证代码按官方来操作 ThinkPHP官方手册 注意&#xff1a; 如果验证一直失败&#xff0c;看看Session是否开启&#xff0c; 打印dump(session_status());结果2为正确的&#xff0c; PHP_SESSION_DISABLED: Session功能被禁用&#xff08;返回值为0&#xff09;。…

数据库导入

【一】存储数据的演变过程 1.本地对象内存存储--》字典列表之类的存在我们所写的模块那里 2.txt文件---》要对数据进行转变格式以及拼接才能存储 3.json文件---》升级了一点&#xff0c;不用像txt那样 4.数据库应用--》解决了存放位置和数据格式问题 【二】数据库本质 "…

科普文:一文搞懂jvm实战(四)深入理解逃逸分析Escape Analysis

概叙 Java 中的对象是否都分配在堆内存中&#xff1f; 好了太抽象了&#xff0c;那具体一点&#xff0c;看看下面这个对象是在哪里分配内存&#xff1f; public void test() { Object object new Object(); }这个方法中的object对象&#xff0c;是在堆中分配内存么&#xff1…

【C语言】C语言编译链接和Win32API简单介绍

目录 翻译环境和运行环境翻译环境编译器预处理&#xff08;预编译&#xff09;编译链接 执行环境 Win32API是什么控制台程序控制台获取坐标COORDGetStdHandle函数GetConsoleCursorinfo函数CONSOLE_CURSOR_INFOSetConsoleCursorInfo函数SetConsoleCursorPostion函数GetAsyncKeyS…

Qt(MSVC)下报“语法错误缺少“}““语法错误缺少“常数“ 的解决办法

1.现象 目前我在工程中试图使用QHttpServer时&#xff0c;一编译&#xff0c;就报了一堆奇奇怪怪的错误&#xff1a; D:\Qt\httpServer\Qt5.15.2\include\QtHttpServer\qhttpserverrequest.h:75: error: C2143: 语法错误: 缺少“}”(在“(”的前面) D:\Qt\httpServer\Qt5.15.…

栈和队列---循环队列

1.循环队列的出现 &#xff08;1&#xff09;上面的这个就是一个普通的数据的入队和出队的过程我们正常情况下去实现这个入队和出队的过程&#xff0c;就是这个数据从这个队尾进入&#xff0c;从队头离开&#xff0c;但是这个加入的时候肯定是没有其他的问题的&#xff0c;直接…