MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Tổng quan về mã hóa cấp trường phía máy khách trong MongoDB

Dữ liệu thường yêu cầu bảo mật cao cấp ở hầu hết mọi cấp độ của giao dịch dữ liệu để đáp ứng các chính sách bảo mật, tuân thủ và các quy định của chính phủ. Danh tiếng của tổ chức có thể bị phá hủy nếu có quyền truy cập trái phép vào dữ liệu nhạy cảm, do đó không tuân thủ nhiệm vụ đã vạch ra.

Trong blog này, chúng ta sẽ thảo luận về một số biện pháp bảo mật mà bạn có thể sử dụng liên quan đến MongoDB, đặc biệt là tập trung vào phía khách hàng.

Tình huống Dữ liệu Có thể Được Truy cập

Ai đó có thể truy cập dữ liệu MongoDB của bạn một số cách, sau đây là một số cách ...

  1. Chụp dữ liệu qua mạng không an toàn. Ai đó có thể truy cập dữ liệu của bạn thông qua API với mạng VPN và sẽ rất khó để theo dõi chúng. Dữ liệu ở trạng thái nghỉ thường là thủ phạm trong trường hợp này.
  2. Người dùng cấp cao chẳng hạn như quản trị viên có quyền truy cập trực tiếp. Điều này xảy ra khi bạn không xác định được vai trò và hạn chế của người dùng.
  3. Có quyền truy cập vào dữ liệu trên đĩa trong khi đọc cơ sở dữ liệu của các tệp sao lưu.
  4. Đọc bộ nhớ máy chủ và dữ liệu đã ghi.
  5. Nhân viên tình cờ tiết lộ dữ liệu.

Danh mục dữ liệu MongoDB và cách chúng được bảo mật

Nói chung, bất kỳ hệ thống cơ sở dữ liệu nào cũng có hai loại dữ liệu:

  1. Data-at-rest:Một dữ liệu được lưu trữ trong tệp cơ sở dữ liệu
  2. Dữ liệu trong quá trình truyền:Một dữ liệu được giao dịch giữa máy khách, máy chủ và cơ sở dữ liệu.

MongoDB có tính năng Mã hóa lúc Nghỉ ngơi mã hóa các tệp cơ sở dữ liệu trên đĩa do đó ngăn chặn truy cập vào các tệp cơ sở dữ liệu trên đĩa.

Dữ liệu trong quá trình truyền qua mạng có thể được bảo mật trong MongoDB thông qua Mã hóa truyền tải bằng TLS / SSL bằng cách mã hóa dữ liệu.

Trong trường hợp dữ liệu vô tình bị tiết lộ bởi một nhân viên, chẳng hạn như nhân viên lễ tân trên màn hình máy tính để bàn, MongoDB tích hợp Kiểm soát truy cập dựa trên vai trò cho phép quản trị viên cấp và hạn chế quyền cấp thu thập cho người dùng.

Dữ liệu được giao dịch qua máy chủ có thể vẫn còn trong bộ nhớ và những cách tiếp cận này không giải quyết được mối lo ngại về bảo mật chống lại việc truy cập dữ liệu trong bộ nhớ máy chủ. Do đó, MongoDB đã giới thiệu Mã hóa mức trường phía máy khách để mã hóa các trường cụ thể của tài liệu liên quan đến dữ liệu bí mật.

Mã hóa Cấp độ Trường

MongoDB hoạt động với các tài liệu có các trường được xác định. Một số trường có thể được yêu cầu để giữ thông tin bí mật như số thẻ tín dụng, số an sinh xã hội, dữ liệu chẩn đoán sự kiên nhẫn, v.v.

Mã hóa Cấp độ Trường sẽ cho phép chúng tôi bảo mật các trường và chỉ nhân viên được ủy quyền mới có thể truy cập chúng bằng khóa giải mã.

Việc mã hóa có thể được thực hiện theo hai cách

  1. Sử dụng khóa bí mật. Một khóa duy nhất được sử dụng cho cả mã hóa và giải mã, do đó, nó phải được trình bày khi truyền nguồn và đích nhưng được giữ bí mật bởi tất cả các bên.
  2. Sử dụng khóa công khai. Sử dụng một cặp khóa trong đó một khóa được sử dụng để mã hóa và khóa còn lại được sử dụng để giải mã

Khi áp dụng Mã hóa cấp độ trường, hãy cân nhắc sử dụng thiết lập cơ sở dữ liệu mới thay vì thiết lập hiện có.

Mã hóa mức trường phía máy khách (CSFLE)

Được giới thiệu trong MongoDB phiên bản 4.2 Enterprise để cung cấp cho quản trị viên cơ sở dữ liệu điều chỉnh để mã hóa các trường liên quan đến các giá trị cần được bảo mật. Điều này có nghĩa là, dữ liệu nhạy cảm được mã hóa hoặc giải mã bởi máy khách và chỉ được giao tiếp đến và đi từ máy chủ dưới dạng mã hóa. Bên cạnh đó, ngay cả những người dùng cấp cao không có khóa mã hóa cũng sẽ không có quyền kiểm soát các trường dữ liệu được mã hóa này.

Cách triển khai CSFLE

Để bạn triển khai Mã hóa cấp độ trường phía máy khách, bạn yêu cầu những điều sau:

  1. MongoDB Server 4.2 Enterprise
  2. MongoDB tương thích với CSFLE
  3. Quyền đối với hệ thống tệp
  4. Trình điều khiển ngôn ngữ cụ thể. (Trong blog của chúng tôi, chúng tôi sẽ sử dụng Node.js)

Quy trình triển khai bao gồm:

  • Môi trường phát triển cục bộ với phần mềm để chạy máy khách và máy chủ
  • Tạo và xác thực khóa mã hóa.
  • Định cấu hình ứng dụng khách để mã hóa cấp trường tự động
  • Xuyên suốt các hoạt động về truy vấn của các trường được mã hóa.

Triển khai CSFLE

CSFLE sử dụng chiến lược mã hóa phong bì, theo đó các khóa mã hóa dữ liệu được mã hóa bằng một khóa khác được gọi là khóa chính. Ứng dụng Máy khách tạo khóa chính được lưu trữ trong Nhà cung cấp khóa cục bộ về cơ bản là hệ thống tệp cục bộ. Tuy nhiên, phương pháp lưu trữ này không an toàn do đó trong quá trình sản xuất, người ta nên định cấu hình khóa trong Hệ thống quản lý khóa (KMS) lưu trữ và giải mã các khóa mã hóa dữ liệu từ xa.

Sau khi các khóa mã hóa dữ liệu được tạo, chúng được lưu trữ trong bộ sưu tập vault trong cùng một bộ bản sao MongoDB làm dữ liệu được mã hóa.

Tạo Khóa chính

Trong nút js, chúng ta cần tạo một khóa chính 96 byte được quản lý cục bộ và ghi nó vào một tệp trong thư mục nơi tập lệnh chính được thực thi từ:

$npm install fs && npm install crypto

Sau đó, trong tập lệnh:

const crypto = require(“crypto”)

const fs = require(“fs”)



try{

fs.writeFileSync(‘masterKey.txt’, crypto.randomBytes(96))

}catch(err){

throw err;

}

Tạo Khóa Mã hóa Dữ liệu

Khóa này được lưu trữ trong bộ sưu tập kho khóa nơi các ứng dụng khách hỗ trợ CSFLE có thể truy cập khóa để mã hóa / giải mã. Để tạo một tài khoản, bạn cần những thứ sau:

  • Khóa chính được quản lý cục bộ
  • Kết nối với cơ sở dữ liệu của bạn, đó là chuỗi kết nối MongoDB
  • Không gian tên kho tiền chính (cơ sở dữ liệu và bộ sưu tập)

Các bước tạo Khóa mã hóa dữ liệu

  1. Đọc tạo khóa chính cục bộ trước khi

const localMasterKey = fs.readFileSync(‘./masterKey.txt’);
  1. Chỉ định cài đặt nhà cung cấp KMS sẽ được khách hàng sử dụng để khám phá khóa chính.

const kmsProvider = {

local: {

key: localMasterKey

}

}
  1. Tạo Khóa Mã hóa Dữ liệu. Chúng ta cần tạo một ứng dụng khách với chuỗi kết nối MongoDB và cấu hình không gian tên kho tiền chính. Giả sử chúng ta sẽ có một cơ sở dữ liệu được gọi là người dùng và bên trong nó là một bộ sưu tập keyVault. Trước tiên, bạn cần cài đặt uuid-base64 bằng cách chạy lệnh

$ npm install uuid-base64

Sau đó, trong tập lệnh của bạn

const base64 = require('uuid-base64');

const keyVaultNamespace = 'users.keyVaul';

const client = new MongoClient('mongodb://localhost:27017', {

  useNewUrlParser: true,

  useUnifiedTopology: true,

});

async function createKey() {

  try {

    await client.connect();

    const encryption = new ClientEncryption(client, {

      keyVaultNamespace,

      kmsProvider,

    });

    const key = await encryption.createDataKey('local');

    const base64DataKeyId = key.toString('base64');

    const uuidDataKeyId = base64.decode(base64DataKeyId);

    console.log('DataKeyId [UUID]: ', uuidDataKeyId);

    console.log('DataKeyId [base64]: ', base64DataKeyId);

  } finally {

    await client.close();

  }

}

createKey();

Sau đó, bạn sẽ thấy một số kết quả giống với

DataKeyId [UUID]: ad4d735a-44789-48bc-bb93-3c81c3c90824

DataKeyId [base64]: 4K13FkSZSLy7kwABP4HQyD==

Máy khách phải có quyền ReadWrite trên không gian tên kho khóa được chỉ định

  1. Để xác minh rằng Khóa mã hóa dữ liệu đã được tạo

const client = new MongoClient('mongodb://localhost:27017', {

  useNewUrlParser: true,

  useUnifiedTopology: true,

});



async function checkClient() {

  try {

    await client.connect();

    const keyDB = client.db(users);

    const keyColl = keyDB.collection(keyVault);

    const query = {

      _id: ‘4K13FkSZSLy7kwABP4HQyD==’,

    };

    const dataKey = await keyColl.findOne(query);

    console.log(dataKey);

  } finally {

    await client.close();

  }

}

checkClient();

Bạn sẽ nhận được một số kết quả sắp xếp

{

  _id: Binary {

    _bsontype: 'Binary',

    sub_type: 4,

    position: 2,

    buffer: <Buffer 68 ca d2 10 16 5d 45 bf 9d 1d 44 d4 91 a6 92 44>

  },

  keyMaterial: Binary {

    _bsontype: 'Binary',

    sub_type: 0,

    position: 20,

    buffer: <Buffer f1 4a 9f bd aa ac c9 89 e9 b3 da 48 72 8e a8 62 97 2a 4a a0 d2 d4 2d a8 f0 74 9c 16 4d 2c 95 34 19 22 05 05 84 0e 41 42 12 1e e3 b5 f0 b1 c5 a8 37 b8 ... 110 more bytes>

  },

  creationDate: 2020-02-08T11:10:20.021Z,

  updateDate: 2020-02-08T11:10:25.021Z,

  status: 0,

  masterKey: { provider: 'local' }

}

Dữ liệu tài liệu trả về bao gồm:id khóa mã hóa dữ liệu (UUID), khóa mã hóa dữ liệu ở dạng mã hóa, thông tin nhà cung cấp KMS của khóa chính và siêu dữ liệu như ngày sáng tạo.

Chỉ định các trường được mã hóa bằng lược đồ JSON

Phần mở rộng Lược đồ JSON được trình điều khiển MongoDB sử dụng để định cấu hình mã hóa phía máy khách tự động và giải mã các trường tài liệu được chỉ định trong tập hợp. Cấu hình CSFLE cho lược đồ này sẽ yêu cầu:thuật toán mã hóa để sử dụng khi mã hóa từng trường, một hoặc tất cả các khóa mã hóa được mã hóa bằng khóa chính CSFLE và Loại BSON của mỗi trường.

Tuy nhiên, lược đồ CSFLE JSON này không hỗ trợ xác thực tài liệu, nếu không, bất kỳ trường hợp xác thực nào sẽ khiến máy khách gặp lỗi.

Khách hàng không được định cấu hình với Lược đồ JSON phía máy khách thích hợp có thể bị hạn chế ghi dữ liệu không được mã hóa vào một trường bằng cách sử dụng Lược đồ JSON phía máy chủ.

Có hai thuật toán mã hóa chủ yếu:Ngẫu nhiên và xác định.

Chúng tôi sẽ xác định một số khóa mã hóaMetadata ở cấp cơ sở của Lược đồ JSON và định cấu hình nó với các trường được mã hóa bằng cách xác định chúng trong trường thuộc tính của lược đồ, do đó chúng sẽ có thể kế thừa khóa mã hóa này .

{

    "bsonType" : "object",

    "encryptMetadata" : {

        "keyId" : // keyId generated here

    },

    "properties": {

        // field schemas here

    }

}

Giả sử bạn muốn mã hóa trường số tài khoản ngân hàng, bạn sẽ làm như sau:

"bankAccountNumber": {

    "encrypt": {

        "bsonType": "int",

        "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic"

    }

}

Bởi vì số lượng lớn và trường có thể truy vấn được, chúng tôi sử dụng phương pháp xác định. Các trường nhạy cảm như nhóm máu có kế hoạch truy vấn thấp và số lượng thấp có thể được mã hóa bằng cách sử dụng phương pháp ngẫu nhiên.

Trường mảng nên sử dụng mã hóa ngẫu nhiên với CSFLE để tăng cường mã hóa tự động cho tất cả các phần tử.

Ứng dụng Mongocryptd

Được cài đặt trong MongoDB Enterprise Service 4.2 trở lên, đây là ứng dụng mã hóa riêng biệt tự động hóa Mã hóa mức trường phía máy khách. Bất cứ khi nào một ứng dụng khách hỗ trợ CSFLE được tạo, dịch vụ này sẽ tự động được khởi động theo mặc định thành:

  • Xác thực các hướng dẫn mã hóa được nêu trong Lược đồ JSON, phát hiện trường nào sẽ được mã hóa trong các hoạt động thông lượng.
  • Ngăn các hoạt động không được hỗ trợ thực thi trên các trường được mã hóa.

Để chèn dữ liệu, chúng tôi sẽ thực hiện truy vấn chèn bình thường và tài liệu kết quả sẽ có dữ liệu mẫu bên dưới liên quan đến trường tài khoản ngân hàng.

{

…

"bankAccountNumber":"Ac+ZbPM+sk7gl7CJCcIzlRAQUJ+uo/0WhqX+KbTNdhqCszHucqXNiwqEUjkGlh7gK8pm2JhIs/P3//nkVP0dWu8pSs6TJnpfUwRjPfnI0TURzQ==",

…

}

Khi nhân viên được ủy quyền thực hiện truy vấn, trình điều khiển sẽ giải mã dữ liệu này và trả về ở định dạng có thể đọc được, tức là

{

…

"bankAccountNumber":43265436456456456756,

…

}

Lưu ý:Không thể truy vấn tài liệu trên trường được mã hóa ngẫu nhiên trừ khi bạn sử dụng trường khác để tìm tài liệu có chứa dữ liệu gần đúng của trường được mã hóa ngẫu nhiên.

Kết luận

Bảo mật dữ liệu nên được xem xét ở tất cả các cấp liên quan đến một cấp ở trạng thái nghỉ và chuyển tiếp. MongoDB Enterprise 4.2 Server cung cấp cho các nhà phát triển một cửa sổ để mã hóa dữ liệu từ phía máy khách bằng cách sử dụng Mã hóa mức trường phía máy khách, do đó bảo mật dữ liệu từ các nhà cung cấp máy chủ cơ sở dữ liệu và truy cập mạng không an toàn. CSFLE sử dụng mã hóa phong bì trong đó khóa chính được sử dụng để mã hóa khóa mã hóa dữ liệu. Do đó, khóa chính phải được giữ an toàn bằng cách sử dụng các công cụ quản lý khóa như Hệ thống quản lý khóa.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Làm cách nào để thực thi truy vấn gốc MongoDB (JSON) chỉ sử dụng mongo-java-driver?

  2. Nối các giá trị chuỗi trong mảng trong một trường duy nhất trong MongoDB

  3. Tại sao chúng ta cần một 'trọng tài viên' trong việc nhân rộng MongoDB?

  4. Nhiều số lượng với một truy vấn duy nhất trong mongodb

  5. Phân trang bằng MongoDB