Contents

在Linux上让MongoDB收听远程连接

1. 概述

在本教程中,我们将学习连接到在远程机器上运行的MongoDB 。MongoDB 的默认配置仅允许来自安装它的同一服务器的连接。通过对默认配置进行一些更改,可以远程管理 MongoDB 或连接到单独的应用程序服务器。

首先,我们将使用docker容器安装 MongoDB,然后将 MongoDB 安装配置为从受信任的远程计算机安全访问。重要的是,当我们启用远程连接时,我们还需要通过为数据库创建管理用户帐户来保护 MongoDB 安装。

让我们看看 MongoDB 服务器的远程连接。

2. 使用 Docker 安装 MongoDB

要在 MongoDB 中设置远程连接,我们首先需要安装 MongoDB。在 Linux 机器上设置 MongoDB 的最简单方法是使用docker容器。为 MongoDB 使用docker的好处之一是容器化数据库在多个环境中保持一致,从而实现更快的开发设置。

拉取最新Mongo Docker 镜像 的命令:

$ sudo docker pull mongo
Using default tag: latest
latest: Pulling from library/mongo
Digest: sha256:ad947856db716ddd0b9cc525e341c77208ed8dafcb4a6ad23f9b3addd7a4f71c
Status: Image is up to date for mongo:latest
docker.io/library/mongo:latest

在这里,在上面的命令中,我们拉取了 Docker 镜像,现在为了说明,让我们使用它运行一个容器:

$ docker run -itd --name mongodb mongo
fda9c14e96a2e35e3daf89b5772d2fb2205c2679a1dc0c4a831c32690d40391c

我们将使用容器名称“ mongodb ”启动容器。

3. 创建管理用户

在我们继续为 MongoDB 打开远程连接之前,我们首先需要在 MongoDB 中启用身份验证。但是,默认配置中禁用身份验证,这意味着任何有权访问包含 MongoDB 的服务器的用户都可以完全访问所有数据库。为了保护数据库,我们将创建一个管理用户并启用身份验证以使用该管理用户安全地连接到数据库。

我们首先需要使用以下命令进入 shell 来创建管理用户:

$ mongo

要启用身份验证,我们需要使用数据库admin

use admin

在这里,我们将使用 admin 数据库的createUser方法。使用它,我们可以为单个用户分配多个角色。分配给管理员用户的角色授予他们创建和修改用户以及读取和写入任何数据库所需的所有权限。

createUser方法需要用户的用户名和密码以及我们希望用户拥有的任何角色。在这里,我们需要创建一个包含与用户凭据和角色相关的所有详细信息的文档。

为了演示,让我们调用createUser方法将角色分配给管理员用户:

db.createUser(
{
    user: "blogdemo",
    pwd: "blogdemo",
    roles: [
        { 
            role: "userAdminAnyDatabase", db: "admin" 
        },
        { 
            role: "readWriteAnyDatabase", db: "admin" 
        },
        {
            role: "dbAdminAnyDatabase",   db: "admin"
        }
    ]
});

在这种情况下,上述命令的输出将是:

Successfully added user: 
{
    "user" : "blogdemo", 
    "roles" : [
        {
            "role" : "userAdminAnyDatabase",
	    "db" : "admin"
        },
	{
	    "role" : "readWriteAnyDatabase",
	    "db" : "admin"
	},
        { 
             "role" : "dbAdminAnyDatabase",
	     "db" : "admin"
	}
    ]
}

在上述命令中,我们使用密码“ blogdemo ”创建了一个用户blogdemo ,并为该用户提供了完全访问权限。passwordPrompt也可用于在终端上提示密码,而不是在 JSON 中提供密码:

db.createUser(
{
    user: "blogdemo",
    pwd: passwordPrompt(),
    roles: [
        { 
            role: "userAdminAnyDatabase", db: "admin" 
        },
        { 
            role: "readWriteAnyDatabase", db: "admin" 
        },
        {
            role: "dbAdminAnyDatabase",   db: "admin"
        }
    ]
});

需要注意的一个关键点是,我们还需要重新启动 MongoDB守护进程。否则,更改将不会反映。

4.启用MongoDB身份验证

现在,我们的管理员已设置完毕,并且已创建特定于数据库的用户。接下来,我们必须启用 MongoDB 才能开始使用这些访问控制。具体来说,这里我们需要更新mongod.conf文件的配置:

$ sudo vi /etc/mongod.conf

mongod.conf文件中,我们要先对operationProfiling进行注释 ,然后在 security 下启用authorization

#operationProfiling:
security:
  authorization: enabled

最后,MongoDB 使用我们在上一步中创建的角色来执行数据库访问控制,以重新启动服务器。

5. 配置公共绑定IP

到目前为止,我们使用docker安装了 MongoDB并启用了 mongo auth 配置。默认情况下,MongoDB 只接受来自 localhost 的连接。因此,我们需要允许远程连接。mongod.conf  文件中,我们需要转到网络接口部分并将bindIp更改为 0.0.0.0,这意味着允许来自任何 IP 地址的连接:

# network interfaces
net:
  port: 27017
  bindIp: 0.0.0.0

此外,我们必须重新启动 MongoDB 守护程序才能看到更改。

6. 远程连接

现在我们已经将 MongoDB 配置为在其可公开路由的 IP 地址上侦听远程连接。在这里我们可以测试远程机器是否能够连接。为了演示,让我们查看连接远程 MongoDB 的命令:

$ mongo mongodb://blogdemo:blogdemo@10.5.7.18:27017/admin

使用上述命令,我们可以通过身份验证访问 MongoDB。