繁体   English   中英

MongoDB 服务器接受服务器证书作为客户端证书

[英]MongoDB Server accepting server certificate as client certificate

我似乎对 MongoDB 中的 x509 证书身份验证有点困惑。

TLDR :我创建了服务器和客户端证书(由相同的 CA 签名,但 CN 和 OU 不同),使用主题名称作为用户名在 MongoDB 中创建了一个用户,并使用 c# 客户端 + 客户端证书成功连接。 使用 MongoDB Compass,我能够使用服务器证书作为客户端证书连接到服务器并从中读取数据。 为什么我可以使用错误的证书进行身份验证? 是否无法基于每个证书来控制权限?

扩展:我使用 OpenSSL 创建了一个自签名根 CA,它签署了另一个证书,即我的签名 CA。 使用这个 Signing-CA 我创建了另外两个证书:

  • 服务器证书 (CN=Server1,OU=Servers,O=project,ST=SH,C=DE)
  • 客户端证书(CN=Client1,OU=Clients,O=project,ST=SH,C=DE)

有了这些证书,我在没有身份验证的情况下启动了 MongoDB 实例,启动了 replicaSet 并使用以下命令为证书创建了一个用户:

db.getSiblingDB("$external").runCommand({createUser: "CN=Client1,OU=Clients,O=project,ST=SH,C=DE",roles: [{role: "readWrite", db: "admin"}, {role: "userAdminAnyDatabase", db: "admin"}, {role: "clusterAdmin", db: "admin"}, {role: "root", db: "admin"}]}); . 我重新启动了服务器,这次使用更多参数来启用身份验证: --replSet *replicaSetName* --port *port* --dbpath *path* --logpath *path* --tlsMode requireTLS --clusterAuthMode x509 --tlsCAFile *path* --tlsCertificateKeyFile *path* --tlsClusterFile *path* --auth

我能够使用 C# 客户端毫无问题地进行连接,MongoDB Compass 也能正常工作。 但是当我测试其他证书来验证安全性时,我注意到使用 MongoDB 指南针使用服务器证书和密钥文件连接到服务器是绝对可能的。 我不仅可以连接,还可以浏览和修改数据。

我的印象是每个客户端证书都必须在 $external 数据库中有一个关联的帐户,因此只有我分配/授予此特定用户帐户的权限/角色。

这种行为应该发生吗? 是否可以为每个客户端证书创建一个用户帐户并在不同的数据库上授予不同的权限?

感谢您的关注和解答,祝您生活愉快!

这取决于您如何配置 mongod 进程。 假设您有 mongod 的配置文件(默认路径是 /etc/mongod.conf),您将查看是否有net.tlssecurity.clusterAuthMode设置。

具有以下设置的示例配置文件:

storage:
  dbPath: /data/db
  journal:
    enabled: true
systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log
net:
  port: 27017
  bindIp: 0.0.0.0
  tls:
    mode: requireTLS
    certificateKeyFile: /etc/ssl/node1.pem
    CAFile: /etc/ssl/ca.crt
    clusterFile: /etc/ssl/node1.pem
processManagement:
  fork: true
  pidFilePath: /var/run/mongodb/mongod.pid
  timeZoneInfo: /usr/share/zoneinfo
security:
  authorization: enabled
  clusterAuthMode: x509
replication:
  replSetName: replset

其他事情

最近 MongoDB 从SSL切换到TLS因此根据您使用的版本,您可能会发现SSL而不是TLS

此外,您可能正在使用副本集,也可能没有。 如果使用副本集,您需要决定副本集成员如何向其他成员进行身份验证。 它应该使用密钥文件,还是应该使用 x509 以及普通数据库用户。

此外,您将需要至少创建一个命名的数据库用户。 如果连接的用户绑定到 localhost 并且不存在其他用户,则系统将允许对连接的用户进行 root 访问。 这称为localhost 异常 缺少这些步骤是不完整且不安全的安装。

套接字/TLS 连接和身份验证是高级连接建立过程中的独立步骤。

人们使用“连接”一词来指代多个单独的操作和流程,在对其中任何一个进行故障排除时,您需要非常清楚您正在查看/询问的是什么:

  1. 从驱动程序到服务器的套接字连接
  2. 驱动程序的身份验证(不会发生在仍然通过套接字连接过程的监视连接上)
  3. 客户端对象创建(严格来说根本不是连接,尽管很多人草率/错误地使用“连接”一词来指代创建客户端对象的操作——创建客户端对象本身不会将任何东西连接到任何地方)
  4. 执行操作(即使启用了身份验证的服务器也允许创建到它的套接字连接并在没有身份验证的情况下执行诸如ismaster命令之类的操作)

可能想询问 #2,但您测试了 #3 或 #4,正如您现在应该看到的,这不一定会给您预期的结果。

当启用 TLS 而“不安全 TLS”未启用时,服务器将在套接字连接过程中验证客户端的 TLS 证书(客户端将验证服务器的)。 被验证的证书必须由验证器配置的 CA 签名。 此时,如果您设法将与服务器证书一起的私钥(通常不应该发生)提供给客户端,则不会有任何阻止客户端向服务器提供服务器证书的情况。 服务器会在日志中警告这种情况。 请注意,尚未发生身份验证。

如果您使用 X.509 身份验证(必须在客户端配置并且与提供用于套接字连接的证书分开,例如使用authMechanism URI 选项),则在成功的套接字连接和任何相关的证书验证后,驱动程序将执行身份验证。 此时,您需要创建与证书上的专有名称匹配的服务器用户。

MongoDB 有关于设置 TLS 连接和 X.509 身份验证的指南,通读它们并完全按照所写的那样遵循它们并验证每一步。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM