如何在Linux或Unix生产服务器上保护MongoDB

时间:2020-01-09 10:39:41  来源:igfitidea点击:

我使用MongoDB用于在由Ubuntu Linux驱动的面向公众的云服务器上存储数据。
如何在Linux或Unix操作系统上保护和保护我的MongoDB nosql服务器?

MongoDB是免费的开源NoSQL文档数据库服务器。

Web应用程序使用它在面向公众的服务器上存储数据。
确保MongoDB的安全至关重要。
黑客和黑客正在访问不安全的MongoDB,以窃取数据并从未修补或配置错误的数据库中删除数据。
在本教程中,您将学习"如何保护运行云服务器的MongoDB实例或服务器"。

MongoDB配置

  • 缺省文件位于/etc/mongodb.conf
  • 默认端口是TCP 27017
  • MongoDB服务器版本:3.4.1

限制暴露在网络中

编辑/etc/mongodb.conf或/usr/local/etc/mongodb.conf文件,执行:

$ sudo vi /etc/mongodb.conf

如果您的Web应用程序和MongoDB(mongod服务器)安装在同一台计算机上,请将MongoDB的IP地址设置为127.0.0.1。
这直接减少了来自互联网的通信:

# network interfaces
net:
  port: 27017
  bindIp: 127.0.0.1

但是,可能有两个或多个服务器,如下所示:
在VLAN内运行MonoDB的示例现代Web应用程序

您需要将mongod绑定到192.168.1.7,以便只能通过VLAN访问它:

bindIp: 192.168.1.7

bind_ip指令确保MongoDB在受信任的网络环境中运行,并限制MongoDB实例侦听传入连接的接口。

更改默认端口

您也可以根据需要更改默认端口。
在此示例中,将其设置为2727:

port: 2727

保存并关闭文件。
您需要重新启动MongoDB,执行:

$ sudo systemctl restart mongod

或者,如果您使用的是FreeBSD Unix:

# service mongod restart

使用netstat命令验证打开的端口:

$ netstat -tulpn
$ ss -tulpn
$ sockstat #freebsd unix command
$ ss -tulpn | grep 27017
$ netstat -tulpn | grep 27017

输出示例:

tcp        0      0 127.0.0.1:27017         0.0.0.0:*               LISTEN      6818/mongod

设置访问控制

您需要将用户管理员添加到在没有访问控制的情况下运行的MongoDB实例,然后启用访问控制。
默认情况下,任何人都可以连接到MongoDB,这不是一个好主意。
例如:gif动画01:使用任何身份验证将mongo shell连接到实例

连接到数据库实例

$ mongo
## 或者
$ mongo --port 2727

创建用户管理员

警告:使用强密码创建用户。
出于演示目的,我在这里使用mySuperSecretePasswordHere,但您应该使用强密码。

您需要使用管理数据库。
在>提示符下执行以下命令以创建您的超级用户:

> use admin
`switched to db admin`

接下来,使用userAdminAnyDatabase角色在管理数据库中创建用户Hyman:

> db.createUser({user:"Hyman",pwd:"mySuperSecretePasswordHere", roles:[{role:"userAdminAnyDatabase",db:"admin"}]})

输出示例:

Successfully added user: {
	"user" : "Hyman",
	"roles" : [
		{
			"role" : "userAdminAnyDatabase",
			"db" : "admin"
		}
	]
}

通过执行以下命令来断开mongo shell:

> exit

重新启动MongoDB实例

编辑/etc/mongodb.conf或/usr/local/etc/mongodb.conf文件,执行:

$ sudo vi /etc/mongodb.conf

开启安全性:

security:
  authorization: enabled

保存并关闭文件。
重新启动MongoDB实例:

$ sudo systemctl restart mongodb

或者,如果您使用的是FreeBSD Unix:

# service mongod restart

要在连接期间使用用户名和管理员数据库的密码进行身份验证,请执行以下操作:

$ mongo -u Hyman -p mySuperSecretePasswordHere --authenticationDatabase admin

将其他用户添加到您的数据库。
首先创建一个名为theitroad的新数据库:

> use theitroad
`switched to db theitroad`

为theitroad数据库创建一个名为nixdbuser的用户,并使用一个名为myKoolPassowrd的密码:

db.createUser(
     {
       USER: "nixdbuser",
       pwd: "myKoolPassowrd",
       roles: [ { ROLE: "readWrite", db: "theitroad" },
                { ROLE: "read", db: "reporting" } ]
     }
   )

输出示例:

Successfully added user: {
	"user" : "nixdbuser",
	"roles" : [
		{
			"role" : "readWrite",
			"db" : "theitroad"
		},
		{
			"role" : "read",
			"db" : "reporting"
		}
	]
}

现在,您可以按以下方式连接到theitroad db:

$ mongo --port 27017 -u "nixdbuser" -p "myKoolPassowrd" --authenticationDatabase "theitroad"

确保只有名叫Hyman的授权管理员用户才能执行命令,或者nixdbuser可以对theitroad db进行读/写操作。
您可以通过插入记录来进行如下验证:

> use theitroad
> db
> db.names.insert({"title":"Mr", "last":"Gite", "First":"Hyman"})
> db.names.find()
> show dbs

使用防火墙

使用防火墙来限制允许其他实体连接到您的mongodb服务器。
在此示例中,仅允许您的应用程序服务器在Ubuntu或Debian Linux上使用ufw访问数据库:

$ sudo ufw allow proto tcp from 192.168.1.5 to 192.168.1.7 port 27017
$ sudo ufw allow proto tcp from 192.168.1.6 to 192.168.1.7 port 27017

启用SSL

通过Internet连接到Mongodb服务器时,在MongoDB客户端和服务器之间使用SSL。
否则,您的会话将向中级攻击者开放。
我的设置如下:

mongodb-server: 127.0.0.1
  mongodb-client: 127.0.0.1
  Common Name (e.g. server FQDN or YOUR name) []: 127.0.0.1
  The PEM pass phrase for server: mongodb_server_test_ssl
  The password/passphrase for client: mongodb_client_test_ssl

执行以下命令设置服务器证书

MongoDB SSL设置服务器证书

$ sudo mkdir /etc/ssl/mongodb/
$ cd /etc/ssl/mongodb/
$ sudo openssl req -new -x509 -days 365 -out mongodb-server-cert.crt -keyout mongodb-server-cert.key

使用密钥和证书创建服务器.pem文件:

$ cd /etc/ssl/mongodb/
$ sudo bash -c 'cat mongodb-server-cert.key mongodb-server-cert.crt > mongodb-server.pem'

执行以下命令设置客户端证书

MongoDB SSL设置客户端证书

$ cd /etc/ssl/mongodb/
$ sudo openssl req -new -x509 -days 365 -out mongodb-client-cert.crt -keyout mongodb-client-cert.key

使用密钥和证书创建客户端.pem文件:

$ cd /etc/ssl/mongodb/
$ sudo bash -c 'cat mongodb-client-cert.key mongodb-client-cert.crt > mongodb-client.pem'

为TLS/SSL服务器配置mongod和mongos

编辑/etc/mongodb.conf或/usr/local/etc/mongodb.conf文件,执行:

$ sudo vi /etc/mongodb.conf

如下更新配置文件:

# network interfaces
net:
  port: 27017
  bindIp: 127.0.0.1
  ssl:
     mode: requireSSL
     PEMKeyFile: /etc/ssl/mongodb/mongodb-server.pem
     CAFile: /etc/ssl/mongodb/mongodb-client.pem
     PEMKeyPassword: mongodb_server_test_ssl

保存并关闭文件。
重新启动MongoDB实例:

$ sudo systemctl restart mongodb

或者,如果您使用的是FreeBSD Unix:

# service mongod restart

MongoDB客户端的TLS/SSL配置

mongo shell接口的语法如下:

$ mongo --ssl --sslCAFile /etc/ssl/mongodb/mongodb-server.pem \
--sslPEMKeyFile /etc/ssl/mongodb/mongodb-client.pem \
--sslPEMKeyPassword mongodb_client_test_ssl \
--host 127.0.0.1 --port 27017 \
--u "nixdbuser" -p "myKoolPassowrd" --authenticationDatabase "theitroad"

这是一个用于连接启用SSL的MongoDB的Python客户端:

client = pymongo.MongoClient('127.0.0.1', ssl=True)

或者

client = pymongo.MongoClient('127.0.0.1',
                              ssl=True,
                              ssl_certfile='/etc/ssl/mongodb/mongodb-client.pem',
                              ssl_keyfile='/etc/ssl/mongodb/mongodb-server.pem',
                              ssl_pem_passphrase=mongodb_client_test_ssl)