MySQL 数据库核心漏洞防护-账户安全以及日志权限加固

MySQL数据库安全加固方案

28.7 分享金砖国家-2024 Linux 应急响应https://cloud.kong.college/s/q6CJ

28.7 分享金砖国家-2024 Linux 加固https://cloud.kong.college/s/KOhG

数据库作为核心数据存储载体,常面临SQL注入、口令破解、权限提升等安全威胁。本文针对6大核心风险,提供可落地的MySQL数据库加固措施,覆盖账户安全、配置防护、权限管控、日志审计等维度。

一、数据库面临的核心安全漏洞

在MySQL数据库运维中,需优先关注以下6类高风险漏洞:

  1. SQL注入(通过恶意SQL语句操控数据库)
  2. 口令破解(暴力破解或弱口令导致账户沦陷)
  3. 数据库漏洞利用(利用MySQL版本漏洞或未修复缺陷入侵)
  4. 权限提升(低权限账户通过配置缺陷获取高权限)
  5. 信息窃取(未授权读取数据文件、日志或敏感数据)
  6. 拒绝服务(恶意请求耗尽数据库资源,导致服务不可用)

二、重点防护方向

针对上述漏洞,本文聚焦以下6个核心防护场景,提供分步加固方案:

  1. 防口令破解(账户安全加固)
  2. 防止SQL注入(应用与数据库协同防护)
  3. 防止数据库漏洞利用(版本更新与配置限制)
  4. 防权限提升(权限最小化与访问控制)
  5. 防信息窃取(文件权限与敏感操作禁用)
  6. 防拒绝服务(资源限制与连接管控)

三、具体加固措施

3.1 防口令破解:账户安全加固

账户是数据库的第一道防线,需通过“强密码+账户清理+访问限制”降低破解风险。

3.1.1 重命名root账户并设置强密码

默认root账户是攻击者的主要目标,通过重命名账户+强密码,将“单密码爆破”升级为“账号+密码双爆破”,大幅提升攻击成本。

操作步骤

1
2
3
4
5
6
7
8
-- 1. 重命名root账户(示例:改为28.7Blog,仅允许本地访问)
RENAME USER 'root'@'localhost' TO '28.7Blog'@'localhost';

-- 2. 为新账户设置强密码(要求:大小写+数字+特殊符号,长度≥10位)
ALTER USER '28.7Blog'@'localhost' IDENTIFIED WITH mysql_native_password BY 'Eef9ch@oh-';

-- 3. 刷新权限,使配置生效
FLUSH PRIVILEGES;
3.1.2 删除测试账户与空密码账户

MySQL初始化时可能默认创建test测试账户,或存在空密码账户,这些是典型的入侵入口,必须清理。

操作步骤

  1. 查询风险账户

    1
    2
    -- ① 查询所有账户(检查是否存在test等测试账户)
    SELECT user, host FROM mysql.user;

    图:查询MySQL所有用户列表

    1
    2
    3
    4
    -- ② 查询空密码账户(authentication_string为空或NULL)
    SELECT user, authentication_string
    FROM mysql.user
    WHERE LENGTH(authentication_string) = 0 OR authentication_string IS NULL;

    图:查询MySQL空密码账户

  2. 删除风险账户

    1
    2
    3
    4
    5
    6
    7
    8
    -- 删除test测试账户(根据实际host调整,如@'localhost'或@'%')
    DROP USER 'test'@'localhost';

    -- 删除空密码账户(替换username为实际空密码账户名)
    DROP USER 'username'@'localhost';

    -- 刷新权限
    FLUSH PRIVILEGES;

3.2 日志审计:启用错误日志

MySQL错误日志记录启动/关闭信息、严重错误、警告,是事后追溯攻击行为的关键依据,必须强制启用。

操作步骤

  1. 编辑MySQL配置文件(不同系统路径可能不同,示例为Ubuntu):

    1
    vim /etc/mysql/mysql.conf.d/mysqld.cnf

    图:打开MySQL配置文件

  2. 配置错误日志路径(确保路径存在且MySQL有写入权限):

    1
    2
    [mysqld]
    log_error = /var/log/mysql/error.log # 错误日志路径
  3. 重启MySQL服务,使配置生效:

    1
    systemctl restart mysql

3.3 配置防护:禁用符号链接

启用符号链接(symbolic-links)可能导致攻击者通过链接篡改数据库文件,甚至突破目录限制,需禁用。

操作步骤

  1. 编辑MySQL配置文件:

    1
    vim /etc/mysql/mysql.conf.d/mysqld.cnf
  2. [mysqld]段添加/修改配置:

    1
    symbolic-links=0  # 禁用符号链接

    图:配置禁用符号链接

  3. 重启MySQL服务:

    1
    systemctl restart mysql

    图:重启MySQL服务验证配置

3.4 隐藏性防护:修改默认监听端口

MySQL默认监听3306端口,是扫描器的重点目标。修改为高位端口(如33060)可降低被主动扫描的概率。

操作步骤

  1. 编辑MySQL配置文件:

    1
    vim /etc/mysql/mysql.conf.d/mysqld.cnf
  2. 修改port参数(示例改为33060,确保端口未被占用):

    1
    2
    [mysqld]
    port = 33060 # 自定义监听端口

    图:修改MySQL监听端口

  3. 重启MySQL服务,并验证端口监听:

    1
    2
    systemctl restart mysql
    netstat -tulnp | grep mysql # 确认端口已改为33060

    图:验证MySQL新端口监听

3.5 访问控制:禁止任意远程登录(仅允许可信IP)

默认root账户可能允许远程登录(host=%),攻击者可通过远程爆破入侵。需限制仅可信IP能远程访问,且保留root本地权限。

操作步骤

  1. 创建专用远程管理账户(避免使用root远程登录):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    -- 示例:允许192.168.20.1(可信IP)远程登录,账户为remote_user
    CREATE USER 'remote_user'@'192.168.20.1'
    IDENTIFIED WITH mysql_native_password BY 'Eef9ch@oh-'; # 强密码

    -- 授予必要权限(遵循最小权限原则,示例授予SELECT/UPDATE)
    GRANT SELECT, UPDATE ON *.* TO 'remote_user'@'192.168.20.1';

    -- 刷新权限
    FLUSH PRIVILEGES;

    图:创建可信IP的远程账户

  2. 禁用root远程登录(若存在root@%账户):

    1
    2
    3
    -- 删除root远程账户(若存在)
    DROP USER 'root'@'%';
    FLUSH PRIVILEGES;

3.6 信息泄露防护:禁用MySQL历史命令

MySQL会将执行过的命令记录到~/.mysql_history文件,若攻击者获取该文件,可泄露敏感操作(如密码、表结构),需禁用记录。

操作步骤

  1. 删除现有历史命令文件,并创建空链接(指向/dev/null,写入即丢弃):
    1
    2
    3
    cd ~  # 进入当前用户家目录(若为root操作,路径为/root)
    rm -rf .mysql_history # 删除原有历史文件
    ln -s /dev/null .mysql_history # 建立空链接,禁止记录命令
    图:禁用MySQL历史命令

3.7 权限管控:禁止MySQL用户的Shell权限

MySQL系统用户(默认名为mysql)仅用于运行数据库服务,无需Shell登录权限。若启用Shell,可能被攻击者利用登录系统,需设置为/sbin/nologin

操作步骤

1
2
3
4
5
# 修改mysql用户的Shell为nologin(禁止登录)
usermod -s /sbin/nologin mysql

# 验证配置(查看mysql用户的Shell字段)
cat /etc/passwd | grep mysql

图:禁止MySQL用户Shell权限

3.8 防文件读取:禁用load_file函数

load_file函数可读取服务器本地文件(如/etc/passwd、敏感配置),是SQL注入中“文件读取”攻击的核心手段,需通过配置禁用。

操作步骤

  1. 编辑MySQL配置文件:

    1
    vim /etc/mysql/mysql.conf.d/mysqld.cnf
  2. [mysqld]段添加配置:

    1
    local-infile=0  # 禁用load_file及本地文件读取功能
  3. 重启MySQL服务:

    1
    systemctl restart mysql

3.9 文件权限加固:数据文件/日志文件权限管控

MySQL数据文件、日志文件包含敏感信息(如数据内容、账户密码),需限制仅mysql用户可读写,防止其他用户窃取。

3.9.1 强化数据文件权限

MySQL数据默认存储在/var/lib/mysql/,需设置权限为700(仅所有者可读写执行)。

1
2
3
4
5
6
# 递归设置数据目录权限(所有者为mysql:mysql,权限700)
chmod -R 700 /var/lib/mysql/
chown -R mysql:mysql /var/lib/mysql/

# 验证权限(确保目录权限为drwx------,文件权限为-rw-------)
ls -l /var/lib/mysql/

图:验证MySQL数据文件权限

3.9.2 强化二进制日志权限

二进制日志记录数据库所有修改操作,若泄露可能被用于数据恢复或攻击分析,需限制权限。

1
2
# 设置二进制日志所有者为mysql:mysql(日志路径需与配置一致)
chown mysql:mysql /var/lib/mysql/binlog*

图:强化二进制日志权限

3.9.3 强化错误日志权限

错误日志可能包含账户登录失败、服务异常等信息,需设置权限为600(仅所有者可读写)。

1
2
3
4
5
6
# 设置错误日志权限为600,所有者为mysql:mysql
chmod 600 /var/log/mysql/error.log
chown mysql:mysql /var/log/mysql/error.log

# 验证权限
ls -l /var/log/mysql/error.log

图:强化MySQL错误日志权限

四、加固后验证与维护

  1. 权限验证:通过SELECT user, host, authentication_string FROM mysql.user;确认账户无空密码、无测试账户。
  2. 配置验证:通过show variables like '%symbolic_links%';show variables like '%local_infile%';确认禁用项生效。
  3. 日志验证:查看/var/log/mysql/error.log,确认服务启动日志正常记录。
  4. 定期维护:每季度更新MySQL版本(修复已知漏洞)、每半年审计一次账户权限与日志。