百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

如何安全配置数据库(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 日志与监控

  • 启用数据库日志,监控所有访问和查询活动。
  • 使用监控工具(如 ZabbixPrometheus)检测异常活动。

示例(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 文件:

  • 使用强身份验证方法,如 MD5SCRAM-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 不启用用户认证。需要手动启用。

  1. 创建管理员用户:
  2. bash
  3. 复制
  4. mongo use admin db.createUser({ user: "admin", pwd: "secure_password", roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] });
  5. 修改配置文件(mongod.conf)启用认证:
  6. yaml
  7. 复制
  8. security: authorization: "enabled"
  9. 重启 MongoDB:
  10. bash
  11. 复制
  12. 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 数据加密

  1. 启用传输加密(TLS/SSL)
    mongod.conf 中启用 TLS:
  2. yaml
  3. 复制
  4. net: ssl: mode: requireSSL PEMKeyFile: /etc/ssl/mongodb.pem
  5. 启用磁盘加密(加密存储引擎)
    mongod.conf 中启用:
  6. yaml
  7. 复制
  8. 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. 总结

安全配置数据库需要从以下方面入手:

  1. 限制访问:绑定本地地址,使用防火墙限制访问。
  2. 用户权限:按照最小权限原则为不同用户分配角色。
  3. 加密通信:启用 SSL/TLS 和存储加密保护敏感数据。
  4. 日志审计:监控和记录访问活动,检测异常行为。
  5. 备份策略:定期备份和测试恢复流程,确保数据安全。

通过这些措施,可以有效保护 MySQL、PostgreSQL 和 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应用程序开发的开发人员需要各种库和包,这些被称为依赖项,以完成项目的功能并正确运行它们。...