如何在Linux或Unix生产服务器上保护MongoDB
我使用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)