MongoDB安全配置规范

一、  背景

  著名安全专家兼Shodan搜索引擎的创建者John Matherly发现,超过650TBMongoDB数据因数据库配置不当而暴露在互联网上,其中的大多数数据库都托管在Amazon.com、阿里巴巴集团和DigitalOcean运营的云计算平台上。

  MongoDB的安全模式默认是关闭的,无需账号密码就可以访问数据库,使用和开发时比较便利,这在一个可信任的网络环境中还可以接受。但如果未启用安全模式的MongoDB暴露在外网环境下,数据就是在裸奔,风险极大。MongoDB内置了完善的安全机制,我们可以利用这些功能来提高MongoDB服务的安全性。

二、基线目标

  通过在系统生命周期不同阶段对目标系统展开各类安全检查,找出不符合基线定义的安全配置项并选择和实施安全措施来控制安全风险,并通过对历史数据的分析获得系统安全状态和变化趋势。

三、MongoDB常见漏洞特征

1、MongoDB常见漏洞

  近日,大批量的MongoDB实例因为配置漏洞遭遇了攻击,黑客无需身份认证即可登录MongoDB实例,从而删除了大量数据,并勒索受害者支付赎金才能要回自己的数据。截止目前为止,被劫持的MongoDB实例已经达到了一个惊人的数量。更加可恶的是,黑客在删除完业务数据库后,在里面的数据库留下了这段嘲讽+敲诈的文章。中招的主要原因还是因为用户的安全意识比较薄弱,部署的 MongoDB 完全没有任何安全防护,可以通过公网访问,并且没有开启鉴权。

2、 满足以下条件MongoDB实例存在此安全隐患

  通过调查,我们发现遭遇黑客攻击的MongoDB实例需要同时具备以下两个条件:

  l MongoDB实例免密码登陆

  l MongoDB实例能被公网访问到

  通过上述的原因分析,一般都是以下两种原因引发了悲剧:

  l MongoDB使用者安全意识不高(认为数据可有可无,并非关键性服务)

  l MongoDB使用者的运维能力薄弱,根本没想到这一点

四、  MongoDB安全规范

1、 指定允许访问的IP

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

 启动时指定ip

mongod --bind_ip 127.0.0.1,192.168.100.123

  2) 通过配置文件/etc/mongodb.conf 指定ip

# network interfaces
net:
  port: 27017
  bindIp: 192.168.100.123

  实际测试,发现在MongoDB 3.4版本中只能指定127.0.0.1(本地)或0.0.0.0(所有ip),如果指定具体的ip启动时会报错,4.0以上的版本已经解决了这个问题。

  3) 如果仅对内网服务器提供服务,建议禁止将MongoDB服务发布到互联网上,并在主机上通过防火墙或安全组限制访问源IP。

2、 设置监听端口

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

启动时指定端口

mongod --port 27017

配置文件(/etc/mongodb.conf)中指定端口

# network interfaces
net:
  port: 27017

3、开启身份认证 

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

通过启动参数开启

mongod --auth

通过配置文件(/etc/mongodb.conf)开启

security:
  authorization: enabled

4、使用root用户运行MongoDB

  创建单独的用户来管理MongoDB进程,不要用root帐号启动。

5、配置基于角色的访问控制

  MongoDB支持SCRAMx.509证书认证等多种认证机制,SCRAMSalted Challenge Response Authentication Mechanism)是3.x版本的默认认证机制,该机制通过用户名、密码验证,基于用户角色进行访问控制。

  首先创建一个管理员账号,然后创建其它的普通用户,为访问系统的每个应用程序创建一个唯一的MongoDB用户。

创建角色,以定义一组用户所需的确切访问权限,遵循最小特权原则。然后创建用户,并仅为其分配执行操作所需的角色。

在开始之前需要了解一下概念:

  1)启用访问控制:

  MongoDB使用的是基于角色的访问控制(Role-Based Access Control,RBAC)来管理用户对实例的访问。通过对用户授予一个或多个角色来控制用户访问数据库资源的权限和数据库操作的权限,在对用户分配角色之前,用户无法访问实例。

  在实例启动时添加选项 — auth 或指定启动配置文件中添加选项 auth=true

  2)角色:

  在MongoDB中通过角色对用户授予相应数据库资源的操作权限,每个角色当中的权限可以显式指定,也可以通过继承其他角色的权限,或者两都都存在的权限。

  3)权限:

  权限由指定的数据库资源(resource)以及允许在指定资源上进行的操作(action)组成。

   a. 资源(resource)包括:数据库、集合、部分集合和集群;

   b. 操作(action)包括:对资源进行的增、删、改、查(CRUD)操作。

   在角色定义时可以包含一个或多个已存在的角色,新创建的角色会继承包含的角色所有的权限。在同一个数据库中,新创建角色可以继承其他角色的权限,在 admin数据库中创建的角色可以继承在其它任意数据库中角色的权限。

  4) 常用的内置角色:

   l 数据库用户角色:readreadWrite;

   l 所有数据库用户角色:readAnyDatabasereadWriteAnyDatabase

   l userAdminAnyDatabasedbAdminAnyDatabase

 

   l 数据库管理角色:dbAdmindbOwneruserAdmin

   l 集群管理角色:clusterAdminclusterManagerclusterMonitorhostManager; 备份恢复角色:backuprestore

   l 超级用户角色:root 内部角色:system

  5) 角色说明:

 

参考:https://mongoing.com/docs/administration/security-checklist.html