mongo 4.4 访问控制启用

106 阅读2分钟
# mongo 4.4 访问控制启用

# 超级管理员

在启用访问控制前,你需要在admin库中创建一个拥有 userAdmin 或者 userAdminAnyDatabase角色的超级管理员 这个用户可以管理user和roles,比如创建用户,授权或撤销某个用户的角色,以及创建和修改自定义角色

# 启用访问控制步骤

1. 启动mongodb。不启用访问控制

```shell
mongod --port 27017 --dbpath /var/lib/mongodb
```

2. 连接实例

```shell
mongo --port 27017 
```

3. 创建管理员

```
use admin
db.createUser(
  {
    user: "myUserAdmin",
    pwd: passwordPrompt(), // 这里也可以直接写你要设置的密码
    roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
  }
)
```

创建用户所在数据库是用户的authentication database(认证数据库)。尽管用户将对此数据库进行身份验证,但该用户可以在其他数据库中拥有roles; 即用户的认证数据库不限制用户的权限

4. 重启实例,开启访问控制

```
a. 关闭mongo实例 db.adminCommand( { shutdown: 1 } )
b. 退出 mongo shell
c. mongod --auth --port 27017 --dbpath /var/lib/mongodb
    如果是你是用配置文件启动,你需要在配置文件中添加如下配置开启访问控制
    security:
        authorization: enabled
```

5. 使用管理员连接mongo实例 有两种连接方式

- 直接通过mongo 连接并携带凭证 mongo --port 27017 --authenticationDatabase "admin" -u "myUserAdmin" -p
- 先连接,然后在通过db.auth()方法认证

```
mongo --port 27017
# 切换到认证库
use admin
# 认证
db.auth(<username>, <pwd>)
```

6. 按需创建用户 一旦管理员创建成功。

就可以使用db.createUser()方法创建其他用户。你可以复制任意内置roles和用户自定义roles给创建的用户 举例如下:在test
数据库下创还能一个myTester用户。同时赋予对test库的readWrite角色和对reporting库的read角色

```
use test
db.createUser(
  {
    user: "myTester",
    pwd:  passwordPrompt(),   // or cleartext password
    roles: [ { role: "readWrite", db: "test" },
             { role: "read", db: "reporting" } ]
  }
)

```

7. 使用myTester用户登录

```shell
mongo --port 27017 -u "myTester" --authenticationDatabase "test" -p
```

8. 使用myTester插入文档

```
db.foo.insert( { x: 1, y: 1 } )
```

# 内置角色

## role种类
- Database User Roles
- Database Administration Roles
- Cluster Administration Roles
- Backup and Restoration Roles
- All-Database Roles
- Superuser Roles
- Internal Role

## 自托管mongo服务内置角色

- 每个数据库都包含Database user和Database administration角色
- 只有admin数据库包含所有角色

# 新库创建新用户的整体步骤

1. 需要超级管理员
2. 管理员登录

- db.auth方式

```shell
use admin
db.auth("root","xxx");
```

- 命令行方式

```shell
mongo  -u root -p xxx --authenticationDatabase admin 
```

3. use newDatabase
4. db.createUser() 赋予角色和对应的认证库
5. 退出,用新用户登录

# 参考文献

[Enable Access Control](https://www.mongodb.com/docs/v4.4/tutorial/enable-authentication/)

[Built-In Roles](https://www.mongodb.com/docs/v4.4/reference/built-in-roles/)