클라이언트 사이드 필드 레벨 암호화
이 페이지의 내용
클라이언트 사이드 필드 레벨 암호화
MongoDB 4.2 의 새로운 기능 클라이언트 측 필드 레벨 암호화 (CSFLE) 를 사용하면 관리자와 개발자가 다른 MongoDB 암호화 기능 외에도 특정 데이터 필드를 암호화할 수 있습니다.
개발자는 CSFLE를 사용하여 서버 사이드 구성이나 지시문 없이 클라이언트 사이드에서 필드를 암호화할 수 있습니다. 클라이언트 측 필드 레벨 암호화는 서버 관리자를 포함한 권한이 없는 당사자가 암호화된 데이터를 읽을 수 없도록 애플리케이션이 보장해야 하는 워크로드를 지원합니다.
CSFLE에 대한 개요는 매뉴얼의 공식 MongoDB 문서를 참조하세요.
설치
libmongocrypt
클라이언트 측 필드 레벨 암호화 는 libmongocrypt
라는 C 라이브러리를 사용하여 어려운 암호화 작업을 수행합니다. 이 종속성은 C 운전자 에 의해 managed 됩니다. C 운전자 설치가 1.16.0 이상이고 클라이언트 측 필드 레벨 암호화 지원 으로 컴파일된 경우 이 종속성은 내부적으로 managed 해야 합니다. 자세한 내용은 C 드라이버의 클라이언트 측 필드 레벨 암호화 사용 을(를) 참조하세요.
mongocryptd
자동 CSFLE는 드라이버가 작동하는 동안 데몬으로 실행되는 mongocryptd
라는 새 바이너리에 의존합니다. 이 바이너리는 MongoDB Enterprise에서만 사용할 수 있습니다.
mongocryptd
드라이버와 별도로 시작하거나 암호화를 사용할 때 자동으로 생성되도록 둘 수 있습니다.
mongocryptd를 별도로 실행하려면 mongocryptdBypassSpawn
플래그를 클라이언트의 자동 암호화 옵션에 전달합니다.
auto mongocryptd_options = make_document(kvp("mongocryptdBypassSpawn", true)); options::auto_encryption auto_encrypt_opts{}; auto_encrypt_opts.extra_options({mongocryptd_options.view()});
mongocryptd 바이너리가 현재 경로에 있는 경우 드라이버는 사용자 지정 플래그 없이 이를 생성할 수 있습니다. 그러나 mongocryptd 바이너리가 다른 경로에 있는 경우 mongocryptdSpawnPath
옵션을 사용하여 경로를 설정합니다.
auto mongocryptd_options = make_document(kvp("mongocryptdSpawnPath", "path/to/mongocryptd")); options::auto_encryption auto_encrypt_opts{}; auto_encrypt_opts.extra_options({mongocryptd_options.view()});
예시
자동 클라이언트 사이드 필드 레벨 암호화
자동 클라이언트 측 필드 레벨 암호화는 auto_encryption_opts
옵션이 mongocxx::options::auto_encryption
인스턴스로 설정된 mongocxx::client
를 생성하여 활성화됩니다. 다음 예제에서는 mongocxx::client_encryption
클래스를 사용하여 새 암호화 데이터 키를 생성하고 자동 클라이언트 사이드 필드 수준 암호화를 설정하는 방법을 보여 줍니다.
참고
자동 클라이언트 사이드 필드 수준 암호화에는 MongoDB 4.2 엔터프라이즈 또는 MongoDB 4.2 이 필요합니다. Atlas cluster. 서버의 커뮤니티 버전은 자동 암호 해독과 명시적 클라이언트 사이드 필드 수준 암호화를 지원합니다.
로컬 자동 암호화 규칙 제공
다음 예시 는 schema_map 옵션을 통해 자동 암호화 규칙을 지정하는 방법을 보여줍니다. 자동 암호화 규칙은 JSON schema 구문의 엄격한 하위 집합을 사용하여 표현됩니다.
schema_map
를 제공하면 서버에서 가져온 JSON Schema에 의존하는 것보다 더 강력한 보안이 제공됩니다. 악의적인 서버가 잘못된 JSON schema 를 광고하여 클라이언트를 속여 암호화되어야 하는 암호화되지 않은 데이터를 보내도록 할 수 있습니다.
schema_map
에 제공된 JSON Schemas는 자동 클라이언트 사이드 필드 수준 암호화를 구성하는 데에만 적용됩니다. JSON schema의 다른 유효성 검사 규칙은 드라이버에서 적용되지 않으므로 오류가 발생합니다.
// // The schema map has the following form: // // { // "test.coll" : { // "bsonType" : "object", // "properties" : { // "encryptedFieldName" : { // "encrypt" : { // "keyId" : [ <datakey as UUID> ], // "bsonType" : "string", // "algorithm" : <algorithm> // } // } // } // } // } //
예제/mongocxx/automatic_client_side_field_level_encryption.cpp 를 참조하세요. 자동 암호화 를 위해 를 설정하다 하는 방법에 대한 전체 예시 를 확인하세요.JSON schema
서버측 필드 레벨 암호화 시행
MongoDB 4.2 서버는 스키마 유효성 검사를 사용하여 컬렉션의 특정 필드에 암호화를 적용하는 기능을 지원합니다. 이 스키마 유효성 검사는 애플리케이션이 "encrypt"
JSON schema 키워드로 표시된 필드에 암호화되지 않은 값을 삽입하는 것을 방지합니다.
mongocxx::client_encryption
를 사용하여 자동 클라이언트 사이드 필드 수준 암호화 를 설정하다 하여 새 암호화 데이터 키를 만들고 자동 암호화 JSON schema 구문으로 컬렉션 을 만들 수 있습니다.
// Please see the linked example below for full json_schema construction. bsoncxx::document::value json_schema{}; // Create the collection with the encryption JSON Schema. auto cmd = document{} << "create" << "coll" << "validator" << open_document << "$jsonSchema" << json_schema.view() << close_document << finalize; db.run_command(cmd.view());
예제/mongocxx/server_side_field_level_encryption_enforcement.cpp 를 참조하세요. 서버 에서 암호화 시행을 설정하는 전체 예시 를 확인하세요.
명시적 암호화
명시적 암호화는 MongoDB Community 기능이며 mongocryptd
프로세스를 사용하지 않습니다. 명시적 암호화는 mongocxx::client_encryption
클래스에서 제공합니다.
// Explicitly encrypt a BSON value. auto to_encrypt = bsoncxx::types::bson_value::make_value("secret message"); auto encrypted_message = client_encryption.encrypt(to_encrypt, encrypt_opts); // Explicitly decrypt a BSON value. auto decrypted_message = client_encryption.decrypt(encrypted_message);
예제/mongocxx/explicit_encryption.cpp 를 참조하세요. 명시적 암호화 및 암호 해독을 사용하는 전체 예시 를 확인하세요.
자동 암호 해독을 통한 명시적 암호화
자동 암호화에는 MongoDB 4.2 엔터프라이즈 또는 MongoDB 4.2 이 필요합니다. Atlas cluster에서는 모든 사용자에 대해 자동 암호 해독이 지원됩니다. 자동 암호화 없이 자동 암호 해독을 구성하려면 options::auto_encryption
클래스에서 bypass_auto_encryption=True
를 설정합니다.
options::auto_encryption auto_encrypt_opts{}; auto_encrypt_opts.bypass_auto_encryption(true); // Please see full example for complete options construction. // Create a client with automatic decryption enabled, but automatic encryption bypassed. options::client client_opts{}; client_opts.auto_encryption_opts(std::move(auto_encrypt_opts)); class client client_encrypted {uri{}, std::move(client_opts)};
예제/mongocxx/explicit_encryption_auto_decryption.cpp 를 참조하세요. 자동 암호 해독과 함께 명시적 암호화 를 사용하는 예시 를 들 수 있습니다.