一、认证Authentication
1、创建用户: db.createUser( { user: "reportsUser", pwd: "12345678", roles: [ { role: "read", db: "reporting" }, { role: "read", db: "products" }, { role: "read", db: "sales" }, { role: "readWrite", db: "accounts" } ] } )2、认证机制 Authentication Mechanisms SCRAM-SHA-1 MONGODB-CR x.509 ---------------------用于客户端认证以及副本集和分片群集成员的内部认证 3.0版本之后默认用SCRAM-SHA-1 之前默认用MONGODB-CR3、企业认证机制Enterprise Authentication Mechanisms Kerberos身份验证 ------------------------大型客户机/服务器系统的行业标准认证协议 LDAP代理身份验证4、内部认证Internal Authentication--------------------------------------------------------------
二、启用身份验证1)步骤: 1、启动没有访问控制的MongoDB --------- mongod --port 27017 --dbpath /data/db1 2、连接到实例--------------------------------- mongo --port 27017 3、创建用户管理员---------------------------- use admin db.createUser( { user: "myUserAdmin", pwd: "abc123", roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]}
) 4、用访问控制重新启动MongoDB实例--- mongod --auth --port 27017 --dbpath /data/db1 5、以用户管理员身份进行连接和身份验证-- mongo --port 27017 -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin" 6、根据需要为您的部署创建其他用户------- use test db.createUser( { user: "myTester", pwd: "xyz123", roles: [ { role: "readWrite", db: "test" }, { role: "read", db: "reporting" } ] } ) 7、作为myTester连接和认证。------------- mongo --port 27017 -u "myTester" -p "xyz123" --authenticationDatabase "test"2)管理用户与角色
1、 新增角色 use admin db.createRole( { role: "manageOpRole", privileges: [ { resource: { cluster: true }, actions: [ "killop", "inprog" ] }, { resource: { db: "", collection: "" }, actions: [ "killCursors" ] } ], roles: [] } ) 2、修改现有用户的访问权限 db.getUser() and db.getRole() methods.来获取用户和角色 db.revokeRolesFromUser() method 回收一个用户的角色 use reporting db.revokeRolesFromUser( "reportsUser", [{ role: "readWrite", db: "accounts" } ] ) db.grantRolesToUser() method 授予一个用户的角色3、修改现有用户的密码
db.changeUserPassword() method. db.changeUserPassword("reporting", "SOh3TbYhxuLiW8ypJPxmt1oOfL") 4、查看用户的角色 db.getUser() method 5、查看角色的权限 db.getRole() method3)更改您的密码和自定义数据
To modify your own password and custom data, you must have privileges that grant changeOwnPassword and changeOwnCustomData actions respectively
on the user’s database.
建立个角色 包含changeOwnPassword 和changeOwnCustomData 权限;
然后分配给一个用户;
通过db.updateUser() method to update the password and custom data; use test db.updateUser( "user123", { pwd: "KNlZmiaNUp0B", customData: { title: "Senior Manager" } } )三、 基于角色的访问控制 MongoDB采用基于角色的访问控制(RBAC)来管理对MongoDB系统的访问。用户被授予一个或多个角色,以确定用户对数据库资源和操作的访问 权限。
在角色分配之外,用户不能访问系统。
1) 内置角色
Built-in database user roles and database administration roles roles exist in each database
database user roles数据库用户角色: read and readWrite database administration roles数据库管理角色:dbAdmin、dbOwner and userAdminCluster Administration Roles 群集管理角色: clusterAdmin 、clusterManager、clusterMonitor and hostManager
Backup and Restoration Roles 备份和恢复角色:backup and restore All-Database Roles 全数据库角色 :readAnyDatabase 、readWriteAnyDatabase、userAdminAnyDatabase and dbAdminAnyDatabase Superuser Roles 超级用户角色:root Internal Role内部角色:__system 除特殊情况以外,不要将此角色分配给表示应用程序或人员管理员的用户对象。 2)用户定义的角色 添加角色时,可以在特定数据库中创建角色。 MongoDB使用数据库和角色名称的组合来唯一地定义一个角色 除了在admin数据库中创建的角色外,角色只能包含适用于其数据库的权限,并且只能从其数据库中的其他角色继承。 MongoDB将所有角色信息存储在admin数据库的system.roles集合中3)集合级访问控制
管理员可以通过用户定义的角色实现集合级访问控制。通过创建具有特定数据库中特定集合的特权的角色, 管理员可以为用户提供授予集合级别权限的角色。 privileges: [ { resource: { db: "products", collection: "inventory" }, actions: [ "find", "update", "insert" ] }, { resource: { db: "products", collection: "orders" }, actions: [ "find" ] } ]四、Encryption 加密1)Transport Encryption 传输加密
MongoDB支持TLS / SSL(传输层安全/安全套接字层)来加密所有MongoDB的网络流量。
TLS / SSL确保MongoDB网络流量只能由预期的客户端读取。1、为TLS / SSL配置mongod和mongos
1.1---------使用SSL证书和密钥设置mongod和mongos
mongod --sslMode requireSSL --sslPEMKeyFile <pem>
例如:mongod --sslMode requireSSL --sslPEMKeyFile /etc/ssl/mongodb.pem1.2--------设置证书验证mongod和mongos
mongod --sslMode requireSSL --sslPEMKeyFile <pem> --sslCAFile <ca> mongod --sslMode requireSSL --sslPEMKeyFile /etc/ssl/mongodb.pem --sslCAFile /etc/ssl/ca.pem要防止具有吊销证书的客户端连接,请包含sslCRLFile以指定包含吊销证书的.pem文件。
mongod --sslMode requireSSL --sslCRLFile /etc/ssl/ca-crl.pem --sslPEMKeyFile /etc/ssl/mongodb.pem --sslCAFile /etc/ssl/ca.pem仅在客户提交证书时进行验证:加上 --sslAllowConnectionsWithoutCertificates 选项
要防止MongoDB服务器接受使用特定协议的传入连接,请包括--sslDisabledProtocols选项,或者如果使用配置文件net.ssl.disabledProtocols设置
2、客户端的TLS / SSL配置
-------------------mongo Shell SSL配置------------------------
2.1使用SSL加密连接到MongoDB实例 mongo --ssl --host hostname.example.com --sslCAFile /etc/ssl/ca.pem2.2连接到需要客户端证书的MongoDB实例
mongo --ssl --host hostname.example.com --sslPEMKeyFile /etc/ssl/client.pem --sslCAFile /etc/ssl/ca.pem 连接到提供证书时验证的MongoDB实例 (MongoDB 3.2.6添加了对系统CA存储检查证书的支持,允许您使用--ssl选项运行mongo shell, 而不包括--sslCAFile或sslAllowInvalidCertificates) mongo --ssl --host hostname.example.com --sslCAFile /etc/ssl/ca.pem mongo --ssl --host hostname.example.com --sslPEMKeyFile /etc/ssl/client.pem --sslCAFile /etc/ssl/ca.pem -------------------mongo Shell SSL配置 end---------------------3、升级群集以使用TLS / SSL
To upgrade from a MongoDB cluster using no TLS/SSL encryption to one using only TLS/SSL encryption
use the following rolling upgrade process:3.1对于群集的每个节点,使用选项--sslMode设置为允许SSL启动节点
mongod --replSet <name> --sslMode allowSSL --sslPEMKeyFile <path to TLS/SSL Certificate and key PEM file> --sslCAFile <path to root CA PEM file> 3.2切换所有客户端以使用TLS / SSL 3.3对于群集的每个节点,请使用setParameter命令将sslMode更新为preferSSL。 db.adminCommand( { setParameter: 1, sslMode: "preferSSL" } )------------该节点同时接受TLS / SSL和非TLS /非SSL入局连接3.4对于群集的每个节点,请使用setParameter命令将sslMode更新为requireSSL。
db.adminCommand( { setParameter: 1, sslMode: "requireSSL" } ) ----以requireSSL作为其net.ssl.mode,节点将拒绝任何非TLS /非SSL连接 3.5所有节点升级后,使用适当的TLS / SSL设置编辑配置文件,以确保在随后重新启动时,群集使用TLS / SSL。4、为FIPS配置MongoDB
联邦信息处理标准(FIPS)是美国政府的计算机安全标准,用于对安全地加密和解密数据的软件模块和库进行认证。
您可以将MongoDB配置为使用经过FIPS 140-2认证的OpenSSL库运行。配置FIPS默认运行或根据需要从命令行运行。 4.1配置MongoDB以使用TLS / SSL 4.2以FIPS模式运行mongod或mongos实例 4.2.1改变配置文件 net: ssl:FIPSMode: true
4.2.2 用配置文件启动mongod或mongos实例。mongod --config /etc/mongod.conf 4.3确认FIPS模式正在运行 FIPS 140-2 mode activated五、 Auditing 审计
MongoDB Enterprise包含mongod和mongos实例的审计功能。
审计工具允许管理员和用户跟踪多个用户和应用程序部署的系统活动。 审计系统将每个审计事件写入审计事件的内存缓冲区。 MongoDB定期将此缓冲区写入磁盘 如果审计事件条目对应于影响数据库持久状态的操作(如对数据的修改),那么在写入该条目的日志之前,MongoDB将始终将审计事件 写入磁盘,也就是说,在向日志添加操作之前,MongoDB会将所有审计事件写入触发操作的连接,直到操作的入口。These auditing guarantees require that MongoDB run with journaling enabled.-------------------- 配置审计---------------------------
1、启用并配置审计输出
Use the --auditDestination option to enable auditing 1.1 Output to Syslog mongod --dbpath data/db --auditDestination syslog 1.2 Output to Console mongod --dbpath data/db --auditDestination console 1.3 Output to JSON File --auditDestination设置指定文件,为--auditFormat设置指定JSON, 为--auditPath指定输出文件名。 --auditPath选项接受全路径名或相对路径名。 mongod --dbpath data/db --auditDestination file --auditFormat JSON --auditPath data/db/auditLog.json 1.4 Output to BSON File mongod --dbpath data/db --auditDestination file --auditFormat BSON --auditPath data/db/auditLog.bson------------------配置审计筛选器-------------------
MongoDB Enterprise支持各种操作的审计。如果启用,默认情况下,审计工具将记录审计事件操作,
详细信息和结果中详细描述的所有可审计操作。要指定要记录哪些事件,审计功能将包含--auditFilter选项。 例如: 删选多种操作类型 mongod --dbpath data/db --auditDestination file --auditFilter '{ atype: { $in: [ "createCollection", "dropCollection" ] } }' --auditFormat BSON --auditPath data/db/auditLog.bson六 Security Hardening 安全强化
1、MongoDB配置强化
1.1 HTTP状态接口
HTTP状态界面提供了一个基于Web的界面,其中包括有关mongod或mongos实例的各种操作数据,日志和状态报告。
HTTP状态界面默认是禁用的,不建议用于生产。1.2 REST API
REST API到MongoDB提供额外的信息,并在HTTP状态接口上写入访问。虽然REST API不提供对插入,更新或删除操作的任何支持, 但确实提供了管理访问权限,其可访问性表示安全环境中的漏洞。1.3 bind_ip
mongod和mongos实例的net.bindIp设置(或--bind_ip命令行选项)限制了MongoDB程序监听传入连接的网络接口。
2、强化网络基础设施
2.1 防火墙
防火墙允许管理员通过提供对网络通信的细粒度控制来过滤和控制对系统的访问。
对于MongoDB的管理员,以下功能非常重要:限制特定端口上的传入流量到特定系统,并限制来自不受信任主机的传入流量。2.2虚拟专用网络vpn
虚拟专用网络或VPN使得通过加密和有限访问的可信网络连接两个网络成为可能。 通常,使用VPN的MongoDB用户使用TLS / SSL而不是IPSEC VPN来解决性能问题。 根据配置和实现,VPN提供证书验证和加密协议选择,这需要对所有客户端进行严格的身份验证和身份验证。 此外,由于VPN提供了一个安全隧道,通过使用VPN连接来控制对MongoDB实例的访问,您可以防止篡改和“中间人”攻击。https://docs.mongodb.com/manual/reference/security/