클라이언트 사이드 필드 레벨 암호화
버전 4.2에 추가되었습니다.
공식 MongoDB 4.2+ 호환 드라이버 는 클라이언트 사이드 필드 수준 암호화 프레임워크를 제공합니다. 애플리케이션은 유선을 통해 서버로 데이터를 전송 하기 전에 문서의 필드를 암호화할 수 있습니다. 올바른 암호화 키에 액세스할 수 있는 애플리케이션만 보호된 데이터를 해독하고 읽을 수 있습니다. 암호화 키를 삭제하면 해당 키를 사용하여 암호화된 모든 데이터를 영구적으로 읽을 수 없는 상태로 만듭니다.
예를 예시 인증 을 적용하는 MongoDB cluster 는 전송 중인 데이터를 보호하기 위해 TLS 암호화 를 사용합니다. 또한 클러스터 는 MongoDB 암호화됨 스토리지 엔진 을 사용하여 디스크의 데이터를 보호합니다. 다음 시나리오를 고려하세요.
직원은 클러스터 와 해당 호스팅하다 머신에 대한 관리 액세스 을 갖습니다. 직원의 액세스 수준을 통해 정상적인 업무의 일환으로 고감도 데이터를 해독된 상태 로 볼 수 있습니다.
타사 제공자 가 MongoDB cluster 를 호스팅합니다. 제공자 에게 호스트 시스템 또는 데이터베이스 수준의 보안 위반이 있으며, 이 경우 승인되지 않은 당사자가 암호가 해독된 상태 의 데이터에 액세스 .
타사 데이터 분석 회사가 비공개, 개인 또는 기밀 정보가 포함된 데이터에 액세스 할 수 있습니다. 타사 회사는 승인되지 않은 당사자가 액세스 할 수 있는 보안되지 않은 데이터 저장 볼륨에 해독된 데이터를 로드합니다.
각 시나리오에서 MongoDB cluster 또는 호스팅하다 머신에 액세스 권한이 있는 사용자는 암호화 를 우회하고 비공개, 권한이 있는 데이터 또는 기밀인 데이터를 읽을 수 있습니다. 서버 에 기록 되기 전에 클라이언트 사이드 필드 수준 암호화 를 사용하여 데이터를 보호하면 네트워크 또는 디스크 암호화 를 우회하는 이벤트 데이터가 노출될 위험을 줄일 수 있습니다.
다음 문서를 살펴보세요.
{ "name" : "John Doe", "address" : { "street" : "1234 Main Street", "city" : "MongoDBVille", "zip" : 99999 }, "phone" : "949-555-1212", "ssn" : "123-45-6789" }
클라이언트 사이드 필드 수준 암호화 를 사용하면 애플리케이션 이 ssn
및 phone
와 같은 민감한 정보를 구체적으로 암호화할 수 있습니다. 암호화된 필드는 binary data
하위 유형이 인 6 으)로 저장됩니다. :
{ "name" : "John Doe", "address" : { "street" : "1234 Main Street", "city" : "MongoDBVille", "zip" : 99999 }, "phone" : BinData(6,"U2FsdGVkX1+CGIDGUnGgtS46+c7R5u17SwPDEmzyCbA="), "ssn" : BinData(6,"AaloEw285E3AnfjP+r8ph2YCvMI1+rWzpZK97tV6iz0jx") }
클라이언트 사이드 필드 레벨 암호화를 지원하는 공식 4.2+ 호환 드라이버의 전체 목록은 드라이버 호환성 표를 참조하세요.
일부 MongoDB 4.2+ 호환 드라이버를 사용하여 필드 레벨 암호화 를 구성하는 엔드투엔드 절차는 클라이언트 사이드 필드 레벨 암호화 가이드를 참조하세요.
지원되는 암호화 방법
MongoDB 는 공식 MongoDB 4.2+ 호환 드라이버를 사용하여 클라이언트 사이드 필드 레벨 암호화 를 수행하는 두 가지 방법을 지원합니다.
- 필드의 명시적(수동) 암호화
공식 MongoDB 4.2+ 호환 드라이버,
mongosh
및 MongoDB 4.2 이상 레거시mongo
shell 은 특정 데이터 암호화 키 및 암호화 알고리즘 을 사용하여 필드를 명시적으로 암호화하거나 해독할 수 있도록 지원 합니다.애플리케이션은 드라이버 암호화 라이브러리를 통해 암호화/복호화 로직을 포함하도록 읽기 및 쓰기 작업 구성과 관련된 모든 코드를 수정해야 합니다. 애플리케이션은 작업별로 암호화/복호화에 적합한 데이터 암호화 키를 선택할 책임이 있습니다.
- 필드 자동 암호화
참고
엔터프라이즈 기능
필드 레벨 암호화의 자동 기능은 MongoDB Enterprise 4.2 이상 및 MongoDB Atlas 4.2 이상 cluster에서만 사용할 수 있습니다.
공식 MongoDB 4.2+ 호환 드라이버,
mongosh
및 MongoDB 4.2 이상 레거시mongo
셸 은 읽기 및 쓰기 (write) 작업에서 필드를 자동으로 암호화하는 기능을 지원 합니다.애플리케이션은 데이터베이스 연결 객체 를 생성해야 합니다(예:
MongoClient
)를 자동 암호화 구성 설정으로 변경합니다. JSON schema 4 구성 설정에는 초안 표준 구문 의 엄격한 하위 집합을 사용하는 자동 암호화 규칙이 포함되어야 합니다. 및 암호화별 스키마 키워드를 포함합니다. 애플리케이션은 읽기/ 쓰기 (write) 작업과 관련된 코드를 수정할 필요가 없습니다. 자동 암호화 규칙 에 대한 전체 문서는 자동 암호화 규칙을 참조하세요.자세한 내용은 자동 클라이언트 측 필드 레벨 암호화를 참조하세요.
MongoDB 4.2+ 호환 드라이버, mongosh
및 MongoDB 4.2 이상 레거시 mongo
shell 은 클라이언트 사이드 필드 수준 암호화 를 사용하여 생성된 Binary
하위 유형 6 객체를 자동으로 해독합니다. 자동 암호 해독에 대한 자세한 내용은 자동 필드 암호 해독을 참조하세요.
중요
MongoDB 클라이언트 사이드 필드 레벨 암호화 는 문서 의 단일 필드 암호화만 지원합니다. 전체 문서 를 암호화하려면 문서 의 각 개별 필드 를 암호화해야 합니다.
암호화 구성 요소
다음 다이어그램은 운전자 와 각 암호화 구성 요소 간의 관계를 보여줍니다.
libmongocrypt
Apache 라이선스가 있는 오픈 소스입니다 4. 공식 MongoDB 에서 사용하는 핵심 암호화 라이브러리입니다.2+ 호환 드라이버,mongosh
및 MongoDB 4.2 이상의 레거시mongo
shell 을 사용하여 클라이언트 사이드 필드 수준 암호화 를 강화할 수 있습니다. 일부 드라이버는 라이브러리를 설치하거나 연결하기 위해 특정 통합 단계가 필요할 수 있습니다. 자세한 내용은 운전자 설명서를 참조하세요.자동 암호화 공유 라이브러리는 자동 클라이언트 측 필드 레벨 암호화 를 지원하며 MongoDB Enterprise 에서만 사용할 수 있습니다. 자동 암호화 공유 라이브러리는 암호화 기능을 수행하지 않습니다. 공유 라이브러리는
mongocryptd
대신 선호되는 대안이며 새 프로세스 를 생성할 필요가 없습니다.mongocryptd
는 계속 지원됩니다.키 볼트 는 값을 암호화하는 데 사용되는 모든 데이터 암호화 키를 저장하는 MongoDB 컬렉션 입니다. 데이터 암호화 키는 컬렉션 에 저장 되기 전에 고객 마스터 키 (CMK )를 사용하여 자체적으로 암호화됨 . 키 볼트는 암호화됨 데이터를 저장하는 MongoDB 클러스터와 다른 MongoDB cluster 에 있을 수 있습니다.
KMS (KMS) 는 데이터 암호화 키를 암호화하는 데 사용되는 고객 마스터 키 (CMK )를 저장합니다. MongoDB 는 다음과 같은 KMS 제공자를 지원합니다.
암호화됨 데이터를 저장하는 MongoDB cluster 는 클라이언트 사이드 필드 수준 암호화 를 시행하다 할 수도 있습니다. 자세한 내용은 필드 레벨 암호화 스키마 시행 을 참조하세요.
암호화 알고리즘
MongoDB 클라이언트 사이드 필드 수준 암호화 는 필드 값을 암호화하기 위해 결정론적 또는 무작위 초기화 벡터와 결합된 암호화 후MAC 접근 방식을 사용합니다. MongoDB 256는 AEAD 만512 지원합니다. AES- -HMAC-SHA- MAC을 사용한 CBC 암호화 알고리즘 .
결정론적 암호화
결정론적 암호화 알고리즘 은 주어진 입력 값이 알고리즘 이 실행될 때마다 항상 동일한 출력 값으로 암호화되도록 합니다. 결정론적 암호화 는 읽기 작업에 대한 더 큰 지원 을 제공하지만, 카디널리티 가 낮은 암호화됨 데이터는 빈도 분석 복구에 취약합니다.
읽기 작업에 사용되지 않는 민감한 필드의 경우 애플리케이션은 빈도 분석 복구로부터 향상된 보호를 위해 무작위 암호화를 사용할 수 있습니다.
무작위 암호화
무작위 암호화 알고리즘은 주어진 입력 값이 알고리즘이 실행될 때마다 항상 다른 출력 값으로 암호화되도록 합니다. 무작위 암호화는 데이터 기밀성을 가장 강력하게 보장하는 동시에 쿼리를 평가하기 위해 암호화된 필드에서 수행해야 하는 읽기 작업에 대한 지원도 방지합니다.
무작위 암호화 는 전체 객체 또는 배열 암호화도 지원합니다. 예를 예시 다음 문서 를 가정해 보겠습니다.
{ "personal_information" : { "ssn" : "123-45-6789", "credit_score" : 750, "credit_cards" : [ "1234-5678-9012-3456", "9876-5432-1098-7654"] }, "phone_numbers" : [ "(212) 555-0153" ] }
무작위 암호화 알고리즘을 사용하여 personal_information
및 phone_numbers
필드를 암호화하면 전체 객체가 암호화됩니다. 이렇게 하면 해당 필드 아래에 중첩된 모든 필드가 보호되지만, 중첩된 필드에 대한 쿼리도 방지됩니다.
읽기 작업에 사용되는 민감한 필드의 경우 애플리케이션은 암호화된 필드에 대한 읽기 지원을 개선하기 위해 결정론적 암호화를 사용해야 합니다.
자동 필드 암호 해독
BinData
블롭 메타데이터 에는 바이너리 데이터를 암호화하는 데 사용되는 데이터 암호화 키 _id
및 암호화 알고리즘 이 포함되어 있습니다. 4.2+ 호환 드라이버, mongosh
및 MongoDB 4.2 이상 레거시 mongo
shell 은 이 메타데이터 를 사용하여 BinData
하위 유형 6 객체의 자동 암호 해독을 시도합니다. 자동 암호 해독 프로세스 는 다음과 같이 작동합니다.
값을 암호화하는 데 사용된 데이터 암호화 키 및 암호화 알고리즘 에 대해서는
BinData
블롭 메타데이터 를 확인하세요.지정된 데이터 암호화 키 에 대해 현재 데이터베이스 연결에 구성된 Key Vault를 확인합니다. 키 볼트에 지정된 키가 포함되어 있지 않으면 자동 암호 해독이 실패하고 운전자 는
BinData
블롭을 반환합니다.키 자료를 암호화하는 데 사용되는 고객 마스터 키(CMK)의 데이터 암호화 키 메타데이터를 확인합니다.
Amazon Web Services KMS, Azure Key Vault 또는 Google Cloud Platform KMS 의 경우, 복호화를 위해 데이터 암호화 키를 KMS 제공자에게 보냅니다. CMK가 존재하지 않거나 연결 구성에서 CMK에 대한 액세스 권한을 부여하지 않으면 암호 해독이 실패하고 드라이버는
BinData
블롭을 반환합니다.로컬 관리 키 의 경우 로컬 키를 조회 하고 데이터 암호화 키 를 해독합니다. 데이터베이스 구성에 지정된 로컬 키가 데이터 암호화 키 를 암호화하는 데 사용되지 않은 경우 암호 해독이 실패하고 운전자 는
BinData
블롭을 반환합니다.해독된 데이터 암호화 키 와 적절한 알고리즘 을 사용하여
BinData
값을 해독합니다.
필요한 마스터 키 및 데이터 암호화 키 에도 액세스할 수 없는 MongoDB 서버에 대한 액세스 권한이 있는 애플리케이션은 BinData
값을 해독할 수 없습니다.
클라이언트 사이드 필드 수준 암호화 를 위한 데이터베이스 연결 구성에 대한 자세한 내용은 Mongo()
생성자를 참조 하거나 선호하는 드라이버의 클라이언트 구성 방법에 대한 설명서를 참조하세요.
필드 레벨 암호화 스키마 적용
MongoDB 4.2 부터 서버 는 스키마 유효성 검사 를 사용하여 컬렉션 의 특정 필드에 암호화 를 시행하다 수 있도록 지원합니다. 자동 암호화 규칙 키워드 를 $jsonSchema
유효성 검사 객체 와 함께 사용하여 암호화 가 필요한 필드를 표시합니다. 서버 는 지정된 필드가 Binary (BinData)
하위 유형 6 객체가 아닌 해당 컬렉션 에 대한 모든 쓰기 (write) 작업을 거부합니다.
예를 들어, 다음 collMod
명령은 validator
를 포함하도록 hr.employees
컬렉션을 수정합니다. $jsonSchema
유효성 검사 객체에는 다음을 나타내는 클라이언트 사이드 필드 수준 암호화 키워드가 포함되어 있습니다.
taxid
필드 를 암호화됨 해야 합니다. 클라이언트는 필드 를 암호화할 때 지정된 데이터 암호화 키 와 무작위 암호화 알고리즘 을 사용해야 합니다.taxid-short
필드 를 암호화됨 해야 합니다. 클라이언트는 필드 를 암호화할 때 지정된 데이터 암호화 키 와 결정론적 암호화 알고리즘 을 사용해야 합니다.
db.getSiblingDB("hr").runCommand( { "collMod" : "employees", "validator" : { "$jsonSchema" : { "bsonType" : "object", "properties" : { "taxid" : { "encrypt" : { "keyId" : [UUID("e114f7ad-ad7a-4a68-81a7-ebcb9ea0953a")], "algorithm" : "AEAD_AES_256_CBC_HMAC_SHA_512-Random", } }, "taxid-short" : { "encrypt" : { "keyId" : [UUID("33408ee9-e499-43f9-89fe-5f8533870617")], "algorithm" : "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType" : "string" } } } } } } )
명시적(수동) 필드 수준 암호화 encrypt
taxid
를 taxid-short
수행하는 클라이언트는 쓰기 (write) 작업을 실행 하기 전에 $jsonSchema
원격 과 동일한 설정을 사용하여 최소한 및 필드를 해야 합니다 .
자동 클라이언트 사이드 필드 수준 암호화 를 수행하는 클라이언트는 데이터베이스 연결 구성에 따라 특정 동작을 수행합니다.
참고
자동 클라이언트 사이드 필드 수준 암호화 는 MongoDB Enterprise 4.2 이상에서만 사용할 수 있습니다.
연결
ClientSideFieldLevelEncryptionOptions
schemaMap
객체 에 지정된 컬렉션 에 대한 키가 포함되어 있으면 클라이언트 는 해당 객체 를 사용하여 자동 필드 수준 암호화 를 수행하고 원격 스키마 를 무시합니다. 로컬 규칙은 최소한taxid
및taxid-short
필드를 암호화 해야 합니다.연결
ClientSideFieldLevelEncryptionOptions
schemaMap
객체 에 지정된 컬렉션 에 대한 키가 포함되어 있지 않으면 클라이언트 는 컬렉션 에 대한 서버 측 원격 스키마 를 다운로드하고 이를 사용하여 자동 필드 수준 암호화 를 수행합니다.이 구성을 사용하려면 클라이언트가 자동 필드 수준 암호화와 관련하여 서버가 유효한 스키마를 가지고 있다고 신뢰해야 합니다. 클라이언트는 원격 스키마를 사용하여 자동 필드 수준 암호화를 수행하기만 하며 스키마에 지정된 다른 유효성 검사 규칙을 적용하지 않습니다.
MongoDB 서버 는 암호화됨 필드 의 내용을 해독하거나 자체 검사할 수 없으므로 클라이언트가 지정된 암호화 옵션을 사용하여 지정된 필드 를 암호화했는지 확인할 수 없습니다. 이를 통해 두 클라이언트는 특정 필드 에 대해 서로 다른 keyID 또는 암호화 알고리즘을 사용하여 암호화됨 데이터를 삽입할 수 있습니다. 일부 워크로드에는 독립적인 필드 수준 암호화 구현이 필요할 수 있지만, 클라이언트 간에 필드 에 대한 암호화 옵션을 일관되지 않게 구현 하면 암호화됨 필드 에 대한 쿼리가 부정확하거나 예기치 않은 동작을 초래할 수 있습니다.
예를 예시, 클라이언트 A
는 무작위 암호화 를 사용하여 PII
필드 를 암호화하고 클라이언트 B
는 결정론적 암호화 를 사용하여 PII
필드 를 암호화합니다. 무작위 암호화 알고리즘 은 항상 다른 고유 값을 반환하지만 결정론적 알고리즘 은 항상 동일한 값을 반환합니다. 해당 필드 에 대해 결정론적으로 암호화됨 데이터가 예상되는 쿼리는 서버 가 무작위로 암호화됨 필드와 일치할 수 없으므로 일관되지 않은 결과를 반환합니다.
드라이버 호환성 표
MongoDB 4.2 클라이언트 사이드 필드 레벨 암호화 는 다음 공식 4.2+ 호환 운전자 버전에서만 사용할 수 있습니다.
드라이버 | 지원되는 버전 | 빠른 시작 / 튜토리얼 |
---|---|---|
| ||
| ||
| ||
| ||
| ||
| ||
| ||
| ||
| ||
|
구문 및 구현 예제는 드라이버 참고 문서를 참조하세요.