作者介绍:简历上没有一个精通的运维工程师,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。

数据库是一个系统(应用)最重要的资产之一,所以我们的数据库将从以下几个数据库来进行介绍。
MySQL
PostgreSQL
Redis
Etcd
上个小节我们介绍了MongoDB的的用户角色及权限,本小节就介绍如何开启认证,并配置一个真实需求:1.一个普通用户有某个特定库库的增删查改权限,2.一个只读用户只能访问某特定库,3.自定义角色权限。
一.配置超级管理员
1.创建超级管理员
test> use admin
switched to db admin
admin> db.createUser({
... user: "superuser",
... pwd: "your_secure_password",
... roles: [ { role: "root", db: "admin" } ]
... })
{ ok: 1 }
admin> 这里创建了一个用户名为"superuser",密码为"your_secure_password"的用户,并赋予了root角色。root角色是超级用户角色,拥有所有数据库的全部权限。先创建超级管理员,再启用认证。
2.启用认证
vi /etc/mongod.conf
security:
authorization: enabled3.重启服务
systemctl restart mongod4.检查认证是否生效
即便启用了认证,我们也可以直接使用mongosh以无认证进入数据库,但是操作权限受限。
test> use admin
switched to db admin
admin> db.getUsers()
MongoServerError[Unauthorized]: Command usersInfo requires authentication
admin> 5.启用认证
当我们以mongosh连接到数据库以后,再启用认证(类似Redis-cli认证)。
admin> db.auth("superuser", "your_secure_password")
{ ok: 1 }
admin> db.getUsers()
{
users: [
{
_id: 'admin.superuser',
userId: UUID('1f2c6f8f-407c-4b5c-b036-d54af744f729'),
user: 'superuser',
db: 'admin',
roles: [ { role: 'root', db: 'admin' } ],
mechanisms: [ 'SCRAM-SHA-1', 'SCRAM-SHA-256' ]
}
],
ok: 1
}
admin>
6.登录及认证
在mongosh连接的时候指定账号及密码及数据库。
mongosh -u "superuser" \
-p "your_secure_password" \
--authenticationDatabase admin二.配置特定用户
为这个特定库:abcd,创建2个账号,一个拥有增删改查,一个拥有只读权限。
admin> show dbs
abcd 40.00 KiB
admin 132.00 KiB
config 108.00 KiB
local 72.00 KiB
test 40.00 KiB1.创建增删改查账号
admin> use admin
already on db admin
admin> db.createUser({
... user: "abcd_rw",
... pwd: "password",
... roles: [ { role: "readWrite", db: "abcd" } ]
... })
{ ok: 1 }
admin> 2.创建只读账号
use admin
db.createUser({
user: "abcd_ro", // 只读账号用户名
pwd: "ROpassword456!", // 只读账号密码
roles: [
{ role: "read", db: "abcd" } // 授予 myapp 数据库的只读权限
]
})3.测试只读权限
这里的可选的role,就是我们上个小节提到的哪些角色,后面的库还可以更精细到集合。
mongosh -u "abcd_ro" \
-p 'ROpassword456!' \
--authenticationDatabase admin注意:我们创建的账号的时候,在哪个库里面创建账号,则认证的时候就必须使用对应的库,才能认证成功(这里和对应的权限无关)。
比如我们在admin库创建的用户:abcd_ro就认证的时候就必须使用admin库才能认证成功。
三.创建自定义角色
use myapp
// 创建自定义角色
db.createRole({
role: "customReadWrite",
privileges: [
{
resource: { db: "myapp", collection: "users" }, // 只针对 users 集合
actions: [ "find", "insert", "update", "remove" ]
},
{
resource: { db: "myapp", collection: "orders" }, // 只针对 orders 集合
actions: [ "find", "insert", "update", "remove" ]
}
],
roles: []
})
// 创建使用自定义角色的用户
db.createUser({
user: "limited_rw",
pwd: "LimitedPass123!",
roles: [ { role: "customReadWrite", db: "myapp" } ]
})