折腾:
【已解决】阿里云ECS服务器中已有的MongoDB的用户名密码和端口
期间,去新建MongoDB的用户,加上权限访问控制。
API Documentation — PyMongo 3.6.1 documentation
Enable Auth — MongoDB Manual 3.6
Tutorial — PyMongo 3.6.1 documentation
然后去试试:
<code>> use gridfs switched to db gridfs > show collections > 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-<Guid(5A2C30A2-A87D-490A-9281-6765EDAD7CBA)> 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-<Guid(5A2C30A2-A87D-490A-9281-6765EDAD7CBA)> unix 2 [ ACC ] SEQPACKET LISTENING 8091 /run/udev/control </code>
才发现,之前创建用户有问题,应该是:
use admin
再去创建
<code>> use admin switched to db admin > db.createUser({ ... user: "uuu", ... pwd: "pwd", ... roles: [ { role: "readWrite", db: "gridfs"}] ... }) Successfully added user: { "user" : "uuu", "roles" : [ { "role" : "readWrite", "db" : "gridfs" } ] } > </code>
然后再去授权:
<code>> use gridfs switched to db gridfs > 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中就无法连接了:
折腾完毕,也就知道了,如何创建用户,并授权对应权限了。
【总结】
首先要知道的是:
“在开启认证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
role:
userAdminAnyDatabase:
表示对于其他任何数据,都可以管理其用户
但是对于非用户的操作,比如数据的读写,是不行的
一般也可以换用类似作用的:userAdmin
db:
admin:系统默认的admin数据库,存放了用户相关的信息
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:表示数据库的拥有者
dbOwner = readWrite + dbAdmin + userAdmin
所以可以为所欲为的操作该数据了,包括对于数据和该数据库的用户的所有的权限
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%[email protected]: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
详见:
另外,关于Mongo的用户和权限的其他总结,详见:
而关于用户权限的,这里:
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数据库新建用户和权限