设为首页 收藏本站
查看: 726|回复: 0

[经验分享] MongoDB的安全性

[复制链接]

尚未签到

发表于 2015-7-7 10:15:50 | 显示全部楼层 |阅读模式
上篇文章介绍Mongo启动了,一般数据库启动,下面的操作就是登录数据库了,之前测试数据库是否正常安装的时候也登录过数据库,现在回想一下,好像连用户名和密码都没有输入,找几篇帖子来探究下Mongodb的登录:

在启动篇中,配置启动参数配置文件的时候有个参数选项 noauth=true,这个就决定了无需验证即可登录服务器,那么我想要增加验证的安全机制如何做呢?

MongoDB的安全
      MongoDB目前只支持最基本的安全认证,如果我们开启了安全性检查,则只有数据库认证用户才能进行读写操作,当然我们还可以创建读写权限用户和只读权限用户,如果我们在admin的数据库中进行创建用户,那么admin中的用户就会被当作超级用户,超级用户可以读写所有的数据库,并且还可以进行特殊的管理操作,比如可以再创建其他用户关闭进程等操作。

添加用户

根据官网上的例子,我们也来创建一个超级用户,一个test库中具有读写操作的普通用户,一个test库中只有读操作的普通用户。

  [mongodb@localhost bin]$ ./mongo
MongoDB shell version: 2.0.0
connecting to: test
> use admin
switched to db admin
  
> db.addUser("sys","sys");
{ "n" : 0, "connectionId" : 3, "err" : null,"ok" : 1 }
{
        "user" : "sys",
        "readOnly" : false,
        "pwd" : "f0253610217776057486b19f72577509",
        "_id" : ObjectId("4e9f8e27eb203de00bb8bfcf")
}
  
> show dbs
admin   0.0625GB
local   (empty)
my_mongodb      0.0625GB
test    0.0625GB
  
> use test
switched to db test
  
> db.addUser("test001","001");
{ "n" : 0, "connectionId" : 3, "err" : null,"ok" : 1 }
{
        "user" : "test001",
        "readOnly" : false,
        "pwd" : "189c319d58c4d3f3e540ac7bceae5d91",
        "_id" : ObjectId("4e9f9273eb203de00bb8bfd0")
}
  
> db.addUser("test002","002");
{ "n" : 0, "connectionId" : 3, "err" : null,"ok" : 1 }
{
        "user" : "test002",
        "readOnly" : false,
        "pwd" : "7d236571b88bc6cd0c87567589be0e6b",
        "_id" : ObjectId("4e9f927ceb203de00bb8bfd1")
}
这里sys是在admin库中创建,属于超级用户,可以对所有库进行操作,在test库中创建的test001和test002属于test库的操作人员,只能对test库进行相应操作,记得要为安全验证生效需要将启动项auth设置为true。

查看用户
所有的用户信息都存储在每个数据库的db.system.users中,可以使用find()进行查看

# 选择admin数据库

>use admin

# 查看该库下的所有collection,这一步可以忽略
# 只是为了让你看一下每个库中都会有system.users这个collection
>show collections
system.indexes
system.users
# 查看可以访问该库的用户,结果类似这样
# {"_id":ObjectId("4be171f8cb53000000006064","user":"sys","readOnly":false,
# "pwd":"2a8025f0885adad5a8ce0044070032b3")},
# 不用说大家都看的明白了,root就是用户名,pwd的值就是通过加密后得到的字符串了,什么算法我不知道,
# readOnly的值为false是该用户还可以执行其他操作,如果该值为true那么该用户只拥有读数据的权限
>db.system.users.find();

{ "_id" :ObjectId("4e9f8755672f1dd46f2cb654"), "user" :"sa", "readOnly" : false, "pwd" : "75692b1d11c072c6c79332e248c4f699"}
{ "_id" :ObjectId("4e9f8c2feb203de00bb8bfce"), "user": "admin", "readOnly" : false, "pwd" : "7c67ef13bbd4cae106d959320af3f704" }
{ "_id" :ObjectId("4e9f8e27eb203de00bb8bfcf"),"user" : "sys", "readOnly" : false,"pwd" : "f0253610217776057486b19f72577509" }

其中的pwd是根据用户名和用户密码生成的散列值。

修改用户
不管是添加用户,修改用户密码,修改用户操作权限都使用addUser()来完成。删除用户可以用remove()来实现.

# 命令和添加用户一样,把用户‘sys’的密码改为'123456'
>db.addUser('sys','123456') })
>db.system.users.find()
删除用户
>db.system.users.remove({'user':'sys'});

启用 验证 (设置--auth=true)

  此时登录再直接查询信息的时候,可以看到要求验证用户名和密码的情况:
[mongodb@localhost bin]$ ./mongo
MongoDB shell version: 2.0.0
connecting to: test
> show collections
Thu Oct 20 12:37:52 uncaught exception: error: {
        "$err" : "unauthorized db:testlock type:-1 client:127.0.0.1",
        "code" : 10057
}
  [mongodb@localhost bin]$ ./mongo
MongoDB shell version: 2.0.0
connecting to: test
> db.auth("test001","test001")
1
> show collections
foo
system.indexes
system.users
test
  ____________________________________________________________________________________________________________
  根据官方文档开启 mongod 服务时不添加任何参数时,可以对数据库任意操作,而且可以远程访问数据库,所以推荐只是在开发是才这样不设置任何参数。
而提高 mongodb 数据库安全有几个方面:
  1.绑定 内网IP 地址设置 use projectx>db.addUser("user1","1resu");  在 admin 中创建用户名为 root 密码为 toor 的用户,如下:







$ ./mongo
>use admin
>db.addUser("root","toor");
>db.auth("root","toor");
1  ^^^^ 如果认证成功会显示 1
^^^^ 用以下命令可以查看所有当前选择的数据库的用户信息
  
  
  Centos5.5-64bit-IP=80:/tools/mongodb/mongodb1.8/bin#./mongo localhost:3306
  MongoDB shell version: 1.8.0
  connecting to: localhost:3306/test
  > use admin;
  switched to db admin
  >  db.system.users.find();
  error: {
          "$err" : "unauthorized db:admin lock type:-1 client:127.0.0.1",
          "code" : 10057
  }
  > db.auth("kadmin", "kadmin");
  1
  > db.system.users.find();
  { "_id" : ObjectId("4d8d8ab69c6467b52026ae57"), "user" : "kadmin", "readOnly" : false, "pwd" : "2be6a622a0d0f69ac838db1fd0f2ece" }
  > use hai;
  switched to db hai
  > db.system.users.find();
  { "_id" : ObjectId("4d8d8a7a9c6467b52026ae56"), "user" : "hairoot", "readOnly" : false, "pwd" : "3c5db163d5b5825573259bf0c7af84fb" }
  >
  
  ‍









>db.system.users.find();
{"_id": ObjectId("4d761dfc23e14f10be8563c5"),"user":"root","readOnly":false,"pwd":"6a921fa21bbcd22989efecbcb2340d17"}






$ ./mongo
>use projectx
switched to db dbtest
>db.aaaa.insert({aa:"xx"});
unauthorized  ^^^^ 一旦在 admin 数据库中添加了用户,
^^^^ 那么对数据库的操作必须进行认证,否则提示 unauthorized







>db.auth("user1","1resu");
1
>db.aaaa.insert({aa:"xx"});
>db.aaaa.find();
{"_id": ObjectId("4d7628638e6ce2eb56b45a41"),"aa":"xx"}  ^^^^ 进行用户认证后就可以插入数据了







>use projecty
switched to db projecty
>db.zzz.insert({aa:"xx"});
unauthorized  ^^^^ 由于用户 user1 只作用于 projectx
^^^^ 并没有对 projecty 的操作权限
^^^^ 而我们却可以用 admin 库中的用户认证后进行创建,如下







>use admin
>db.auth("root","toor");
1
>use projecty
switched to db projecty
>db.zzz.insert({aa:"xx"});
>db.zzz.find();
{"_id": ObjectId("4d7628638e6ce2eb56b45a41"),"aa":"xx"}  ^^^^ 用 admin 库中的用户认证后就可以创建另一个数据库了
^^^^ 所以说明 admin 数据库中的权限很大,如果没有指定 readonly 的话
^^^^ 它可以进行任何操作,很危险







>use projectx
>db.addUser("user2","2resu",true);
{
"user":"user2",
"readOnly":true,
"pwd":"471e31e021a3656044ef3487ea90e0cf"
}  ^^^^ 当一 user2 用户认证时,user2 只能对 projectx 进行只读操作。
  
  ------------------------------------
  
1.指定服务端口
mongod --port 27017
2.限定IP(只允许特定IP访问)
mongod --bind_ip 127.0.0.1
3.用户验证模式(db层)
mongod --auth #启动时加上--auth参数
#use mydb
#db.auth('username','password')
注1:
全局数据库权限:在admin库里添加用户
> use admin
switched to db admin
> db.addUser('username','password')
{
"user" : "username",
"readOnly" : false,
"pwd" : "aa5469a39788b6c3988537cd409887a1"
}
特定某个数据库权限:
> use mydb
switched to db mydb
> db.addUser('username','password')
{
"user" : "username",
"readOnly" : false,
"pwd" : "aa5469a39788b6c3988537cd409887a1"
}
注2:
添加只读权限的用户
> db.addUser('username','password',true)
{
"user" : "username",
"readOnly" : true,
"pwd" : "aa5469a39788b6c3988537cd409887a1"
}
  
  



    • 更多的安全考虑

      刚说了MongoDB的安全认证其实还是简陋的,所以我们还是有其他很多的安全考虑。
      1.比如说MongoDB传输协议是不加密的,如果需要加密的话,我们可以考虑使用ssh隧道或是他们的技术来对客户端和服务端之间的通讯进行加密。
      2.将MongoDB部署在只有客户端服务器才能访问到的环境,比如内网,vpn网络中,可以使用 bind_ip = 本机或内网 。
      3.如果确实需要将MongoDB暴露在外部环境可以考虑使用IPTABLES等技术进行访问限制



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-84031-1-1.html 上篇帖子: MongoDB配置多个ConfigDB的问题(笔记) 下篇帖子: MongoDB说明
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表