MongoDB - 安全

作者: yuanzicheng | 来源:发表于2018-05-22 12:42 被阅读289次

MongoDB的安全模式默认是关闭的,无需账号密码就可以访问数据库,使用和开发时比较便利,这在一个可信任的网络环境中还可以接受。但如果未启用安全模式的MongoDB暴露在外网环境下,数据就是在裸奔,风险极大。

MongoDB内置了完善的安全机制,我们可以利用这些功能来提高MongoDB服务的安全性。

1.指定允许访问的IP

MongoDB可以通过在启动参数或配置文件中添加--bind_ip来设置允许访问的ip

  • 启动时指定ip
mongod --bind_ip 127.0.0.1,192.168.100.123
  • 通过配置文件/etc/mongodb.conf指定ip
# network interfaces
net:
  port: 27017
  bindIp: 127.0.0.1,192.168.100.123

这是官方文档中给出的配置多个ip的方式,但是实际测试下来是不可行的,mongod会启动失败,查看/var/log/mongodb/mongod.log会发现如下SocketException: Cannot assign requested address的错误信息

2018-05-24T12:02:02.817+0800 I CONTROL  [initandlisten] options: { config: "/etc/mongod.conf", net: { bindIp: "127.0.0.1,192.168.13.64", port: 27017 }, processManagement: { fork: false, pidFilePath: "/var/run/mongodb/mongod.pid", timeZoneInfo: "/usr/share/zoneinfo" }, storage: { dbPath: "/var/lib/mongo", journal: { enabled: true } }, systemLog: { destination: "file", logAppend: true, path: "/var/log/mongodb/mongod.log" } }
2018-05-24T12:02:02.817+0800 E STORAGE  [initandlisten] Failed to set up listener: SocketException: Cannot assign requested address

甚至仅仅配置一个另外的ip

# network interfaces
net:
  port: 27017
  bindIp: 192.168.13.64

也同样无法启动

2018-05-24T12:07:54.917+0800 I CONTROL  [initandlisten] options: { config: "/etc/mongod.conf", net: { bindIp: "192.168.13.64", port: 27017 }, processManagement: { fork: false, pidFilePath: "/var/run/mongodb/mongod.pid", timeZoneInfo: "/usr/share/zoneinfo" }, storage: { dbPath: "/var/lib/mongo", journal: { enabled: true } }, systemLog: { destination: "file", logAppend: true, path: "/var/log/mongodb/mongod.log" } }
2018-05-24T12:07:54.917+0800 E STORAGE  [initandlisten] Failed to set up listener: SocketException: Cannot assign requested address

测试结果:bindIp的值只能为127.0.0.1或0.0.0.0以及当前主机的具体地址。
查找了国内外许多资料都没有找到解决方案,那么如果想要控制访问的ip,就需要通过服务器本身的手段了,如firewalld等。

  • 启动时指定配置文件
mongod --config /etc/mongod.conf

2.设置监听端口

MongoDB默认监听的端口为27017,为避免恶意的连接尝试,可以修改监听的端口。

  • 启动时指定端口
mongod --port 27017
  • 配置文件(/etc/mongodb.conf)中指定端口
# network interfaces
net:
  port: 27017

3.用户认证

MongoDB还提供了用户认证功能,如果开启了用户认证(默认未开启),需要使用账号密码验证才能访问。

3.1 启用用户认证
  • 通过启动参数开启
mongod --auth
  • 通过配置文件(/etc/mongodb.conf)开启
security:
  authorization: enabled
3.2 添加用户

首先需要创建管理员账户

> use admin
switched to db admin
> db.createUser({user:"admin",pwd:"123456",roles:[{role:"userAdminAnyDatabase",db:"admin"}]})
Successfully added user: {
    "user" : "admin",
    "roles" : [
        {
            "role" : "userAdminAnyDatabase",
            "db" : "admin"
        }
    ]
}

创建普通账户

> use test
switched to db test
> db.createUser({user:"abc",pwd:"123",roles:[{role:"read",db:"test"}]})
Successfully added user: {
    "user" : "abc",
    "roles" : [
        {
            "role" : "read",
            "db" : "test"
        }
    ]
}

3.3 用户权限控制
  • 查看用户权限

可以使用show users查询当前数据库的全部用户

> use test
switched to db test
> show users
{
    "_id" : "test.abc",
    "user" : "abc",
    "db" : "test",
    "roles" : [
        {
            "role" : "read",
            "db" : "test"
        }
    ]
}

还可以查询指定的用户的权限

> db.getUser("abc")
{
    "_id" : "test.abc",
    "user" : "abc",
    "db" : "test",
    "roles" : [
        {
            "role" : "read",
            "db" : "test"
        }
    ]
}
  • 查看权限能执行操作
> db.getRole("read",{showPrivileges:true})
  • 授权(为账户分配role)
> db.grantRolesToUser("abc",[{role:"readWrite",db:"test"}])
> show users
{
    "_id" : "test.abc",
    "user" : "abc",
    "db" : "test",
    "roles" : [
        {
            "role" : "readWrite",
            "db" : "test"
        },
        {
            "role" : "read",
            "db" : "test"
        }
    ]
}
  • 取消权限
> db.revokeRolesFromUser("abc",[{role:"readWrite",db:"test"}])
> show users
{
    "_id" : "test.abc",
    "user" : "abc",
    "db" : "abc",
    "roles" : [
        {
            "role" : "read",
            "db" : "test"
        }
    ]
}
3.4 用户登录

启动mongo客户端时登录,其中 --authenticationDatabase "admin"表示用户在admin数据库中。

mongo --host 192.168.100.123 --port 27017 -u "user123" -p "123456" --authenticationDatabase "admin"

进入mongo客户端后登录

mongo --host 192.168.100.123 --port 27017
use admin
db.auth("user123","123456")
3.5 修改密码(需要admin管理员权限)
db.changeUserPassword("user123","password456")
3.6 删除用户(需要admin管理员权限)
db.dropUser("user123")

相关文章

  • MongoDB认证和授权

    MongoDB认证和授权详解MongoDB安全介绍及配置身份认证MondoDB安全 要想了解MongoDB的权限必...

  • MongoDB 安全

    MongoDB Security Documentation 安全 MongoDB提供了多种特性,如 authen...

  • MongoDB-CentOS

    Centos 7.5安装配置MongoDB 4.0.4Mongodb密码安全设置

  • MongoDB - 安全

    MongoDB的安全模式默认是关闭的,无需账号密码就可以访问数据库,使用和开发时比较便利,这在一个可信任的网络环境...

  • MongoDB安全

    MongoDB对数据安全提供了多种保证,其中包含验证、访问控制、加密来确保部署的数据安全。 1.开启访问控制强制校...

  • mongodb副本集搭建

    非安全认证 环境说明 Linux:CentOS7MongoDB:mongodb-linux-x86_64-ente...

  • mongodb3 之单一用途聚合

    mongodb3相比于mongodb2在性能和安全上具有很大提升。mongodb3比较新的的资料在mongodb的...

  • mongoDB用户认证

    MongoDB默认是不创建用户,但是为了保证的MongoDB数据的安全,就需要给MongoDB配置用户和分配操作权...

  • mongoDB 实操杂记

    文章索引 下载 mongoDB,服务器上的安装、开启关闭、环境变量配置 mongoDB安全 mongoDB三方库m...

  • mongo(十八:安全架构)

    MongoBD安全架构:认证鉴权审计加密 MongoDB 用户认证方式 MongoDB 集群节点认证 传输加密 落...

网友评论

    本文标题:MongoDB - 安全

    本文链接:https://www.haomeiwen.com/subject/ymeyzxtx.html