# MongoDB 安装与配置

Ubuntu 20.04 安装 MongoDB 4.4 并配置用户和开启远程访问

# 安装

提示

可以设置代理以加快下载速度

导入 GPG 秘钥

wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -

添加 apt 源

echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list

更新并安装

sudo apt-get update
sudo apt-get install -y mongodb-org

启动和添加开启自启

systemctl start mongod
systemctl enable mongod

# 设置用户

进入 MongoDB 控制台,默认操作 test 数据库

mongo

注意

此时执行 show dbs 可能不会出现 admin 数据库,因为 MongoDB 数据库必须存在一个集合时才会显示;不影响下面操作

# 创建管理员账户

切换至 admin 数据库

use admin

创建 root 用户

db.createUser(
    {
		user: "root",
		pwd: "abcd1234",
		roles: [ "root" ]
    }
)

提示

对于 root 身份,MongoDB 不强制用户名必须为 root;MongoDB 以 roles 来区分用户权限

  • user 用户名
  • pwd 用户密码
  • roles 该账户所拥有的权限

提示

MongoDB 的用户分别存在于其对应的数据库中,但高级权限的用户仅能存放在 admin 数据库中

提示

操作时需要解锁当前用户所在的数据库;root 存在于 admin 数据库中,因此需要解锁 admin 数据库

解锁当前数据库的访问权限

db.auth("root", "abcd1234")

# 创建普通用户

假设下面需要为 hello 数据库创建用户 hello

切换至 hello 数据库(即使不存在)

use hello

创建用户

db.createUser(
	{ 
		user: "hello", 
		pwd: "abcd1234", 
		roles: [ "readWrite", "dbAdmin"]
	}
)

查看所有用户

> db.getUsers()
[
        {
                "_id" : "hello.hello",
                "userId" : UUID("968ea50a-809b-4f28-8919-2b828ba561c1"),
                "user" : "hello",
                "db" : "hello",
                "roles" : [
                        {
                                "role" : "readWrite",
                                "db" : "hello"
                        },
                        {
                                "role" : "dbAdmin",
                                "db" : "hello"
                        }
                ],
                "mechanisms" : [
                        "SCRAM-SHA-1",
                        "SCRAM-SHA-256"
                ]
        }
]

提示

此时仅列出当前数据库 hello 中所存在的用户;root 用户在 admin 数据库中所以这里不会显示;这里不需要授权是因为当前用户 root 拥有可以给其他数据库创建用户的权限

# 角色

MongoDB 中的 roles 包含该用户的一系列权限,其中各个权限是独立的;以下为常用的权限:

  • Read:允许用户指定数据库
  • readWrite:允许用户读写指定数据库
  • dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问 system.profile
  • userAdmin:允许用户向 system.users 集合写入,可以找指定数据库里创建、删除和管理用户

仅能保存在 admin 数据库中的权限

  • clusterAdmin:赋予用户所有分片和复制集相关函数的管理权限
  • readAnyDatabase:赋予用户所有数据库的读权限
  • readWriteAnyDatabase:赋予用户所有数据库的读写权限
  • userAdminAnyDatabase:赋予用户所有数据库的 userAdmin 权限
  • dbAdminAnyDatabase:赋予用户所有数据库的 dbAdmin 权限

特殊权限

  • root:包含所有权限

# 远程访问

编辑配置文件

sudo vi /etc/mongod.conf

bindIp 更改为 0.0.0.0;取消 security 注释并添加 authorization: enabled

# mongod.conf

# for documentation of all options, see:
#   http://docs.mongodb.org/manual/reference/configuration-options/

# Where and how to store data.
storage:
  dbPath: /var/lib/mongodb
  journal:
    enabled: false
#  engine:
#  mmapv1:
#  wiredTiger:

# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log

# network interfaces
net:
  port: 27017
  bindIp: 0.0.0.0


# how the process runs
processManagement:
  timeZoneInfo: /usr/share/zoneinfo

# 注意此处
security:
  authorization: enabled

#operationProfiling:

#replication:

#sharding:

## Enterprise-Only Options:

#auditLog:

#snmp:

重启 mongod 进程

注意

升级 MongoDB 版本后 MongoDB 不会使用旧的配置文件

systemctl restart mongod

# 卸载

停止 mongod 进程

sudo systemctl stop mongod

删除安装程序

sudo apt-get purge mongodb-org*

删除日志和数据库目录

sudo rm -r /var/log/mongodb
sudo rm -r /var/lib/mongodb