网站首页 > 技术文章 正文
安全配置数据库(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 数据库的安全运行。
- 上一篇: SQL-执行过程详解(sql语句执行)
- 下一篇: 面试题:RocketMQ如何保证消息不重复消费
猜你喜欢
- 2025-07-27 Mybatis Plus框架学习指南-第六节内容(常用的类 1)
- 2025-07-27 面试题:RocketMQ如何保证消息不重复消费
- 2025-07-27 SQL-执行过程详解(sql语句执行)
- 2025-07-27 SQL Server如何使用维护计划?(sql2000维护计划怎么执行)
- 2025-07-27 云服务器:SQL数据库超时的原因与解决方法
- 2025-07-27 SQL 从入门到精通:全面掌握数据库操作
- 2025-07-27 数据库 SQL 约束之 DEFAULT(sql的约束是什么)
- 2025-07-27 windows下,mysql自动备份脚本(mysql数据备份脚本)
- 2025-07-27 SQL Server中从SELECT进行UPDATE的方法
- 2025-07-27 谈谈 SQL 注入及防范(如何处理sql注入)
- 1517℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 596℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 521℃MySQL service启动脚本浅析(r12笔记第59天)
- 489℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 489℃启用MySQL查询缓存(mysql8.0查询缓存)
- 477℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 456℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 454℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- windowsscripthost (69)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- c语言min函数头文件 (68)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)