`

1. MongoDB登陆

阅读更多

1.mongo 远程连接

配置mongodb.conf,注释掉bind_ip

 #bind_ip = 127.0.0.1   //注释此行

 

启用认证登陆

auth = true       //将此行前的注释去掉

 

登陆(authenticationDatabase 验证数据库)

mongo host:port/dbname -u user-p password --authenticationDatabase dbname 

mongo 127.0.0.1:27017/admin -u root -p 123456 --authenticationDatabase admin

 

正确关闭mongod 的方法

use admin

db.shutdownServer()

 

 

用户操作

认证 

db.auth("user","password")

全部用户 

show users // db.system.users.find()  

// 新建用户

// 超级用户 root

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

// 用户管理权限 userAdminAnyDatabase

db.createUser({user:"userAdmin",pwd:"123456",roles:[{role:"userAdminAnyDatabase",db:"admin"}]})

// 数据库管理权限 dbAdminAnyDatabase

db.createUser({user:"dbAdmin",pwd:"123456",roles:[{role:"dbAdminAnyDatabase",db:"admin"}]})

// 数据读写用户 readWriteAnyDatabase

use test

db.createUser({user:"sa",pwd:"sa",roles:[{role:"readWrite",db:"test"}]})

// 已废弃的方法 相当于新建 { "user" : "root", "roles" : [ "dbOwner" ] }

 

// db.addUser("root","123456") 

// 修改密码 db.changeUserPassword("root", "root")

// 删除原用户 db.dropUser("test") // db.system.users.remove({user:"test"});

 

角色权限

展示角色 show roles;

// 查看当前用户的权限 db.runCommand({usersInfo:"root",showPrivileges:true})

// 查看角色权限 db.getRole( "dbAdminAnyDatabase", { showPrivileges: true } )

 

 

集合(collection)文档(JSON)操作

展示集合 show collections;

查询数据 db.collection.find(query)  // query可以是 ObjectId("24length")

查询一条 db.collection.findOne(query)   // query可以是 ObjectId("24length")

插入数据 db.collection.insert(JSON)

删除数据 db.collection.remove(query)

更新数据 db.collection.update(queryjson,JSON[,{multi:true}]) // 及时匹配多条也只修改一条 ,可选项mulit:true时更新多条

删除集合 db.collection.drop()

添加或更新数据 db.collection.save(JSON) // JSON没有_id是insert否则是upsert

集合名的长度不能超过121字节,是因为集合命名空间中需要额外6个字节 .$_id_ ,放在一起是127个字节 

 

更新修改器

1.增加、修改、删除

$set 增加或修改建对应的值 

db.foo.update({"_id" : ObjectId("...")},{"$set":{"total":1,coll:[{"json1":"jsonV"},{"key":"value"}]}})

$unset  删除键对应的值

db.foo.update({"_id" : ObjectId("...")},{"$unset":{"total":null,coll:null}})

 

2.计数器

$inc  增加或减少数字 只能用于整数、长整数或双精度浮点数

db.foo.update({"_id":ObjectId("...")},{"$inc":{"total":-1}})

 

3.数组修改器

$push 新增或向尾部插入一个元素 一次只能插入一个

db.foo.update({"_id" : ObjectId("...")},{"$push":{coll:"a"}})

 

$ne 查询是否不存在某个元素 从查询的角度避免重复

db.foo.update({"_id" : ObjectId("..."),"coll":{"$ne":"a"}},{"$push":{coll:"a"}})

 

$addToSet 不设置重复值 从数组元素值的角度避免重复数据

db.foo.update({"_id" : ObjectId("54c25d065478a3459336bab0")},{"$addToSet":{coll:"c"}})

 

$each 将数组拆分,实现批量插入

可以跟$addToSet结合使用

db.foo.update({"_id" : ObjectId("54c25d065478a3459336bab0")},{"$addToSet":{coll:{"$each":["a","b","c","d"]}}})

 

$pop 栈的方式删除一端元素

负数从左移除一位,null/0/正数从右移除一位 

db.foo.update({"_id" : ObjectId("54c25d065478a3459336bab0")},{"$pop":{"coll":1}})

 

$pull 删除匹配元素

db.foo.update({"_id" : ObjectId("54c25d065478a3459336bab0")},{"$pull":{"coll":5}})

 

4.数组定位修改器 $

通过下标(0开始)或定位操作符$(有问题)

db.foo.update({"_id" : ObjectId("54c25d065478a3459336bab0")},{"$set":{"coll.0":{"k0":"v0"}}})

 

5.upsert

创建或更新文档 update第三个参数为true,表示这是个upsert,如果不存在,查询条件会被当做文档的一部分

db.foo.update({"a":"b"},{"$inc":{"total":1}},true)

 

6.update 第四个参数

代表更新所有匹配到的文档,默认只更新第一个匹配到的文档

db.foo.update({"a":"b"},{"$inc":{"total":1}},false,true)

 

7.返回更新状态  getLastError

主要对写操作有用,写操作默认不会有返结果:这样就节约了客户端在写操作时等待客户端/服务器之间往返时间

db.runCommand({getLastError:1}) // 等价于 db.getLastErrorObj() 不等价于db.getLastError() 

选项

fsync 当没有使用日志功能运行mongod(--nojournal)时,同步的选项强制数据库在同步完所有文件后才返回。 db.runCommand({getlasterror:1,fsync:true})

j:当j=true时,getlasterror调用等待日志提交后才返回。如果服务器没有启用日志功能,它立即返回,并且成功 db.runCommand({getlasterror:1,j:true})

w:客户端可以阻塞直到一个写操作被复制到N个服务器。wtimeout可以联合w一起使用。默认是没有超时(永久等待)db.getLastError(2, 5000) // w=2, timeout 5000ms

 

返回值

这个命令的返回值是一个多字段的对象。常用的字段已经列在下面;这里可能还有其他字段。

  • ok - 为真的话表示getLastError命令成功完成了。它并不表示上一次没有错误。
  • err - 如果非空,表示有错误出现。值是一个错误正文的描述。
  • code - 如果设置了,表示出现的错误码。
  • connectionId - 连接的id。
  • lastOp - 上一次操作的op-id

对于更新:

  • n - 如果一次更新完成了,它是更新的文档个数。

使用了w:<n>/<tag>

  • wnote - 如果设置了,表示这里有些不寻常的事情发生,涉及使用w:
  • wtimeout - 如果超时了,设置该值为真
  • waited - 如果超时了,标记等到了多久,单位毫秒
  • wtime - 花在等待操作完成的时间

 

JSON操作

赋值

foo.key1 = foo.key2

 

删除某个属性

delete foo.key

 

 

其他

展示状态 show dbs;

可以直接使用ObjectId("123456789012345678901234") 

 

0x00 MongoDB权限介绍


1.MongoDB安装时不添加任何参数,默认是没有权限验证的,登录的用户可以对数据库任意操作而且可以远程访问数据库,需以--auth参数启动。

2.在刚安装完毕的时候MongoDB都默认有一个admin数据库,此时admin数据库是空的,没有记录权限相关的信息。当admin.system.users一个用户都没有时,即使mongod启动时添加了--auth参数,如果没有在admin数据库中添加用户,此时不进行任何认证还是可以做任何操作(不管是否是以--auth 参数启动),直到在admin.system.users中添加了一个用户。

3.MongoDB的访问分为连接和权限验证,即使以--auth参数启动还是可以不使用用户名连接数据库,但是不会有任何的权限进行任何操作

4.admin数据库中的用户名可以管理所有数据库,其他数据库中的用户只能管理其所在的数据库。

5.在2.4之前版本中,用户的权限分为只读和拥有所有权限;2.4版本的权限管理主要分为:数据库的操作权限、数据库用户的管理权限、集群的管理权限,建议由超级用户在admin数据库中管理这些用户。不过依然兼容2.4版本之前的用户管理方法。

 

0x01 MongoDB中用户的角色说明


1. read角色

数据库的只读权限,包括:

aggregate,checkShardingIndex,cloneCollectionAsCapped,collStats,count,dataSize,dbHash,dbStats,distinct,filemd5,mapReduce (inline output only.),text (beta feature.)geoNear,geoSearch,geoWalk,group 

2. readWrite角色

数据库的读写权限,包括:

read角色的所有权限

cloneCollection (as the target database.),convertToCapped,create (and to create collections implicitly.),renameCollection (within the same database.)findAndModify,mapReduce (output to a collection.) 
drop(),dropIndexes,emptycapped,ensureIndex() 

3. dbAdmin角色

数据库的管理权限,包括:

clean,collMod,collStats,compact,convertToCappe 
create,db.createCollection(),dbStats,drop(),dropIndexes 
ensureIndex(),indexStats,profile,reIndex 
renameCollection (within a single database.),validate 

4. userAdmin角色

数据库的用户管理权限

5. clusterAdmin角色

集群管理权限(副本集、分片、主从等相关管理),包括:

addShard,closeAllDatabases,connPoolStats,connPoolSync,_cpuProfilerStart_cpuProfilerStop,cursorInfo,diagLogging,dropDatabase 
shardingState,shutdown,splitChunk,splitVector,split,top,touchresync 
serverStatus,setParameter,setShardVersion,shardCollection 
replSetMaintenance,replSetReconfig,replSetStepDown,replSetSyncFrom 
repairDatabase,replSetFreeze,replSetGetStatus,replSetInitiate 
logRotate,moveChunk,movePrimary,netstat,removeShard,unsetSharding 
hostInfo,db.currentOp(),db.killOp(),listDatabases,listShardsgetCmdLineOpts,getLog,getParameter,getShardMap,getShardVersion 
enableSharding,flushRouterConfig,fsync,db.fsyncUnlock() 

6. readAnyDatabase角色

任何数据库的只读权限(和read相似)

7. readWriteAnyDatabase角色

任何数据库的读写权限(和readWrite相似)

8. userAdminAnyDatabase角色

任何数据库用户的管理权限(和userAdmin相似)

9. dbAdminAnyDatabase角色

任何数据库的管理权限(dbAdmin相似)

0x02 MongoDB安装注意事项


1. 安装的时候需要加--auth

加了--auth之后MongoDB才需要验证

2. 需要加--nohttpinterface

不加会有一个28017的端口监听,可以通过网页管理mongodb,不需要请去掉

3. 可以加--bind_ip

加之后可以限制访问的ip

4. 可以加--port

加了之后可以重新制定端口,默认为27017

5. 安装完之后需立即在admin数据库中添加一个用户

只有在admin数据库中添加一个用户后才能使认证生效

注:安装的过程其实就是添加1个服务,指定启动时候的参数。

0x03 用户授权


1. 2.4之前版本的用户管理方式

1.1、进入admin创建一个管理账号

use admin 
db.addUser("test","test") 

1.2、进入需要使用的数据库中创建一个程序使用用户

use test 
db.addUser("test","test")默认拥有读写权限 
db.addUser("test","test",True)拥有读取权限 

2. 2.4版本的用户管理,也可使用之前版本的方式

2.1、进入admin创建一个管理账号

use admin 
db.addUser("test","test") 

2.2、进入admin给使用的数据库test创建一个对数据库及日志拥有读写权限的账户

use admin 
db.addUser({
    "user": "test", 
    "pwd": "test", 
    "roles": [ ], 
    "otherDBRoles": {
        "test": [
            "readWrite"
        ], 
        "test_log": [
            "readWrite"
        ]
    }
}) 

0x04 安全配置方案


1. 安装的时候加--auth,并立即在admin数据库创建一个用户

默认情况下MongoDB是无需验证的,所以这是至关重要的一步

2. 可以考虑安装的时候修改端口和指定访问ip

具体根据实际情况来设定,也可以直接在服务器防火墙上做

3. 安装的时候建议加上--nohttpinterface取消默认的一个网页管理方式

默认的web管理一般不会用,且很多人不知道,最好关闭

4. 管理用户处理

因需要在admin中建立一个管理账户用于管理,最好是设置强密码,但是不要给其他程序使用

5. MongoDB服务运行账户

windows下可以使用network service 或者新建一个用户,使用默认的USERS组,然后添加给予数据库文件及日志存储目录的写权限,并建议取消对cmd等程序的执行权限。

linux下新建一个账户,给予程序的执行权限和数据库文件及日志目录的读写权限,并建议取消对sh等程序的执行权限。

6. 控制好网站或者其他程序使用的连接用户权限

网站或者其他程序使用的用户只给予对应库的权限,不要使用admin数据库中的管理账户。

0x05 常用命令


1. 安装

mongod --dbpath d:\mongodb\data --logpath d:\mongodb\log\mongodb.log ----nohttpinterface --auth --install

2. 添加用户

use admin 
db.addUser("test","test") 

3. 显示所有数据库

show dbs 

4. 使用某个数据库

use test 

5. 连接数据库

mongo test -uroot -p123456 

6. 添加用户认证

db.auth("username","password") 

7. 查看用户

db.system.users.find() 

就写几个基本的,其他的网上很多,或者用工具连上去之后操作。

0x06 管理工具


1. MongoVUE

客户端形式的管理工具

 

不受访问限制的超级用户

use admin
db.createUser(
    {
      user: "superuser",
      pwd: "12345678",
      roles: [ "root" ]
    }
)

 

服务器配置: /etc/mongod.conf

 

# mongod.conf

#where to log
logpath=/var/log/mongodb/mongod.log

# 以追加方式写入日志
logappend=true

# fork and run in background
fork=true

# 端口
#port=27017

# 数据库文件保存位置
dbpath=/var/lib/mongo

# location of pidfile
pidfilepath=/var/run/mongodb/mongod.pid

# Listen to local interface only. Comment out to listen on all interfaces. 
bind_ip=127.0.0.1

# Disables write-ahead journaling
# nojournal=true

# Enables periodic logging of CPU utilization and I/O wait
# 启用定期记录CPU利用率和 I/O 等待 
#cpu=true

# Turn on/off security.  Off is currently the default
# 是否以安全认证方式运行,默认是不认证的非安全方式
#noauth=true
#auth=true

# Verbose logging output.
# 详细记录输出
#verbose=true

# Inspect all client data for validity on receipt (useful for
# developing drivers)
# 用于开发驱动程序时的检查客户端接收数据的有效性
#objcheck=true

# Enable db quota management
# 启用数据库配额管理,默认每个db可以有8个文件,可以用quotaFiles参数设置 
#quota=true

# Set oplogging level where n is
# 设置oplog记录等级
#   0=off (default)
#   1=W
#   2=R
#   3=both
#   7=W+some reads
#diaglog=0

# Ignore query hints
# 忽略查询提示
#nohints=true

# Enable the HTTP interface (Defaults to port 28017).
# 禁用http界面,默认为localhost:28017
#httpinterface=true

# Turns off server-side scripting.  This will result in greatly limited
# 关闭服务器端脚本,这将极大的限制功能
# functionality
#noscripting=true

# Turns off table scans.  Any query that would do a table scan fails.
# 关闭扫描表,任何查询将会是扫描失败 
#notablescan=true

# Disable data file preallocation.
# 关闭数据文件预分配
#noprealloc=true

# Specify .ns file size for new databases.
# 为新数据库指定.ns文件的大小,单位:MB
# nssize=<size>

# Replication Options

# in replicated mongo databases, specify the replica set name here
#replSet=setname
# maximum size in megabytes for replication operation log
#oplogSize=1024
# path to a key file storing authentication info for connections
# between replica set members
#keyFile=/path/to/keyfile
 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics