lyhabc 发表于 2016-01-22 23:57

安全部署MongoDB最佳实践

#1: 不要把MongoDB服务器部署在互联网上或者DMZ里

MongoDB和其他的后端服务器一样,不应该部署在DMZ里,更不用说直接部署在互联网上面。你应该把MongoDB部署在公司内部网络,使用路由器或防火墙技术把MongoDB服务器保护起来,

不允许直接从互联网访问MongoDB的端口。 通过这种方式来防止未授权的访问及DDoS攻击等。

另外,如果MongoDB所在的服务器上有多个网卡,建议使用bind_ip来进一步限制MongoDB会在哪一个网络接口上监听。

#2: 为你的MongoDB实例启用安全模块

默认情况下MongoDB不会启动安全模块。任何人只要可以连接到你的MongoDB所在的服务器即可连接到你的MongoDB数据库并执行任意操作。 这些操作包括导出所有数据和配置,执行任意的Javascript,修改库内数据和删除数据等等。 为防止这些,MongoDB建议你始终要用安全模式启动MongoDB实例, 并为需要访问数据库的用户建立相应的权限。参见 权限控制 获得更多信息。

#3: 使用SSL

MongoDB集群之间以及从客户端连接到MongoDB实例的连接应该使用SSL。使用SSL对性能没有影响并且可以防范类似于man-in-the-middle的攻击。参见 配置SSL 以获得更多信息。 注意MongoDB社区版默认并不支持SSL。你可以选用MongoDB企业版(有SSL支持),或者从源码重新编译MongoDB并使用 —ssl 选项来获得SSL功能。

#4: 禁止HTTP和REST端口

MongoDB自己带有一个HTTP服务和并支持REST接口。在2.6以后这些接口默认是关闭的。不要开启这些服务和端口 – 他们的存在只是用于向后兼容。
web管理界面查看mongodb的一些状况


#5: 合理配置用户权限

MongoDB提供一个非常灵活的角色权限控制机制。你应该了解其正确使用。以下是一些不建议的做法:

仅仅使用一个高权限用户(如root)来执行所有操作
给一个用户多于他需要的权限
使用弱密码或者多个账号同用一个密码
删除数据库后没有删除相应的用户
MongoDB建议只分配给用户恰好足够的权限。使用复杂的密码并及时对无效用户做清理。

#6: 合理配置操作系统权限

不要使用root或者其他高权限用户来启动MongoDB。MongoDB不需要很多权限,一个普通用户以及对数据目录的读写访问一般就足够了。另外,对以下文件要配置好合适的文件权限,如,只允许mongod用户自己进行读写。

数据文件
秘钥、证书文件(只读)
日志文件
#7: 保护好秘钥文件

秘钥文件相当于密码, 应该使用操作系统文件权限来保护该文件不被其他用户(root除外)读取 。

#8: SSL配置须知

SSL是一个复杂的协议,需要妥善的配置才可以防止可能的安全漏洞。以下几点应该遵循:

给MongDB实例一个或多个CA用以认证。
不要使用自签名证书 – 除非你只需要用来做数据加密。自签名证书无法防止man-in-the-middle
#9: 使用审计功能

审计功能可以用来记录用户对数据库的所有相关操作。这些记录可以让系统管理员在需要的时候分析数据库在什么时段发生了什么事情。具体请参见配置审计功能

审计功能是一个MongoDB企业版的功能,在社区版中不支持。


安装
我自己的



yum install -y openssl-devel openssl
cd /download/
curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.0.7.tgz

tar -zxvf mongodb-linux-x86_64-2.6.6.tgz -C /usr/local/
mv /usr/local/{mongodb-linux-x86_64-2.6.6,mongodb}
touch /usr/local/mongodb/mongo.pid
mkdir -pv /data/mongodb/{data,logs}
echo 'export PATH=/usr/local/mongodb/bin:$PATH'>>/root/.bashrc


vim /etc/mongod.conf
port=27017
dbpath=/data/mongodb/data/
logpath=/data/mongodb/logs/mongo.log
pidfilepath=/usr/local/mongodb/mongo.pid
fork=true
logappend=true
oplogSize=2048
shardsvr=true
directoryperdb=true
#auth = true   

-----------------------------------------------------
dbpath=data/mongodb/data/   #数据存放目录
logpath=/data/mongodb/logs/mongo.log#日志文件目录
pidfilepath=/usr/local/mongodb/mongo.pid#pid端口文件

port=27017   #mongodb端口

logappend=true   #追加方式写日志文件
fork=true      #后台运行
journal=true   #启用日志选项,MongoDB的数据操作将会写入到journal文件夹的文件里
oplogSize=2048   #同步操作记录文件大小(MB)
smallfiles=true#使用较小的默认文件
#auth = true         #是否开启安全验证
replSet=dbset    #副本集名称,同一个副本集,名称必须一致
------------------------------------------------------------------


groupadd mongodb
useradd -g mongodb -s /sbin/nologin -d /dev/null mongodb //-d 指定家目录为/dev/null
chown -R mongodb:mongodb /data/mongodb/
chown -R mongodb:mongodb /usr/local/mongodb/

启动mongodb
/usr/local/mongodb/bin/mongod -f /etc/mongod.conf


vi /etc/init.d/mongod

## 添加init配置文件
#!/bin/bash
# mongod - Startup script for mongod
# chkconfig: 35 85 15
# description: Mongo is a scalable, document-oriented database.
# processname: mongod
# config: /etc/mongod.conf
# pidfile: /usr/local/mongodb/mongo.pid
. /etc/rc.d/init.d/functions
# things from mongod.conf get there by mongod reading it
# NOTE: if you change any OPTIONS here, you get what you pay for:
# this script assumes all options are in the config file.
CONFIGFILE="/etc/mongod.conf"
OPTIONS=" -f $CONFIGFILE"
#SYSCONFIG="/etc/sysconfig/mongod"
# FIXME: 1.9.x has a --shutdown flag that parses the config file and
# shuts down the correct running pid, but that's unavailable in 1.8
# for now.This can go away when this script stops supporting 1.8.
DBPATH=`awk -F= '/^dbpath[[:blank:]]*=[[:blank:]]*/{print $2}' "$CONFIGFILE"`
PIDFILE=`awk -F= '/^pidfilepath[[:blank:]]*=[[:blank:]]*/{print $2}' "$CONFIGFILE"`
mongod=${MONGOD-/usr/local/mongodb/bin/mongod}
MONGO_USER=mongodb
MONGO_GROUP=mongodb
if [ -f "$SYSCONFIG" ]; then
    . "$SYSCONFIG"
fi
# Handle NUMA access to CPUs (SERVER-3574)
# This verifies the existence of numactl as well as testing that the command works
NUMACTL_ARGS="--interleave=all"
if which numactl >/dev/null 2>/dev/null && numactl $NUMACTL_ARGS ls / >/dev/null 2>/dev/null
then
    NUMACTL="numactl $NUMACTL_ARGS"
else
    NUMACTL=""
fi
start()
{
# Recommended ulimit values for mongod or mongos
# See http://docs.mongodb.org/manual/reference/ulimit/#recommended-settings
#
ulimit -f unlimited
ulimit -t unlimited
ulimit -v unlimited
ulimit -n 64000
ulimit -m unlimited
ulimit -u 32000
echo -n $"Starting mongod: "
daemon --user "$MONGO_USER" "$NUMACTL $mongod $OPTIONS >/dev/null"
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/mongod
}
stop()
{
echo -n $"Stopping mongod: "
killproc -p "$PIDFILE" -d 300 /usr/bin/mongod
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/mongod
}
restart () {
stop
start
}
RETVAL=0
case "$1" in
start)
    start
    ;;
stop)
    stop
    ;;
restart|reload|force-reload)
    restart
    ;;
condrestart)
    [ -f /var/lock/subsys/mongod ] && restart || :
    ;;
status)
    status $mongod
    RETVAL=$?
    ;;
*)
    echo "Usage: $0 {start|stop|status|restart|reload|force-reload|condrestart}"
    RETVAL=1
esac
exit $RETVAL

chmod +x /etc/init.d/mongod



chkconfig --add mongod   # --del 删除




启动 /etc/init.d/mongod start

金匀娇 发表于 2016-03-23 12:36

进来学习呢。。

reakesl111 发表于 2016-03-31 00:12

Mark 明天看,我的mongodb是用root启动的,要改

我知道就行 发表于 2016-06-22 12:09

路过~~~~~~~~~~````

lyhabc 发表于 2016-06-22 19:01

@我知道就行
谢谢支持   

elewei 发表于 2016-10-16 22:00

mark:mrgreen::mrgreen:

lgcf 发表于 2016-11-30 17:07

回复 1# lyhabc

asdfasf
页: [1]
查看完整版本: 安全部署MongoDB最佳实践