对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
Docs 菜单

从搜索到 MongoDB 的安全连接

此页面介绍了mongot 开启到 mongod(或mongos )的连接,以供应数据并读取复制状态,适用于使用 MongoDB Controllers for Kubernetes 操作符 管理的 MongoDB Search 和向量搜索部署。在此连接上,mongot 是客户端,mongod 是服务器。此页面介绍了 mongot 如何向 mongod 进行身份验证(SCRAM 或 X.509)、其身份所需的角色,以及 mongot 如何通过 TLS 信任 mongod 服务器证书。

应用程序用户从不直接连接到 mongot。对于相反方向(即 mongodmongot 监听服务器开启的连接),请参阅 保护 MongoDB 到搜索的连接。

有关此页上引用的每个 MongoDBSearch 设置的完整模式,请参阅 MongoDB Search 和向量搜索设置。

mongot 连接到 mongod 时,它会使用两种互斥模式之一作为数据库客户端进行身份验证:

模式
凭证
使用时

SCRAM

用户名和密码

您的 mongod 部署已经使用 SCRAM。当 Kubernetes 操作符还托管您的 MongoDBMongoDBCommunity 资源时,SCRAM 是默认设置。要在不更改身份验证机制的情况下添加网络层安全性,可将 SCRAM 与 TLS 证书结合使用。

x.509

客户端证书

您的组织会从 PKI 预配用于集群服务的证书,或合规要求更倾向使用基于证书的身份验证而不是密码。

您可以通过更新 MongoDBSearch 资源并让 Kubernetes 操作符重新启动 mongot 节点来实现事后切换模式。如果 mongot 身份持有下一节中描述的必要角色,则不需要更改 mongod 侧身份。

注意

从 SCRAM 切换到 X.509 要求同步源上启用 TLS。当源 mongod 未运行 TLS 时,Kubernetes 操作符将拒绝 X.509。首次启用搜索 TLS 时,会出现短暂但实际存在的查询服务中断,而非无缝重启。进行此切换时,请计划一段短暂的停机时间。有关割接行为,请参见 Secure the Connection from MongoDB to Search

无论 mongot 使用何种模式,其身份验证必须具有在 mongod 上源数据和维护搜索目录的权限。该身份必须拥有内置 searchCoordinator 角色,该角色随 MongoDB Server 8.2 及更高版本提供,并仅授予 mongot 所需的权限。

您始终自己创建此身份;MongoDBSearch 控制器从不会为您创建此身份。创建方式取决于 Kubernetes Operator 是否管理源 mongod

  • 操作符托管的源。声明持有 searchCoordinator 角色的用户,并在 Community 的 MongoDBCommunity 资源的 users 列表中引用密码 Secret,或将其作为 Enterprise 的单独 MongoDBUser 资源。Kubernetes 操作符将为您在 mongod 上预配该用户。然后,您在 MongoDBSearch 资源上引用相同的用户和 Secret,以便 mongot 可以与其进行身份验证。

  • 外部来源。直接在自己的 mongod 部署上创建用户并授予其 searchCoordinator 角色,然后在 MongoDBSearch 资源上引用其凭证,如下所示。

本页的其余部分展示了如何在 MongoDBSearch 资源上配置每种身份验证模式,以及如何通过 TLS 信任 mongod 服务器证书。

提供一个 Kubernetes Secret,其中包含 mongot 应用于向 mongod 进行身份验证的密码。通过 spec.source.passwordSecretRef 参考 MongoDBSearch 资源上的秘钥,并通过 spec.source.username 设置用户名。

spec:
source:
username: search-sync-source
passwordSecretRef:
name: my-mongot-password

引用的 Secret 必须在名为 password 的密钥下包含密码。如果将密码存储在不同的密钥下,则通过 spec.source.passwordSecretRef.key 覆盖密钥。

spec.source.username 标识的用户必须已存在于 mongod,并且必须拥有 searchCoordinator 角色。如果省略 spec.source.username,Kubernetes Operator 会将用户名视为 search-sync-source

要在 SCRAM 之上添加网络层 mTLS,请提供包含客户端证书和私钥的 Kubernetes Secret,并通过 spec.source.tls.clientCertificateSecretRef 引用它。Secret 必须包含 tls.crttls.key。Kubernetes 操作符 在 TLS 握手期间呈现此证书,同时仍通过用户名和密码进行身份验证。

spec:
source:
username: search-sync-source
passwordSecretRef:
name: my-mongot-password
tls:
clientCertificateSecretRef:
name: my-mongot-client-cert

如果客户端私钥已加密,请在单独的 Secret 中提供密码,并通过 spec.source.tls.keyFilePasswordSecretRef 引用密码。Secret 必须在 keyFilePassword 键处包含密码。

X.509 身份验证通过客户端证书而不是用户名和密码来向 mongod 识别 mongot。证书上的主题标识名 (DN) 成为 mongodmongot 的身份。

注意

spec.source.x509spec.source.usernamespec.source.passwordSecretRef 互斥。如果同时设置这两个,Kubernetes 操作符将拒绝 MongoDBSearch 资源。

提供一个 Kubernetes Secret,其中包含客户端证书和私钥,分别位于 tls.crttls.key 密钥下,并通过 spec.source.x509.clientCertificateSecretRefMongoDBSearch 资源上引用它:

spec:
source:
x509:
clientCertificateSecretRef:
name: my-mongot-x509-cert

如果客户端私钥已加密,请在 keyFilePassword 键下的单独 Secret 中提供密语,并通过 spec.source.x509.keyFilePasswordSecretRef 引用它:

spec:
source:
x509:
clientCertificateSecretRef:
name: my-mongot-x509-cert
keyFilePasswordSecretRef:
name: my-mongot-key-password

仅客户端证书不授予访问权限:mongod 必须将其主题标识名识别为授权身份。创建上述证书秘密后,如下所述,在 mongod 上授权该证书的主题标识名。

mongod 侧,在 $external 数据库中创建一个用户,其名称与上面预配的客户端证书上的主题标识名匹配,并将 searchCoordinator 角色授予该用户。mongod 使用 $external 数据库来追踪通过 X.509 等外部机制进行身份验证的身份。要在 Kubernetes 操作符管理的部署上创建 X.509 用户,请参阅 使用 X.509 保护客户端身份验证。

您还必须在 mongod 部署上启用 TLS,并将其配置为信任签署 mongot 客户端证书的证书颁发机构 (CA)。您需要在 mongod 部署本身上通过 MongoDBMongoDBCommunity 资源进行此配置,而不是通过 MongoDBSearch 资源。要对托管的 mongod 部署启用 TLS,请参阅 安全的单集群客户端连接 (TLS/SSL)。

上述设置建立 mongot 的身份。独立地,当源 mongod 使用 TLS 时,mongot 必须信任 mongodmongot 连接到它时提供的证书。mongot 是此连接上的 TLS 客户端;mongod 提供其服务器证书,mongot 会使用您提供的 CA 对该证书进行验证。

当源 mongod 位于 Kubernetes 操作符外部(即通过 spec.source.external 声明)时,请提供签发 mongod 服务器证书的 CA:

spec:
source:
external:
hostAndPorts:
- mongod-0.example.com:27017
tls:
ca:
name: my-external-mongod-ca

spec.source.external.tls.ca.name 字段引用一个 Kubernetes ConfigMap,其中包含 ca.crt 键下的 CA 证书。CA 必须是颁发 mongod 服务器证书的 CA。

当源 mongod 由 Kubernetes 操作符(通过 spec.source.mongodbResourceRef)托管时,Kubernetes 操作符会为您处理此 CA 信任,并且 spec.source.external.tls.ca.name 字段不适用。

mongot 在进程启动时读取其客户端证书。要轮换证书,请更新 spec.source.x509.clientCertificateSecretRef 引用的 Secret (对于 X.509)或 spec.source.tls.clientCertificateSecretRef (对于在 SCRAM 之上的 mTLS)在 MongoDBSearch 资源上。Kubernetes 操作符 会检测到更改,并自动重启 mongot 节点以加载新的证书材料。对于 spec.source.passwordSecretRef 引用的 SCRAM 密码 Secret,也适用同样的操作。

要在 MCK 下轮换 X.509 客户端证书:

1

颁发与要替换的证书具有相同主题标识名的新客户端证书,以便您在 mongod 上创建的 $external 用户无需更改。MongoDB 建议有效期至少为 30 天,因为较短的有效期会增加轮换频率。

2

使用新的 tls.crttls.key 值更新 spec.source.x509.clientCertificateSecretRef 引用的 Secret。如果私钥已加密,还请使用 keyFilePassword 密钥处的新密语更新 spec.source.x509.keyFilePasswordSecretRef 引用的 Secret。Kubernetes 操作符检测到变更并自动重启 mongot 节点。

3

所有 Pod 成功重启后,请在 PKI 中撤销旧证书。如果替换证书使用的主体标识名相同,则无需更改 mongod 上的对应 $external 用户。仅在您还想完全停用该 X.509 身份时才删除 $external 用户。

无法通过 MongoDBSearch CRD 配置自动轮换。更新 spec.source.x509.clientCertificateSecretRef 引用的 Secret 以 trigger 轮换;Kubernetes 操作符 会自动重启节点。