MYSQL数据库加固

男娘i 2023-02-16 01:52 113阅读 0赞

收集整理比较全面的MYSQL数据库加固

MYSQL数据库加固指导手册

1. 数据库存放位置检查

  • windows系统: 数据库不可以放在C盘
  • linux系统:数据库文件不可以存放在 /,/var,/usr目录内

    连上mysql数据,mysql -uroot -p —回车输入密码

select @@datadir;
#或

show variables where variable_name=‘datadir’;

加固方法

  1. #设置指定安全的路径
  2. set global datadir='路径' ;
  3. #或者修改配置文件my.cnf(linux)或my.init(windows)中的datadir值
  4. datadir='路径'

2. 最小权限账号运行MYSQL数据库

  • windows系统:打开任务管理器,查看运行mysql的是什么权限账号,不能是administrator
  • linux系统: 不是是高权限账号(root)运行mysql,也不可以是在高权限用户组内

    ps 命令查看进程 ,grep过滤结果,使用下面命令查看运行mysql的用户

    ps -ef | grep mysql

加固方法

  1. # 1. 创建低权限账号和组
  2. groupadd mysql
  3. useradd -r -g mysql mysql
  4. # 2. 给新建账号添加密码
  5. passwd mysql
  6. # 3. 修改MYSQL安装目录的权限(提前关闭mysql服务)
  7. chown -R mysl.mysql mysql安装路径
  8. # 4. 读写执行权限最小化755
  9. chmod 755 mysql安装根路径
  10. chmod 755 mysql安装后执行目录(bin)
  11. chmod 755 mysql安装后lib库(libexec)
  12. chmod -R go-rwx mysql数据存储目录(data)
  13. # 5.重启mysql服务即可
  14. service mysqld start

3. 禁用使用mysql命令行历史记录

  • 查看系统中是存在.mysql_history文件:find / -name “.mysql_history” ,存在表示需要加固

加固方法

  1. echo "export MYSQL_HISTORY=dev/null" >> /etc/profile
  2. ln -s /dev/null .mysql_history文件路径
  3. rm -r .mysql_history文件路径

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

  • 查看慢查询日志文件名称和路径,然后查看权限,日志文件权限应满足:chmoed 660 和chmod mysq.mysql
  • 如果没有开启慢查询,表示安全

    第一种方法

    1. 查看慢查询日志文件名称和路径

    select @@slow_query_log_file;

    或者

    show variables like ‘slow_query_log_file’;

    2. 查看是否开启慢查询, slow_query_log 值:ON表示开启,OFF表示关闭

    show variables like ‘%query%’;

    第二种方法,直接查看mysql配置文件 /etc/my.cnf

    cat /etc/my.cnf

    看[mysqld]下面是否有以下配置:

    logout=file
    slow_query_log=on
    slow_query_log_file=路径
    long_query_time=2

    3. 查看慢查询日志文件的权限

    ls -l 慢查询日志文件路径

加固方法

  1. #修改慢查询日志权限如下
  2. chmod 660 慢查询日志文件
  3. chmod msyql.mysql 慢查询日志文件

5. 控制通用日志文件的权限

  • 查看通用日志文件名字和权限,日志文件权限应满足:chmoed 660 和chmod mysq.mysql
  • 如果没有开启慢查询,表示安全

    1. 查看是否开始通用日志记录,如果general_log为ON表示开启,否者就是关闭,其中general_log_file是通用日志的存放位置

    show variables like ‘%general%’;

    2. 根据第一步查看获取日志文件的位置查看通用日志文件的权限

    ls -l 通用日志文件

加固方法

  1. #修改权限和所属权限
  2. chmod 660 <log file>
  3. chown mysql:mysql <log file>

6. 审计日志文件的权限控制

  • 查看 审计日志文件名字和权限,日志文件权限应满足:chmoed 660 和chmod mysq.mysql
  • 如果没有开启慢查询,表示安全

    查看文件路径

    show variables like ‘%audit_log_file%’;

    查看权限

    ls -l 审计日志文件

加固方法

  1. #修改权限和所属权限
  2. chmod 660 <log file>
  3. chown mysql:mysql <log file>

7. 查看MYSQL版本,是否需要进行打补丁

  1. show variables like 'version';

加固方法

  • 安装补丁
  • 升级到mysql 最新版本

8. 删除test数据库

  • 如果存在test默认数据库,需要进行删除做加固
  • 如果没有,就不需要加固

    1. 查看系统数据库

    show databases;

加固方法

  1. drop database test;

9. 读取本地文件设置为OFF

  • 确认mysql数据库关闭对本地文件的读取功能,local_infile应为OFF

    查看是否开启本地读取文件功能

    show variables like ‘local_infile’

加固方法

  1. # 临时设置
  2. set @@local_infile=0;
  3. #永久设置,修改/etc/my.cnf 加入local-infile=0
  4. 在[mysqld]下面加入
  5. local-infile=0

10 .确认只有管理员权限可以管理所有表,查看所有用户和用户密码哈希,权限修改

  1. # 1. 查看所有数据库用户
  2. select user,host from mysql.user;
  3. # 2. 执行以下两条语句确保结果智能是数据库管理员
  4. SELECT user, host FROM mysql.user WHERE (Select_priv = 'Y') OR (Insert_priv = 'Y') OR (Update_priv = 'Y')
  5. OR (Delete_priv = 'Y') OR (Create_priv = 'Y') OR (Drop_priv = 'Y');
  6. 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'));

加固方法

  1. # 1. 确保一个数据库使用一个用户(尽可能的每个数据库使用单独的用户),每个用户只能对自己的库和表有全部权限,对其他库表根据情况有部分权限
  2. # 2. 确保权限管理只能是管理员
  3. ## 授权操作 :授予xiaoming用户对数据库test的goods表privileges权限
  4. grant privileges on test.goods to xiaoming@localhost

privileges:表示要授予什么权力,例如可以有 select , insert ,delete,update等,如果要授予全部权力,则填 ALL
atabasename.tablename:表示用户的权限能用在哪个库的哪个表中,如果想要用户的权限很作用于所有的数据库所有的表,则填 .,*是一个通配符,表示全部。
username@host:表示授权给哪个用户。
GRANT select,insert ON zje.zje TO ‘aaa’@’%’; //表示给用户aaa授权,让aaa能给zje库中的zje表 实行 insert 和 select。

GRANT ALL ON . TO ‘aaa’@’%’;//表示给用户aaa授权,让aaa能给所有库所有表实行所有的权力。

## 删除无关用户
drop user ‘test’@’%’; #删除 test用户

### 撤销用户权限
revoke privileges ON database.tablename FROM ‘username’@‘host’;
privileges,database.tablename,‘username’@’host’同上

根据实际情况对数据库用户进行权限的回收

11. 限制非管理权限

  1. 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’;

加固方法

  1. # 回收权限
  2. REVOKE FILE ON *.* FROM '<user>';

REVOKE PROCESS ON . FROM ‘’;

REVOKE SUPER ON . FROM ‘’;

REVOKE SHUTDOWN ON . FROM ‘’;

REVOKE CREATE USER ON . FROM ‘’;

REVOKE GRANT OPTION ON . FROM ;

其中user为上述查询到的非管理员用户。
例如:回收用户xiaoming的本地文件读取权限
revoke file on . from ‘xiaoming’;

12. 合理控制DML/DDL操作授权

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

加固方法

  1. REVOKE SELECT ON <host>.<database> FROM <user>;
  2. REVOKE INSERT ON <host>.<database> FROM <user>;
  3. REVOKE UPDATE ON <host>.<database> FROM <user>;
  4. REVOKE DELETE ON <host>.<database> FROM <user>;
  5. REVOKE CREATE ON <host>.<database> FROM <user>;
  6. REVOKE DROP ON <host>.<database> FROM <user>;
  7. REVOKE ALTER ON <host>.<database> FROM <user>;
  8. #其中<user>为查询到的未授权的用户,host为相关主机,database为相关数据库。

13. 开启错误日志审计功能

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

    show variables like ‘log_error’;

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

加固方法

  1. #在/etc/my.cnf加入配置
  2. [mysqld_safe]
  3. log-error=log文件路径

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

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

    show variables like ‘log_error’;

    或者直接去mysql文件查看 /etc/my.cnf log-error的值

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

加固方法

  1. #修改mysql配置文件log-error值不是 / ,/var/ ,/usr下

15. 关闭原始日志功能

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

    查看配置文件中是否有 log-raw=OFF或者log-raw=0

    cat /etc/my.cnf

加固方法

  1. #修改mysql 配置文件 /etc/my.cnf 加入 log-raw=0
  2. [mysqld_safe]
  3. log-raw=1

16. 用户密码加密强度

  • old_passwords的值不能为0,如果为0则用户密码可被破解

    select @@old_passwpords;

    值为0表示需要加固,否则不需要加固

加固方法

  1. set global old_passwords=1;
  2. #或者
  3. set global old_passwords=2;
  4. ## 或者修改/etc/my.cnf 加入old_passwords=1
  5. [mysqld_safe]
  6. old_passords=1 #或者等于2

17. secure_auth 选项设置

  • 如果客户端采用Old_passwords发起连接请求,如果服务器端设置了secure_auth,则客户端会拒绝连接请求,可以根据安全需求在配置文件中做相应配置。

    查看配置文件中是否有 secure_auth 并且值不为0

    cat /etc/my.cnf

加固方法

  1. ## 或者修改/etc/my.cnf 加入secure_auth=1
  2. [mysqld_safe]
  3. secure_auth=1 #或者等于2

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

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

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

    如果没有返回用户表示不存在

    或者使用以下语句查看是否有空密码

    select user,host from msyql.user;

加固方法

  1. #对空口零的用户加入密码user的值指定用户, password('')对用户密码加密,new password指定用户的密码
  2. update mysql.user set password=password('new password') where user='root';

19. 数据库定时备份

  • 定时对数据备份,异地备份,全量备份

加固方法

  1. # 创建定时任务脚本,指定时间间隔对数据备份
  2. # 例子:

a.新建备份文件并赋予可以执行的权限

  1. mkdir -p /home/mysql_backup/
  2. touch /home/mysql_backup/mysql_backup.sh
  3. chmod 551 /home/mysql_backup/mysql_backup.sh

b.编辑/home/mysql_backup/mysql_backup.sh

  1. vim /home/mysql_backup/mysql_backup.sh

c.写入以下内容

  1. backupdir=/home/mysql_backup
  2. time=` date +%Y_%m_%d_%H_%M_%S `
  3. db_user=root
  4. db_pass=123456
  5. mysqldump --all-databases -u $db_user -p$db_pass | gzip > $backupdir/$time.sql.gz
  6. find $backupdir -name "*.sql.gz" -type f -mtime +5 -exec rm -rf {} \; > /dev/null 2>&1

d.编辑crontab

  1. crontab -e

e.在最后一行加入

  1. * */1 * * * root /home/mysql_backup/mysql_backup.sh

f.重启crontab

  1. service crond restart

发表评论

表情:
评论列表 (有 0 条评论,113人围观)

还没有评论,来说两句吧...

相关阅读

    相关 MYSQL数据库加固

    > 收集整理比较全面的MYSQL数据库加固 MYSQL数据库加固指导手册 1. 数据库存放位置检查 windows系统: 数据库不可以放在C盘 lin

    相关 MySQL安全加固方法分享

    前言: 数据库作为数据存储的载体,在程序开发中承担着至关重要的作用。近些年,随着各种安全事故的发生,数据安全性逐渐得到重视。等保评测或各类系统安全评测中也都有增加数据库安全相

    相关 Oracle数据库安全加固记录

    一个应用系统做等保,需要对数据库进行安全加固,根据流程需要先在测试环境进行测试通过后应用于生产环境,这里简单记录测试过程,审计内容是评测的重要点,但是生产环境也不便于开启,这里

    相关 oracle11g数据库安全加固须谨慎

    oracle11g数据库安全加固须谨慎 数据库安全配置中,需要做相关的安全加固工作。以确认数据库的安全,但是,有些时候,操作不当或者数据库业务账号修改密码后,而程序的连接数据