MongoDB
MongoDB - TLS / SSL을 지원하도록 ReplicaSet 구성
수색…
소개
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 간의 모든 트랜잭션이 암호화됩니다.