MongoDB
MongoDB - Skonfiguruj ReplicaSet do obsługi TLS / SSL
Szukaj…
Wprowadzenie
Jak skonfigurować ReplicaSet do obsługi TLS / SSL?
Wdrożymy zestaw 3 węzłów ReplicaSet w twoim lokalnym środowisku i użyjemy samopodpisanego certyfikatu. Nie używaj samopodpisanego certyfikatu w PRODUKCJI.
Jak podłączyć klienta do tego zestawu replik?
Podłączymy powłokę Mongo.
Opis certyfikatów TLS / SSL, PKI (Public Key Infrastructure) i ośrodka certyfikacji wykracza poza zakres tej dokumentacji.
Jak skonfigurować ReplicaSet do obsługi TLS / SSL?
Utwórz certyfikat główny
Certyfikat główny (znany również jako plik CA) zostanie użyty do podpisania i identyfikacji twojego certyfikatu. Aby go wygenerować, uruchom poniższe polecenie.
openssl req -nodes -out ca.pem -new -x509 -keyout ca.key
Zachowaj ostrożnie certyfikat główny i jego klucz, oba będą używane do podpisywania twoich certyfikatów. Certyfikat główny może być również używany przez klienta.
Wygeneruj żądania certyfikatów i klucze prywatne
Podczas generowania żądania podpisania certyfikatu (inaczej CSR) wpisz dokładną nazwę hosta (lub adres IP) swojego węzła w polu Nazwa pospolita (inaczej CN). Pozostałe pola muszą mieć dokładnie taką samą wartość. Może być konieczne zmodyfikowanie pliku / etc / hosts .
Poniższe polecenia wygenerują pliki CSR i klucze prywatne RSA (4096 bitów).
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
Musisz wygenerować jeden raport CSR dla każdego węzła zestawu repliki. Pamiętaj, że nazwa pospolita nie jest taka sama między węzłami. Nie opieraj wielu CSR na tym samym kluczu prywatnym.
Musisz teraz mieć 3 CSR i 3 klucze prywatne.
mongodb_node_1.key - mongodb_node_2.key - mongodb_node_3.key
mongodb_node_1.csr - mongodb_node_2.csr - mongodb_node_3.csr
Podpisz prośby o certyfikat
Użyj wygenerowanego wcześniej pliku CA (ca.pem) i jego klucza prywatnego (ca.key), aby podpisać każde żądanie certyfikatu, wykonując poniższe polecenia.
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
Musisz podpisać każdy CSR.
Teraz musisz mieć 3 CSR, 3 klucze prywatne i 3 samopodpisane certyfikaty. MongoDB będzie używać tylko kluczy prywatnych i certyfikatów.
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
Każdy certyfikat odpowiada jednemu węzłowi. Pamiętaj dokładnie, jaką CN / nazwę hosta podałeś dla każdego CSR.
Połącz każdy certyfikat węzła z jego kluczem
Uruchom poniższe polecenia, aby powiązać każdy certyfikat węzła z jego kluczem w jednym pliku (wymaganie 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
Teraz musisz mieć 3 pliki PEM.
mongodb_node_1.pem - mongodb_node_2.pem - mongodb_node_3.pem
Wdróż swój zestaw ReplicaSet
Zakładamy, że twoje pliki pem znajdują się w bieżącym folderze, a także dane / dane1, dane / dane2 i dane / dane3.
Uruchom poniższe polecenia, aby wdrożyć nasłuchiwanie repliki 3 węzłów na portach 27017, 27018 i 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
Masz teraz wdrożony zestaw 3 węzłów ReplicaSet w środowisku lokalnym, a wszystkie ich transakcje są szyfrowane. Nie można połączyć się z tym zestawem replik bez użycia TLS.
Wdróż swój zestaw ReplicaSet dla wzajemnego SSL / wzajemnego zaufania
Aby zmusić klienta do dostarczenia certyfikatu klienta (Mutual SSL), należy dodać plik CA podczas uruchamiania instancji.
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
Masz teraz wdrożony zestaw 3 węzłów ReplicaSet w środowisku lokalnym, a wszystkie ich transakcje są szyfrowane. Nie można połączyć się z tym zestawem replik bez użycia TLS lub bez przedstawienia certyfikatu klienta zaufanego przez urząd certyfikacji.
Jak podłączyć klienta (Mongo Shell) do ReplicaSet?
Brak wzajemnego SSL
W tym przykładzie możemy użyć pliku CA (ca.pem), który wygenerowałeś w sekcji „ Jak skonfigurować ReplicaSet do obsługi TLS / SSL? ”. Zakładamy, że plik CA znajduje się w bieżącym folderze.
Zakładamy, że twoje 3 węzły działają na mongo1: 27017, mongo2: 27018 i mongo3: 27019. (Może być konieczne zmodyfikowanie pliku / etc / hosts .)
W MongoDB 3.2.6, jeśli plik CA jest zarejestrowany w magazynie zaufania systemu operacyjnego, możesz połączyć się z ReplicaSet bez podawania pliku CA.
mongo --ssl --host rs0/mongo1:27017,mongo2:27018,mongo3:27019
W przeciwnym razie musisz podać plik CA.
mongo --ssl --sslCAFile ca.pem --host rs0/mongo1:27017,mongo2:27018,mongo3:27019
Jesteś teraz połączony ze swoim ReplicaSet, a wszystkie transakcje między Mongo Shell i ReplicaSet są szyfrowane.
Z wzajemnym SSL
Jeśli Twój ReplicaSet prosi o certyfikat klienta, musisz podać certyfikat podpisany przez urząd certyfikacji używany podczas wdrażania repliki. Kroki w celu wygenerowania certyfikatu klienta są prawie takie same jak w celu wygenerowania certyfikatu serwera.
Rzeczywiście wystarczy zmodyfikować pole nazwy zwyczajowej podczas tworzenia CSR. Zamiast podawać nazwę hosta 1-węzłowego w polu Nazwa pospolita, musisz podać wszystkie nazwy hosta ReplicaSet oddzielone przecinkiem .
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
Możesz napotkać ograniczenie rozmiaru nazwy zwykłej, jeśli pole nazwy zwykłej jest zbyt długie (ponad 64 bajty). Aby ominąć to ograniczenie, podczas generowania CSR należy użyć SubjectAltName.
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
)
Następnie podpisujesz raport CSR za pomocą certyfikatu i klucza urzędu certyfikacji.
openssl x509 -req -in mongodb_client.csr -CA ca.pem -CAkey ca.key -set_serial 00 -out mongodb_client.crt
Na koniec konkatujesz klucz i podpisany certyfikat.
cat mongodb_client.key mongodb_client.crt > mongodb_client.pem
Aby połączyć się z ReplicaSet, możesz teraz dostarczyć nowo wygenerowany certyfikat klienta.
mongo --ssl --sslCAFile ca.pem --host rs0/mongo1:27017,mongo2:27018,mongo3:27019 --sslPEMKeyFile mongodb_client.pem
Jesteś teraz połączony ze swoim ReplicaSet, a wszystkie transakcje między Mongo Shell i ReplicaSet są szyfrowane.