MySql安全

本文详细介绍了MySQL的安全配置,包括操作系统级别的安全措施,如避免在系统分区存放数据库,使用非管理员账号运行MySQL,禁用命令行历史记录,以及检查MYSQL_PWD环境变量。还涉及了安装过程中的注意事项,如使用专用服务器,不复用数据库账号,设置密码不可见。此外,文章讨论了文件权限控制,确保数据目录、日志文件的访问权限得到限制。最后,提到了权限配置、审计和日志、认证策略以及网络设置和定期备份的重要性,以增强MySQL数据库的安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MySQL安全

Mysql配置文件:linux系统下是my.conf,windows环境下是my.ini;

数据库整体安全需求:机密性、完整性、可用性;

1、操作系统级别安全配置

1.1不要将数据库放在系统分区

Windows系统:

直接检查是否将数据库放置在C盘。

Linux系统:

在终端连接上mysql数据库,执行如下命令:

show variables where variable_name = 'datadir';

然后返回shell命令行:

df -h <datadir>

其中datadir是上一条命令的返回值。

上述命令的返回值不应是/、/var、/usr

 

1.2使用专用的最小权限账号运行mysql数据库进程

Windows系统:

直接打开任务管理器,查看运行mysql进程的操作系统账号,不能为administrator账号。

Linux系统:

Shell命令行运行如下命令:

ps -ef | grep mysql

查看mysql服务的运行账号是否为root或其他高权限账号,如果是的,则需要创建一个非管理员专用账号来运行mysql服务。

 

1.3禁止使用mysql命令行历史记录( . mysql_history)

Linux系统:

执行如下命令:

find / -name ".mysql_history"

查看是否存在mysql的历史命令记录文件,如果存在,则需要进行如下加固:

(1)删除.mysql_history文件;

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

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

查看历史命令方法:

history

命令行历史记录: /root/.bash_history

mysql数据库操作历史记录:/root/.mysql_history

 

1.4 确保MYSQL_PWD环境变量未设置敏感信息

Linux系统下使用如下命令:

grep MYSQL_PWD /proc/*/environ

查看MYSQL_PWD环境变量是否设置了敏感信息。

确认那个配置文件或脚本设置了MYSQL_PWD环境变量。

 

2、安装

2.1使用数据库专用服务器

使用专用的服务器安装mysql服务可以减少mysql服务的攻击面,尽量卸载或删除操作系统上的不必要的应用或服务,减少其他应用的安装可能给mysql的运行带来的安全风险。

2.2 不要复用数据库账号

运行mysql服务的操作系统账号不要用来运行其他应用或服务,这样可以避免其他应用或服务器被攻击给mysql服务带来影响。

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

使用如下命令:

mysql -u admin -p password

连接mysql数据库服务,退出后查看历史命令,确认password是否为明文。

建议使用如下命令方式登录:

(1)先输入mysql -u admin -p

(2)根据命令行提示输入密码;

而不要在一整条命令中输入密码。

另外要控制mysql配置文件访问权限。

 

3、文件权限控制

3.1 控制数据目录的访问权限

数据目录是mysql数据库存放的位置,在mysql命令行界面下执行如下命令:

show variables where variable_name = 'datadir';

在终端命令行下执行如下命令:

ll <datadir>

如果存在问题,linux环境下在终端执行如下命令进行加固:

chmod 700 <datadir>

chown mysql:mysql <datadir>

 

3.2 控制二进制日志文件的权限

mysql的运行会产生很多日志,例如二进制日志、错误日志、慢查询日志等等,Mysql命令行下执行如下命令:

show variables like 'log_bin_basename';

ll <log_bin_basename>.*

根据输出确认日志文件的权限设置是否存在问题。

对于每个日志文件,修改其权限和属组如下:

chmod 660 <log file>

chown mysql:mysql <log file>

 

3.3 控制错误日志文件的权限

Mysql命令行下执行如下命令:

show variables like 'log_error';

在终端命令行执行如下命令:

ll <log_error>.*

对于每个日志文件,修改其权限和属组如下:

chmod 660 <log file>

chown mysql:mysql <log file>

 

3.4控制慢查询日志文件的权限

Mysql命令行下执行如下命令:

show variables like 'slow_query_log_file';

在终端命令行执行如下命令:

ll <slow_query_log_file>

对于每个日志文件,修改其权限和属组如下:

chmod 660 <log file>

chown mysql:mysql <log file>

 

3.5控制通用日志文件的权限

Mysql命令行下执行如下命令:

show variables like 'general_log_file';

对于每个日志文件,修改其权限和属组如下:

chmod 660 <log file>

chown mysql:mysql <log file>

 

3.6控制审计日志文件的权限

Mysql命令行下执行如下命令:

show global variables where variable_name =  'audit_log_file';

对于每个日志文件,修改其权限和属组如下:

chmod 660 <audit_log_file>

chown mysql:mysql <audit_log_file>

 

4、通用安全

4.1安装最新的补丁

在mysql命令行下查询MySQL的版本:

SHOW VARIABLES WHERE Variable_name LIKE "version";

或者 select version();

确认是否由需要安装的补丁包,如果有请安装。

 

4.2 删除test数据库

Mysql数据库默认安装好后,存在一个名为test的数据库,如果存在,请执行如下命令删除:

drop database “test”

 

4.3 确保读取本地文件的参数设置为失效

Mysql命令行下,使用如下命令:

SHOW VARIABLES WHERE Variable_name = 'local_infile';

查看结果是否为OFF。

如果该命令为ON,则数据库用户可以通过LOAD DATA INFILE 或者 SELECT local_file 读取到数据库所在操作系统本地的文件,在这种情况下,需要在mysql配置文件中新增一行:

Local-infile=0

然后重启数据库服务。

 

5、权限配置

5.1控制可以访问所有数据库的账号

Mysql数据库下的user表和db表中存放着可以授予数据库用户的权限,确保只有管理员账号才能访问所有数据库。

使用如下sql语句:

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'));

确保返回结果只能是数据库管理员账号。

 

5.2限制非管理员用户的权限

Mysql.user表中的权限列有:

file_priv:表示是否允许用户读取数据库所在主机的本地文件;

Process:表示是否允许用户查询所有用户的命令执行信息;

Super_priv:表示用户是否有设置全局变量、管理员调试等高级别权限;

Shutdown_priv:表示用户是否可以关闭数据库;

Create_user_priv:表示用户是否可以创建或删除其他用户;

Grant_priv:表示用户是否可以修改其他用户的权限;

应确保只有数据库管理员才有上述权限,使用如下sql语句查看拥有各个权限的数据库账号:

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>;

其中user为上述查询到的非管理员用户。

 

5.3合理控制DML/DDL操作授权

创建用户并授权语句:

grant select,insert,update,delete on base.* to base@localhost Identified by "123456";

DML/DDL语句包括创建或修改数据库结构的权限,例如insert、update、delete、create、drop和alter语句,在任何数据库中都要控制用户的此类权限,确保只授权给有业务需求的非管理员用户。Mysql命令行下执行如下命令:

SELECT User,Host,Db FROM mysql.db WHERE Select_priv='Y'

OR Insert_priv='Y' OR Update_priv='Y' OR Delete_priv='Y' OR Create_priv='Y'

OR Drop_priv='Y' OR Alter_priv='Y';

上述查询到的用户只能对特地的数据库才有相关的权限,使用如下命令进行相关权限的回收:

REVOKE SELECT ON <host>.<database> FROM <user>;

REVOKE INSERT ON <host>.<database> FROM <user>;

REVOKE UPDATE ON <host>.<database> FROM <user>;

REVOKE DELETE ON <host>.<database> FROM <user>;

REVOKE CREATE ON <host>.<database> FROM <user>;

REVOKE DROP ON <host>.<database> FROM <user>;

REVOKE ALTER ON <host>.<database> FROM <user>;

其中<user>为查询到的未授权的用户,host为相关主机,database为相关数据库。

 

6、审计和日志

6.1开启错误日志审计功能

错误日志包括数据库运行和停止过程中的一系列活动信息,有助于分析数据库运行过程中的一些异常活动,一般情况下需要开启错误日志记录功能,使用如下命令查询:

SHOW variables LIKE 'log_error';

确保返回结果为非空,如果为空,需要在mysql数据库配置文件中增加相关配置。

 

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

日志文件随着数据库的运行会不断增加,如果存放在系统区域,则会影响系统的正常运行,使用如下命令进行查询:

SELECT @@global.log_bin_basename;

确保返回结果不是如下路径:/、/var、/usr

 

6.3关闭原始日志功能

原始日志选项会决定一些敏感信息是否会被明文写进日志中,例如查询日志、慢查询日志、二进制日志,确保数据库配置文件中存在如下配置项:

Log-raw = OFF

 

7、认证

7.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

设置为mysql_old_password代表弱hash算法,可以快速通过密码字典进行暴力破解。使用如下命令查询相关值:

SHOW VARIABLES WHERE Variable_name = 'old_passwords';

确保返回值不为1。

 

7.2 密码保存

确保密码没有明文保存在全局配置文件中。

 

7.3 确保所有用户都要求使用非空密码登录

执行如下语句查询是否有用户不需要密码即可登录:

SELECT User, Password,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);

 

7.5不存在空账号

使用如下命令查询是否存在空账号:

SELECT user,host FROM mysql.user WHERE user = '';

 

8、网络设置

如果mysql数据库服务器与应用是跨信任域部署的,则需要考虑在数据库服务器与应用服务器之间建立ssl通道进行数据传输。

 

9、定期备份数据库

任何系统都有可能发生灾难。服务器、MySQL也会崩溃,也有可能遭受入侵,数据有可能被删除,所以数据库一定要定期备份。

导入数据库

/usr/bin/mysql -h*** -uroot -p changzhou_random < /app/backupsql/tb_place.sql

备份数据库

/usr/bin/mysqldump -h*** -uroot -p changzhou_random>/app/backupsql/changzhou_random_20171024.sql

/usr/bin/mysqldump -h*** -uroot -p hunan_randomnew>/home/www/backupsql/hunan_randomnew_20180131.sql

按条件备份数据表

mysqldump -h*** -uroot -p hunan_randomnew tb_taiji_company --where=" id between 10001 and 20000">D:\phpStudy\company2.sql

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值