Docs Menu
Docs Home
/ / /
Ruby MongoDB Driver
/ /

클라이언트 측 암호화

이 페이지의 내용

  • 설치
  • 자동 암호화
  • 명시적 암호화
  • 마스터 키 생성
  • 데이터 키 만들기
  • 자동 암호화 옵션

MongoDB 4.2에 새로 추가된 클라이언트 사이드 암호화를 통해 관리자와 개발자는 MongoDB 문서의 특정 필드를 데이터베이스에 삽입하기 전에 암호화할 수 있습니다.

클라이언트 사이드 암호화를 사용하면 개발자는 서버 사이드 구성이나 지시문 없이 클라이언트 사이드에서 필드를 암호화할 수 있습니다. 클라이언트 사이드 암호화는 애플리케이션이 서버 관리자를 포함하여 권한이 없는 당사자가 암호화된 데이터를 읽을 수 없도록 보장해야 하는 워크로드를 지원합니다.

경고

클라이언트 측 암호화를 활성화하면 최대 쓰기 배치 크기가 줄어들고 성능에 부정적인 영향을 미칠 수 있습니다.

클라이언트 사이드 암호화를 사용하려면 추가 패키지를 설치해야 합니다.

Libmongocrypt는 클라이언트 사이드 암호화를 위해 드라이버에서 사용하는 C 라이브러리입니다. 클라이언트 사이드 암호화를 사용하려면 Ruby 프로그램을 실행하는 컴퓨터에 libmongocrypt 라이브러리를 설치해야 합니다.

이 라이브러리를 설치하는 가장 쉬운 방법은 libmongocrypt-helper 를 설치하는 것입니다. 다음과 같이:

gem install libmongocrypt-helper --pre

libmongocrypt-helper의 버전 번호는 포함된 libmongocrypt의 버전 뒤에 릴리스 번호를 붙입니다. 1.3.2.r1. Ruby는 버전 번호의 모든 문자를 시험판 버전으로 간주하므로 --pre 플래그가 필요합니다.

드라이버가 자동으로 libmongocrypt-helper를 로드하므로 추가 구성이 필요하지 않습니다.

참고

libmongocrypt-helper는 현재 Linux 운영 체제만 지원합니다.

또는 사전 빌드된 libmongocrypt 바이너리 배포를 다운로드하여 다음과 같이 필요한 공유 객체를 컴퓨터에 수동으로 배치할 수 있습니다.

  • 여기 에서 모든 libmongocrypt 변형의 tarball을 다운로드합니다. .

  • 다운로드한 파일을 추출합니다. 각각 운영 체제에 해당하는 디렉토리 목록이 표시됩니다. 운영 체제와 일치하는 디렉토리를 찾아 엽니다.

  • 해당 폴더 내에서 'nocrypto' 폴더를 엽니다. OS에 따라 lib 또는 파운드64 폴더에서 libmongocrypt.so 또는 libmongocrypt.dylib 또는 libmongocrypt.exe 파일을 찾을 수 있습니다.

  • 해당 파일을 컴퓨터에서 보관할 곳으로 이동합니다. 타르볼에 포함된 다른 파일은 삭제할 수 있습니다.

소스에서 바이너리를 빌드하려면 다음을 수행합니다.

시스템에 libmongocrypt 바이너리가 있으면 LIBMONgocrypt 환경 변수를 사용하여 바이너리의 경로를 지정합니다. 이 변수를 rc 파일에 추가하는 것이 좋습니다. 예를 들면 다음과 같습니다.

export LIBMONGOCRYPT_PATH=/path/to/your/libmongocrypt.so

참고

이 섹션에서 참조하는 바이너리는 프로덕션 환경에 권장되지 않는 libmongocrypt의 시험판 버전일 수 있습니다.

자동 암호화 공유 라이브러리는 클라이언트 애플리케이션이 자동 암호화를 수행할 수 있도록 하는 동적 라이브러리입니다. 엔터프라이즈 전용 기능인 자동 암호화에만 필요합니다. 명시적 암호화만 사용하려는 경우 이 단계를 건너뛸 수 있습니다. 자동 암호화 공유 라이브러리는 mongocryptd와 동일한 기능(아래 참조)을 제공하지만 자동 암호화를 수행하기 위해 다른 프로세스를 생성할 필요가 없습니다.

설치 지침 은 MongoDB 매뉴얼 을 참조하세요.

자동 암호화가 활성화되면 libmongocrypt는 시스템 라이브러리 경로에서 공유 라이브러리를 찾거나 클라이언트를 만들 때 :crypt_shared_lib_path 옵션이 제공된 경우 특정 위치에서 라이브러리를 로드하려고 시도합니다. 라이브러리를 로드할 수 있는 경우 드라이버는 mongocryptd 데몬을 생성하려고 시도하지 않습니다. 공유 라이브러리를 찾을 수 없는 경우에도 데몬이 생성됩니다.

클라이언트를 생성할 때 crypt_shared_lib_required: true 옵션을 전달하여 공유 라이브러리를 사용하도록 요구할 수도 있습니다. 이 경우 공유 라이브러리를 로드할 수 없으면 오류가 발생합니다.

참고

단일 운영 체제 프로세스에서 2개 이상의 crypt_shared 동적 라이브러리를 동시에 로드하면 오류가 발생하므로 동일한 프로세스의 모든 Mongo::Client 객체는 동일한 설정 :crypt_shared_lib_path 을 사용해야 합니다.

Mongocryptd는 자동 암호화 공유 라이브러리의 대안입니다. Mongocryptd는 지정된 작업에서 암호화할 필드를 드라이버에 알려주는 데몬입니다. 엔터프라이즈 전용 기능인 자동 암호화에만 필요합니다. 명시적 암호화만 사용하려는 경우 이 단계를 건너뛸 수 있습니다.

Mongocryptd는 MongoDB 서버의 엔터프라이즈 빌드(버전 4.2 이상)와 함께 사전 패키지로 제공됩니다. 설치 지침은 MongoDB 매뉴얼 을 참조하세요.

mongocryptd를 구성하려면(예: 수신 대기하는 포트 또는 데몬을 생성하는 데 사용되는 경로) 자동 암호화를 수행하는 Mongo::Client 에 다양한 옵션을 전달해야 합니다. 자세한 내용은 이 튜토리얼의 :extra_options 섹션을 참조하세요.

자동 암호화는 사용자가 데이터베이스 작업을 수행할 때 특정 문서 필드를 항상 암호화하도록 Mongo::Client 인스턴스를 구성할 수 있는 기능입니다. Mongo::Client 가 구성되면 암호화가 필요한 모든 필드를 데이터베이스에 쓰기 전에 자동으로 암호화하고, 해당 필드를 읽을 때 자동으로 암호를 해독합니다.

클라이언트 사이드 암호화는 데이터 키로 데이터를 암호화하고 다시 마스터 키를 사용하여 암호화하는 방식인 봉투 암호화를 구현합니다. 따라서 MongoDB로 클라이언트 사이드 암호화를 사용하는 데는 세 가지 주요 단계가 포함됩니다.

  1. 마스터 키 생성

  2. 데이터 키 생성(및 마스터 키를 사용하여 암호화)

  3. 데이터 키를 사용하여 데이터 암호화

아래 예에서는 자동 암호화를 수행하기 위해 로컬 마스터 키를 사용하여 이러한 단계를 수행하는 방법을 보여 줍니다.

참고

자동 암호화는 컬렉션의 작업에만 적용되는 엔터프라이즈 전용 기능입니다. 데이터베이스 또는 뷰에서의 작업에는 자동 암호화가 지원되지 않으며, 우회하지 않는 작업은 오류를 발생시킵니다( 자동 암호화 허용 목록 참조). ). 모든 작업에 대해 자동 암호화를 우회하려면 auto_encryption_options 에서 bypass_auto_encryption 를 true로 설정합니다.

참고

자동 암호화를 사용하려면 인증된 사용자에게 listCollections 권한 작업이 있어야 합니다.

참고

자동 암호화를 사용하고 :auto_encryption_options 로 구성된 Mongo::Client 인스턴스의 연결 풀 크기가 제한되어 있는 경우(즉, 기본 설정이 0이 아닌 :max_pool_size) 별도의 내부 Mongo::Client 인스턴스가 생성됩니다. 다음 중 하나라도 해당되는 경우:

  • auto_encryption_options[:key_vault_client] 은(는) 전달되지 않습니다.

  • auto_encryption_options[:bypass_automatic_encryption] 통과 또는 거짓이 아닙니다.

내부 Mongo::Client 인스턴스가 생성되면 :min_pool_size 이(가) 0으로 설정되고 :auto_encryption_options 이(가) 생략된다는 점을 제외하고 상위 클라이언트와 동일한 옵션으로 구성됩니다.

require 'mongo'
#####################################
# Step 1: Create a local master key #
#####################################
# A local master key is a 96-byte binary blob.
local_master_key = SecureRandom.random_bytes(96)
# => "\xB2\xBE\x8EN\xD4\x14\xC2\x13\xC3..."
#############################
# Step 2: Create a data key #
#############################
kms_providers = {
local: {
key: local_master_key
}
}
# The key vault client is a Mongo::Client instance connected to the collection
# that will store your data keys.
key_vault_client = Mongo::Client.new(['localhost:27017'])
# Use an instance of Mongo::ClientEncryption to create a new data key
client_encryption = Mongo::ClientEncryption.new(
key_vault_client,
key_vault_namespace: 'encryption.__keyVault',
kms_providers: kms_providers
)
data_key_id = client_encryption.create_data_key('local')
# => <BSON::Binary... type=ciphertext...>
#######################################################
# Step 3: Configure Mongo::Client for auto-encryption #
#######################################################
# Create a schema map, which tells the Mongo::Client which fields to encrypt
schema_map = {
'encryption_db.encryption_coll': {
properties: {
encrypted_field: {
encrypt: {
keyId: [data_key_id],
bsonType: "string",
algorithm: "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic"
}
}
},
bsonType: "object"
}
}
# Configure the client for automatic encryption
client = Mongo::Client.new(
['localhost:27017'],
auto_encryption_options: {
key_vault_namespace: 'encryption.__keyVault',
kms_providers: kms_providers,
schema_map: schema_map
},
database: 'encryption_db',
)
collection = client['encryption_coll']
collection.drop # Make sure there is no data in the collection
# The string "sensitive data" will be encrypted and stored in the database
# as ciphertext
collection.insert_one(encrypted_field: 'sensitive data')
# The data is decrypted before being returned to the user
collection.find(encrypted_field: 'sensitive data').first['encrypted_field']
# => "sensitive data"
# A client with no auto_encryption_options is unable to decrypt the data
client_no_encryption = Mongo::Client.new(
['localhost:27017'],
database: 'encryption_db',
)
client_no_encryption['encryption_coll'].find.first['encrypted_field']
# => <BSON::Binary... type=ciphertext...>

위의 예는 로컬 마스터 키와 함께 자동 암호화를 사용하는 방법을 보여줍니다. 다른 키 관리 서비스를 사용하여 마스터 키를 생성하고 데이터 키를 생성하는 방법에 대한 자세한 내용은 이 튜토리얼의 다음 섹션을 참조하세요.

명시적 암호화는 사용자가 문자열, 정수 또는 기호와 같은 개별 데이터 조각을 암호화하고 해독할 수 있는 기능입니다. 명시적 암호화는 커뮤니티 기능이므로 엔터프라이즈에서 MongoDB Server를 빌드할 필요가 없습니다. 모든 명시적 암호화 및 암호 해독 작업을 수행하려면 ClientEncryption 클래스의 인스턴스를 사용하세요.

클라이언트 사이드 암호화는 데이터 키로 데이터를 암호화하고 다시 마스터 키를 사용하여 암호화하는 방식인 봉투 암호화를 구현합니다. 따라서 MongoDB로 클라이언트 사이드 암호화를 사용하는 데는 세 가지 주요 단계가 포함됩니다.

  1. 마스터 키 생성

  2. 데이터 키 생성(및 마스터 키를 사용하여 암호화)

  3. 데이터 키를 사용하여 데이터 암호화

아래 예에서는 명시적 암호화를 수행하기 위해 로컬 마스터 키를 사용하여 이러한 단계를 수행하는 방법을 보여 줍니다.

require 'mongo'
#####################################
# Step 1: Create a local master key #
#####################################
# A local master key is a 96-byte binary blob.
local_master_key = SecureRandom.random_bytes(96)
# => "\xB2\xBE\x8EN\xD4\x14\xC2\x13\xC3..."
#############################
# Step 2: Create a data key #
#############################
kms_providers = {
local: {
key: local_master_key
}
}
# The key vault client is a Mongo::Client instance connected to the collection
# that will store your data keys.
key_vault_client = Mongo::Client.new(['localhost:27017'])
# Use an instance of Mongo::ClientEncryption to create a new data key
client_encryption = Mongo::ClientEncryption.new(
key_vault_client,
key_vault_namespace: 'encryption.__keyVault',
kms_providers: kms_providers
)
data_key_id = client_encryption.create_data_key('local')
# => <BSON::Binary... type=ciphertext...>
#####################################################
# Step 3: Encrypt a string with explicit encryption #
#####################################################
# The value to encrypt
value = 'sensitive data'
# Encrypt the value
encrypted_value = client_encryption.encrypt(
'sensitive data',
{
key_id: data_key_id,
algorithm: "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic"
}
)
# Create the client you will use to read and write the data to MongoDB
client = Mongo::Client.new(
['localhost:27017'],
database: 'encryption_db',
)
collection = client['encryption_coll']
collection.drop # Make sure there is no data in the collection
# Insert the encrypted value into the collection
collection.insert_one(encrypted_field: encrypted_value)
# Use the client to read the encrypted value from the database, then
# use the ClientEncryption object to decrypt it
find_result = collection.find(encrypted_field: encrypted_value).first['encrypted_field']
# => <BSON::Binary...> (the find result is encrypted)
unencrypted_result = client_encryption.decrypt(find_result)
# => "sensitive data"

위의 예는 로컬 마스터 키와 함께 명시적 암호화를 사용하는 방법을 보여줍니다. 다른 키 관리 서비스를 사용하여 마스터 키를 생성하고 데이터 키를 생성하는 방법에 대한 자세한 내용은 이 튜토리얼의 다음 섹션을 참조하세요.

자동 암호화와 명시적 암호화 모두 암호화 마스터 키가 필요합니다. 이 마스터 키는 데이터 키를 암호화하는 데 사용되며, 이는 다시 사용자 데이터를 암호화하는 데 사용됩니다. 마스터 키는 로컬 키를 생성하거나 KMS에서 키를 생성하는 두 가지 방법 중 하나로 생성할 수 있습니다. 현재 Ruby 드라이버는 AWS 키 관리 서비스(KMS), Azure Key Vault 및 Google Cloud 키 관리(GCP KMS)를 지원합니다.

로컬 마스터 키는 96바이트 바이너리 문자열입니다. 이 값은 컴퓨터에 환경 변수 또는 텍스트 파일로 저장되어야 합니다.

경고

로컬 마스터 키를 사용하는 것은 안전하지 않으며 프로덕션에서 클라이언트 사이드 암호화를 사용하려는 경우 권장되지 않습니다.

Ruby를 사용하여 로컬 마스터 키를 생성하려면 다음 코드를 실행하세요.

local_master_key = SecureRandom.random_bytes(96)
# => "\xB2\xBE\x8EN\xD4\x14\xC2\x13\xC3..." (a binary blob)

원격 KMS를 사용하여 마스터 키를 생성하고 저장하는 것이 좋습니다. 이렇게 하려면 MongoDB 클라이언트 측 암호화 문서에서 "원격 마스터 키 설정" 단계를 따르세요.

마스터 키 생성에 대한 자세한 내용은 MongoDB 매뉴얼의 마스터 키 생성 섹션을 참조하세요.

마스터 키를 생성한 후에는 Mongo::ClientEncryption 클래스의 인스턴스에서 #create_data_key 메서드를 호출하여 데이터 키를 생성합니다. 이 메서드는 새 데이터 키를 생성하고 이를 데이터 키를 저장하도록 선택한 MongoDB 컬렉션인 키 볼트 컬렉션에 삽입합니다. #create_data_key 메서드는 새로 생성된 데이터 키의 ID를 BSON::Binary 객체 형식으로 반환합니다.

로컬 마스터 키를 생성한 경우 이를 사용하여 다음 코드 스니펫으로 새 데이터 키를 생성할 수 있습니다.

경고

로컬 마스터 키를 사용하는 것은 안전하지 않으며 프로덕션에서 클라이언트 사이드 암호화를 사용하려는 경우 권장되지 않습니다.

# A Mongo::Client instance that will be used to connect to the key vault
# collection. Replace the server address with the address of the MongoDB
# server where you would like to store your key vault collection.
key_vault_client = Mongo::Client.new(['localhost:27017'])
client_encryption = Mongo::ClientEncryption.new(
key_vault_client,
# Replace with the database and collection names for your key vault collection
key_vault_namespace: 'encryption.__keyVault',
kms_providers: {
local: {
key: local_master_key
}
}
)
data_key_id = client_encryption.create_data_key('local')
# => <BSON::Binary... type=ciphertext...>

새 로컬 마스터 키 생성에 대한 자세한 내용은 로컬 마스터 키 섹션을 참조하세요.

Amazon Web Services KMS 마스터 키를 생성한 경우 해당 키를 사용할 권한이 있는 IAM 사용자의 액세스 키 ID와 비공개 액세스 키를 기록해 둡니다. 또한 Amazon Web Services 리전과 마스터 키의 Amazon 리소스 번호(ARN)를 확인합니다. 해당 정보를 사용하여 데이터 키를 생성합니다.

Azure 마스터 키를 만든 경우 키를 사용할 권한이 있는 애플리케이션의 테넌트 ID, 클라이언트 ID 및 클라이언트 시크릿을 기록해 둡니다. 또한 마스터 키의 키 이름, 키 버전(있는 경우) 및 Key Vault 엔드포인트를 기록해 둡니다. 해당 정보를 사용하여 데이터 키를 생성합니다.

GCP KMS 마스터 키를 생성한 경우 키를 사용할 권한이 있는 애플리케이션의 이메일과 비공개 키, 클라이언트 시크릿을 기록해 둡니다. 또한 마스터 키의 프로젝트 ID, 위치, 키링, 키 이름, 키 버전(있는 경우)을 기록해 둡니다. 해당 정보를 사용하여 데이터 키를 생성합니다.

GCP 비공개 키의 형식은 다양할 수 있습니다. Ruby 드라이버는 DER로 인코딩된 RSA 비공개 키를 base64로 인코딩된 문자열로 지원합니다. 자기 공명 영상 Ruby의 경우 드라이버는 PEM으로 인코딩된 RSA 비공개 키를 추가로 지원합니다.

KMIP(Key Management Interoperability Protocol) 호환 키 관리 서버를 사용하여 마스터 키를 생성한 경우 서버 호스트 및 포트, 키 ID를 기록해 둡니다. 해당 정보를 사용하여 데이터 키를 생성합니다. KMIP 서버에 인증하기 위해 인증 기관 인증서, 클라이언트 인증서 및 비공개 키가 필요할 수도 있습니다.

# A Mongo::Client instance that will be used to connect to the key vault
# collection. Replace the server address with the address of the MongoDB
# server where you would like to store your key vault collection.
key_vault_client = Mongo::Client.new(['localhost:27017'])
client_encryption = Mongo::ClientEncryption.new(
key_vault_client,
# Replace with the database and collection names for your key vault collection
key_vault_namespace: 'encryption.__keyVault',
kms_providers: {
aws: {
access_key_id: 'IAM-ACCESS-KEY-ID',
secret_access_key: 'IAM-SECRET-ACCESS-KEY'
},
azure: {
tenant_id: 'AZURE-TENANT-ID',
client_id: 'AZURE-CLIENT-ID',
client_secret: 'AZURE-CLIENT-SECRET'
},
gcp: {
email: 'GCP-EMAIL',
# :private_key value should be GCP private key as base64 encoded
# DER RSA private key, or PEM RSA private key, if you are using MRI Ruby.
private_key: 'GCP-PRIVATE-KEY',
},
kmip: {
# KMIP server endpoint may include port.
endpoint: 'KMIP-SERVER-HOST'
},
# TLS options to connect to KMIP server.
kms_tls_options: {
kmip: {
ssl_ca_cert: 'PATH-TO-CA-FILE',
ssl_cert: 'PATH-TO-CLIENT-CERT-FILE',
ssl_key: 'PATH-TO-CLIENT-KEY-FILE'
}
}
}
)
aws_data_key_id = client_encryption.create_data_key(
'aws',
{
master_key: {
region: 'REGION-OF-YOUR-MASTER-KEY',
key: 'ARN-OF-YOUR-MASTER-KEY'
}
}
)
# => <BSON::Binary... type=ciphertext...>
azure_data_key_id = client_encryption.create_data_key(
'azure',
{
master_key: {
key_vault_endpoint: 'AZURE-KEY-VAULT-ENDPOINT',
key_name: 'AZURE-KEY-NAME'
}
}
)
# => <BSON::Binary... type=ciphertext...>
gcp_data_key_id = client_encryption.create_data_key(
'gcp',
{
master_key: {
project_id: 'GCP-PROJECT-ID',
location: 'GCP-LOCATION',
key_ring: 'GCP-KEY-RING',
key_name: 'GCP-KEY-NAME',
}
}
)
# => <BSON::Binary... type=ciphertext...>

새 원격 마스터 키를 생성하고 데이터 키를 생성하는 데 필요한 정보를 찾는 방법에 대한 자세한 내용은 이 튜토리얼의 원격 마스터 키 섹션을 참조하세요.

데이터 키 생성에 대한 자세한 내용은 MongoDB 매뉴얼의 데이터 암호화 키 생성 섹션을 참조하세요.

가능한 KMS TLS 옵션 목록은 클라이언트 참조 생성 을 참조하세요. Mongo::ClientEncryption 생성자는 Mongo::Client 와 동일한 ssl_ 옵션을 허용합니다.

자동 암호화는 auto_encryption_options 옵션 Hash 를 사용하여 Mongo::Client 에 구성할 수 있습니다. 이 섹션에서는 auto_encryption_options 내의 필드에 대한 개요를 제공하고 해당 값을 선택하는 방법을 설명합니다.

키 볼트 클라이언트는 암호화 데이터 키가 포함된 MongoDB collection에 연결하는 데 사용되는 Mongo::Client 인스턴스입니다. 예를 들어, 키 볼트가 localhost:30000 의 MongoDB 인스턴스에서 호스팅된 경우입니다.

key_vault_client = Mongo::Client.new(['localhost:30000'])
Mongo::Client.new(['localhost:27017],
auto_encryption_options: {
key_vault_client: key_vault_client,
# ... (Fill in other options here)
}
)

데이터 키가 암호화된 데이터를 저장하는 것과 동일한 MongoDB 인스턴스에 저장되는 경우, 이 옵션을 비워 둘 수 있으며, 최상위 클라이언트를 사용하여 데이터 키를 삽입하고 가져옵니다.

키 볼트 네임스페이스는 "database_name.collection_name" 형식의 String 이며, 여기서 database_namecollection_name 는 데이터 키를 저장하려는 데이터베이스 및 collection의 이름입니다. 예를 들어 데이터 키가 __keyVault collection의 encryption 데이터베이스에 저장되어 있는 경우입니다.

Mongo::Client.new(['localhost:27017],
auto_encryption_options: {
key_vault_namespace: 'encryption.__keyVault',
# ... (Fill in other options here)
}
)

기본 키 볼트 네임스페이스는 없으며 이 옵션을 제공해야 합니다.

KMS 제공자 이름이 키로 포함되고 제공자 옵션이 값으로 포함된 해시입니다.

Mongo::Client.new(['localhost:27017],
auto_encryption_options: {
key_vault_namespace: 'encryption.__keyVault',
kms_providers: {
aws: {
access_key_id: 'IAM-ACCESS-KEY-ID',
secret_access_key: 'IAM-SECRET-ACCESS-KEY'
},
azure: {
tenant_id: 'AZURE-TENANT-ID',
client_id: 'AZURE-CLIENT-ID',
client_secret: 'AZURE-CLIENT-SECRET'
},
gcp: {
email: 'GCP-EMAIL',
# :private_key value should be GCP private key as base64 encoded
# DER RSA private key, or PEM RSA private key, if you are using MRI Ruby.
private_key: 'GCP-PRIVATE-KEY',
},
kmip: {
# KMIP server endpoint may include port.
endpoint: 'KMIP-SERVER-HOST'
},
# TLS options to connect to KMIP server.
kms_tls_options: {
kmip: {
ssl_ca_cert: 'PATH-TO-CA-FILE',
ssl_cert: 'PATH-TO-CLIENT-CERT-FILE',
ssl_key: 'PATH-TO-CLIENT-KEY-FILE'
}
}
}
}
)

클라이언트는 환경이나 EC2 또는 ECS 메타데이터 엔드포인트에서 Amazon Web Services 자격 증명을 검색할 수 있습니다. 자격 증명을 자동으로 검색하려면 Amazon Web Services에 대한 KMS 공급자 옵션으로 빈 해시를 지정합니다.

Mongo::Client.new(['localhost:27017'],
auto_encryption_options: {
key_vault_namespace: 'encryption.__keyVault',
kms_providers: {
aws: {}
}
}
)

자격 증명 검색에 대한 자세한 내용은 '자동 으로 자격 증명 검색'을 참조하세요.

클라이언트는 Google Compute 엔진 메타데이터 엔드포인트에서 GCP 자격 증명을 검색할 수 있습니다. 자격 증명을 자동으로 검색하려면 GCP에 대한 KMS 제공자 옵션으로 빈 해시를 지정합니다.

Mongo::Client.new(['localhost:27017'],
auto_encryption_options: {
key_vault_namespace: 'encryption.__keyVault',
kms_providers: {
gcp: {}
}
}
)

KMP 제공자 이름이 키로 포함된 해시와 해당 제공자에 연결하기 위한 TLS 옵션입니다.

Mongo::Client.new(['localhost:27017],
auto_encryption_options: {
key_vault_namespace: 'encryption.__keyVault',
kms_providers: {
kmip: {
endpoint: 'KMIP-SERVER-HOST'
}
},
kms_tls_options: {
kmip: {
ssl_ca_cert: 'PATH-TO-CA-FILE',
ssl_cert: 'PATH-TO-CLIENT-CERT-FILE',
ssl_key: 'PATH-TO-CLIENT-KEY-FILE'
}
}
}
)

스키마 맵은 자동으로 암호화하고 해독할 필드에 대한 정보가 들어 있는 해시입니다.

이 튜토리얼 상단의 코드 스니펫은 Ruby Hash 를 사용하여 스키마 맵을 만드는 방법을 보여줍니다. 이 방법은 작동하지만 스키마 맵이 상당히 커질 수 있고 Ruby 코드에 포함하기가 거북할 수 있습니다. 대신 별도의 JSON(JavaScript 객체 Notation) 파일에 저장하는 것이 좋습니다.

JSON 파일을 생성하기 전에 데이터 키의 UUID를 Base64로 인코딩합니다.

Base64.encode64(data_key_id.data)
# => "sr6OTtQUwhPD..." (a base64-encoded string)

그런 다음 초안 표준 구문에 정의된 형식으로 스키마 맵을 포함하는 새 파일을 JSON JSON schema 만듭니다.4 스키마 맵 형식 지정에 대한 자세한 내용은 MongoDB 매뉴얼의 자동 암호화 규칙 섹션에서 확인할 수 있습니다.

{
"encryption_db.encryption_coll": {
"properties": {
"encrypted_field": {
"encrypt": {
"keyId": [{
"$binary": {
"base64": "YOUR-BASE64-ENCODED-DATA-KEY-ID",
"subType": "04"
}
}],
"bsonType": "string",
"algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic"
}
}
},
"bsonType": "object"
}
}

스키마 맵을 사용하려면 bson Ruby 젬의 BSON::ExtJSON 모듈을 사용하여 스키마 맵을 Ruby Hash 로 변환합니다.

schema_map = BSON::ExtJSON.parse(File.read('/path/to/your/file.json'))
# => { 'encryption_db.encryption_coll' => { ... } }
Mongo::Client.new(['localhost:27017],
auto_encryption_options: {
schema_map: schema_map,
# ... (Fill in other options here)
}
)

참고

MongoDB 컬렉션의 유효성 검사기로 스키마 맵을 제공하는 것도 가능합니다. 이를 '원격 스키마 맵'이라고 하며, Mongo::Client 에서 옵션으로 스키마 맵을 제공하는 것을 '로컬 스키마 맵'이라고 합니다.

로컬 스키마 맵을 제공하면 서버에서 얻은 JSON schema에 의존하는 것보다 더 강력한 보안을 제공할 수 있습니다. 클라이언트를 속여 암호화되어야 하는 암호화되지 않은 데이터를 전송하도록 할 수 있는 잘못된 JSON 스키마를 광고하는 악의적인 서버로부터 보호합니다.

스키마 맵을 사용하여 컬렉션에 JSON schema 유효성 검사기를 만드는 방법에 대한 자세한 내용은 MongoDB 매뉴얼의 서버 측 필드 레벨 암호화 시행 을 참조하세요.

다음도 참조하세요.

파일에서 스키마 맵을 로드하는 것도 가능합니다. 위에서 설명한 대로 스키마 맵을 준비하고 파일에 저장한 다음 :schema_map_path 옵션을 사용하여 파일의 경로를 전달합니다.

Mongo::Client.new(['localhost:27017],
auto_encryption_options: {
schema_map_path: '/path/to/your/file.json',
# ... (Fill in other options here)
}
)

:bypass_auto_encryption 옵션은 Mongo::Client 가 데이터베이스에 쓸 때 암호화를 건너뛸지 여부를 지정하는 Boolean 입니다. :bypass_auto_encryptiontrue 인 경우 클라이언트는 이전에 암호화된 데이터의 자동 암호 해독을 계속 수행합니다.

Mongo::Client.new(['localhost:27017],
auto_encryption_options: {
bypass_auto_encryption: true,
# ... (Fill in other options here)
}
)

:extra_options mongocryptd 생성과 관련된 옵션의 Hash 입니다. 이 Hash 의 모든 옵션에는 기본값이 있으므로 기본값을 재정의하려는 옵션만 제공하면 됩니다.

  • :mongocryptd_spawn_args - 이는 mongocryptd를 생성하기 위한 인수가 포함된 Array<String> 입니다. Ruby 드라이버는 데몬 생성 시 이러한 인수를 mongocryptd에 전달합니다. 가능한 인수는 다음과 같습니다.

    • "--idleShutdownTimeoutSecs" - mongocryptd가 종료되기 전에 유휴 상태로 유지되어야 하는 시간(초)입니다. 기본값은 60입니다.

    • "--port" - mongocryptd가 연결을 수신할 포트입니다. 기본값은 27020입니다.

  • :mongocryptd_uri - 드라이버가 mongocryptd에 연결하는 데 사용할 URI입니다. 기본적으로 이 값은 "mongodb://localhost:27020" 입니다.

  • :mongocryptd_spawn_path - mongocryptd 실행 파일의 경로입니다. 기본값은 "mongocryptd" 입니다.

  • :mongocryptd_bypass_spawn - 드라이버가 mongocryptd 생성을 건너뛸지 여부를 나타내는 Boolean 입니다.

예를 들어 포트 30000에서 mongocryptd를 실행하려면 다음과 같이 extra_options 을 제공합니다.

Mongo::Client.new(['localhost:27017],
auto_encryption_options: {
extra_options: {
mongocryptd_spawn_args: ['--port=30000'],
mongocryptd_uri: 'mongodb://localhost:30000',
}
# ... (Fill in other options here)
}
)

경고

:extra_options 의 내용은 클라이언트 사이드 암호화 API의 향후 버전에서 변경될 수 있습니다.

돌아가기

Queryable Encryption