美文网首页mongoDBrua
Mongo安全 之 SSL

Mongo安全 之 SSL

作者: 诺之林 | 来源:发表于2017-06-01 15:45 被阅读166次

    目录

    引言

    上一篇Mongo安全 之 鉴权的文章中 我们讨论Mongo的鉴权和权限控制

    这一篇我们将详细讨论如何打开和配置Mongo SSL 即Mongo安全 之 SSL

    下一篇Mongo安全 之 拾遗我们还会讨论Mongo安全的其他方面

    安装

    在正式开始讨论SSL之前 我们先搭建Mongo服务 以验证SSL问题

    安装Mongo

    上一篇Mongo安全 之 鉴权中我们介绍了使用Docker安装Mongo的方法 这里将介绍基于Ubuntu 1604 LTS使用apt包管理器安装最新Mongo的方法

    sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6
    
    echo "deb [ arch=amd64,arm64 ] http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list
    
    sudo apt-get update
    
    sudo apt-get install -y mongodb-org
    

    其他系统的安装方法可以参考Install MongoDB Community Edition

    运行Mongo

    sudo service mongod start
    

    如果想要重启Mongo服务 可以使用restart参数

    普通连接

    通过上述安装和运行命令之后 我们就可以访问Mongo了

    mongo --host 192.168.56.101
    

    默认配置下 除主机外是无法访问Mongo服务的 需要删除或注释掉/etc/mongodb.conf中的"bindIp: 127.0.0.1"后重启Mongo服务 关于bindIp的更多介绍 可以参考Mongo安全 之 拾遗

    # 切换至auth数据库 如果没有该数据库则新建
    use auth
    
    # 创建collection "users"
    db.createCollection("users")
    

    上述连接的Mongo地址192.168.56.101为本文测试地址 请根据实际情况替换成相应的Mongo地址

    然后 我们打开WireShark工具抓取指定网卡的网络包

    关于Wireshark的使用教程 请读者自行搜索参考

    接着 我们进行插入数据库的操作

    # 向collection "users"插入数据
    db.users.insert({"email": "test@test.com", "password": "password"})
    

    此时 WireShark抓取的数据包 如下图所示

    mongo-ssl-01.png

    从图中我们可以看到 此时发送的数据都是明文的 这点和HTTP类似 因此 才有了下面要讨论的SSL

    SSL连接

    制作证书

    在使用SSL连接之前 我们首先需要制作相关的证书

    这里 我们使用openssl来制作和管理自己的证书 命令如下

    sudo openssl req -newkey rsa:2048 -new -x509 -days 365 -nodes -out mongodb-cert.crt -keyout mongodb-cert.key
    sudo cat mongodb-cert.key mongodb-cert.crt > mongodb.pem
    
    sudo openssl req -newkey rsa:2048 -new -x509 -days 365 -nodes -out client-cert.crt -keyout client-cert.key
    sudo cat client-cert.key client-cert.crt > client.pem
    

    更新配置

    制作完证书之后 我们需要更新Mongo配置以使用这些证书 修改/etc/mongod.conf文件中的net内容如下

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

    接着 不要忘记重启Mongo服务

    sudo service mongod restart
    

    下载证书

    成功配置Mongo服务之后 我们还需要下载证书以在客户端使用

    scp username@192.168.56.101:/etc/ssl/*.pem ~/Downloads
    

    连接数据库

    准备好Mongo服务和证书之后 客户端就可以和Mongo服务建立SSL连接了

    mongo --host 192.168.56.101:27017 --ssl --sslPEMKeyFile ~/Downloads/client.pem --sslCAFile ~/Downloads/mongodb.pem
    

    然后 对数据库进行操作

    use auth
    
    db.createCollection("users")
    

    接着 向数据库插入一条数据 同时 打开WireShark进行抓包

    db.users.insert({"email": "test@test.com", "password": "password"})
    

    此时 在插入数据的时候 WireShark抓包的网络包 如下图所示

    mongo-ssl-02.png

    从图中我们可以看到 此时发送的数据都是加密后的数据 由此SSL配置成功

    小结

    SSL作为网络开发的标准配置 在开发任何网络系统时都是有必要考虑和添加的

    本文配合Nginx配置实战中的HTTPS 可以使用最小的代价(只需要申请相应证书) 实现最高的安全性

    这么划算的买卖 还在犹豫什么呢?

    参考

    更多文章, 请支持我的个人博客

    相关文章

      网友评论

        本文标题:Mongo安全 之 SSL

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