MySQL安全加固

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"

posted @ 2022-11-01 23:32  0dot7  阅读(130)  评论(0编辑  收藏  举报