服务器数据库安全:MySQL 开启 SSL 连接,禁止远程 root 登录并限制 IP 访问

MySQL 数据库安全配置指南

为了确保 MySQL 数据库的安全,建议实施以下措施:开启 SSL 连接以加密数据传输、禁止远程 root 登录以防止未授权访问、限制 IP 访问以控制连接来源。本指南将逐步指导您完成配置过程,基于 MySQL 官方最佳实践(适用于 MySQL 5.7 及以上版本)。在操作前,请务必备份数据库和配置文件(如 my.cnf),并在测试环境中验证。

1. 开启 SSL 连接

开启 SSL 可以加密客户端与服务器之间的通信,防止数据被窃听。步骤如下:

  • 步骤 1: 生成 SSL 证书和密钥

    在 MySQL 服务器上运行以下命令(使用 OpenSSL 工具):

    bash 复制代码
    # 创建证书目录
    sudo mkdir -p /etc/mysql/ssl
    sudo cd /etc/mysql/ssl
    
    # 生成 CA 证书
    sudo openssl genrsa 2048 > ca-key.pem
    sudo openssl req -new -x509 -nodes -days 3650 -key ca-key.pem > ca-cert.pem
    
    # 生成服务器证书
    sudo openssl req -newkey rsa:2048 -days 3650 -nodes -keyout server-key.pem > server-req.pem
    sudo openssl rsa -in server-key.pem -out server-key.pem
    sudo openssl x509 -req -in server-req.pem -days 3650 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > server-cert.pem
    
    # 生成客户端证书(可选,用于双向验证)
    sudo openssl req -newkey rsa:2048 -days 3650 -nodes -keyout client-key.pem > client-req.pem
    sudo openssl rsa -in client-key.pem -out client-key.pem
    sudo openssl x509 -req -in client-req.pem -days 3650 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > client-cert.pem
    
    # 设置文件权限
    sudo chmod 600 /etc/mysql/ssl/*
    sudo chown mysql:mysql /etc/mysql/ssl/*
  • 步骤 2: 配置 MySQL 启用 SSL

    编辑 MySQL 配置文件(通常位于 /etc/mysql/my.cnf/etc/mysql/mysql.conf.d/mysqld.cnf),在 [mysqld] 部分添加以下内容:

    ini 复制代码
    [mysqld]
    ssl-ca = /etc/mysql/ssl/ca-cert.pem
    ssl-cert = /etc/mysql/ssl/server-cert.pem
    ssl-key = /etc/mysql/ssl/server-key.pem
    require_secure_transport = ON  # 强制所有连接使用 SSL
  • 步骤 3: 重启 MySQL 服务

    bash 复制代码
    sudo systemctl restart mysql
  • 步骤 4: 验证 SSL 是否生效

    连接到 MySQL 并运行:

    sql 复制代码
    SHOW VARIABLES LIKE '%ssl%';
    -- 应看到 have_ssl 为 YES
    STATUS;
    -- 在连接信息中查看 SSL 状态(如 Cipher in use)
2. 禁止远程 root 登录

禁止 root 用户从远程登录,减少攻击面。root 用户应仅限本地访问。

  • 步骤 1: 修改 root 用户权限

    使用 MySQL 命令行连接到数据库(本地登录):

    sql 复制代码
    -- 检查当前 root 用户权限
    SELECT user, host FROM mysql.user WHERE user = 'root';
    
    -- 如果 root 有远程访问权限(如 host 为 '%'),则删除
    DROP USER 'root'@'%';
    
    -- 确保 root 仅限本地访问
    CREATE USER 'root'@'localhost' IDENTIFIED BY '您的强密码';
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;
    FLUSH PRIVILEGES;
  • 步骤 2: 验证远程登录被禁止

    尝试从远程机器连接:

    bash 复制代码
    mysql -u root -p -h 服务器IP
    -- 应提示访问被拒绝
3. 限制 IP 访问

通过 GRANT 语句限制用户只能从特定 IP 地址连接,提高访问控制。

  • 步骤 1: 创建或修改用户,绑定特定 IP

    例如,创建一个新用户 admin,仅允许从 IP 192.168.1.100 访问:

    sql 复制代码
    -- 创建用户并限制 IP
    CREATE USER 'admin'@'192.168.1.100' IDENTIFIED BY '您的强密码';
    GRANT ALL PRIVILEGES ON *.* TO 'admin'@'192.168.1.100' WITH GRANT OPTION;
    FLUSH PRIVILEGES;
    
    -- 如果已有用户,修改其 host
    UPDATE mysql.user SET host = '192.168.1.100' WHERE user = 'admin';
    FLUSH PRIVILEGES;
  • 步骤 2: 限制 MySQL 监听 IP(可选)

    在 MySQL 配置文件中,绑定到特定 IP(如仅监听内网):

    ini 复制代码
    [mysqld]
    bind-address = 192.168.1.100  # 替换为您的服务器内网 IP
  • 步骤 3: 验证 IP 限制

    从非授权 IP 尝试连接:

    bash 复制代码
    mysql -u admin -p -h 服务器IP
    -- 应提示访问被拒绝
总结与注意事项
  • 测试配置 :完成所有步骤后,使用工具如 mysql-client 或应用连接测试 SSL 和 IP 限制。
  • 备份 :操作前备份 my.cnf 和数据库(使用 mysqldump)。
  • 最佳实践
    • 使用强密码(12 位以上,包含字母、数字、符号)。
    • 定期更新 MySQL 和操作系统。
    • 监控日志(/var/log/mysql/error.log)排查问题。
  • 常见问题
    • 如果 SSL 配置失败,检查证书路径和权限。
    • 如果 IP 限制无效,确保防火墙(如 ufw)允许 MySQL 端口(默认 3306)。

通过以上步骤,您的 MySQL 数据库将显著提升安全性。如果有具体错误或版本差异,请提供更多细节以便进一步协助。

相关推荐
人工智能训练1 小时前
UE5中如何解决角色网格体“掉下去”的问题
运维·服务器·windows·容器·ue5
码熔burning8 小时前
MySQL 8.0 新特性爆笑盘点:从青铜到王者的骚操作都在这儿了!(万字详解,建议收藏)
数据库·mysql
猫头虎8 小时前
2025最新OpenEuler系统安装MySQL的详细教程
linux·服务器·数据库·sql·mysql·macos·openeuler
木子.李3479 小时前
ssh连接远程服务器相关总结
运维·服务器·ssh
BD_Marathon10 小时前
SpringBoot——辅助功能之切换web服务器
服务器·前端·spring boot
necessary65311 小时前
使用Clion查看linux环境中的PG源码
linux·运维·服务器
AOwhisky14 小时前
Linux逻辑卷管理:从“固定隔间”到“弹性存储池”的智慧
linux·运维·服务器
翼龙云_cloud14 小时前
阿里云渠道商:如何使用弹性伸缩来实现计算资源的弹性配置?
服务器·阿里云·云计算
05大叔15 小时前
大事件Day02
运维·服务器
五仁火烧15 小时前
Vue3 项目的默认端口行为
服务器·vue.js·nginx·容器·vue