首页 > 数据库 >MySQL加固

MySQL加固

时间:2022-11-01 23:45:18浏览次数:46  
标签:MySQL host user mysql 加固 日志 权限 priv

MySQL加固



1. 口令加固

1.1 old_passwords环境变量设置

old_passwords决定了使用PASSWORD()函数和IDENTIFIED BY 、CREATE USER 、GRANT 等语句时的hash算法:

0 - authenticate with the mysql_native_password plugin
1 - authenticate with the mysql_old_password plugin
2 - authenticate with the sha256_password plugin

# 查询,确保返回值不为1
SHOW VARIABLES WHERE Variable_name = 'old_passwords';

1.2 非空密码登录

在MySQL5.7版本前,root账号是默认空密码

# 查询空密码登录
SELECT User,host FROM mysql.user WHERE (plugin IN('mysql_native_password', 'mysql_old_password') AND (LENGTH(Password) = 0 OR Password IS NULL)) OR (plugin='sha256_password' AND LENGTH(authentication_string) = 0);

1.3 使用插件

查看当前插件信息

show plugins;

安装validate_password插件

install plugin validate_password soname 'validate_password.dll';

查看当前密码规则强度

select @@validate_password_policy;

查看密码策略的具体信息

show variables like 'validate_password%';

2. 账户配置

2.1 查看所有用户

select user,host from mysql.user;

2.2 查看匿名账户

select user,authentication_string from mysql.user;

2.3 删除匿名账户

delete from mysql.user where user='';

3. 权限与访问控制

最好遵循最小权限原则

3.1 用户权限管理

查询本地用户权限

show grants for '用户名'@'localhost'; 	
#显示usage on:不具有任何操作权限

授予用户权限

grant privileges on databasename.tablename to username@localhost;
# grant 权限 on 权限范围  to 用户 identified by '密码'

撤销用户权限

revoke privileges ON database.tablename FROM ‘username’@‘host’;
# revoke 权限 on 范围 from 用户

3.2 限制非管理用户权限

检查管理员账户

SELECT user, host FROM mysql.user WHERE (Select_priv = 'Y') OR (Insert_priv = 'Y') OR (Update_priv = 'Y') OR (Delete_priv = 'Y')  OR (Create_priv = 'Y')  OR (Drop_priv = 'Y');
SELECT user, host FROM mysql.db WHERE db = 'mysql' AND ((Select_priv = 'Y') OR (Insert_priv = 'Y') OR (Update_priv = 'Y') OR (Delete_priv = 'Y') OR (Create_priv = 'Y') OR (Drop_priv = 'Y'));
  • file_priv:表示是否允许用户读取数据库所在主机的本地文件
  • Process:表示是否允许用户查询所有用户的命令执行信息
  • Super_priv:表示用户是否有设置全局变量、管理员调试等高级别权限
  • Shutdown_priv:表示用户是否可以关闭数据库
  • Create_user_priv:表示用户是否可以创建或删除其他用户
  • Grant_priv:表示用户是否可以修改其他用户的权限

查看拥有权限的用户

select user,host from mysql.user where File_priv = 'Y';
select user,host from mysql.user where Process_priv = 'Y';
select user,host from mysql.user where Process_priv = 'Y';
SELECT user,host FROM mysql.user WHERE Shutdown_priv = 'Y';
SELECT user,host FROM mysql.user WHERE Create_user_priv = 'Y';
SELECT user,host FROM mysql.user WHERE Grant_priv = 'Y';
SELECT user,host FROM mysql.db WHERE Grant_priv = 'Y';

回收权限

REVOKE FILE ON *.* FROM '<user>';
REVOKE PROCESS ON *.* FROM '<user>'; 
REVOKE SUPER ON *.* FROM '<user>'; 
REVOKE SHUTDOWN ON *.* FROM '<user>';
REVOKE CREATE USER ON *.* FROM '<user>';
REVOKE GRANT OPTION ON *.* FROM <user>;

3.3 登录管理

指定登录IP

grant all privileges on . to '用户名'@'指定IP' identified by 'password' with grant option;
#只允许该IP访问但给全部权限

grant all privileges on . to '用户名'@'指定IP' identified by 'password';
#只允许该IP访问但不给全部权限

关闭远程连接

use mysql
#将host设置为localhost表示只能本地连接mysql
update user set host='localhost' where user='root';

可以直接禁止远程 tcp/ip连接,通过在mysqld服务器的参数中添加 --skip-networking 启动参数来使 mysql不监听任何 TCP/IP连接,增加安全性。

或直接修改配置文件/etc/my.cnf,在[mysqld]下面添加:

bind-address=127.0.0.1

3.4 文件权限管理

控制访问目录权限

chmod 700 <datadir>
chown mysql:mysql <datadir>

关闭文件读取

禁用LOCAL INFILE,防止造成任意文件读取。

临时设置

set @@local_infile=0;

永久设置

修改/etc/my.cnf ,在[mysqld]下面添加:

set-variable=local-infile=0

关闭文件导入导出

禁用LOCAL OUTFILE,防止webshell写出。

查看是否可以导入\导出

show variables like '%secure%'

在MySQL配置文件的[mysqld]部分增加下面参数:

secure_file_priv= null
  • secure_file_priv=null:表示限制 mysqld不允许导入|导出
  • secure_file_priv=/tmp/:表示限制 mysqld的导入|导出只能发生在/tmp/目录下

4. 日志功能

数据库配置日志功能(不要用root用户,防止root写shell)

4.1 查看所有的log

show variables like 'log_%';

查看部分日志

# 查看二进制日志文件
show variables like 'log_bin_basename';
# 查看错误日志文件
show variables like 'log_error';
# 查看慢查询日志文件
show variables like 'slow_query_log_file';
# 查看通用日志文件
show variables like 'general_log_file';
# 查看审计日志文件
show global variables where variable_name =  'audit_log_file';

4.2 开启错误日志

错误日志包括数据库运行和停止过程中的一系列活动信息,有助于分析数据库运行过程中的一些异常活动。

在配置文件/etc/my.cnf[mysqld_safe]下加入指定日志路径即可开启

[mysqld_safe]
# 错误日志
log-error=log文件路径

日志记录仅适用于查询数量有限的数据库服务器。对于信息量大的服务器,这可能会导致高过载。

4.3 控制日志文件权限

chmod 660 <log file>
chown mysql:mysql <log file>

4.4 确保日志存放在非系统区域

日志文件随着数据库的运行会不断增加,如果存放在系统区域,则会影响系统的正常运行。

查询位置,确保返回结果不是如下路径:/、/var、/usr

SELECT @@global.log_bin_basename;

4.5 关闭原始日志功能

原始日志选项会决定一些敏感信息是否会被明文写进日志中。

修改配置文件 /etc/my.cnf 加入 log-raw=0

[mysqld_safe]
log-raw=0
#或 log-raw=OFF

5. 历史记录

5.1 搜索历史文件

find / -name ".mysql_history"

5.2 删除历史文件

cat /dev/null > ~/.mysql_history

5.3 设置环境变量

设置环境变量MYSQL_HISTFILE为/dev/null,并添加到shell的初始化脚本中,创建mysql_history到/dev/null的链接:

ln -s /dev/null $HOME/.mysql_history

5.4 历史命令行密码设置不可见

如果使用mysql -u root -p password登录,那么history命令会看到明文密码。

建议登录方式:

mysql -u admin -p
#然后根据命令行提示输入密码

6. 其他

6.1 更新补丁

查询MySQL的版本,检查是否有需要安装的补丁

SHOW VARIABLES WHERE Variable_name LIKE "version";

6.2 删除test数据库

Mysql数据库默认安装好后,可能存在一个名为test的数据库

Drop database "test"

标签:MySQL,host,user,mysql,加固,日志,权限,priv
From: https://www.cnblogs.com/0dot7/p/16841714.html

相关文章

  • Centos离线安装JDK+Tomcat+MySQL8.0+Nginx
    一、安装JDK注:以下命令环境在Xshell中进行。1、查询出系统自带的OpenJDK及版本rpm-qa|grepjdk2、如果显示已安装openjdk则对其进行卸载。#卸载rpm-e--nodeps......
  • php加固
    PHP加固1.控制访问目录使用open_basedir选项能够控制PHP脚本只能访问指定的目录。open_basedir=/usr/www2.关闭危险函数disable_functions=system,passthr......
  • MySQL 知识点小结
    ------------------操作mysql的命令--------------------cmd命令行中查看mysql版本:mysql-Vmysql--version登陆mysql:mysql-uroot-pluismysql-uroot-p在mysql......
  • mysql双主架构解决自增冲突
    Mysql双主自增长冲突处理 多主互备和主从复制有一些区别,因为多主中都可以对服务器有写权限,所以设计到自增长重复问题 出现的问题(多主自增长ID重复) 1:首先我们通过A......
  • MySQL查询数据(多表查询)
    准备工作,新建名为students的数据,三张表分别是student,courses,stu_cou,并创建外键约束,级联删除更新,插入数据。/*创建数据库*/createdatabaseifnotEXISTSstudentscha......
  • MySQL基础语句
    DDL(DataDefinitionLanguage) DML(DataManipulateLanguage) DQL(DataQueryLanguage)聚合函数聚合函数作用于字段,而且NULL值不参与计算分组查询 具体......
  • MySql 最大建议行数 2000w,靠谱吗?
     1背景作为在后端圈开车的多年老司机,是不是经常听到过,“mysql单表最好不要超过2000w”,“单表超过2000w就要考虑数据迁移了”,“你这个表数据都马上要到2000w了,难怪查......
  • Mysql集群
    Mysql集群笔记概述我们在考虑MySQL数据库的高可用的架构时,主要要考虑如下几方面:如果数据库发生了宕机或者意外中断等故障,能尽快恢复数据库的可用性,尽可能的减少停机......
  • TYPE(3)—mysql执行计划(四十九)
    Simple:普通的sql查询,连接查询。Primary:union左边的表。Union:union和unionall都叫几个select,除了最左边的是primary,其他都是union。Unionresult:union去重临时表。Subquery:......
  • Extra(5)—mysql执行计划(五十一)
    前面说了有type,simple表示普通查询或者连接查询,primary代表union最左边的select,unionresult代表union查询的临时表去重,所以unionall没有去重功能,subquery代表in的子查询......