Lưu trữ dữ liệu an toàn trong MongoDB bằng cách sử dụng Mã hóa cấp trường phía máy khách

Bạn đang xem: cách lưu trữ dữ liệu trong mongodb bằng python

QuickStart Python Logo

Với sự kết hợp của pháp luật về bảo vệ dữ liệu khách hàng ( chẳng hạn như

GDPR

) và luật pháp ngày càng tăng

mon rửa mắt

, ngày càng cần thiết để có thể lưu trữ dữ liệu nhạy cảm của khách hàng

an toàn

. Mặc dù bảo mật mặc định của MongoDB dựa trên các tiêu chuẩn công nghiệp hiện đại, chẳng hạn như TLS cho lớp truyền tải và

SCRAM-SHA-2356

để trao đổi mật khẩu, ai đó vẫn có thể xâm nhập vào cơ sở dữ liệu của bạn, bằng cách tấn công máy chủ của bạn thông qua một vectơ khác hoặc bằng cách nào đó lấy được thông tin xác thực bảo mật của bạn.

< p class = "css-o89qdh"> Trong những trường hợp này, bạn có thể thêm một lớp bảo mật bổ sung cho các trường nhạy cảm nhất trong cơ sở dữ liệu của mình bằng cách sử dụng mã hóa cấp trường phía máy khách (

CSFLE < / p>

). CSFLE mã hóa một số trường nhất định mà bạn chỉ định, trong trình điều khiển, trên máy khách, để nó không bao giờ được truyền đi mà không được mã hóa, cũng như không được nhìn thấy bởi máy chủ MongoDB. CSFLE gần như không thể lấy được thông tin nhạy cảm từ máy chủ cơ sở dữ liệu trực tiếp thông qua việc chặn dữ liệu từ máy khách hoặc đọc dữ liệu trực tiếp từ đĩa, ngay cả với DBA hoặc thông tin xác thực gốc.

Có hai cách để sử dụng CSFLE trong MongoDB:

Explicit

, trong đó mã của bạn phải mã hóa dữ liệu theo cách thủ công trước đó nó được gửi đến trình điều khiển để được chèn hoặc cập nhật bằng các phương pháp trợ giúp; và

implicit

, nơi bạn khai báo trong bộ sưu tập của mình những trường nào sẽ được mã hóa bằng Lược đồ JSON mở rộng và điều này được thực hiện bởi trình điều khiển Python mà không có bất kỳ thay đổi mã nào. Hướng dẫn này sẽ bao gồm

implicit

CSFLE, chỉ có trong

MongoDB Enterprise

MongoDB Atlas

. Nếu đang chạy Máy chủ cộng đồng MongoDB, bạn cần sử dụng

< p class = "textlink-default-text-class css-pbhol6">

CSFLE rõ ràng

, sẽ không được đề cập ở đây.

Điều kiện tiên quyết

  • Bản phát hành gần đây của Python 3. Mã trong bài đăng này được viết cho 3.8, nhưng bất kỳ bản phát hành nào của Python 3.6+ đều ổn.

  • Đ

    MongoDB Atlas

    cluster đang chạy MongoDB 4.2 trở lên.

Bắt đầu thiết lập

Có hai thứ bạn cần cài đặt trên máy chủ ứng dụng của mình để bật CSFLE trong

Trình điều khiển PyMongo

. Đầu tiên là thư viện Python có tên

pymongocrypt

mà bạn có thể cài đặt bằng cách chạy phần sau khi bật virtualenv:

< / p> [mã hóa]

trong dấu ngoặc vuông yêu cầu pip cài đặt các phụ thuộc tùy chọn cần thiết để mã hóa dữ liệu trong trình điều khiển PyMongo. < / p>

Điều thứ hai bạn cần cài đặt là mongocryptd, một ứng dụng được cung cấp như một phần của

MongoDB Enterprise

. Theo dõi

hướng dẫn

để cài đặt mongocryptd vào máy bạn sẽ đang sử dụng để chạy mã Python của bạn. Trong môi trường sản xuất, bạn nên chạy mongocryptd dưới dạng dịch vụ khi khởi động trên máy ảo hoặc vùng chứa của mình.

Kiểm tra xem bạn có mongocryptd không được cài đặt trong đường dẫn của bạn bằng cách chạy

mongocryptd

, đảm bảo rằng nó in ra một số đầu ra. Sau đó, bạn có thể tắt nó lại bằng

Ctrl-C

.

Tạo khóa để mã hóa và giải mã dữ liệu của bạn

Đầu tiên, Tôi sẽ chỉ cho bạn cách viết một tập lệnh để tạo một khóa chính bí mật mới sẽ được sử dụng để bảo vệ các khóa trường riêng lẻ. Trong hướng dẫn này, chúng tôi sẽ sử dụng khóa chính “cục bộ” sẽ được lưu trữ ở phía ứng dụng hoặc trong dòng mã hoặc trong tệp khóa cục bộ. Lưu ý rằng một tệp khóa cục bộ chỉ nên được sử dụng trong quá trình phát triển. Đối với quá trình sản xuất, bạn nên sử dụng một trong các dịch vụ quản lý khóa đám mây gốc tích hợp hoặc truy xuất khóa chính từ trình quản lý bí mật như Hashicorp Vault. Tập lệnh Python này sẽ tạo ra một số byte ngẫu nhiên để được sử dụng làm khóa chính bí mật. Sau đó, nó sẽ tạo một khóa trường mới trong MongoDB, được mã hóa bằng khóa chính. Khóa chính sẽ được ghi ra một tệp để nó có thể được tải bởi các tập lệnh python khác, cùng với tài liệu lược đồ JSON sẽ cho PyMongo biết những trường nào nên được mã hóa và cách thức.

Tất cả mã được mô tả trong bài đăng này là

trên GitHub

. Tôi khuyên bạn nên kiểm tra nếu bạn gặp khó khăn, nhưng nếu không, bạn nên làm theo hướng dẫn và tự viết mã!

Đầu tiên , đây là một số mục nhập bạn sẽ cần. Dán những thứ này vào một tệp có tên

create_key.py

.

Điều đầu tiên bạn cần làm là tạo 96 byte dữ liệu ngẫu nhiên. May mắn thay, Python cung cấp một mô-đun cho chính xác mục đích này, được gọi là

secret

. Bạn có thể sử dụng phương thức

token_bytes

cho việc này:

Tiếp theo, đây là một số mã tạo MongoClient, được định cấu hình bằng hệ thống quản lý khóa cục bộ (KMS).

Lưu ý

: Lưu trữ khóa chính, không được mã hóa, trên một hệ thống tệp cục bộ (đó là những gì tôi làm trong mã demo này) không an toàn. Trong quá trình sản xuất, bạn nên sử dụng KMS an toàn, chẳng hạn như

AWS KMS

,

Azure Key Vault

hoặc

Cloud KMS của Google

.

I ‘ Sẽ đề cập đến vấn đề này trong một bài đăng blog sau, nhưng nếu bạn muốn bắt đầu ngay bây giờ, bạn nên đọc

tài liệu

Thêm mã này vào

create_key.py

script của bạn :

Sau khi ứng dụng khách được định cấu hình trong đoạn mã trên, nó được sử dụng để loại bỏ bất kỳ cơ sở dữ liệu “csfle_demo” hiện có nào, chỉ để đảm bảo rằng việc chạy tập lệnh này hoặc các tập lệnh khác không dẫn đến việc cơ sở dữ liệu của bạn bị bỏ sót trạng thái kỳ lạ.

Cấu hình và ứng dụng sau đó được sử dụng để tạo đối tượng ClientEncryption mà bạn sẽ sử dụng một lần để tạo khóa dữ liệu trong bộ sưu tập

__ keystore

trong

csfle_demo

cơ sở dữ liệu.

create_data_key

sẽ tạo một tài liệu trong kho khóa

__ Bộ sưu tập

trông giống như sau:

Bây giờ bạn có hai chìa khóa! Một là 96 byte ngẫu nhiên mà bạn đã tạo bằng

token_bytes

– đó là khóa chính (vẫn nằm ngoài cơ sở dữ liệu) . Và có một khóa khác trong bộ sưu tập

__ keystore

! Điều này là do MongoDB CSFLE sử dụng

mã hóa phong bì

. Khóa thực sự được sử dụng để mã hóa các giá trị trường được lưu trữ trong cơ sở dữ liệu nhưng nó được lưu trữ mã hóa bằng khóa chính mà bạn đã tạo.

Để đảm bảo bạn không làm mất khóa chính, đây là một số mã bạn nên thêm vào tập lệnh của mình, mã này sẽ lưu vào tệp có tên

key_bytes.bin

.

Cuối cùng, bạn cần cấu trúc lược đồ JSON sẽ cho PyMongo biết những trường nào cần được mã hóa và làm thế nào. Lược đồ cần tham chiếu đến khóa bạn đã tạo trong

__ keystore

và bạn có khóa đó trong

key_id

biến, vì vậy tập lệnh này là một nơi tốt để tạo tệp JSON. Thêm phần sau vào cuối tập lệnh của bạn:

Bây giờ bạn có thể chạy tập lệnh này. Trước tiên, hãy đặt biến môi trường

MDB_URL

thành URL cho cụm Atlas của bạn. Tập lệnh phải tạo cục bộ hai tệp:

key_bytes.bin

, chứa khóa chính của bạn; và

json_schema.json

, chứa lược đồ JSON của bạn. Trong cơ sở dữ liệu của bạn, phải có bộ sưu tập

__ keystore

chứa khóa trường mới (được mã hóa) của bạn! Cách dễ nhất để kiểm tra điều này là truy cập

cloud.mongodb.com

, tìm cụm của bạn và nhấp vào

Bộ sưu tập

.

Chạy truy vấn bằng khóa và lược đồ của bạn

Tạo một tệp mới, được gọi là < / p> csfle_main.py

. Tập lệnh này sẽ kết nối với cụm MongoDB của bạn bằng cách sử dụng khóa và lược đồ được tạo bằng cách chạy

create_key.py

. Sau đó, tôi sẽ chỉ cho bạn cách chèn tài liệu và truy xuất tài liệu đó cả khi có và không có cấu hình CSFLE, để cho biết cách nó được PyMongo mã hóa và giải mã minh bạch khi cung cấp cấu hình chính xác.

< p class = "css-e1o2b8">

Bắt đầu với một số mã để nhập các mô-đun cần thiết và tải các tệp đã lưu:

Thêm cấu hình cần thiết sau để kết nối với MongoDB:

Đoạn mã trên rất giống với cấu hình được tạo trong

create_key.py

. Lưu ý rằng lần này,

AutoEncryptionOpts

được chuyển

schema_map

, ánh xạ lược đồ JSON đã tải với

people

bộ sưu tập trong cơ sở dữ liệu

csfle_demo

. Điều này sẽ cho PyMongo biết những trường nào cần mã hóa và giải mã cũng như sử dụng các thuật toán và khóa nào.

Tại đây điểm, bạn nên xem lược đồ JSON mà bạn đang tải. Nó được lưu trữ trong

json_schema.json

và nó sẽ giống như sau:

Lược đồ này chỉ định rằng

ssn

field, được sử dụng để lưu trữ số an sinh xã hội, là một chuỗi sẽ được lưu trữ được mã hóa bằng

AEAD_AES_256_CBC_HMAC_SHA_512-Ngẫu nhiên

thuật toán.

Nếu bạn không muốn lưu trữ lược đồ trong tệp khi tạo khóa trường của mình trong MongoDB, bạn có thể tải ID khóa bất kỳ lúc nào bằng cách sử dụng các giá trị bạn đặt cho

< code class = "css-1ej4qfw"> keyAltNames

khi bạn tạo khóa. Trong trường hợp của tôi, tôi đặt

keyAltNames

thành

["example"]

, vì vậy tôi có thể tra cứu nó bằng dòng mã sau:

Vì mã của tôi trong

create_key.py

viết ra giản đồ đồng thời khi tạo khóa, nó đã có quyền truy cập vào ID của khóa nên mã không cần tra cứu.

Thêm mã sau để kết nối với MongoDB bằng cấu hình bạn đã thêm ở trên:

Đoạn mã trên kết nối với MongoDB và xóa mọi tài liệu hiện có khỏi bộ sưu tập

people

. Sau đó, nó thêm một tài liệu người mới, cho Sophia Duleep Singh, với giá trị hư cấu

ssn

.

Chỉ để chứng minh rằng dữ liệu có thể được đọc lại từ MongoDB và được giải mã bởi PyMongo, dòng mã cuối cùng truy vấn lại bản ghi vừa được thêm vào và in ra màn hình. Khi tôi chạy mã này, nó in ra:

Để chứng minh rằng dữ liệu được mã hóa trên máy chủ, bạn có thể kết nối với cụm của mình bằng cách sử dụng

< span class = "css-19syhb" tabindex = "0" target = "_ blank">

La bàn

hoặc tại

cloud.mongodb. com

, nhưng không có nhiều mã để kết nối lại mà không cần cấu hình mã hóa và truy vấn tài liệu:

Khi tôi chạy nó, nó được in ra:

Đó là một kết quả rất khác với ‘123-12-1234’! Thật không may, khi bạn sử dụng thuật toán Mã hóa ngẫu nhiên, bạn sẽ mất khả năng lọc trên trường. Bạn có thể thấy điều này nếu bạn thêm mã sau vào cuối tập lệnh của mình và thực thi nó:

Khi bạn thực thi khối mã này, nó sẽ in ra một ngoại lệ “Không thể truy vấn trên các trường được mã hóa bằng thuật toán mã hóa ngẫu nhiên …”.

AEAD_AES_256_CBC_HMAC_SHA_512-Random

là thuật toán chính xác để sử dụng cho dữ liệu nhạy cảm mà bạn sẽ không phải lọc, chẳng hạn như chẳng hạn như tình trạng y tế, câu hỏi bảo mật, v.v. Nó cũng cung cấp khả năng bảo vệ tốt hơn chống lại việc khôi phục phân tích tần số và vì vậy có lẽ nên là lựa chọn mặc định của bạn để mã hóa dữ liệu nhạy cảm, đặc biệt là dữ liệu có tính thẻ số cao, chẳng hạn như số thẻ tín dụng, số điện thoại, hoặc … có … số an sinh xã hội. Nhưng có một xác suất khác biệt là bạn có thể muốn tìm kiếm ai đó theo số An sinh xã hội của họ, vì đó là số nhận dạng duy nhất của một người và bạn có thể thực hiện điều này bằng cách mã hóa nó bằng thuật toán “Xác định”.

Để khắc phục điều này, hãy mở

create_key.py

một lần nữa và thay đổi thuật toán trong định nghĩa giản đồ từ

Random

thành

Xác định

, vì vậy nó trông giống như sau:

Chạy lại

create_key.py

tới tạo khóa chính, khóa trường và tệp lược đồ mới. (Thao tác này cũng sẽ xóa cơ sở dữ liệu

csfle_demo

của bạn!) Chạy

csfle_main.py

một lần nữa. Lần này, khối mã bị lỗi trước đó nên in ra các chi tiết của Sophia Duleep Singh.

Vấn đề với cách định cấu hình máy khách này là nếu một số mã khác được định cấu hình sai, nó có thể lưu các giá trị chưa được mã hóa trong cơ sở dữ liệu hoặc lưu chúng bằng cách sử dụng sai khóa hoặc thuật toán. Đây là ví dụ về một số mã để thêm bản ghi thứ hai, cho Dora Thewlis. Rất tiếc, lần này, cấu hình chưa cung cấp

schema_map

! Điều này có nghĩa là SSN cho Dora Thewlis sẽ được lưu trữ ở dạng bản rõ.

Nếu bạn dán đoạn mã trên vào tập lệnh của bạn và chạy nó, nó sẽ in ra một thứ như thế này, chứng tỏ rằng một trong các tài liệu có SSN được mã hóa và tài liệu kia là văn bản rõ:

May mắn thay

, MongoDB cung cấp khả năng đính kèm

trình xác thực

vào bộ sưu tập, để đảm bảo rằng dữ liệu được lưu trữ được mã hóa theo lược đồ.

Để xác định lược đồ ở phía máy chủ, hãy quay lại

create_key.py

script của bạn và thay vì ghi giản đồ ra tệp JSON, hãy cung cấp lược đồ đó cho

create_collection

phương thức làm trình xác thực lược đồ JSON:

Cung cấp trình xác thực đính kèm giản đồ vào bộ sưu tập đã tạo, vì vậy không cần lưu tệp cục bộ, không cần đọc nó vào

csfle_main .py

và không cần cung cấp cho MongoClient nữa. Nó sẽ được máy chủ lưu trữ và thực thi. Điều này đơn giản hóa cả mã tạo khóa và mã để truy vấn cơ sở dữ liệu,

nó đảm bảo rằng trường SSN sẽ luôn được mã hóa một cách chính xác. Phần thưởng!

Định nghĩa của

csfle_opts

trở thành:

Kết luận

Bằng cách hoàn thành phần bắt đầu nhanh này, bạn đã học được cách:

  • Tạo khóa ngẫu nhiên an toàn để mã hóa khóa dữ liệu trong MongoDB.

  • < p class = "css-o89qdh"> Sử dụng lưu trữ khóa cục bộ để lưu trữ khóa trong quá trình phát triển.

  • Tạo Khóa trong MongoDB (được mã hóa bằng khóa cục bộ của bạn) để mã hóa dữ liệu trong MongoDB.

  • Sử dụng lược đồ JSON để xác định trường nào sẽ được mã hóa.

  • Gán Lược đồ JSON cho một bộ sưu tập để xác thực các trường được mã hóa trên máy chủ.

Như đã đề cập trước đó, bạn

không

sử dụng lưu trữ khóa cục bộ để quản lý khóa của mình - điều này không an toàn. Bạn có thể lưu trữ khóa theo cách thủ công trong KMS mà bạn chọn, chẳng hạn như

< p class = "textlink-default-text-class css-pbhol6">

Hashicorp Vault

, hoặc nếu bạn đang sử dụng một trong ba nhà cung cấp dịch vụ đám mây lớn, các dịch vụ KMS của họ đã được tích hợp vào PyMongo. Đọc

tài liệu

để tìm hiểu thêm.

< p class = "css-hne1b3">

Tôi hy vọng bạn thích bài đăng này! Hãy cho chúng tôi biết suy nghĩ của bạn về

Diễn đàn cộng đồng MongoDB

. < / p>

Có rất nhiều tài liệu về Mã hóa cấp trường phía máy khách, ở những nơi khác nhau. Dưới đây là những tài liệu tôi thấy hữu ích khi viết bài này:

Nếu CSFLE không phù hợp với yêu cầu bảo mật của bạn, bạn nên xem

tài liệu bảo mật khác

, tài liệu này bao gồm

mã hóa ở chế độ nghỉ

và định cấu hình

mã hóa truyền tải

, trong số những thứ khác.

Như mọi khi, nếu bạn có bất kỳ câu hỏi nào hoặc nếu bạn đã xây dựng được điều gì đó thú vị, hãy cho chúng tôi biết trên

Diễn đàn cộng đồng MongoDB

< / p>

!


Xem thêm những thông tin liên quan đến chủ đề cách lưu trữ dữ liệu trong mongodb bằng python

HOW TO TUTORIAL: PYMONGO, SENDING DATA TO/FROM PYTHON TO MONGO | QUERIES | DATAFRAME | CSV

alt

  • Tác giả: Mr Fugu Data Science
  • Ngày đăng: 2020-04-13
  • Đánh giá: 4 ⭐ ( 2239 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: This is a video to 𝐬𝐞𝐧𝐝 𝐃𝐚𝐭𝐚𝐟𝐫𝐚𝐦𝐞𝐬 & 𝐜𝐬𝐯 𝐟𝐢𝐥𝐞𝐬 𝐭𝐨 𝐌𝐨𝐧𝐠𝐨𝐃𝐁 𝐟𝐫𝐨𝐦 𝐏𝐲𝐭𝐡𝐨𝐧.
    We will then do some queries, and finally export data from Mongo back to Python and store as data frame. TURN ON NOTIFICATION 🔔

    ➡ Patreon: https://www.patreon.com/mrfugudatasci
    ➡ Buy Me A Coffee: https://www.buymeacoffee.com/mrfugudatasci
    ➡ Github: github.com/MrFuguDataScience
    ➡ Twitter: @MrFuguDataSci
    ➡ Instagram: @mrfugudatascience

    Code For This Video:
    https://github.com/MrFuguDataScience/SendDataFrom-R-Python-to-SQL-PSQL-Mongo/blob/master/Send%20Data%20From%20Python%20to%20MongoDB.ipynb

    Similar Content You May Like:

    ▶️ R to Mongodb: Nested Data: https://youtu.be/4kgrB8u1x5Y

    ▶️ Python to Mongodb Nested Data (query, aggregation and map-reduce): https://youtu.be/QOuan5A8Id4

    ▶️ Mongo nested dictionaries: where we will update, index, aggregate: https://youtu.be/S4Y4MFEctNY

    pymongo,mongodb,mrfugudatascience

Tạo và xóa collection trong MongoDB

  • Tác giả: toidicode.com
  • Đánh giá: 3 ⭐ ( 1886 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Nếu như trong các hệ quản trị cơ sở RDBMS trước đây có các table để lưu trữ dữ liệu, thì trong MongoDB chúng được thay thế với một khái niệm hoàn toàn mới là các Collection...

Bài 03: Cấu trúc Data Model trong MongoDB

  • Tác giả: freetuts.net
  • Đánh giá: 3 ⭐ ( 3002 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Tìm hiểu Cấu trúc Data Model trong MongoDB, so sánh cách lưu trữ dữ liệu trong MySQL với mongodb và một số RDBMS khác

Bắt đầu với Python và MongoDB

  • Tác giả: helpex.vn
  • Đánh giá: 3 ⭐ ( 5118 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Bạn có thể bắt đầu với MongoDB và ngôn ngữ lập trình yêu thích của mình bằng cách tận dụng một trong các trình điều khiển của nó , nhiều trình điều khiển được duy trì bởi các kỹ sư MongoDB…

Python MongoDB - Chèn tài liệu

  • Tác giả: isolution.pro
  • Đánh giá: 3 ⭐ ( 4709 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Bạn có thể lưu trữ tài liệu vào MongoDB bằng phương thức insert () . Phương thức này chấp nhận một tài liệu JSON làm tham số. Cú pháp Sau đây là cú pháp của phương thức chèn. >db.COLLECTION_NAME.insert(DOCUMENT_NAME) Thí dụ > use mydb switched to db mydb > db.createCollection("sample") { "ok" : 1 } > doc1 = {"name": "Ram",...

Cách thiết kế cơ sở dữ liệu chat trong mongoDB

  • Tác giả: viblo.asia
  • Đánh giá: 4 ⭐ ( 7771 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Bản thân mình khi viết bài này là đang đi tìm kiếm một giải pháp cho bài toán IoT của mình . Đó là hệ thống có sẽ nhiều người dùng , mỗi người dùng có rất nhiều sensor ,hơn nữa dữ liệu tracking là dạn...

Thao tác với file trong Python

  • Tác giả: phannhatchanh.com
  • Đánh giá: 4 ⭐ ( 4427 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Chúng ta thường lưu trữ dữ liệu của mình dưới các định dạng file khác nhau như .txt, .json, .xml, .csv, .tsv, .xlsx). Trong phần này, ta sẽ…

Xem thêm các bài viết khác thuộc chuyên mục: Kiến thức lập trình

Xem Thêm  SQL COUNT: Hướng dẫn cơ bản về hàm COUNT trong SQL - đếm tổng số bản ghi trong sql

By ads_php