无法通过身份验证连接到 MongoDB 服务器

问题描述 投票:0回答:1

我们正在尝试在 Ubuntu 服务器上安装和配置 MongoDB(版本 7.0)。我们使用this文档作为我们的指南。这是我们从命令行一步步完成的(在 Ubuntu 机器上安装 MongoDB 服务器之后):

1 – 连接到其中一台主机并使用以下命令生成新的私钥 openssl:

openssl genrsa -out mongoCA.key -aes256 8192

2 – 签署新的 CA 证书:

openssl req -x509 -new -extensions v3_ca -key mongoCA.key -days 365 -out mongoCA.crt

3 – 为所有节点颁发自签名证书

openssl req -new -nodes -newkey rsa:4096 -keyout mongossl1.key -out mongossl1.csr

openssl x509 -CA mongoCA.crt -CAkey mongoCA.key -CAcreateserial -req -days 365 -in mongossl1.csr -out mongossl1.crt

cat mongossl1.key mongossl1.crt > psmdb1.pem

这是 Ubuntu 主机上的 MongoDB 配置:

net:   
  ssl:
    mode: requireSSL
    PEMKeyFile: /etc/mongodb/ssl/psmdb1.pem
    CAFile: /etc/mongodb/ssl/mongoCA.crt 
security:  
  authorization: enabled  
  clusterAuthMode: x509

然后我们在 Ubuntu 主机上重新启动 MongoDB 服务器。

然后我们在 Ubuntu 主机(即刚刚配置并重新启动 MongoDB 的主机)上启动 mongo-shell (

mongosh
),它能够正常连接到该 MongoDB 实例。

但是,当尝试从 mongo shell 外部连接时,无论是在同一 Ubuntu 主机中,还是在其他虚拟机中,通过 PyMongo 甚至 Compass 等客户端,我们都会收到错误。

mongo --tls --tlsCAFile /etc/ssl/new/mongoCA.crt --tlsCertificateKeyFile /etc/ssl/new/psmdb1.pem --authenticationMechanism MONGODB-X509 --authenticationDatabase '$external' --host <our Ubuntu host public IP address> --port 27017

知道如何解决这个问题吗?

mongodb pymongo x509certificate mongo-shell
1个回答
1
投票

你混淆了几个话题。

security.clusterAuthMode: x509
用于分片集群和/或副本集中的内部成员身份验证。看起来,您使用的是 MongoDB 独立实例,因此它不适用。

在 MongoDB 中,您可以使用 server 证书来加密连接。服务器证书还用于保证您连接到正确的服务器。

客户端可以使用用户名/密码或client证书进行身份验证。

原则上可以为所有人使用一个证书,但这没有多大意义。最好创建两个证书,一个用于服务器,一个用于客户端。您还必须创建 x.509 用户。查看 使用 x.509 证书对客户端进行身份验证MongoDB 中的安全性如何工作(使用 x.509 证书) 以获得一般概述。

更新

根据您的评论,您的配置文件几乎是正确的。

正如已经提到的

security.clusterAuthMode
与独立 MongoDB 无关,您可以跳过它。您应该使用
tls
选项而不是已弃用的
ssl
选项:

net:
  tls:
    mode: requireTLS
    certificateKeyFile: /etc/mongodb/ssl/psmdb1.pem
    CAFile: /etc/mongodb/ssl/mongoCA.crt
security:  
  authorization: enabled  

当你连接到 MongoDB 时,你必须使用这些参数

mongosh --tls --tlsCAFile /etc/ssl/new/mongoCA.crt --tlsCertificateKeyFile /etc/ssl/new/psmdb1.pem --authenticationDatabase 'admin' --user 'username' --password 'secret' --host <our Ubuntu host public IP address> --port 27017

旧版 mongo shell

mongo
已在 MongoDB 版本 6.0 中删除。 27017 端口是默认端口,可以跳过。

选项

--authenticationMechanism MONGODB-X509 --authenticationDatabase '$external'
当您想使用 x.509 证书对客户端进行身份验证时使用 - 您并不要求这样做。

读/写权限是在 createUser 命令中定义的授予角色。例如,您可以使用参数

authenticationRestrictions
限制 IP 范围

use admin
db.runCommand(
   {
     createUser: "api",
     pwd: "secret"
     roles: [
       { role: "dbOwner", db: "application" }
     ],
     authenticationRestrictions: [
        { clientSource: [ "10.20.30.0/24" ]
     ]
   }
)

正如我已经提到的,我建议创建专用的客户端和服务器证书,请参阅extendedKeyUsage

© www.soinside.com 2019 - 2024. All rights reserved.