mongodb默认是没有密码账号的,直接可以可以连接
MongoDB 默认直接连接,无须身份验证,如果当前机器可以公网访问,且不注意Mongodb 端口(27017)的开放状态,那么Mongodb就会产生安全风险,被利用此配置漏洞,入侵数据库很容易遭受非法入侵。
使用默认 mongod 命令启动 Mongodb
机器可以被公网访问
在公网上开放了 Mongodb 端口
安全风险
但是这样做开发的时候确实挺爽,倒也挺省事儿,可是一旦到了线上,数据库直接处于裸奔的状态!
任何人只要知道你的ip和端口号,直接通过ip + 端口的方式就可以访问你的数据库,风险很大,为了保险期间我们还是设置密码访问。
mongo中账号密码说明
mongo中账号和密码是针对单一数据库而设置的,而非整个系统权限(特定角色除外),不同的用户可以设置不同的数据库权限,可读,读写,只读等。
内置角色
- 数据库用户角色:read、readWrite;
- 数据库管理角色:dbAdmin、dbOwner、userAdmin;
- 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
- 备份恢复角色:backup、restore;
- 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
- 超级用户角色:root
具体角色
Read:允许用户读取指定数据库
readWrite:允许用户读写指定数据库
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
root:只在admin数据库中可用。超级账号,超级权限
设置帐号密码
1 进入控制台启动mongo 不使用–auth参数启动MongoDB
./mongo --port 27071
参数默认可以不加,若有自定义参数,才要加上
2 查看数据库
show dbs
3 切换到admin 下面
use admin
4 添加管理员 然后对某个库进行设置用户
use admin
db.createUser(
{
user: "admin",
pwd: "admin",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}
)
userAdminAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
管理员角色可以操作任何数据库
查看是否添加成功
db.auth(“admin”,“admin”)
1
1 表示成功 ; 0表示失败;
加入我现在需要对 test 库进行设置为 只读状态
在当前user库下 执行添加用户语句
db.createUser(
{
user: "user1",
pwd: "user1",
roles: [{ role: "read", db: "user" } ]
}
)
重启 MongoDB服务
启用auth
mongod --auth
mongo
提示报错,权限开启,但是数据路径错误。
命令后带上 data文件路径
mongod --auth -dbpath “mongo data文件夹路径” 启动即可
可能会报错
2019-04-22T22:25:29.682+0800 I CONTROL [initandlisten] options: { security: { authorization: "enabled" }, storage: { dbPath: "../data" } }
2019-04-22T22:25:29.687+0800 I STORAGE [initandlisten] exception in initAndListen: DBPathInUse: Unable to create/open the lock file: ../data\mongod.lock (另一个程序正在使用此文件,进程无法访问。). En
sure the user executing mongod is the owner of the lock file and has the appropriate permissions. Also make sure that another mongod instance is not already running on the ../data directory, terminati
ng
关闭mongo服务 , 然后即可。
C:\Program Files\MongoDB\Server\4.0\bin>mongod --auth --dbpath ../data
2019-04-22T22:27:08.387+0800 I CONTROL [main] Automatically disabling TLS 1.0, to force-enable TLS 1.0 specify --sslDisabledProtocols 'none'
2019-04-22T22:27:08.682+0800 I CONTROL [initandlisten] MongoDB starting : pid=8040 port=27017 dbpath=../data 64-bit host=Draper
2019-04-22T22:27:08.683+0800 I CONTROL [initandlisten] targetMinOS: Windows 7/Windows Server 2008 R2
2019-04-22T22:27:08.683+0800 I CONTROL [initandlisten] db version v4.0.4
2019-04-22T22:27:08.684+0800 I CONTROL [initandlisten] git version: f288a3bdf201007f3693c58e140056adf8b04839
2019-04-22T22:27:08.684+0800 I CONTROL [initandlisten] allocator: tcmalloc
2019-04-22T22:27:08.684+0800 I CONTROL [initandlisten] modules: none
2019-04-22T22:27:08.685+0800 I CONTROL [initandlisten] build environment:
2019-04-22T22:27:08.685+0800 I CONTROL [initandlisten] distmod: 2008plus-ssl
2019-04-22T22:27:08.685+0800 I CONTROL [initandlisten] distarch: x86_64
2019-04-22T22:27:08.685+0800 I CONTROL [initandlisten] target_arch: x86_64
2019-04-22T22:27:08.686+0800 I CONTROL [initandlisten] options: { security: { authorization: "enabled" }, storage: { dbPath: "../data" } }
2019-04-22T22:27:08.690+0800 I STORAGE [initandlisten] Detected data files in ../data created by the 'wiredTiger' storage engine, so setting the active storage engine to 'wiredTiger'.
2019-04-22T22:27:08.691+0800 I STORAGE [initandlisten] wiredtiger_open config: create,cache_size=7615M,session_max=20000,eviction=(threads_min=4,threads_max=4),config_base=false,statistics=(fast),lo
=(enabled=true,archive=true,path=journal,compressor=snappy),file_manager=(close_idle_time=100000),statistics_log=(wait=0),verbose=(recovery_progress),
2019-04-22T22:27:08.837+0800 I STORAGE [initandlisten] WiredTiger message [1555943228:837200][8040:2000301840], txn-recover: Main recovery loop: starting at 19/12928 to 20/256
2019-04-22T22:27:08.957+0800 I STORAGE [initandlisten] WiredTiger message [1555943228:957200][8040:2000301840], txn-recover: Recovering log 19 through 20
2019-04-22T22:27:09.135+0800 I STORAGE [initandlisten] WiredTiger message [1555943229:135200][8040:2000301840], txn-recover: Recovering log 20 through 20
2019-04-22T22:27:09.229+0800 I STORAGE [initandlisten] WiredTiger message [1555943229:229200][8040:2000301840], txn-recover: Set global recovery timestamp: 0
2019-04-22T22:27:10.089+0800 I RECOVERY [initandlisten] WiredTiger recoveryTimestamp. Ts: Timestamp(0, 0)
2019-04-22T22:27:10.723+0800 I CONTROL [initandlisten]
2019-04-22T22:27:10.724+0800 I CONTROL [initandlisten] ** WARNING: This server is bound to localhost.
2019-04-22T22:27:10.725+0800 I CONTROL [initandlisten] ** Remote systems will be unable to connect to this server.
2019-04-22T22:27:10.727+0800 I CONTROL [initandlisten] ** Start the server with --bind_ip <address> to specify which IP
2019-04-22T22:27:10.728+0800 I CONTROL [initandlisten] ** addresses it should serve responses from, or with --bind_ip_all to
2019-04-22T22:27:10.730+0800 I CONTROL [initandlisten] ** bind to all interfaces. If this behavior is desired, start the
2019-04-22T22:27:10.731+0800 I CONTROL [initandlisten] ** server with --bind_ip 127.0.0.1 to disable this warning.
2019-04-22T22:27:10.732+0800 I CONTROL [initandlisten]
2019-04-22T22:27:10.734+0800 I CONTROL [initandlisten] Hotfix KB2731284 or later update is not installed, will zero-out data files.
2019-04-22T22:27:10.735+0800 I CONTROL [initandlisten]
2019-04-22T22:27:12.120+0800 I FTDC [initandlisten] Initializing full-time diagnostic data capture with directory '../data/diagnostic.data'
2019-04-22T22:27:12.129+0800 I NETWORK [initandlisten] waiting for connections on port 27017
2019-04-22T22:27:12.903+0800 I NETWORK [listener] connection accepted from 127.0.0.1:11451 #1 (1 connection now open)
2019-04-22T22:27:15.565+0800 I NETWORK [listener] connection accepted from 127.0.0.1:11454 #2 (2 connections now open)
2019-04-22T22:27:15.575+0800 I NETWORK [conn2] received client metadata from 127.0.0.1:11454 conn2: { application: { name: "Navicat" }, driver: { name: "mongoc", version: "1.11.0" }, os: { type: "Wi
dows", name: "Windows", version: "6.1 (7601)", architecture: "x86_64" }, platform: "cfg=0x041700e9 CC=MSVC 1900 CFLAGS="/DWIN32 /D_WINDOWS /W3" LDFLAGS="/machine:x64"" }
启动成功。
我这里服务是没有设置权限之前的服务,开启权限后如需要服务中启动,可将原来的服务删除重新添加服务即可。
然后 我们用默认的进行连接数据库
提示没有授权,需要权限。
然后我们使用user1 账号来登录测试一下
登录成功
然后我们会发现只有一个库,也就是我们设置的user库
尝试删除一个文档,发现无权限(我们的user设置了只读权限)
linux 环境下步骤一致,唯一区别就是 需要在 mongo.config 文件中设置开始启动权限配置。
true 表示启用权限配置
auth = true
#noauth = true
···