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

Cách sử dụng mã hóa để bảo vệ dữ liệu MongoDB của bạn

Bảo mật cơ sở dữ liệu là yếu tố chính cần xem xét đối với bất kỳ ứng dụng nào liên quan đến dữ liệu nhạy cảm cao như báo cáo tài chính và sức khỏe. Bảo vệ dữ liệu có thể đạt được thông qua mã hóa ở các cấp độ khác nhau, bắt đầu từ chính ứng dụng đến các tệp lưu giữ dữ liệu.

Vì MongoDB là một cơ sở dữ liệu không quan hệ, người ta không cần xác định cột trước khi chèn dữ liệu; và do đó các tài liệu trong cùng một bộ sưu tập có thể có các trường khác nhau.

Mặt khác, đối với SQL DBMS, người ta phải xác định các cột cho dữ liệu, do đó tất cả các hàng đều có các cột giống nhau. Người ta có thể quyết định mã hóa các cột riêng lẻ, toàn bộ tệp cơ sở dữ liệu hoặc dữ liệu từ ứng dụng trước khi tham gia vào quá trình cơ sở dữ liệu.

Mã hóa các cột riêng lẻ được ưu tiên nhất vì nó rẻ hơn và ít dữ liệu được mã hóa hơn, do đó cải thiện độ trễ. Nói chung, hiệu suất tổng thể ảnh hưởng do mã hóa.

Đối với NoSQL DBMS, tuy nhiên, cách tiếp cận này sẽ không phải là tốt nhất. Xem xét rằng không phải tất cả các tài liệu đều có thể có tất cả các trường bạn muốn sử dụng trong mã hóa của mình, nên không thể thực hiện mã hóa mức cột.

Mã hóa dữ liệu ở cấp độ ứng dụng khá tốn kém và khó thực hiện. Do đó, chúng tôi vẫn duy trì tùy chọn mã hóa dữ liệu ở cấp cơ sở dữ liệu.

MongoDB cung cấp mã hóa gốc mà không yêu cầu người dùng phải trả thêm chi phí để bảo mật dữ liệu nhạy cảm của bạn.

Mã hóa dữ liệu trong MongoDB

Bất kỳ hoạt động cơ sở dữ liệu nào liên quan đến một trong hai dạng dữ liệu này, dữ liệu ở trạng thái nghỉ hoặc dữ liệu đang chuyển động.

Dữ liệu đang chuyển động là một luồng dữ liệu di chuyển qua bất kỳ loại mạng nào trong khi dữ liệu ở trạng thái nghỉ là tĩnh do đó không di chuyển đến bất cứ đâu.

Cả hai loại dữ liệu wo này đều dễ bị can thiệp từ bên ngoài bởi người dùng ẩn danh trừ khi có liên quan đến mã hóa. Quá trình mã hóa bao gồm:

  • Tạo khóa chính cho toàn bộ cơ sở dữ liệu
  • Tạo các khóa duy nhất cho mỗi cơ sở dữ liệu
  • Mã hóa dữ liệu của bạn bằng các khóa cơ sở dữ liệu bạn đã tạo
  • Mã hóa toàn bộ cơ sở dữ liệu bằng khóa chính

Mã hóa dữ liệu khi chuyển tuyến

Dữ liệu được giao dịch giữa MongoDB và ứng dụng máy chủ theo hai cách, đó là thông qua Bảo mật lớp truyền tải (TLS) và Lớp cổng bảo mật (SSL).

Đây là hai giao thức mã hóa được sử dụng nhiều nhất để bảo mật dữ liệu gửi và nhận giữa hai hệ thống. Về cơ bản, khái niệm này là mã hóa các kết nối đến các cá thể mongod và mongos sao cho lưu lượng mạng chỉ máy khách dự kiến ​​mới có thể đọc được.

TLS / SSL được sử dụng trong MongoDB với một số chứng chỉ dưới dạng tệp PEM được cấp bởi tổ chức phát hành chứng chỉ hoặc có thể là chứng chỉ tự ký. Cái thứ hai có một hạn chế là tuy nhiên kênh giao tiếp được mã hóa, luôn không có xác nhận đối với danh tính máy chủ do đó dễ bị tấn công từ bên ngoài giữa chừng. Do đó, bạn nên sử dụng các chứng chỉ của cơ quan đáng tin cậy cho phép trình điều khiển MongoDB cũng xác minh danh tính máy chủ.

Bên cạnh mã hóa, TLS / SSL có thể được sử dụng để xác thực máy khách và xác thực nội bộ của các thành viên của nhóm bản sao và cụm phân đoạn thông qua chứng chỉ.

Cấu hình TLS / SSL cho Khách hàng

Có nhiều cài đặt tùy chọn TLS / SSL khác nhau có thể được sử dụng trong cấu hình của các giao thức này.

Ví dụ:nếu bạn muốn kết nối với phiên bản Mongod bằng mã hóa, bạn sẽ bắt đầu phiên bản của mình như,

mongo --ssl --host example.com --sslCAFile /etc/ssl/ca.pem

--ssl bật kết nối TLS / SSL.

--sslCAFile chỉ định tệp pem của tổ chức phát hành chứng chỉ (CA) để xác minh chứng chỉ do mongod hoặc mongos cung cấp. Do đó, trình bao Mongo sẽ xác minh chứng chỉ do cá thể mongod cấp dựa trên tệp CA được chỉ định và tên máy chủ.

Bạn cũng có thể muốn kết nối phiên bản MongoDB yêu cầu chứng chỉ ứng dụng khách. Chúng tôi sử dụng mẫu mã bên dưới

mongo --ssl --host hostname.example.com --sslPEMKeyFile /etc/ssl/client.pem --sslCAFile /etc/ssl/ca.pem

Tùy chọn --sslPEMKeyFile chỉ định tệp .pem chứa chứng chỉ trình bao mongo và một khóa để hiển thị cho cá thể mongod hoặc mongos. Trong quá trình kết nối:

Trình bao mongo sẽ xác minh xem chứng chỉ có phải từ Tổ chức phát hành chứng chỉ được chỉ định là (--sslCAFile) hay không và nếu không, trình bao sẽ không kết nối được.

Thứ hai, shell cũng sẽ xác minh xem tên máy chủ được chỉ định trong tùy chọn --host có khớp với SAN / CN trong chứng chỉ do mongod hoặc mongos trình bày hay không. Nếu tên máy chủ này không khớp với một trong hai thì kết nối sẽ không thành công.

Nếu không muốn sử dụng chứng chỉ tự ký, bạn phải đảm bảo mạng kết nối đáng tin cậy.

Bên cạnh đó, bạn cần giảm sự xuất hiện của khóa cá nhân, đặc biệt là những nơi có liên quan đến bộ bản sao / cụm phân đoạn. Điều này có thể đạt được bằng cách sử dụng các chứng chỉ khác nhau trên các máy chủ khác nhau.

Các tùy chọn bổ sung có thể được sử dụng trong các kết nối là:

requestSSL:điều này sẽ hạn chế mỗi máy chủ chỉ sử dụng các kết nối được mã hóa TLS / SSL.

--sslAllowConnectionsWithoutCertificates:Điều này cho phép xác thực nếu chỉ máy khách xuất trình chứng chỉ, ngược lại nếu không có chứng chỉ, máy khách sẽ vẫn được kết nối ở chế độ mã hóa. Ví dụ:

mongod --sslMode requireSSL --sslAllowConnectionsWithoutCertificates --sslPEMKeyFile /etc/ssl/mongodb.pem --sslCAFile /etc/ssl/ca.pem

sslDisabledProtocols:tùy chọn này ngăn máy chủ chấp nhận các kết nối đến sử dụng các giao thức cụ thể. Điều này có thể được thực hiện với:

mongod --sslMode requireSSL --sslDisabledProtocols TLS1_0,TLS1_1 --sslPEMKeyFile /etc/ssl/mongodb.pem --sslCAFile /etc/ssl/ca.pem

Mã hóa dữ liệu ở phần còn lại

Từ phiên bản 3.2, MongoDB đã giới thiệu một tùy chọn mã hóa riêng cho công cụ lưu trữ WiredTiger. Bên thứ ba chỉ có thể truy cập vào dữ liệu trong bộ lưu trữ này thông qua khóa giải mã để giải mã dữ liệu thành định dạng có thể đọc được.

Thuật toán mật mã mã hóa thường được sử dụng trong MongoDB là AES256-GCM. Nó sử dụng cùng một khóa bí mật để mã hóa và giải mã dữ liệu. Có thể bật mã hóa bằng chế độ FIPS, do đó đảm bảo mã hóa đáp ứng tiêu chuẩn và tuân thủ cao nhất.

Toàn bộ tệp cơ sở dữ liệu được mã hóa bằng mã hóa dữ liệu minh bạch (TDE) ở cấp lưu trữ.

Bất cứ khi nào tệp được mã hóa, một khóa mã hóa riêng tư duy nhất sẽ được tạo ra và rất tốt để hiểu cách các khóa này được quản lý và lưu trữ. Tất cả các khóa cơ sở dữ liệu được tạo sau đó đều được mã hóa bằng khóa chính.

Sự khác biệt giữa khóa cơ sở dữ liệu và khóa chính là các khóa cơ sở dữ liệu có thể được lưu trữ cùng với chính dữ liệu được mã hóa nhưng đối với khóa chính, MongoDB khuyên nó nên được lưu trữ trong một máy chủ khác với dữ liệu được mã hóa, chẳng hạn như khóa doanh nghiệp của bên thứ ba. giải pháp quản lý.

Với dữ liệu sao chép, tiêu chí mã hóa không được chia sẻ cho các nút khác vì dữ liệu không được mã hóa nguyên bản qua dây. Người ta có thể sử dụng lại cùng một khóa cho các nút nhưng cách tốt nhất là sử dụng các khóa riêng lẻ duy nhất cho mọi nút.

Khóa mã hóa xoay

Khóa được quản lý được sử dụng để giải mã dữ liệu nhạy cảm phải được xoay vòng hoặc thay thế ít nhất mỗi năm một lần. Có hai tùy chọn trong MongoDB để đạt được xoay vòng.

Xoay vòng chính của KMIP

Trong trường hợp này, chỉ khóa chính được thay đổi vì nó được quản lý bên ngoài. Quy trình xoay chìa khóa như được mô tả bên dưới.

  1. Khoá chính cho các thành viên phụ trong tập hợp bản sao được xoay từng lần một. Tức là

    mongod --enableEncryption --kmipRotateMasterKey \ --kmipServerName <KMIP Server HostName> \--kmipServerCAFile ca.pem --kmipClientCertificateFile client.pem

    Sau khi quá trình hoàn tất, mongod sẽ thoát và bạn sẽ cần khởi động lại thiết bị phụ mà không có tham số kmipRotateMasterKey

    mongod --enableEncryption --kmipServerName <KMIP Server HostName> \
      --kmipServerCAFile ca.pem --kmipClientCertificateFile client.pem
  2. Bộ sao chính bị loại bỏ:
    Sử dụng phương thức rs.stepDown (), bộ chính bị hủy kích hoạt, do đó buộc phải bầu chọn bộ chính mới.

  3. Kiểm tra trạng thái của các nút bằng cách sử dụng phương thức rs.status () và nếu nút chính cho biết đã bị loại bỏ, hãy xoay khóa chính của nó. Khởi động lại thành viên đã hạ cấp bao gồm tùy chọn kmipRotateMasterKey.

    mongod --enableEncryption --kmipRotateMasterKey \
      --kmipServerName <KMIP Server HostName> \
      --kmipServerCAFile ca.pem --kmipClientCertificateFile client.pem

Ghi nhật ký

MongoDB luôn làm việc với tệp nhật ký để ghi lại một số trạng thái hoặc thông tin được chỉ định ở các khoảng thời gian khác nhau.

Tuy nhiên, tệp nhật ký không được mã hóa như một phần của công cụ lưu trữ. Điều này gây ra rủi ro là một phiên bản mongod đang chạy với việc ghi nhật ký có thể xuất ra dữ liệu nhạy cảm tiềm ẩn cho các tệp nhật ký giống như một phần của quá trình ghi nhật ký thông thường.

Từ phiên bản MongoDB 3.4, có cài đặt security.redactClientLogData ngăn dữ liệu nhạy cảm tiềm ẩn được ghi vào nhật ký quy trình mongod. Tuy nhiên, tùy chọn này có thể làm phức tạp chẩn đoán nhật ký.

Vài người trở thành MongoDB DBA - Đưa MongoDB vào Sản xuất Tìm hiểu về những điều bạn cần biết để triển khai, giám sát, quản lý và mở rộng MongoDBDownload miễn phí

Hiệu suất mã hóa trong MongoDB

Mã hóa tại một số điểm dẫn đến độ trễ tăng lên, do đó làm giảm hiệu suất của cơ sở dữ liệu. Trường hợp này thường xảy ra khi có một khối lượng lớn tài liệu.

Việc mã hóa và giải mã đòi hỏi nhiều tài nguyên hơn, do đó điều quan trọng là phải hiểu mối quan hệ này để điều chỉnh kế hoạch năng lực cho phù hợp.

Về các bài kiểm tra MongoDB, một công cụ lưu trữ được mã hóa sẽ có độ trễ từ 10% đến 20% khi tải cao nhất. Điều này thường xảy ra khi người dùng ghi một lượng lớn dữ liệu vào cơ sở dữ liệu do đó dẫn đến giảm hiệu suất. Đối với các hoạt động đọc, sự suy giảm hiệu suất là không đáng kể, khoảng 5 - 10%.

Để thực hành mã hóa tốt hơn trong MongoDB, công cụ lưu trữ WiredTiger được ưu tiên nhất do hiệu suất cao, bảo mật và khả năng mở rộng của nó. Hơn nữa, nó tối ưu hóa việc mã hóa các tệp cơ sở dữ liệu ở cấp độ trang, điều này có công lớn ở chỗ, nếu người dùng đọc hoặc ghi dữ liệu vào cơ sở dữ liệu được mã hóa, thì thao tác thông lượng sẽ chỉ được áp dụng cho trang mà dữ liệu được lưu trữ chứ không phải toàn bộ cơ sở dữ liệu.

Điều này sẽ giảm lượng dữ liệu cần được mã hóa và giải mã để xử lý một phần dữ liệu.

Tóm tắt

Bảo mật dữ liệu đối với thông tin nhạy cảm là điều bắt buộc và cần phải bảo vệ nó mà không làm giảm hiệu suất của hệ thống cơ sở dữ liệu.

MongoDB cung cấp một quy trình mã hóa gốc mạnh mẽ có thể giúp chúng tôi bảo mật dữ liệu của mình cả dữ liệu ở trạng thái nghỉ và dữ liệu đang chuyển động. Bên cạnh đó, các thủ tục mã hóa phải tuân thủ các tiêu chuẩn đặt ra của các tổ chức khác nhau.

Công cụ lưu trữ WiredTiger nâng cao cung cấp một tùy chọn tốt hơn do các giá trị liên quan của nó như hiệu suất cao, khả năng mở rộng và bảo mật. Khi mã hóa dữ liệu trong các tập hợp bản sao, bạn nên sử dụng các khóa chính khác nhau cho mỗi bộ bên cạnh việc thay đổi chúng ít nhất một lần một năm.

Tuy nhiên, sự sẵn có của các tùy chọn mã hóa của bên thứ ba, không có gì đảm bảo rằng việc triển khai của bạn sẽ phù hợp với chúng về khả năng mở rộng. Do đó, việc sử dụng mã hóa cấp độ cơ sở dữ liệu là rất đáng cân nhắc.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Làm thế nào để kết nối chính xác với cụm Atlas M0 (Bậc miễn phí) thông qua trình điều khiển Java?

  2. Mongo:cách sắp xếp theo trọng lượng bên ngoài

  3. Giới hạn kết quả trong MongoDB nhưng vẫn nhận được đầy đủ?

  4. Làm cách nào để xác thực các thành viên của một trường mảng?

  5. Cách cập nhật tài liệu con trong mongodb