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