MySQL 数据库安全
数据库安全是通过限制访问权限,仅允许必要人员访问,从而保护数据的完整性、机密性和可用性的实践。依赖默认设置或“开放式”配置会使数据面临意外删除、恶意篡改或未经授权外泄的风险。
1. 最小特权原则 (PoLP)
最有效的安全策略是最小特权原则 (Principle of Least Privilege)。这意味着每个用户、应用程序或服务都应仅拥有执行其特定任务所需的最低限度权限。
例如,如果一个 Web 应用程序只需要读取产品列表,那么它的数据库用户账号就不应该拥有 DROP 表或 UPDATE 用户凭据的权限。通过限制范围,你可以将特定账号被破解后可能造成的损失降到最低。
2. 实施范围受限的访问
不要使用 root 账号进行应用程序连接,而应为特定功能创建特定用户。
-- 创建一个仅限于特定主机的用户
CREATE USER 'web_app_user'@'localhost' IDENTIFIED BY 'Strong_Password_123!';
-- 仅授予特定数据库的 SELECT 权限
GRANT SELECT ON world.* TO 'web_app_user'@'localhost';
-- 立即应用更改
FLUSH PRIVILEGES;3. 网络与身份验证安全
MySQL 服务器通常位于应用层之后,但仍必须在网络边界受到保护。
- 网络隔离: 许多安装默认监听所有网络接口。如果没有远程访问需求,应配置服务器仅监听本地接口 (
127.0.0.1);或者使用防火墙(如ufw或iptables)将访问限制在应用服务器的特定 IP 地址。 - 凭据管理: 身份验证安全始于密码复杂度,但也包括如何处理这些密码。严禁在源代码中硬编码凭据。应使用环境变量或安全的配置管理工具在运行时注入凭据。
4. 移除匿名访问与测试数据库
默认的 MySQL 安装通常会创建一个“匿名”用户和一个任何人无需身份验证即可访问的 test 数据库。这些是未经授权探测的潜在入口。
-- 移除匿名用户
DROP USER ''@'localhost';
DROP USER ''@'hostname';
-- 移除测试数据库
DROP DATABASE IF EXISTS test;5. 数据加密与审计
- 静态加密 (Encryption at Rest): 确保如果数据库文件被物理盗取(例如留在公共服务器上未加密的备份文件),其中的数据仍然不可读。除了 MySQL 提供的透明数据加密 (TDE) 外,最基础的安全层是限制文件系统权限,使只有 mysql 操作系统用户可以读取数据目录。
- 审计 (Auditing): 涉及跟踪谁在何时访问了什么。虽然全量审计日志可能会影响性能,但启用通用查询日志或错误日志对于事故后的分析至关重要。
- 未经授权的访问尝试
- 凭据是否有效?
- 否 → 拒绝连接并记录 IP。
- 是 → 继续。
- 是否拥有所需权限?
- 否 → 拒绝查询并记录错误。
- 是 → 执行查询 → 将操作记录到审计追踪。
6. 安全的备份实践
备份往往是安全链中最薄弱的一环。未加密的备份只是整个数据库的纯文本副本。在使用 mysqldump 等工具时,请确保:
- 受限访问: 备份存储在具有严格文件系统权限的加密目录中。
- 加密存储: 如果存储在云端(如 Amazon S3),文件必须使用服务托管密钥进行加密。
- 传输安全: 数据库转储应通过加密隧道(如 SSH/TLS)传输,绝不能通过普通 FTP 或未加密的 HTTP 传输。