一、概要

各应用系统上线后基本都需要做等保测评,接下来将针对MySQL数据库所要求的各安全策略进行设置,如:

  • 所有的数据库需要设置三权账户:系统管理员、网络管理员和安全管理员
  • 所有数据库密码的负责度策略需要启用,如:密码为8位以上,由大小写字母、数字和特殊字符组成;90天定期更换
  • 所有数据库登录失败处理需要启用,如:登录失败5次,锁定10分钟,登录超时10分钟,自动退出
  • 所有数据库需要关闭远程登录管理,需要通过服务器进入
  • 所有数据库的配置数据,必须要进行定期本地备份

二、环境及实现

  • 系统:Linux
  • 软件:MySQL
  • 实现:my.cnf配置文件、MySQL脚本等

三、前期准备

  • 登录系统
    如果登录时不是root账号,需要切换到root账号,输入命令 su - root,回车后输入密码即可
  • 进入MySQL
    执行命令 mysql -uroot -p,回车后输入密码即可
    在这里插入图片描述

四、操作步骤

1、所有的数据库需要设置三权账户:系统管理员、网络管理员和安全管理员

创建系统管理员账户:
mysql -u root -p

CREATE USER 'sys_admin'@'localhost' IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON *.* TO 'sys_admin'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;
创建网络管理员账户:
mysql -u root -p
CREATE USER 'net_admin'@'localhost' IDENTIFIED BY '123456';
GRANT SELECT, SHOW DATABASES, PROCESS ON *.* TO 'net_admin'@'localhost';
FLUSH PRIVILEGES;
创建安全管理员账户:
mysql -u root -p
CREATE USER 'sec_admin'@'localhost' IDENTIFIED BY '123456';
GRANT SELECT, SHOW DATABASES, FILE ON *.* TO 'sec_admin'@'localhost';
FLUSH PRIVILEGES;

如果提示如下错误信息,按照如下命令执行即可

ERROR 1290 (HY000): The MySQL server is running with the --super-read-only option so it cannot execute this statement

在这里插入图片描述

SHOW VARIABLES LIKE 'read_only';
SET GLOBAL super_read_only = OFF;
-- 执行完成后,再修改为ON即可
SET GLOBAL super_read_only = ON;

2、所有数据库密码的负责度策略需要启用,如:密码为8位以上,由大小写字母、数字和特殊字符组成;90天定期更换

方式1:修改配置文件(推荐)

将以下配置添加到/etc/my.cnf或/etc/mysql/my.cnf的[mysqld]部分

[mysqld]
plugin-load-add = validate_password.so
validate-password-policy=2
validate-password-length=8
validate-password-mixed-case-count=1
validate-password-number-count=1
validate-password-special-char-count=1
# 设置密码过期时间为 90 天
default_password_lifetime = 90

然后重启MySQL服务
systemctl restart mysqld

方式2:通过MySQL脚本实现

启用validate_password插件

mysql -u root -p

INSTALL PLUGIN validate_password SONAME 'validate_password.so';

配置密码策略

SET GLOBAL validate_password.policy = 2; -- 0=Low, 1=Medium, 2=High
SET GLOBAL validate_password.length = 8; -- 密码最小长度
SET GLOBAL validate_password.mixed_case_count = 1; -- 至少包含一个大写字母
SET GLOBAL validate_password.number_count = 1; -- 至少包含一个数字
SET GLOBAL validate_password.special_char_count = 1; -- 至少包含一个特殊字符
-- 设置密码过期时间为 90 天
SET GLOBAL default_password_lifetime = 90;

3、所有数据库登录失败处理需要启用,如:登录失败5次,锁定10分钟,登录超时10分钟,自动退出

方式1:修改配置文件(推荐)

将以下配置添加到/etc/my.cnf或/etc/mysql/my.cnf的[mysqld]部分

[mysqld]
max_connect_errors = 5
interactive_timeout = 600
wait_timeout = 600

然后重启MySQL服务
systemctl restart mysqld

方式2:通过MySQL脚本实现
mysql -u root -p
-- 设置最大连接错误次数
SET GLOBAL max_connect_errors = 5;

-- 设置超时
SET GLOBAL interactive_timeout = 600;  -- 10分钟后自动断开
SET GLOBAL wait_timeout = 600;  -- 设置客户端连接超时

4、所有数据库需要关闭远程登录管理,需要通过服务器进入

编辑MySQL的配置文件/etc/my.cnf或/etc/mysql/my.cnf,在[mysqld]部分添加以下内容:

[mysqld]
bind-address = 127.0.0.1

重启MySQL服务

sudo systemctl restart mysqld

配置后,MySQL将仅允许来自本地机器的连接

5、所有数据库的配置数据,必须要进行定期本地备份

备份命令

使用mysqldump进行数据库备份,可以创建一个定期备份的脚本
创建一个备份脚本/usr/local/bin/mysql_backup.sh

#
DB_HOST="192.168.0.1"
DB_USER="root"
DB_PASS="123456"
DB_NAME="myblog"

# 备份文件保存位置
BACKUP_DIR="/disk/backup"
DATE=$(date +"%Y-%m-%d_%H-%M-%S")
BACKUP_FILE="$BACKUP_DIR/${DB_NAME}_backup_$DATE.sql"

# 日志文件
LOG_FILE="$BACKUP_DIR/backup.log"

# 创建备份目录(如果不存在)
mkdir -p $BACKUP_DIR

# 进行数据库备份
mysqldump -h $DB_HOST -u $DB_USER -p$DB_PASS $DB_NAME > $BACKUP_FILE

# 检查备份是否成功
if [ $? -eq 0 ]; then
  echo "[$(date +"%Y-%m-%d %H:%M:%S")] 备份成功: $BACKUP_FILE" >> $LOG_FILE
else
  echo "[$(date +"%Y-%m-%d %H:%M:%S")] 备份失败" >> $LOG_FILE
fi

# 删除超过7天的备份文件
find $BACKUP_DIR -type f -name "*.sql" -mtime +3 -exec rm {} \;

# 打印日志文件
cat $LOG_FILE
给脚本添加执行权限

chmod +x /usr/local/bin/mysql_backup.sh

设置定时任务

使用cron设置定期备份任务,执行命令 crontab -e
然后添加以下行,如每天凌晨2点进行备份
0 2 * * * /usr/local/bin/mysql_backup.sh

通过命令crontab -l 查看是否生效
在这里插入图片描述

五、最终验证

1、验证三权账号

mysql -u root -p

-- 查看系统管理员账户权限
SHOW GRANTS FOR 'sys_admin'@'localhost';

-- 查看网络管理员账户权限
SHOW GRANTS FOR 'net_admin'@'localhost';

-- 查看安全管理员账户权限
SHOW GRANTS FOR 'sec_admin'@'localhost';

在这里插入图片描述

2、验证密码度策略

-- 查看密码策略设置 
SHOW VARIABLES LIKE 'validate_password%';
-- 检查密码过期策略
SHOW VARIABLES LIKE 'default_password_lifetime';

在这里插入图片描述

3、验证登录失败处理

-- 查看`max_connect_errors`配置

SHOW VARIABLES LIKE 'max_connect_errors';

-- 查看`interactive_timeout`和`wait_timeout`配置

SHOW VARIABLES LIKE 'interactive_timeout';

 SHOW VARIABLES LIKE 'wait_timeout';

在这里插入图片描述

4、验证数据库关闭远程登录

mysql -u root -p

SHOW VARIABLES LIKE 'bind_address';

在这里插入图片描述

5、验证数据库定期本地备份

crontab -l
在这里插入图片描述

六、小结

至此,有关MySQL的等保测评所需要的策略就设置完成了,如有错漏请指出,下次再见

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐