MySQL作为最常用的关系型数据库之一,其安全性直接影响业务系统的稳定与数据资产的保护。提高MySQL数据库的安全性需要从账号权限、网络通信、数据存储以及运维规范多个层面共同着手,而不是依赖单一配置。
一、基于最小权限原则管理用户
创建数据库账号时,应避免使用root进行日常业务操作。为每个应用分配独立账号,并仅授予所需库表的权限。
-- 创建只能访问 app_db 库的应用账号 CREATE USER 'app_user'@'192.168.0.1' IDENTIFIED BY 'StrongPass_2023'; -- 仅授予该库增删改查权限 GRANT SELECT, INSERT, UPDATE, DELETE ON app_db.* TO 'app_user'@'192.168.0.1'; -- 刷新权限使配置生效 FLUSH PRIVILEGES;
定期使用SHOW GRANTS语句审查账号权限,及时回收多余授权。
二、启用传输层加密
MySQL客户端与服务器之间默认可能明文传输数据,在不可信网络中存在被嗅探风险。可通过配置SSL来加密连接。
[mysqld] require_secure_transport = ON ssl-ca = /etc/mysql/ca.pem ssl-cert = /etc/mysql/server-cert.pem ssl-key = /etc/mysql/server-key.pem
重启服务后,客户端使用--ssl-mode=REQUIRED参数即可强制加密连接。
三、静态数据加密
对于敏感字段,如手机号、身份证号,可在应用层加密后存储,或启用MySQL企业版的透明数据加密(TDE)。中小团队更常用应用层AES加密:
<?php // 使用AES-256-CBC加密用户手机号 $key = openssl_random_pseudo_bytes(32); $iv = openssl_random_pseudo_bytes(16); $phone = '13800000000'; $encrypted = openssl_encrypt($phone, 'AES-256-CBC', $key, 0, $iv); echo base64_encode($encrypted); ?>
四、审计与注入防护
开启通用查询日志或部署审计插件,记录异常SQL。同时在代码中使用预处理语句,避免拼接SQL引发注入:
String sql = "SELECT * FROM users WHERE id = ?"; PreparedStatement ps = conn.prepareStatement(sql); ps.setInt(1, userId); ResultSet rs = ps.executeQuery();
| 措施 | 作用 |
|---|---|
| 最小权限 | 降低账号泄露影响面 |
| SSL加密 | 防止链路窃听 |
| 字段加密 | 保护静态敏感数据 |
通过以上组合策略,可系统性提高MySQL数据库的安全性,实际落地时建议结合业务场景做取舍与持续巡检。