MongoDB内部认证

可以对副本集和分片集群的节点进行认证,对于节点的内部认证,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=,OU=Dept1,O=MongoDB,ST=NY,C=US

subject= CN=,OU=Dept1,O=MongoDB,ST=NY,C=US

subject= CN=,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

你可能感兴趣的:(mongodb)