수색…


소개

TLS / SSL을 지원하도록 ReplicaSet을 구성하는 방법

로컬 환경에 3 노드 복제 세트를 배포하고 자체 서명 된 인증서를 사용합니다. PRODUCTION에서 자체 서명 된 인증서를 사용하지 마십시오.

클라이언트를이 ReplicaSet에 연결하는 방법은 무엇입니까?

Mongo Shell을 연결합니다.

TLS / SSL, PKI (공개 키 인프라) 인증서 및 인증 기관에 대한 설명은이 설명서의 범위를 벗어납니다.

TLS / SSL을 지원하도록 ReplicaSet을 구성하는 방법

루트 인증서 만들기

루트 인증서 (CA File이라고도 함)는 인증서에 서명하고 식별하는 데 사용됩니다. 생성하려면 아래 명령을 실행하십시오.

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

루트 인증서와 키를 신중하게 유지하십시오. 둘 다 인증서에 서명하는 데 사용됩니다. 루트 인증서는 클라이언트에서도 사용할 수 있습니다.


인증서 요청 및 개인 키 생성

인증서 서명 요청 (CSR이라고도 함)을 생성 할 때 일반 이름 (일명 CN) 필드에 노드의 정확한 호스트 이름 (또는 IP)을 입력하십시오. 다른 필드는 정확히 같은 값을 가져야합니다. / 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

ReplicaSet의 각 노드마다 하나의 CSR을 생성해야합니다. 공통 이름은 한 노드에서 다른 노드로 동일하지 않습니다. 동일한 개인 키에 여러 CSR을 배치하지 마십시오.

이제 3 개의 CSR과 3 개의 개인 키가 있어야합니다.

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

각 CSR에 서명해야합니다.

이제는 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

각 인증서는 하나의 노드에 해당합니다. 신중하게 각 CSR에 CN / 호스트 이름을 알려주십시오.


키로 각 노드 인증서를 연결하십시오.

아래의 명령을 실행하여 각 노드 인증서를 키와 함께 하나의 파일 (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

이제 PEM 파일이 3 개 있어야합니다.

mongodb_node_1.pem - mongodb_node_2.pem - mongodb_node_3.pem

ReplicaSet 배포

우리는 pem 파일이 data / data1, data / data2 및 data / data3뿐만 아니라 현재 폴더에 있다고 가정합니다.

아래의 명령을 실행하여 포트 27017, 27018 및 27019에서 수신하는 3 개의 노드 ReplicaSet을 배치하십시오.

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 개의 노드 ReplicaSet이 있으며 모든 트랜잭션은 암호화됩니다. TLS를 사용하지 않고이 ReplicaSet에 연결할 수 없습니다.

상호 SSL / 상호 트러스트를위한 ReplicaSet 배포

클라이언트가 클라이언트 인증서 (상호 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 개의 노드 ReplicaSet이 있으며 모든 트랜잭션은 암호화됩니다. TLS를 사용하지 않거나 CA가 신뢰하는 클라이언트 인증서를 제공하지 않으면이 ReplicaSet에 연결할 수 없습니다.

클라이언트 (Mongo Shell)를 ReplicaSet에 연결하는 방법은 무엇입니까?

상호 SSL 없음

이 예에서는 " TLS / SSL을 지원하도록 ReplicaSet을 구성하는 방법 "절에서 생성 한 CA 파일 (ca.pem)을 사용할 수 있습니다. CA 파일은 현재 폴더에 있다고 가정합니다.

3 노드가 mongo1 : 27017, mongo2 : 27018 및 mongo3 : 27019에서 실행되고 있다고 가정합니다. ( / etc / hosts 파일을 수정해야 할 수도 있습니다.)

MongoDB 3.2.6에서 CA 파일이 운영 체제 트러스트 스토어에 등록 된 경우 CA 파일을 제공하지 않고 ReplicaSet에 연결할 수 있습니다.

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 배포에서 사용하는 CA에서 서명 한 인증서를 제공해야합니다. 클라이언트 인증서를 생성하는 단계는 서버 인증서를 생성하는 단계와 거의 같습니다.

사실 CSR 작성 중에 Common Name Field를 수정하면됩니다. 일반 이름 필드에 1 노드 호스트 이름을 제공하는 대신 모든 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

일반 이름 필드가 너무 길면 (64 바이트보다 길면) 일반 이름 크기 제한이 발생할 수 있습니다. 이 제한을 우회하려면 CSR을 생성 할 때 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
)

그런 다음 CA 인증서와 키를 사용하여 CSR에 서명합니다.

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