Поиск…


Вступление

Как настроить ReplicaSet для поддержки TLS / SSL?

Мы разворачиваем 3 ReplicationSet Nodes в вашей локальной среде, и мы будем использовать самозаверяющий сертификат. Не используйте самозаверяющий сертификат в ПРОДУКЦИИ.

Как подключить своего клиента к этому ReplicaSet?

Мы соединим монгольскую оболочку.

Описание сертификатов TLS / SSL, PKI (Public Key Infrastructure) и центра сертификации выходит за рамки этой документации.

Как настроить ReplicaSet для поддержки TLS / SSL?

Создание корневого сертификата

Корневой сертификат (aka CA File) будет использоваться для подписи и идентификации вашего сертификата. Чтобы сгенерировать его, запустите команду ниже.

openssl req -nodes -out ca.pem -new -x509 -keyout ca.key

Держите корневой сертификат и его ключ тщательно, оба будут использоваться для подписания ваших сертификатов. Корневой сертификат может также использоваться вашим клиентом.


Сгенерировать запросы на сертификат и приватные ключи

При создании запроса на подпись сертификата (иначе CSR) введите точное имя хоста (или IP) вашего узла в поле Common Name (aka CN). Другие поля должны иметь точно такое же значение. Возможно, вам потребуется изменить файл / etc / hosts .

В приведенных ниже командах будут генерироваться файлы CSR и частные ключи RSA (4096 бит).

openssl req -nodes -newkey rsa:4096 -sha256 -keyout mongodb_node_1.key -out mongodb_node_1.csr
openssl req -nodes -newkey rsa:4096 -sha256 -keyout mongodb_node_2.key -out mongodb_node_2.csr
openssl req -nodes -newkey rsa:4096 -sha256 -keyout mongodb_node_3.key -out mongodb_node_3.csr

Вы должны создать один CSR для каждого узла ReplicaSet. Помните, что Common Name отличается от одного узла к другому. Не устанавливайте несколько CSR в одном и том же приватном ключе.

Теперь у вас должно быть 3 CSR и 3 Private Keys.

mongodb_node_1.key - mongodb_node_2.key - mongodb_node_3.key
mongodb_node_1.csr - mongodb_node_2.csr - mongodb_node_3.csr

Подпишите ваши запросы на сертификаты

Используйте файл CA (ca.pem) и его секретный ключ (ca.key), сгенерированный ранее, чтобы подписать каждый запрос сертификата, выполнив приведенные ниже команды.

openssl x509 -req -in mongodb_node_1.csr -CA ca.pem -CAkey ca.key -set_serial 00 -out mongodb_node_1.crt
openssl x509 -req -in mongodb_node_2.csr -CA ca.pem -CAkey ca.key -set_serial 00 -out mongodb_node_2.crt
openssl x509 -req -in mongodb_node_3.csr -CA ca.pem -CAkey ca.key -set_serial 00 -out mongodb_node_3.crt

Вы должны подписать каждую КСО.

Теперь у вас должно быть 3 CSR, 3 закрытых ключа и 3 самоподписанных сертификата. MongoDB будет использовать только приватные ключи и сертификаты.

mongodb_node_1.key - mongodb_node_2.key - mongodb_node_3.key
mongodb_node_1.csr - mongodb_node_2.csr - mongodb_node_3.csr
mongodb_node_1.crt - mongodb_node_2.crt - mongodb_node_3.crt

Каждый сертификат соответствует одному узлу. Помните, какой CN / hostname вы дали каждому CSR.


Согласовать каждый сертификат узла с его ключом

Выполните приведенные ниже команды для согласования каждого сертификата узла с его ключом в одном файле (требование MongoDB).

cat mongodb_node_1.key mongodb_node_1.crt > mongodb_node_1.pem
cat mongodb_node_2.key mongodb_node_2.crt > mongodb_node_2.pem
cat mongodb_node_3.key mongodb_node_3.crt > mongodb_node_3.pem

Теперь у вас должно быть 3 файла PEM.

mongodb_node_1.pem - mongodb_node_2.pem - mongodb_node_3.pem

Разверните ReplicaSet

Мы предположим, что ваши файлы pem находятся в вашей текущей папке, а также данные / данные1, данные / данные2 и данные / данные3.

Выполните приведенные ниже команды, чтобы развернуть свои 3 Nodes ReplicaSet, прослушивая порты 27017, 27018 и 27019.

mongod --dbpath data/data_1 --replSet rs0 --port 27017 --sslMode requireSSL --sslPEMKeyFile mongodb_node_1.pem
mongod --dbpath data/data_2 --replSet rs0 --port 27018 --sslMode requireSSL --sslPEMKeyFile mongodb_node_2.pem
mongod --dbpath data/data_3 --replSet rs0 --port 27019 --sslMode requireSSL --sslPEMKeyFile mongodb_node_3.pem

Теперь у вас есть 3 Nodes ReplicaSet, развернутый в вашей локальной среде, и все их транзакции зашифрованы. Вы не можете подключиться к этому ReplicaSet, не используя TLS.

Разверните ReplicaSet для взаимного SSL / взаимного доверия

Чтобы заставить клиента предоставить сертификат клиента (взаимный SSL), вы должны добавить файл CA при запуске своих экземпляров.

mongod --dbpath data/data_1 --replSet rs0 --port 27017 --sslMode requireSSL --sslPEMKeyFile mongodb_node_1.pem --sslCAFile ca.pem
mongod --dbpath data/data_2 --replSet rs0 --port 27018 --sslMode requireSSL --sslPEMKeyFile mongodb_node_2.pem --sslCAFile ca.pem
mongod --dbpath data/data_3 --replSet rs0 --port 27019 --sslMode requireSSL --sslPEMKeyFile mongodb_node_3.pem --sslCAFile ca.pem

Теперь у вас есть 3 Nodes ReplicaSet, развернутый в вашей локальной среде, и все их транзакции зашифрованы. Вы не можете подключиться к этому ReplicaSet без использования TLS или без предоставления сертификата клиента, которому доверяет ваш ЦС.

Как подключить своего клиента (Mongo Shell) к ReplicaSet?

Нет взаимного SSL

В этом примере мы можем использовать файл CA (ca.pem), который вы создали во время настройки « Как настроить ReplicaSet для поддержки TLS / SSL? ». Предположим, что файл CA находится в вашей текущей папке.

Предположим, что ваши 3 узла работают на mongo1: 27017, mongo2: 27018 и mongo3: 27019. (Возможно, вам потребуется изменить файл / etc / hosts .)

Из MongoDB 3.2.6, если ваш файл CA зарегистрирован в хранилище Trust System Store, вы можете подключиться к вашему ReplicaSet без предоставления файла CA.

mongo --ssl --host rs0/mongo1:27017,mongo2:27018,mongo3:27019

В противном случае вы должны предоставить файл CA.

mongo --ssl --sslCAFile ca.pem --host rs0/mongo1:27017,mongo2:27018,mongo3:27019

Теперь вы подключены к своему ReplicaSet, и все транзакции между вашей Mongo Shell и вашим ReplicaSet зашифрованы.

С взаимным SSL

Если ваш ReplicaSet запрашивает сертификат клиента, вы должны предоставить один, подписанный ЦС, используемый развертыванием ReplicaSet. Шаги по созданию сертификата клиента почти такие же, как и для создания сертификата сервера.

Действительно, вам просто нужно изменить поле Common Name во время создания CSR. Вместо предоставления 1 Node Hostname в поле Common Name вам необходимо указать все имена ReplicaSet, разделенные запятой .

openssl req -nodes -newkey rsa:4096 -sha256 -keyout mongodb_client.key -out mongodb_client.csr
...
Common Name (e.g. server FQDN or YOUR name) []: mongo1,mongo2,mongo3

Вы можете столкнуться с ограничением размера Common Name, если поле Common Name слишком длинное (длиной более 64 байтов). Чтобы обойти это ограничение, вы должны использовать SubjectAltName при создании CSR.

openssl req -nodes -newkey rsa:4096 -sha256 -keyout mongodb_client.key -out mongodb_client.csr -config <(
cat <<-EOF
[req]
default_bits = 4096
prompt = no
default_md = sha256
req_extensions = req_ext
distinguished_name = dn
 
[ dn ]
CN = .
 
[ req_ext ]
subjectAltName = @alt_names
 
[ alt_names ]
DNS.1 = mongo1
DNS.2 = mongo2
DNS.3 = mongo3
EOF
)

Затем вы подписываете CSR, используя сертификат CA и ключ.

openssl x509 -req -in mongodb_client.csr  -CA ca.pem -CAkey ca.key -set_serial 00 -out mongodb_client.crt

Наконец, вы присоединяете ключ и подписанный сертификат.

cat mongodb_client.key mongodb_client.crt > mongodb_client.pem

Чтобы подключиться к вашему ReplicaSet, вы можете предоставить недавно созданный сертификат клиента.

mongo --ssl --sslCAFile ca.pem --host rs0/mongo1:27017,mongo2:27018,mongo3:27019 --sslPEMKeyFile mongodb_client.pem

Теперь вы подключены к своему ReplicaSet, и все транзакции между вашей Mongo Shell и вашим ReplicaSet зашифрованы.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow