当前位置: 首页 > news >正文

Docker 部署 MongoDB / MySQL / PostgreSQL 安全加固实录:TLS 双向认证、双因素鉴别与审计

环境:Linux 宿主机 + Docker Compose、fastgpt_shared_network(典型网段172.18.0.0/16
场景:等保 / 行业安全检查中的数据库整改项(传输加密、身份鉴别、审计)
版本:MongoDB 5.0.18、MySQL 8.2.0、PostgreSQL(官方镜像)


一、写在前面:检查项与社区版能力

近期连续做了三套库的加固,检查方常见要求可归纳为:

类别典型表述社区版能否做
传输加密启用 TLS/SSL,requireSSL/ 双向证书(OpenSSL,国际算法)
国密 SM2/SM4传输/存储使用国密算法库本身不原生支持 TLCP;需网关/VPN/应用层 SM4
双因素鉴别口令 + 证书 / 动态口令 / 堡垒机(证书+口令;OTP 在堡垒机)
安全审计logging_collector、登录与 DDL 等(PG 推荐 pgAudit)

结论:不必迷信「SSL 版」「企业版才有 TLS」——官方 Docker 镜像已带 OpenSSL;企业版主要多 TDE、LDAP 等,不等于国密 TLCP。


二、整体架构(与 FastGPT 类项目一致)

┌─────────────────────────────────────────┐ 运维 Navicat │ Docker: fastgpt_shared_network │ (证书+口令) ────► │ fastmongo:27017 (映射宿主机 27018) │ │ mysql:3306 (通常不映射公网) │ │ postgres:5432 (通常不映射公网) │ │ fastapi / One-API / 业务容器 ──► 各库 │ └─────────────────────────────────────────┘ ▲ 堡垒机 SSH + OTP(可选第三层)

统一原则

  1. 管理账号dba_admin/ 带REQUIRE X509或 mTLS):证书 + 强口令。
  2. 应用账号fastgpt/oneapi):仅传输加密 + 口令,不配客户端证书。
  3. 端口:能内网就不映射;必须映射时防火墙收窄源 IP。
  4. 口令:不要写在 compose 明文里,用.env/ secrets,整改后轮换。

三、MongoDB 5.0:TLS 双向认证 + 双因素

3.1 现状诊断

dockerexecfastmongo mongo-u...--eval'printjson(db.adminCommand({getParameter:1,tlsMode:1}))'# 整改前: "tlsMode" : "disabled"dockerexecfastmongo mongo--ssl--hostlocalhost:27017--eval"db.version()"# 报错: stream truncated → 客户端要 TLS,服务端仍是明文

说明:--keyFile是副本集成员认证,不能代替 TLS。

3.2 证书目录与mongod.conf

宿主机:

/data/project/config/mongo-tls/ ca.pem server.pem # server.crt + server.key client-app.pem # 给应用/运维客户端

mongod.conf片段:

net:port:27017bindIp:0.0.0.0tls:mode:requireTLScertificateKeyFile:/data/mongo-tls/server.pemCAFile:/data/mongo-tls/ca.pemallowConnectionsWithoutCertificates:false# 强制客户端证书allowInvalidCertificates:false

db-compose.yml挂载:

volumes:-/data/project/config/mongod.conf:/data/mongod.conf:ro-/data/project/config/mongo-tls:/data/mongo-tls:ro

关键坑:改 compose 后必须docker compose up -d --force-recreate fastmongo,仅restart不会挂上mongo-tls卷。入口脚本里until mongo ...也要加--tls和证书参数,否则容器永远 Waiting。

3.3 双因素(整改表述)

因子实现
持有mTLS 客户端证书
知晓SCRAM 用户口令,authSource=admin

应用 URI 示例:

mongodb://fastgpt:***@fastmongo:27017/fastgpt?authSource=admin&tls=true&tlsCAFile=...&tlsCertificateKeyFile=...

3.4 Navicat

CAca.pem
客户端密钥client-app.pem(或 cert+key)
验证数据库admin(必填)
允许无效主机名用 IP 连时建议勾选

3.5 国密 SM2 与 Navicat

  • 国际 TLS(RSA):Navicat可以直连。
  • 端到端 TLCP/SM2:普通 Navicat不能直连;需国密网关/VPN,或内网仍用国际 TLS、国密放在网段入口。

四、MySQL 8.2:自动证书 +require_secure_transport

4.1 自动生成证书

数据目录/data/project/data/mysql下已有(首次初始化自动创建):

ca.pem server-cert.pem server-key.pem client-cert.pem client-key.pem

Issuer 为MySQL_Server_8.2.0_Auto_Generated_CA_Certificate2035 年前有效,整改演示可直接用。

dockerexecmysql mysql-uroot-p-e"SHOW VARIABLES LIKE '%ssl%';"# have_ssl=YES, ssl_ca=ca.pem, ssl_cert=server-cert.pem

4.2 强制 SSL

/data/project/config/mysql/conf.d/ssl.cnf

[mysqld] require_secure_transport=ON ssl_ca=/var/lib/mysql/ca.pem ssl_cert=/var/lib/mysql/server-cert.pem ssl_key=/var/lib/mysql/server-key.pem

挂载:./config/mysql/conf.d:/etc/mysql/conf.d:ro,然后force-recreate

4.3 用户与双因素

CREATEUSER'dba_admin'@'%'IDENTIFIEDBY'强密码'REQUIREX509;-- 管理:证书 + 口令ALTERUSER'oneapi'@'%'REQUIRESSL;-- 应用:仅加密通道

4.4 踩坑:VERIFY_IDENTITY与 One-API

# 错误:证书 CN 不是 mysql/127.0.0.1mysql... --ssl-mode=VERIFY_IDENTITY...# SSL connection error: certificate verify failed# 管理端测试用--ssl-mode=VERIFY_CA# 无客户端证 + dba_admin → 1045(预期,说明 X509 生效)

One-APISQL_DSN(容器内连mysql:3306):

# 错误 oneapi:***@tcp(mysql:3306)/one-api?tls=true # 正确(内网自签) oneapi:***@tcp(mysql:3306)/one-api?tls=skip-verify&parseTime=true

日志:

tls: certificate is not valid for any names, but wanted to match mysql

只改应用连接串这一处(grep 仅db-compose.ymlSQL_DSN),MySQL 侧 SSL + 用户权限需已配好。

4.5 Navicat(dba_admin

  • CA:ca.pem
  • 客户端证书/私钥:client-cert.pemclient-key.pem
  • 不要server-cert当客户端证

五、PostgreSQL:pg_hba+ SSL + 审计

5.1 改掉trust和明文host

整改前(不合格)

local all all trust host all all 127.0.0.1/32 trust host all all all scram-sha-256 # 明文 TCP 即可连

整改后(示例)

local all postgres peer local all all scram-sha-256 hostssl all fastgpt 172.18.0.0/16 scram-sha-256 hostssl all dba_admin 172.18.0.0/16 scram-sha-256 clientcert=verify-ca hostssl all fastgpt 127.0.0.1/32 scram-sha-256 hostssl all dba_admin 127.0.0.1/32 scram-sha-256 clientcert=verify-ca hostnossl all all all reject
  • fastgpt:业务账号(不是示例里的app_user)。
  • 172.18.0.0/16:以docker network inspect fastgpt_shared_networkSubnet为准,不是 Navicat 里填的10.102.53.251
  • 从宿主机连映射端口时,先SELECT inet_client_addr();,常见为172.18.0.1,需单独加一条hostssl

postgresql.conf

ssl = on ssl_cert_file = '/etc/postgresql/ssl/server.crt' ssl_key_file = '/etc/postgresql/ssl/server.key' ssl_ca_file = '/etc/postgresql/ssl/ca.crt' password_encryption = scram-sha-256

5.2 双因素

dba_adminscram-sha-256+clientcert=verify-ca+ Navicat 填客户端证书 + 客户端密钥 + 根证书 + 密码

常见遗漏:只填了client-admin.crt未填client-admin.key→ 锁图标报红。

应用 JDBC:

jdbc:postgresql://postgres:5432/your_db?sslmode=require

5.3 安全审计

conf.d/audit.conf

logging_collector = on log_destination = 'csvlog' log_directory = 'log' log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' log_rotation_age = 1d log_connections = on log_disconnections = on log_failed_login_attempts = on # PG14+ log_line_prefix = '%m [%p] %u@%d %h %a ' log_statement = 'ddl'

加强(需重启):

shared_preload_libraries = 'pgaudit' pgaudit.log = 'ddl, role, write' pgaudit.log_parameter = on
CREATEEXTENSION pgaudit;

日志目录挂宿主机:/data/project/logs/postgres,保留 ≥6 个月。


六、三套库对照表(写报告用)

项目MongoDBMySQLPostgreSQL
强制加密传输tls.mode: requireTLSrequire_secure_transport=ONssl=on+hostssl
管理双因素mTLS + SCRAMREQUIRE X509+ 口令clientcert=verify-ca+ SCRAM
应用账号fastgpt + TLSoneapi +REQUIRE SSLfastgpt +hostsslscram
应用改连接MONGODB_URItls 参数SQL_DSN?tls=skip-verifyJDBCsslmode=require
管理客户端Navicat:CA+客户端证+口令同上 + client-key同上,key 必填
主机名校验允许无效主机名 / SANskip-verify内网verify-ca或 allow invalid hostname
审计auditLog(企业)/ 应用日志general/audit pluginlogging_collector + pgAudit

七、高频踩坑汇总

现象原因处理
stream truncated服务端未开 TLS,客户端--sslrequireTLS/require_secure_transport
No such file ... mongo-tls/client-app.pemcompose 未挂卷或未 recreateforce-recreate+ls /data/mongo-tls
MySQLcertificate verify failedVERIFY_IDENTITY与自动证书 CN 不符改用VERIFY_CAtls=skip-verify(应用)
MySQL1045无客户端证REQUIRE X509正常拒绝带 client-cert/key 再连
One-APIwanted to match mysqltls=true校验主机名tls=skip-verify
PG Navicat 红锁client-admin.key补私钥,与 crt 成对
PG 连不上 hba客户端 IP 不是 10.102.53.251inet_client_addr()后改pg_hba
restart不 recreate卷/环境变量未更新docker compose up -d --force-recreate

八、整改报告可粘贴段落(示例)

已对 MongoDB、MySQL、PostgreSQL 实施传输层加密与身份鉴别加固。三套数据库均启用 TLS/SSL 强制加密(MongoDBrequireTLS、MySQLrequire_secure_transport、PostgreSQLssl+hostssl)。管理用户使用数字证书与强口令双因素鉴别(MongoDB mTLS、MySQLREQUIRE X509、PostgreSQLscram-sha-256 clientcert=verify-ca);应用使用独立账号与加密通道。数据库端口不对公网开放,运维经内网/堡垒机访问。PostgreSQL 已启用logging_collector及 pgAudit(或log_statement=ddl)记录登录、权限变更与 DDL 操作,日志集中存储并定期归档。

国密专项(若检查明确要求 SM2/SM4)可补充:

数据库引擎采用国际标准 TLS 保障传输机密性与完整性;跨网访问通过国密 VPN/SSL 网关实现国密算法保护;敏感字段采用 SM4 应用层加密存储。


九、验收命令清单(收藏)

# MongoDBdockerexecfastmongo mongo...--tls--tlsCAFile/data/mongo-tls/ca.pem\--tlsCertificateKeyFile/data/mongo-tls/client-app.pem\--eval'printjson(db.adminCommand({getParameter:1,tlsMode:1}))'# MySQLdockerexecmysql mysql... --ssl-mode=VERIFY_CA\--ssl-ca=/var/lib/mysql/ca.pem --ssl-cert=/var/lib/mysql/client-cert.pem\--ssl-key=/var/lib/mysql/client-key.pem-e"SELECT 1"# PostgreSQLdockerexecpostgres psql"host=127.0.0.1 sslmode=verify-ca user=dba_admin sslrootcert=... sslcert=... sslkey=..."-c"SELECT current_user;"dockernetwork inspect fastgpt_shared_network--format'{{(index .IPAM.Config 0).Subnet}}'

十、结语

这套加固的核心不是「买企业版」,而是:

  1. 把 TLS 真正开起来(配置 + 挂卷 + recreate);
  2. 管理与应用账号分离,管理上证书+口令
  3. 应用连接串补上 tls/sslmode,并处理Docker 内网主机名与自签证书的校验问题;
  4. PostgreSQL改掉 trust,补上审计日志

按本文逐项落地后,再配合截图与日志样本,一般可满足「传输加密」「双因素鉴别」「审计」类检查项;若检查卡「国密算法」字样,再在入口加国密网关,而不是强求 Navicat 直连 SM2。

http://www.zskr.cn/news/1414592.html

相关文章:

  • RedisDesktopManager Windows版:免费高效的Redis可视化管理工具终极指南
  • Botty:暗黑破坏神2重制版自动化工具完整技术指南与实现原理深度解析
  • 大模型时代已来临!小白程序员必备:收藏这份AI前端转型指南
  • 2026年第二季度GEO服务商按预算选型指南:
  • 【紧急避坑指南】:Gemini 1.5 Pro在东南亚小语种(泰/越/印尼)翻译中隐藏的5类事实性谬误
  • 将Hermes Agent自定义提供方指向Taotoken的配置指南
  • 超详细!uni-app Android本地打包傻瓜式教程(转载)
  • 2026年AI大模型API接口中转站排行榜:主流服务商性能与成本权威实测排名
  • 【Sora 2 3D场景生成革命性突破】:20年AIGC架构师亲测的5大工业级落地陷阱与避坑指南
  • 定制款重锤式电阻测试仪,真能满足特殊工位的各类检测需求?
  • 手写签名解决方案终极指南:如何用signature_pad快速构建专业的电子签名功能
  • 如何快速掌握UEFI固件分析:专业工具完整使用指南
  • 新手首次使用Taotoken从注册获取API Key到完成第一次调用的全流程
  • 如何快速下载B站4K高清视频:bilibili-downloader终极指南
  • 820亿Credits等于多少Tokens?
  • 通达信缠论插件:让复杂技术分析变得简单直观
  • 别再写死负责人了!Flowable候选人组实战:用Java代码搞定研发部请假审批
  • RPG Maker解密实战:3步提取加密游戏资源的完整指南
  • Cursor AI Pro破解工具:3步解锁永久VIP功能的终极指南
  • 从摩尔定律到韬定律:半导体产业六十年的范式转移
  • 在Taotoken模型广场对比并选用合适大模型的实际体验
  • 完整记录一套学生智慧平台渗透全流程
  • 揭开高频交易的神秘面纱:以CTP为例,带你全面了解期货Tick数据
  • Kali Linux 2024.4 上快速搞定 WebGoat 8.2.0:新手避坑与端口冲突解决指南
  • 请求签名:某电商平台的_sign签名机制。深度剖析电商平台_sign签名机制:从逆向工程到Python爬虫实战
  • Element:开源的Matrix网络通讯客户端
  • C51开发中far数据段过大问题的解决方案
  • uVision调试器C++开发限制与解决方案
  • 力学的变分原理的形而上学思维特性
  • 直播抠图技术100谈之27---电商美颜--真的不一样