如何安全配置数据库(MySQL/PostgreSQL/MongoDB)
itomcoil 2025-08-02 18:47 2 浏览
安全配置数据库(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 数据库的安全运行。
- 上一篇:MongoDB基础——聚合
- 下一篇:mongodb导入导出及备份
相关推荐
- 前端最常用的25个正则表达式,代码效率提高 80%
-
在日常开发中,正则表达式是非常有用的,正则表达式在每个语言中都是可以使用的,他就跟JSON一样,是通用的。在日常开发中,了解一些常用的正则表达式,能大大提高你的工作效率,例如字符串的匹配表单项的格式校...
- 如何使用正则表达式和 Python 匹配不以模式开头的字符串
-
需要在Python中使用正则表达式来匹配不以给定模式开头的字符串吗?如果是这样,你可以使用下面的语法来查找所有的字符串,除了那些不以https开始的字符串。r"^(?!https).*&...
- Python中使用re模块实现正则表达式的替换字符串操作
-
#编程语言#我是"学海无涯自学不惜!",关注我,一同学习简单易懂的Python编程。0基础学python(83)Python中,导入re模块后还可以进行字符串的替换操作,就是sub()...
- 10分钟快速掌握正则表达式
-
什么是正则表达式,英文名字regularexpression。其实说人话就是:用有限的符号,表达无线的序列。字面量创建正则表达式letstr="jasonlee2023"l...
- C语言中使用正则表达式
-
POSIX规定了正则表达式的C语言库函数,参见regex(3),我们已经学了很多C函数的用法读者应该具备自己看懂man手册的能力C语言中使用正则表达式一般分为三步:1.编译正则表达式regco...
- jmeter(十五)-正则表达式提取器
-
正则表达式提取器(RegularExpressionExtractor)sampler请求的服务器响应结果中通过正则表达式提取值所需值,生成模板字符串,并将结果存储到给定的变量名中。界面如下:Ap...
- 浅学python | 使用正则表达式对象处理字符串
-
分享兴趣,传播快乐,增长见闻,留下美好!亲爱的您,这里是LearningYard学苑。欢迎大家继续访问学苑内容,今天小编为大家带来有关Python的知识。Shareinterest,spread...
- Rocky Linux 9常用命令备忘录(不定时更新)
-
RockyLinux9常用命令备忘录(不定时更新)大家好,我是星哥,上次介绍了<RockyLinux9系统安装配置图解教程并做简单配置>:https://mp.weixin.qq...
- Python教程(十一):循环控制 – break、continue和pass
-
昨天,我们探索了for循环和range()函数。今天,我们将更进一步,学习如何使用三个强大的工具来控制循环内部的流程:break、continue和pass。这些命令让您能够:停止循环(break)...
- pip常用命令,学Python不会这个寸步难行哦(26)
-
小朋友们好,大朋友们好!我是猫妹,一名爱上Python编程的小学生。欢迎和猫妹一起,趣味学Python。今日主题学习下pip的使用。pip什么是pippip全称PythonPackageIndex...
- Python轻松实现markdown转网页,完美支持mermaid图表、latex公式
-
1简介大家好我是费老师,markdown作为经典易用的文档格式,随着近几年AI大模型的普及,更是成为了大模型内容输出的标准内容格式。针对markdown格式的内容,使用Python中的一些宝藏库,我...
- 写 Python 七年才发现的七件事:真正提高生产力的脚本思路
-
如果你已经用Python写了不少脚本,却总觉得代码只是“能跑”,这篇文章或许会刷新你对这门语言的认知。以下七个思路全部来自一线实战,没有花哨的概念,只有可落地的工具与习惯。它们曾帮我省下大量无意义...
- Python sys模块使用教程
-
1.知识导图2.sys模块概述2.1模块定义与作用sys模块是Python标准库中的一个内置模块,提供了与Python解释器及其环境交互的接口。它包含了许多与系统相关的变量和函数,可以用来控制P...
- Python开发效率翻倍!47k星神器uv实测真香
-
在日常Python开发中,你是否经常遇到这些问题:多版本切换复杂-项目间Python版本冲突频发环境管理繁琐-手动创建/激活虚拟环境效率低下依赖安装缓慢-每次pipinstall都像在抽...
- 如何在 Ubuntu Linux 上安装 Python 依赖项
-
对于任何软件项目,管理依赖项是确保顺利运行的必要条件;否则,应用程序可能会出现故障。同样,从事Python应用程序开发的开发人员需要各种库和包,这些被称为依赖项,以完成项目的功能并正确运行它们。...
- 一周热门
- 最近发表
- 标签列表
-
- ps图案在哪里 (33)
- super().__init__ (33)
- python 获取日期 (34)
- 0xa (36)
- super().__init__()详解 (33)
- python安装包在哪里找 (33)
- linux查看python版本信息 (35)
- python怎么改成中文 (35)
- php文件怎么在浏览器运行 (33)
- eval在python中的意思 (33)
- python安装opencv库 (35)
- python div (34)
- sticky css (33)
- python中random.randint()函数 (34)
- python去掉字符串中的指定字符 (33)
- python入门经典100题 (34)
- anaconda安装路径 (34)
- yield和return的区别 (33)
- 1到10的阶乘之和是多少 (35)
- python安装sklearn库 (33)
- dom和bom区别 (33)
- js 替换指定位置的字符 (33)
- python判断元素是否存在 (33)
- sorted key (33)
- shutil.copy() (33)