如何安全配置数据库(MySQL/PostgreSQL/MongoDB)
安全配置数据库(MySQL、PostgreSQL 和 MongoDB)是保护数据免受恶意访问、泄露和篡改的关键步骤。以下是针对这三种常见数据库的安全配置指南,包括基础安全措施、访问控制、加密、备份等。
1. 通用安全配置(适用于所有数据库)
1.1 禁用默认账户或更改默认设置
许多数据库安装后会提供默认账户(如 root 或 admin),这些账户常被攻击者利用。
- 更改默认账户的用户名(如将 root 改为 admin_xyz)。
- 删除不必要的默认账户(如 MySQL 的匿名账户)。
- 强制设置复杂密码。
1.2 强制使用强密码
确保所有账户使用强密码(包括大小写字母、数字和特殊字符)。
- Linux 生成强密码:
- bash
- 复制
- openssl rand -base64 16
- 配置密码策略(MySQL 示例):
在 MySQL 配置文件中启用密码策略: - sql
- 复制
- SET GLOBAL validate_password_policy = MEDIUM; SET GLOBAL validate_password_length = 12;
1.3 限制网络访问
仅允许必要的用户或 IP 地址访问数据库。
- 使用防火墙(如 UFW 或 iptables)限制访问:
- bash
- 复制
- sudo ufw allow from <trusted_ip> to any port 3306 sudo ufw enable
- 在配置文件中绑定数据库监听地址为本地回环地址(127.0.0.1): MySQL:
- ini
- 复制
- bind-address = 127.0.0.1
- PostgreSQL:
在 postgresql.conf 中设置: - ini
- 复制
- listen_addresses = '127.0.0.1'
1.4 定期更新数据库版本
- 更新到最新的稳定版本以修复已知漏洞。
- 检查官方公告了解安全补丁: MySQL:https://dev.mysql.com/ PostgreSQL:https://www.postgresql.org/ MongoDB:https://www.mongodb.com/
1.5 日志与监控
- 启用数据库日志,监控所有访问和查询活动。
- 使用监控工具(如 Zabbix、Prometheus)检测异常活动。
示例(MySQL 启用查询日志):
ini
复制
[mysqld]
general_log = 1
general_log_file = /var/log/mysql/query.log
2. MySQL 安全配置
2.1 初始安全配置
使用 mysql_secure_installation 工具完成基础安全配置:
bash
复制
sudo mysql_secure_installation
- 设置 root 密码。
- 删除匿名用户。
- 禁止 root 远程登录。
- 删除测试数据库。
2.2 用户权限管理
- 创建最小权限的用户:
- sql
- 复制
- CREATE USER 'user'@'localhost' IDENTIFIED BY 'secure_password'; GRANT SELECT, INSERT, UPDATE ON database_name.* TO 'user'@'localhost'; FLUSH PRIVILEGES;
- 避免使用 GRANT ALL PRIVILEGES,只授予必要权限。
2.3 加密通信
确保 MySQL 客户端和服务器之间的通信被加密。
- 在 my.cnf 文件中启用 SSL:
- ini
- 复制
- [mysqld] require_secure_transport = ON
- 创建和配置 SSL 证书(使用 OpenSSL)。
2.4 防止 SQL 注入
- 使用参数化查询代替拼接字符串:
- php
- 复制
- $stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id"); $stmt->bindParam(':id', $id, PDO::PARAM_INT); $stmt->execute();
3. PostgreSQL 安全配置
3.1 配置身份验证
修改 pg_hba.conf 文件:
- 使用强身份验证方法,如 MD5 或 SCRAM-SHA-256:
- plaintext
- 复制
- host all all 127.0.0.1/32 scram-sha-256
3.2 限制访问
- 修改 postgresql.conf 文件,确保只绑定到本地:
- ini
- 复制
- listen_addresses = '127.0.0.1'
3.3 用户权限分离
- 创建低权限用户:
- sql
- 复制
- CREATE ROLE readonly_user LOGIN PASSWORD 'secure_password'; GRANT CONNECT ON DATABASE mydb TO readonly_user; GRANT USAGE ON SCHEMA public TO readonly_user; GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly_user;
- 将不同的用户授予不同的权限,避免权限过大。
3.4 加密数据传输
- 启用 SSL:
在 postgresql.conf 中配置: - ini
- 复制
- ssl = on ssl_cert_file = '/path/to/server.crt' ssl_key_file = '/path/to/server.key'
- 强制客户端使用 SSL:
在 pg_hba.conf 文件中配置: - plaintext
- 复制
- hostssl all all 0.0.0.0/0 scram-sha-256
3.5 日志审计
- 启用审计日志:
在 postgresql.conf 中配置: - ini
- 复制
- logging_collector = on log_statement = 'all' log_directory = '/var/log/postgresql'
4. MongoDB 安全配置
4.1 启用认证
默认情况下,MongoDB 不启用用户认证。需要手动启用。
- 创建管理员用户:
- bash
- 复制
- mongo use admin db.createUser({ user: "admin", pwd: "secure_password", roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] });
- 修改配置文件(mongod.conf)启用认证:
- yaml
- 复制
- security: authorization: "enabled"
- 重启 MongoDB:
- bash
- 复制
- sudo systemctl restart mongod
4.2 网络访问控制
- 限制 MongoDB 仅监听本地:
在 mongod.conf 中配置: - yaml
- 复制
- net: bindIp: 127.0.0.1
- 使用防火墙限制访问:
- bash
- 复制
- sudo ufw allow from <trusted_ip> to any port 27017
4.3 数据加密
- 启用传输加密(TLS/SSL):
在 mongod.conf 中启用 TLS: - yaml
- 复制
- net: ssl: mode: requireSSL PEMKeyFile: /etc/ssl/mongodb.pem
- 启用磁盘加密(加密存储引擎):
在 mongod.conf 中启用: - yaml
- 复制
- security: enableEncryption: true encryptionKeyFile: /etc/mongodb-keyfile
4.4 用户权限管理
- 创建具有最低权限的用户:
- bash
- 复制
- use mydb db.createUser({ user: "readonly_user", pwd: "secure_password", roles: [ { role: "read", db: "mydb" } ] });
4.5 禁用 HTTP 接口(REST API)
MongoDB 的 HTTP 接口可能暴露敏感信息,默认情况下应禁用。
在 mongod.conf 中确保未启用:
yaml
复制
net:
http:
enabled: false
5. 定期备份与恢复
5.1 定期备份
- MySQL:
使用 mysqldump: - bash
- 复制
- mysqldump -u root -p database_name > backup.sql
- PostgreSQL:
使用 pg_dump: - bash
- 复制
- pg_dump -U username -W -F c database_name > backup.dump
- MongoDB:
使用 mongodump: - bash
- 复制
- mongodump --db mydb --out /path/to/backup
5.2 自动化备份
使用定时任务(如 cron)定期执行备份。
6. 总结
安全配置数据库需要从以下方面入手:
- 限制访问:绑定本地地址,使用防火墙限制访问。
- 用户权限:按照最小权限原则为不同用户分配角色。
- 加密通信:启用 SSL/TLS 和存储加密保护敏感数据。
- 日志审计:监控和记录访问活动,检测异常行为。
- 备份策略:定期备份和测试恢复流程,确保数据安全。
通过这些措施,可以有效保护 MySQL、PostgreSQL 和 MongoDB 数据库的安全运行。