可以对副本集和分片集群的节点进行认证,对于节点的内部认证,MongoDB提供了keyfiles和x.509证书进行认证。
所选择的方法将会被用来所有的内部认证,举个栗子,当客户端使用一种支持的认证机制去连接mongos的时候,mongos就会用配置的内部认证方法去连接相应的mongod进程
注意:开启内部认证需要开启客户端认证
一、keyfiles
keyfiles使用scram挑战和响应认证机制,keyfiles的内容提供了节点共享的密码。key的长度在6到1024个字节之间,并且只能是base64的字符集
MongoDB为了跨平台的便利性过滤了空格字符(比如:X0D,X09,X20).结果就是像下面的样例会产生同样的key:
echo -e "my secret key" > key1
echo -e "my secret key\n" > key2
echo -e "my secret key" > key3
echo -e "my\r\nsecret\r\nkey\r\n" > key4
在Unix系统,keyfile 不能有group 和 world权限,在Windows系统,keyfile权限是不被检查的。
keyfile的内容在所有的mongod和mongos实例上都是一样的。必须在所有的副本集和分片集群节点都需要存储keyfile。
使用security.keyfile配置项或者--keyfile命令行选项来指定keyfile
【待续】
二、x.509
副本集和分片集群可以使用x.509证书代替keyfile来进行内部认证。MongoDB支持使用安全的tls/ssl连接来进行x.509证书认证。
注意:从4.0开始,MongoDB不再支持tls1.0加密,支持tls1.1+
三、节点证书要求:
用来进行内部认证去验证分片集群或者副本集成员关系的节点证书,必须满足下列要求:
1、所有的分片集群和副本集节点必须使用唯一的CA来发布所有的x.509证书
2、节点证书的主题,也就是DN(Distinguished Name),必须是一个非空的值,也即:Organization (O), Organizational Unit (OU) 或者 Domain Component (DC)三个属性至少一个有值。
3、证书里面的组织属性,组织单位属性,领域必须和其他的集群节点匹配。为了匹配,证书必须匹配所有规范的这些属性值,甚至是不规范的属性。对属性的顺序没有要求。
后面的样例,这两个DN的内容是匹配的,有规范的O和OU,但是没有出现DC属性
CN=host1,OU=Dept1,O=MongoDB,ST=NY,C=US
C=US, ST=CA, O=MongoDB, OU=Dept1, CN=host2
然而,下面的这两个DN内容是因为OU不匹配导致不匹配,因为一个拥有两个OU声明,而另外一个只有一个OU声明:
CN=host1,OU=Dept1,OU=Sales,O=MongoDB
CN=host2,OU=Dept1,O=MongoDB
4、Common Name (CN) 或者 Subject Alternative Name (SAN)必须匹配服务器的hostname,它将会被集群其他节点使用。
举个栗子,集群中的证书可能包含下列主题:
subject= CN=<myhostname1>,OU=Dept1,O=MongoDB,ST=NY,C=US
subject= CN=<myhostname2>,OU=Dept1,O=MongoDB,ST=NY,C=US
subject= CN=<myhostname3>,OU=Dept1,O=MongoDB,ST=NY,C=US
5、如果证书包含Extended Key Usage (extendedKeyUsage)设置,这个值必须包含clientAuth
extendedKeyUsage = clientAuth
你也可以使用不包含Extended Key Usage (EKU)的证书。
四、MongoDB配置
如果使用x.509进行内部认证,还需要配置相应的TLS/SSL,每个分区集群或者副本集成员需要选择下列一种设置:
配置文件:security.clusterAuthMode 和net.ssl.clusterFile
命令行参数:--clusterAuthMode and --sslClusterFile
五、节点证书和 PEMKeyFile
配置MongoDB的客户端证书认证的时候,mongod和mongos设置了PEMKeyFile去验证客户端,或者通过在配置文件中设置net.ssl.PEMKeyFile或者在命令行中使用--sslPEMKeyFile选项
如果在内部节点认证的时候没有声明clusterFile证书,MongoDB将会使用PEMKeyFile证书来进行节点认证。为了使用PEMKeyFile证书来进行内部认证,则PEMKeyFile证书必须满足:
删掉extendedKeyUsage 或者 设置extendedKeyUsage的值包括clientAuth 和 serverAuth