优秀的编程知识分享平台

网站首页 > 技术文章 正文

如何安全配置数据库(MySQL/PostgreSQL/MongoDB)

nanyue 2025-07-27 22:57:29 技术文章 3 ℃

安全配置数据库(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 数据库的安全运行。

Tags:

最近发表
标签列表