Metabase 使用 SSL 证书加密数据库连接:从证书下载、连接串参数到双向认证的完整配置指南

发布时间:2026/9/10 13:28:31
Metabase 使用 SSL 证书加密数据库连接:从证书下载、连接串参数到双向认证的完整配置指南 Metabase 使用 SSL 证书加密数据库连接从证书下载、连接串参数到双向认证的完整配置指南【免费下载链接】metabaseThe easy-to-use open source Business Intelligence and Embedded Analytics tool that lets everyone work with data :bar_chart:项目地址: https://gitcode.com/GitHub_Trending/me/metabase导读本文围绕 Metabase开源 BI 与嵌入式分析平台的数据库安全连接主题系统讲解如何使用 SSL 证书对 Metabase 到数据库如 PostgreSQL、MySQL之间的连接进行加密与身份验证覆盖 Metabase Cloud 与自托管两种部署形态从云厂商下载根证书、将证书放入 Docker 镜像/app/certs/或上传至「SSL Client Certificate」配置、在「Add additional connection string options」中拼接sslmode/sslrootcert参数直至通过MB_DB_CONNECTION_URI环境变量保护应用数据库连接并进一步理解 truststore / keystore 与双向认证mutual TLS的底层原理。读完本文你将能在 Metabase 中完整落地一条「全链路 SSL 加密」的数据库连接。本文以官方文档 docs/databases/ssl-certificates.md 为主线并结合仓库中的 Dockerfile、bin/docker/Dockerfile_ubuntu、bin/docker/DigiCertGlobalRootG2.crt.pem 及 环境变量说明文档 等实现证据展开。为什么要用 SSL 证书保护数据库连接Secure Socket LayerSSL加密搭配证书可以让 Metabase 与数据库之间的连接同时获得传输加密与身份验证两层保障。官方文档给出了两种典型诉求Metabase Cloud 用户希望验证所连接的数据仓库如 PostgreSQL、MySQL确实是预期的服务端防止中间人伪造自托管用户希望验证由外部云厂商托管的数据仓库身份同时也可以用最严格的连接参数来连接自己的应用数据库。需要特别说明的是Metabase Cloud 的应用数据库由官方托管你只需要为添加到 Metabase 的数据仓库连接启用 SSL而自托管部署中Metabase 自身的应用数据库application database同样可以通过环境变量走 SSL 连接见后文「Securing connection to application database」一节。前置条件启用证书加密的前提是目标数据库必须支持 JDBC 连接。因为 Metabase 需要借助 JDBC 连接字符串connection string来指定要使用的证书路径证书的传递完全通过连接串参数完成。Step 1从云厂商下载根证书Docker 镜像内置的证书如果你通过 Docker 容器运行 Metabase镜像内已经预置了 AWS 与 Azure 的根证书位置在镜像的/app/certs/目录AWS RDS 证书/app/certs/rds-combined-ca-bundle.pemAzure 证书/app/certs/DigiCertGlobalRootG2.crt.pem这一点可以直接在当前仓库的 Dockerfile 中得到印证第 49 行将仓库内的 bin/docker/DigiCertGlobalRootG2.crt.pem 复制为/app/certs/DigiCertGlobalRootG2.crt.pem第 56 行通过curl https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem将 AWS 的 RDS 证书捆绑包下载为/app/certs/rds-combined-ca-bundle.pem第 57–58 行使用keytool将这两个证书分别以aws-rds、azure-cert别名导入 JVM 的信任库/etc/ssl/certs/java/cacerts。这意味着在官方 Docker 镜像中证书不仅存在于/app/certs/还被导入了 Java 运行时信任库——当 JDBC 驱动进行服务端证书校验时Java 侧的信任链同样能够验证 AWS RDS 与 Azure 的证书。仓库中另一个基于 Ubuntu 的镜像定义 bin/docker/Dockerfile_ubuntu 采用了类似的思路但位置不同证书被放到/usr/local/share/ca-certificates/第 11 行并调用update-ca-certificates第 16 行同步到系统证书体系同时使用keytool -list -cacerts确认 JVM 信任库状态。这说明两种镜像都在构建期就把云厂商根证书固化进了运行环境。需要其他证书时如果连接的数据库厂商不在 AWS / Azure 之列官方建议前往外部数据库提供商的页面下载其根证书然后自行构建 Docker 镜像例如将证书 COPY 进镜像、或挂载进/app/certs/再按下文方式在连接串中引用。Step 2保存证书自托管Self-hosted将下载的证书保存在存放metabase.jar的同一目录下。虽然技术上证书可以放在任意位置但与管理 jar 同目录是最佳实践——之后你在连接字符串中需要填写这个证书的完整路径。Metabase Cloud先完成「Step 3添加数据库」然后在Admin管理后台Databases中选择该数据库找到SSL Client Certificate区域点击Select a file上传下载好的证书。作为前端实现的佐证仓库中的 DatabaseSslKeyDescription.tsx 组件在引擎为postgres时会提示用户如果持有 PEM 格式的 SSL 客户端密钥需要先用 OpenSSL 将其转换为 PKCS-8/DER 格式后再上传——这直接对应「SSL Client Certificate」这一客户端证书上传能力详见后文 Keystore / 双向认证部分。Step 3添加你的数据库以连接 PostgreSQL 为例按照应用内的引导流程添加数据库即可完成连接的基本配置。关于添加数据库连接的完整操作可参考 docs/databases/connecting.md。Step 4开启 Use a secure connection (SSL) 选项由于目标数据库支持 JDBC 连接Metabase 会额外提供一个输入框用于填写连接字符串的附加参数。Metabase 会把这些参数并入 JDBC 连接串从而建立安全连接。因此本步骤的核心动作就是在数据库连接表单中打开 SSL 开关并准备好在后续步骤填入参数。Step 5在连接字符串中添加证书相关参数关键一步必须在连接串中指定证书在运行 Metabase 的服务器上的位置。以 PostgreSQL 为例需要追加两个参数参数作用建议sslmode控制 SSL 校验的严格程度推荐使用verify-full最安全且性能开销极小sslrootcert指定根证书的文件路径填入证书在你服务器上的完整绝对路径多个参数之间用与符号分隔。在Add additional connection string options字段中最终应填入类似下面的内容sslmodeverify-fullsslrootcert/path/to/certificate.pem把/path/to/certificate.pem替换成你从提供商处下载的证书的完整路径即可。几点值得注意的细节sslmodeverify-full表示客户端不仅要求加密连接还会校验服务端证书的 CA 签名与主机名是防中间人攻击最彻底的档位较低档位如require只加密不验签安全性不足。如果你使用的是官方 Docker 镜像且目标是 AWS RDS / Azure可以直接把sslrootcert指向镜像内预置的路径例如/app/certs/rds-combined-ca-bundle.pem或/app/certs/DigiCertGlobalRootG2.crt.pem。由于 Docker 镜像构建时已通过keytool将 AWS / Azure 证书导入了 Java 信任库见 Dockerfile某些场景下即使不显式给出sslrootcertJDBC 驱动也可能完成校验但显式指定仍然是更明确、可审计的做法。使用环境变量保护应用数据库连接自托管场景下Metabase 的应用数据库连接也可以启用 SSL。官方文档指出这需要通过环境变量来完成详见 环境变量文档。要使用的环境变量是MB_DB_CONNECTION_URI。该变量类型为 string默认值为null其作用是以 JDBC 风格的连接 URI 替代大部分MB_DB_*系列变量如MB_DB_HOST、MB_DB_PORT等尤其适用于**需要携带特殊连接参数如证书参数**的场景。连接类型要求与MB_DB_TYPE一致。你需要在 URI 中写全数据库主机、端口、库名、用户信息并追加证书相关参数。官方给出的完整示例jdbc:postgresql://db.example.com:port/mydb?userdbuserpassworddbpasswordssltruesslmodeverify-fullsslrootcert/path/to/certificate.pem拆解这个连接串jdbc:postgresql://db.example.com:port/mydbJDBC 协议、主机、端口与数据库名userdbuserpassworddbpassword认证凭据ssltrue显式开启 SSLsslmodeverify-full强制证书完整校验sslrootcert/path/to/certificate.pem证书路径。需要提醒的是MB_DB_CONNECTION_URI的说明中还提到currentSchemaJDBC 参数不生效PostgreSQL 应用数据库的 schema 必须为public这是一个常见的坑点详见 环境变量文档。相关应用数据库 SSL 环境变量环境变量文档 中还记载了两个与 SSL 应用数据库直接相关的变量可作为补充MB_DB_AWS_IAMboolean默认false自 v0.58.0为 true 时使用 AWS IAM 认证应用数据库PostgreSQL 或 MySQL/MariaDB on AWS RDS / Aurora文档特别注明MySQL/MariaDB 场景下必须同时设置MB_DB_SSL_CERT或在MB_DB_CONNECTION_URI中携带 SSL 参数——因为该场景强制要求 SSL。MB_DB_SSL_CERTstring默认null自 v0.58.0用于应用数据库的 SSL 配置配合MB_DB_AWS_IAM在 MySQL/MariaDB 上使用。双向认证mutual authentication文档明确指出MB_DB_CONNECTION_URI中既可以提供sslrootcert验证服务端也可以同时提供客户端证书相关的参数两者同时配置即可支撑双向认证场景服务端也验证客户端。Truststores 与 Keystores客户端证书与双向认证部分数据库如 PostgreSQL、Oracle支持通过truststore与keystore来加固连接。两者的职责方向正好相反Truststore信任库如果提供了 truststore 用于校验凭据那么客户端你的 Metabase可以认证服务端数据库确认数据库的身份符合预期。这对应单向 TLS只验证服务器证书阻止伪造服务器的中间人攻击。它本质上就是「信任哪些 CA」的证书集合——上文sslrootcert指向的根证书即可视为一种 truststore 式的信任来源。Keystore密钥库如果使用 keystore 来提供凭据那么服务端数据库服务器可以要求客户端你的 Metabase用该 keystore 自证身份。这对应双向 TLSmutual TLS客户端也需出示证书数据库才会放行连接。Keystore 的使用频率较低且并非所有数据库都允许——例如 Amazon RDS 就明确禁止使用 keystore。但对于自建机房on prem的数据库如果需要强制客户端认证keystore 就是正确的工具。与前端表单的对应关系仓库前端组件 DatabaseSslKeyDescription.tsx 印证了上述能力在 UI 层的落点当数据库引擎为postgres时Metabase 会在连接表单中提供 SSL 客户端密钥SSL client key相关配置并提示「如果你持有 PEM 格式的 SSL 客户端密钥可以用 OpenSSL 将其转换为 PKCS-8/DER 格式」。也就是说服务端证书校验truststore 方向由连接串中的sslmodesslrootcert或上传的根证书完成客户端证书keystore 方向在 Metabase Cloud / 管理界面中通过SSL Client Certificate文件上传完成且 PEM 密钥需先转成 PKCS-8/DER 格式。这两条路径合在一起即可实现 PostgreSQL 等数据库的完整双向 TLS。配置自查清单完成配置后建议按以下清单逐项核对目标数据库支持 JDBC 连接前置条件根证书已就位自托管放在metabase.jar同目录Docker 场景可直接用/app/certs/内置证书Cloud 场景已上传至SSL Client Certificate数据库连接表单已勾选Use a secure connection (SSL)连接串附加参数已填写sslmodeverify-fullsslrootcert/path/to/certificate.pem路径为服务器上的完整绝对路径应用数据库场景已配置MB_DB_CONNECTION_URI完整 JDBC URI含ssltrue与证书参数或按需使用MB_DB_AWS_IAMMB_DB_SSL_CERT双向认证场景服务端验证用sslrootcert客户端自证用上传的 SSL 客户端证书PKCS-8/DER 格式连接测试通过后再同步检查 Metabase 后台日志确认 SSL 握手成功。相关仓库资源官方文档原文docs/databases/ssl-certificates.md数据库连接向导文档docs/databases/connecting.md环境变量完整参考含MB_DB_CONNECTION_URI/MB_DB_AWS_IAM/MB_DB_SSL_CERTdocs/configuring-metabase/environment-variables.md官方 Docker 镜像中的证书固化实现Dockerfile、bin/docker/Dockerfile_ubuntu仓库内置的 Azure 根证书bin/docker/DigiCertGlobalRootG2.crt.pem前端 SSL 客户端证书提示组件DatabaseSslKeyDescription.tsx【免费下载链接】metabaseThe easy-to-use open source Business Intelligence and Embedded Analytics tool that lets everyone work with data :bar_chart:项目地址: https://gitcode.com/GitHub_Trending/me/metabase创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考