最新消息:20210917 已从crifan.com换到crifan.org

【已解决】给MongoDB数据库新建用户和权限

MongoDB crifan 3077浏览 0评论

折腾:

【已解决】阿里云ECS服务器中已有的MongoDB的用户名密码和端口

期间,去新建MongoDB的用户,加上权限访问控制。

API Documentation — PyMongo 3.6.1 documentation

Enable Auth — MongoDB Manual 3.6

Tutorial — PyMongo 3.6.1 documentation

然后去试试:

<code>&gt; use gridfs
switched to db gridfs
&gt; show collections
&gt; db.createUser({
... user: "uuu",
... pwd: "pwd",
... roles: [ { role: "readWrite", db: "gridfs"}]
... })
Successfully added user: {
        "user" : "uuu",
        "roles" : [
                {
                        "role" : "readWrite",
                        "db" : "gridfs"
                }
        ]
}
</code>

试试不加用户名和密码:

<code>➜  Homebrew git:(stable) mongo 47.96.131.109:27017/gridfs
MongoDB shell version v3.6.3
connecting to: mongodb://47.96.131.109:27017/gridfs
2018-04-02T10:13:05.543+0800 W NETWORK  [thread1] Failed to connect to 47.96.131.109:27017 after 5000ms milliseconds, giving up.
2018-04-02T10:13:05.547+0800 E QUERY    [thread1] Error: couldn't connect to server 47.96.131.109:27017, connection attempt failed :
connect@src/mongo/shell/mongo.js:251:13
@(connect):1:6
exception: connect failed
</code>

果然拒绝了。

但是加了用户名和密码,也是出错:

<code>➜  Homebrew git:(stable) mongo 47.96.131.109:27017/gridfs -u uuu -p pwd
MongoDB shell version v3.6.3
connecting to: mongodb://47.96.131.109:27017/gridfs
2018-04-02T10:14:14.507+0800 W NETWORK  [thread1] Failed to connect to 47.96.131.109:27017 after 5000ms milliseconds, giving up.
2018-04-02T10:14:14.512+0800 E QUERY    [thread1] Error: couldn't connect to server 47.96.131.109:27017, connection attempt failed :
connect@src/mongo/shell/mongo.js:251:13
@(connect):1:6
exception: connect failed
</code>

remote mongo Failed to connect to   after 5000ms milliseconds, giving up

MongoDB 完全新手教學 -5 對外開放問題[allow remote access] – KDZONE

ubuntu – Can’t connect to MongoDB remote server – Stack Overflow

<code>[root@naturling-general-01 ~]# netstat -tulpn | grep 27017
tcp        0      0 0.0.0.0:27017           0.0.0.0:*               LISTEN      2186/mongod         
[root@naturling-general-01 ~]# netstat --listen
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 0.0.0.0:27017           0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:ssh             0.0.0.0:*               LISTEN     
udp        0      0 naturling-general-0:ntp 0.0.0.0:*                          
udp        0      0 localhost:ntp           0.0.0.0:*                          
udp        0      0 0.0.0.0:ntp             0.0.0.0:*                          
udp6       0      0 [::]:ntp                [::]:*                             
Active UNIX domain sockets (only servers)
Proto RefCnt Flags       Type       State         I-Node   Path
unix  2      [ ACC ]     STREAM     LISTENING     8453     /run/systemd/journal/stdout
unix  2      [ ACC ]     STREAM     LISTENING     13975    /tmp/Aegis-&lt;Guid(5A2C30A2-A87D-490A-9281-6765EDAD7CBA)&gt;
unix  2      [ ACC ]     STREAM     LISTENING     10007    /var/run/dbus/system_bus_socket
unix  2      [ ACC ]     STREAM     LISTENING     8064     /run/systemd/private
unix  2      [ ACC ]     STREAM     LISTENING     13123    /tmp/mongodb-27017.sock
unix  2      [ ACC ]     STREAM     LISTENING     13976    /usr/local/aegis/Aegis-&lt;Guid(5A2C30A2-A87D-490A-9281-6765EDAD7CBA)&gt;
unix  2      [ ACC ]     SEQPACKET  LISTENING     8091     /run/udev/control
</code>

才发现,之前创建用户有问题,应该是:

use admin

再去创建

<code>&gt; use admin
switched to db admin
&gt; db.createUser({
...   user: "uuu",
...   pwd: "pwd",
...   roles: [ { role: "readWrite", db: "gridfs"}]
... })
Successfully added user: {
        "user" : "uuu",
        "roles" : [
                {
                        "role" : "readWrite",
                        "db" : "gridfs"
                }
        ]
}
&gt; 
</code>

然后再去授权:

<code>&gt; use gridfs
switched to db gridfs
&gt; db.auth("uuu", "pwd")
1
</code>

“My instance has http/https enabled. This uses the firewall rules default-allow-http and default-allow-https. These rules enable connections from anywhere (0.0.0.0/0) through tcp ports 80 and 443 respectively. I edited the http rule and added tcp port 27017.”

但是错误依旧,所以继续去:

【已解决】连接远程mongoDB失败:Failed to connect to after 5000ms milliseconds giving up

然后为了安全,再去参考:

Configuration File Options — MongoDB Manual 3.6

How to connect to your remote MongoDB server – Ian London’s Blog

去开启authorization

<code>vi /etc/mongod.conf

</code>

     32 security:

     33   authorization: ‘enabled’

     34   

然后重启MongoDB:

<code>[root@naturling-general-01 ~]# systemctl restart mongod
[root@naturling-general-01 ~]# systemctl status mongod 
[0m mongod.service - SYSV: Mongo is a scalable, document-oriented database.
   Loaded: loaded (/etc/rc.d/init.d/mongod; bad; vendor preset: disabled)
   Active: active (running) since Mon 2018-04-02 17:24:06 CST; 6s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 2052 ExecStop=/etc/rc.d/init.d/mongod stop (code=exited, status=0/SUCCESS)
  Process: 2070 ExecStart=/etc/rc.d/init.d/mongod start (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/mongod.service
           2085 /usr/bin/mongod -f /etc/mongod.conf

Apr 02 17:24:06 naturling-general-01 systemd[1]: Starting SYSV: Mongo is a scalable, document-oriented database....
Apr 02 17:24:06 naturling-general-01 runuser[2081]: pam_unix(runuser:session): session opened for user mongod by (uid=0)
Apr 02 17:24:06 naturling-general-01 runuser[2081]: pam_unix(runuser:session): session closed for user mongod
Apr 02 17:24:06 naturling-general-01 mongod[2070]: Starting mongod: [  OK  ]
Apr 02 17:24:06 naturling-general-01 systemd[1]: Started SYSV: Mongo is a scalable, document-oriented database..
</code>

然后再去看看:

本地Python代码

PyCharm的mongoDB插件

还能否正常连接

结果PyCharm中就无法连接了:

【已解决】PyCharm连接远程添加security的authorization的MongoDB出错:com.mongodb.MongoCommandExceptions: Command failed with error 13

折腾完毕,也就知道了,如何创建用户,并授权对应权限了。

【总结】

首先要知道的是:

“在开启认证auth==开启访问控制之前,需要你在admin数据库中,创建一个用户,是带有userAdmin或userAdminAnyDatabase权限的

-》否则意味着你没有一个拥有管理权限的用户,就没法创建用户了

不过,对于创建用户本身来说:在开启访问控制之前或者之后,都是可以的。”

1.新建用户之前的操作

如果你此处,和我之前一样,已经创建了一些用户,但是对于权限等方便,不是很清楚,则为了不影响后续的新建用户等方面的操作,最好删除掉之前的所有的用户。

办法是:

确保没有开启权限控制

(使用)进入对应数据库,去drop掉该数据库的所有用户

比如:

<code>use admin
db.runCommand({dropAllUsersFromDatabase: 1})
show users

use gridfs
db.runCommand({dropAllUsersFromDatabase: 1})
show users
</code>

2.在开启权限控制之前,新建(可以操作其他用户的,管理员)用户

然后在开启权限验证前,去创建,只有用户操作权限的用户

-》注意:这个管理员用户,只有操作用户的权限,对于其他数据库没有权限,包括读取其他数据库都不可以

-〉这样开启了权限控制后,你才有用户可以有权限,接着去创建你要的其他用户,比如针对于某个特定的数据库的数据的读写权限的用户

<code>use admin
db.createUser(
  {
    user: "admin",
    pwd: "your_password",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
  }
)
</code>

提示:

在一个数据库中,创建好用户之前和之后,都可以通过:

<code>show users
</code>

去查看当前用户的信息和权限

-》前提是你要有查看用户的权限

解释:

  • user:随便起个用户名,考虑到此处用于admin数据库(其存放了用户相关的信息),所以起了个admin,另外常见起法:root

  • pwd:起个复杂点的密码

  • roles

3.去开启访问权限控制

两种方式:

(1)mongod命令行加–auth参数

比如:

<code>mongod --auth --port 27017 --dbpath /data/db1
</code>

(2)(如果mongod是通过配置文件去设置配置参数的话,在)mongod配置文件中启用security的authorization设置为enabled

<code>vi /etc/mongod.conf

     32 security:
     33   authorization: 'enabled'
</code>

然后和重启mongod服务

4.新增其他相关的数据库的用户 -》 用来操作其他数据库的数据

提醒:其实这一步也可以放在第3步的开启权限之前去操作,效果是一样的。

去给另外一个gridfs去新建一个用户,且有足够的权限,可以读写数据库:

<code>use gridfs
db.createUser(
      {
        user: "gridfs",
        pwd: "pwd",
        roles: [ { role: "dbOwner", db: "gridfs" } ]
      }
    )
</code>

解释:

  • user:用户名

  • pwd:密码

  • roles

    • role:权限,可以用系统自带的某个权限名字

      • dbOwner:表示数据库的拥有者

    • db:数据库

      • 此处为自己的grifs这个数据库

5.mongo客户端去连接加了权限访问控制的mongo数据库

注意:

不论是下面(mongo shell/代码/其他工具)哪种办法,都记得要:

指定你要连接的数据库

且注意,不是

–authenticationDatabase

参数指定的那个数据库,而是uri中或参数中指定的,要auth认证的数据库是哪个

如果没有制定,则就会出现认证失败

(1)mongo shell

在(比如Mac)本地,用mongo shell,去连接远程的Mongo服务的话,可以用:

<code>mongo 47.96.131.109/gridfs -u gridfs -p pwd --authenticationDatabase gridfs
</code>

说明:重点是47.96.131.109/gridfs中的gridfs,否则后续操作会提示认证失败。

不过,也是可以,先用:

<code>mongo --host 47.96.131.109 -u gridfs -p pwd --authenticationDatabase gridfs
</code>

进去后再告诉系统使用哪个数据库:

<code>use gridfs
</code>

之后也是可以有权限操作的。

详见:

【已解决】本地mongo shell中连接远程加了权限控制的mongoDB

(2)代码

比如Python代码中:

用Pymongo的MongoClient去连接时:

(2.1)用uri方式

<code>mongodbUri = "mongodb://%s:%s@%s:%s/%s" % (
    quote_plus("gridfs"), \
    quote_plus("pwd"), \
    "47.96.131.109", \
    27017, \
    "gridfs" \
)
#'mongodb://gridfs:N%40tur1ing@47.96.131.109:27017/gridfs’

mongoClient = MongoClient(mongodbUri)
</code>

说明:重点是47.96.131.109:27017/gridfs中的gridfs,否则后续操作会提示认证失败。

(2.2)用参数方式

<code>mongoClient = MongoClient(
    host="47.96.131.109",
    port=27017,
    username="gridfs",
    password="pwd",
    authSource="gridfs"
)
</code>

说明:

重点是

authSource=“gridfs”

否则后续操作会提示认证失败。

之后就有权限去操作数据库了,相关代码:

<code>gridfsDb = mongoClient.gridfs
fsCollection = GridFS(gridfsDb)

</code>

if gDeleteAllFilesBeforeStoreNew:

    testGridfsDeleteFile(fsCollection)

def testGridfsDeleteFile(fsCollection):

  curNum = 0

  for curIdx, eachFile in enumerate(fsCollection.find()):

      curNum = curIdx + 1

      fileObjectIdToDelete = eachFile._id

      fsCollection.delete(fileObjectIdToDelete)

      logging.info(“delete [%d] ok for file object id=%s”, curNum, fileObjectIdToDelete)

详见:

【已解决】pymongo中用MongoClient去连接远程加了权限控制的mongoDB

(3)其他工具中

比如PyCharm中Mongo插件中Mongo Server中配置

说明:

重点是:

认证方式不要选择Default,而要选择:SCRAM-SHA-1

详见:

【已解决】PyCharm连接远程添加security的authorization的MongoDB出错:com.mongodb.MongoCommandExceptions: Command failed with error 13

另外,关于Mongo的用户和权限的其他总结,详见:

主流文档型数据库:MongoDB

而关于用户权限的,这里:

MongoDB 基础(六)安全性(权限操作) – CSDN博客

整理的不错:

角色分类
角色
权限及角色
(本文大小写可能有些变化,使用时请参考官方文档)
Database User Roles
read
CollStats,dbHash,dbStats,find,killCursors,listIndexes,listCollections
readWrite
CollStats,ConvertToCapped,CreateCollection,DbHash,DbStats,
DropCollection,CreateIndex,DropIndex,Emptycapped,Find,
Insert,KillCursors,ListIndexes,ListCollections,Remove,
RenameCollectionSameDB,update
Database Administration Roles
dbAdmin
collStats,dbHash,dbStats,find,killCursors,listIndexes,listCollections,
dropCollection 和 createCollection 在 system.profile 
dbOwner
角色:readWrite, dbAdmin,userAdmin
userAdmin
ChangeCustomData,ChangePassword,CreateRole,CreateUser,
DropRole,DropUser,GrantRole,RevokeRole,ViewRole,viewUser
Cluster Administration Roles
clusterAdmin
角色:clusterManager, clusterMonitor, hostManager
clusterManager
AddShard,ApplicationMessage,CleanupOrphaned,FlushRouterConfig,
ListShards,RemoveShard,ReplSetConfigure,ReplSetGetStatus,
ReplSetStateChange,Resync,
 
EnableSharding,MoveChunk,SplitChunk,splitVector
clusterMonitor
connPoolStats,cursorInfo,getCmdLineOpts,getLog,getParameter,
getShardMap,hostInfo,inprog,listDatabases,listShards,netstat,
replSetGetStatus,serverStatus,shardingState,top
 
collStats,dbStats,getShardVersion
hostManager
applicationMessage,closeAllDatabases,connPoolSync,cpuProfiler,
diagLogging,flushRouterConfig,fsync,invalidateUserCache,killop,
logRotate,resync,setParameter,shutdown,touch,unlock
Backup and Restoration Roles
backup
提供在admin数据库mms.backup文档中insert,update权限
列出所有数据库:listDatabases
列出所有集合索引:listIndexes
 
对以下提供查询操作:find
*非系统集合
*系统集合:system.indexes, system.namespaces, system.js
*集合:admin.system.users 和 admin.system.roles
restore
非系统集合、system.js,admin.system.users 和 admin.system.roles 及2.6 版本的system.users提供以下权限:
collMod,createCollection,createIndex,dropCollection,insert
 
列出所有数据库:listDatabases
system.users :find,remove,update
All-Database Roles
readAnyDatabase
提供所有数据库中只读权限:read
列出集群所有数据库:listDatabases
readWriteAnyDatabase
提供所有数据库读写权限:readWrite
列出集群所有数据库:listDatabases
userAdminAnyDatabase
提供所有用户数据管理权限:userAdmin
Cluster:authSchemaUpgrade,invalidateUserCache,listDatabases
admin.system.users和admin.system.roles:
collStats,dbHash,dbStats,find,killCursors,planCacheRead
createIndex,dropIndex
dbAdminAnyDatabase
提供所有数据库管理员权限:dbAdmin
列出集群所有数据库:listDatabases
Superuser Roles
root
角色:dbOwner,userAdmin,userAdminAnyDatabase
readWriteAnyDatabase, dbAdminAnyDatabase,
userAdminAnyDatabase,clusterAdmin
Internal Role
__system
集群中对任何数据库采取任何操作

另外的部分总结:

  • root = readWriteAnyDatabase + dbAdminAnyDatabase + userAdminAnyDatabase + clusterAdmin + restore + backup

  • clusterAdmin = clusterManager + clusterMonitor +hostManager + dropDatabase

  • clusterMonitor = … + inprog + … + serverStatus + …

转载请注明:在路上 » 【已解决】给MongoDB数据库新建用户和权限

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
92 queries in 0.256 seconds, using 23.35MB memory