【发布时间】:2021-10-03 09:49:01
【问题描述】:
对于 MongoDB 中的 x509 证书身份验证,我似乎有点困惑。
TLDR: 我创建了服务器和客户端证书(由相同的 CA 签名,但 CN 和 OU 不同),在 MongoDB 中使用主题名称作为用户名创建了一个用户,并使用 c# 客户端 + 客户端证书成功连接。 使用 MongoDB Compass,我能够使用服务器证书作为客户端证书连接到服务器并从服务器读取数据。 为什么我能够使用错误的证书进行身份验证?是否无法根据每个证书控制权限?
扩展: 我使用 OpenSSL 创建了一个自签名根 CA,它签署了另一个证书,即我的 Signing-CA。 使用此签名 CA,我又创建了两个证书:
- 服务器证书(CN=Server1,OU=Servers,O=project,ST=SH,C=DE)
- 客户端证书(CN=Client1,OU=Clients,O=project,ST=SH,C=DE)
有了这些证书,我无需身份验证就启动了 MongoDB 实例,启动了副本集并使用以下命令为证书创建了一个用户:
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 数据库中有一个关联帐户,因此只有我分配/授予此特定用户帐户的权限/角色。
这种行为应该发生吗? 是否可以为每个客户证书创建一个用户帐户并对不同的数据库授予不同的权限?
感谢您的关注和回答,祝您有美好的一天!
【问题讨论】:
标签: mongodb security authentication ssl x509certificate