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



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

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

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

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

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

CCD_ 1。我重新订购了服务器,这次使用了更多的参数来启动已启用的身份验证:--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异常。缺少这些步骤意味着安装不完整且不安全。

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

单词";"连接";被人们用来指代多个独立的操作和过程,当对其中任何一个进行故障排除时,您需要非常清楚您正在查看/询问的内容:

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

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

当TLS被启用;不安全TLS";否则,服务器将在套接字连接过程中验证客户端的TLS证书(客户端将验证服务器的)。要验证的证书必须由配置验证器的CA签名。在这一点上,如果您设法将服务器证书附带的私钥(通常不应该发生这种情况)提供给客户端,那么没有任何东西可以阻止客户端向服务器提供服务器证书。服务器会在日志中对此情况发出警告。请注意,尚未进行身份验证。

如果您使用的是X.509身份验证(必须在客户端进行配置,并且与提供用于套接字连接的证书是分开的,例如使用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"}]});0 URI选项),则在成功的套接字连接和任何相关的证书验证之后,驱动程序将执行身份验证。此时,您需要创建与证书上的可分辨名称相匹配的服务器用户。

MongoDB提供了设置TLS连接和X.509身份验证的指南,仔细阅读并按照编写的方式进行操作,并验证每一步。

相关内容

最新更新