You are on page 1of 36

BAN CƠ YẾU CHÍNH PHỦ

HỌC VIỆN KỸ THUẬT MẬT MÃ


¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯

BÀI TẬP LỚN

TÌM HIỂU HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU MONGODB

Chuyên ngành: An toàn thông tin

Sinh viên thực hiện:


Phùng Minh Hiếu
Phạm Ngọc Hoàn
Nguyễn Quốc Huy
Nguyễn Hữu Hưng
Trần Thị Diễm Hương
Lớp: CHAT7

Người hướng dẫn:


TS. Hoàng Xuân Dậu
Học Viện Công nghệ Bưu Chính Viễn Thông

Hà Nội, 2021
MỤC LỤC
LỜI MỞ ĐẦU .............................................................................................................. 2

CHƯƠNG 1. TỔNG QUAN VỀ MONGODB ........................................................ 3

1.1. Giới thiệu về MongoDB ........................................................................................ 3

1.2. Kiến trúc của MongoDB ...................................................................................... 3

1.3. Các thành phần trong MongoDB ........................................................................ 3

1.4. Các tính năng nổi bật của MongoDB .................................................................. 4

1.4.1. Truy vấn Ad hoc ................................................................................................. 4

1.4.2. Indexing .............................................................................................................. 5

1.4.3. Replication .......................................................................................................... 5

1.4.4. Sharding .............................................................................................................. 6

1.4.5. Cân bằng tải ........................................................................................................ 6

1.5. Ưu, nhược điểm của MongoDB ........................................................................... 6

1.5.1. Ưu điểm .............................................................................................................. 6

1.5.2. Nhược điểm ........................................................................................................ 7

CHƯƠNG 2. CÁC CƠ CHẾ BẢO MẬT CỦA MONGODB ................................ 8

2.1. Cơ chế xác thực trong MongoDB ........................................................................ 8

2.1.1. Phương thức xác thực ......................................................................................... 8

2.1.2. Cơ chế xác thực .................................................................................................. 8

2.2. Cơ chế ủy quyền trong mongoDB ..................................................................... 10

2.2.1. Tính kế thừa ...................................................................................................... 10

2.2.2. Xem quyền của role .......................................................................................... 11

2.2.3. Tính năng kiểm soát truy cập ........................................................................... 11

2.2.4. Quản lý người dùng và role .............................................................................. 13

2.3. Cơ chế mã hóa trong MongoDB ........................................................................ 14

2.3.1. Mã hóa dữ liệu trạng thái động ........................................................................ 14

2.3.2. Mã hóa dữ liệu ở trạng thái tĩnh ....................................................................... 16


i
2.4. Kiểm toán............................................................................................................. 16

CHƯƠNG 3. QUẢN TRỊ CƠ SỞ DỮ LIỆU MONGODB .................................. 19

3.1. Tạo, xóa database ................................................................................................ 19

3.2. Tạo, xóa collections ............................................................................................. 19

3.3. Insert document .................................................................................................. 20

3.3.1. Insert ................................................................................................................. 20

3.3.2. InsertOne .......................................................................................................... 21

3.3.3. InsertMany ........................................................................................................ 21

3.4. Xóa document ...................................................................................................... 21

3.5. Truy vấn dữ liệu .................................................................................................. 22

3.5.1. Lấy tất cả dữ liệu trong collection .................................................................... 22

3.5.2. Truy vấn có điều kiện ....................................................................................... 22

3.5.3. Truy vấn nhiều điều kiện .................................................................................. 23

3.6. Lập chỉ mục ......................................................................................................... 23

3.6.1. Các loại index trong MongoDB ....................................................................... 23

3.6.2. Index Properties ................................................................................................ 24

3.7. Tìm kiếm .............................................................................................................. 25

CHƯƠNG 4. CÀI ĐẶT VÀ DEMO ....................................................................... 27

4.1. Cài đặt MongoDB trên Windows ...................................................................... 27

4.2. Demo các lệnh quản trị MongoDB .................................................................... 31

TÀI LIỆU THAM KHẢO........................................................................................... 34

ii
LỜI MỞ ĐẦU

Cùng với sự phát triển của xã hội hiện nay, đặc biệt là sự bùng nổ về công nghệ
thông tin thì vấn đề về dữ liệu luôn được đặc biệt quan tâm và chú ý. Từ khi sự xuất
hiện của Web 2.0 thì vấn đề xử lý dữ liệu đặc biệt được quan tâm đến, sự ra đời của
Web 2.0 đánh dấu một sự phát triển lớn mạnh về mặt dữ liệu và các thông tin từ những
dữ liệu đó, bởi vì Web 2.0 là tự do về dữ liệu. Nó cho phép các API, RSS, … có thể truy
xuất dữ liệu từ nhiều nguồn khác nhau mà không cần trực tiếp vào trang web đó. Bên
cạnh đó sự bùng nổ của Web 2.0 và sự phát triển của Internet cùng số lượng người dùng
tăng lên rất lớn, người dùng có thể thỏa mái tạo nội dung trên web, làm cho dữ liệu trở
nên khổng lồ, vượt quá giới hạn xử lý của các hệ quản trị cơ sở dữ liệu truyền thống.
Để đáp ứng nhu cầu lưu trữ, xử lý trên dữ liệu khổng lồ, cần có một cơ sở dữ liệu
có thể lưu trữ dữ liệu với số lượng lớn và có thể truy xuất một cách nhanh chóng và hiệu
quả. Và MongoDB phù hợp với các yêu cầu đó. MongoDB là một phần mềm mã nguồn
mở miễn phí, có cộng đồng phát triển lớn mạnh, đặc biệt nó có hiệu suất truy vấn dữ
liệu khá cao. Vì vậy, nhóm 4 – lớp Cao học An toàn thông tin 7 – Học viện Kỹ thuật
Mật mã chúng em sẽ tìm hiểu về hệ quản trị cơ sở dữ liệu MongoDB để hiểu rõ hơn về
MongoDB, kiến trúc, các thành phần, tính năng hay cơ chế bảo mật của nó, đồng thời
làm các demo để biết cách quản trị MongoDB.

2
CHƯƠNG 1. TỔNG QUAN VỀ MONGODB

1.1. Giới thiệu về MongoDB


NoSQL là một dạng cơ sở dữ liệu mã nguồn mở không sử dụng Transact-SQL
để truy vấn thông tin. NoSQL viết tắt bởi: None-Relational SQL, hay có nơi thường gọi
là Not-Only SQL. Cơ sở dữ liệu này được phát triển trên Javascript Framework với kiểu
dữ liệu JSON. Đây là dạng dữ liệu kiểu key và value cộng với hiệu năng nhanh và khả
năng mở rộng không bị ràng buộc bởi việc tạo khóa chính, khóa ngoại,… NoSQL ra đời
như là 1 mảnh vá cho những khuyết điểm và thiếu xót cũng như hạn chế của mô hình
dữ liệu quan hệ RDBMS về tốc độ, tính năng, khả năng mở rộng, memory cache,...
MongoDB là một hệ quản trị cơ sở dữ liệu mã nguồn mở, là cơ sở dữ liệu NoSQL
và được hàng triệu người tiêu dùng. MongoDB được viết bằng C++.
MongoDB là một cơ sở dữ liệu hướng tài liệu (document database), các dữ liệu
được lưu giữ trong document kiểu JSON thay vì dạng bảng như cơ sở dữ liệu quan hệ
nên truy vấn sẽ rất nhanh, cung cấp hiệu suất cao, tính khả dụng cao và khả năng mở
rộng dễ dàng.
- Với CSDL quan hệ con người có khái niệm bảng, các cơ sở dữ liệu quan hệ
(như MySQL hay SQL Server…) dùng các bảng để lưu dữ liệu thì với MongoDB chúng
ta sẽ sử dụng định nghĩa là collection thay vì bảng.
- So với RDBMS thì trong MongoDB collection ứng với table, còn document sẽ
ứng với row, MongoDB sẽ sử dụng các document thay cho row trong RDBMS.
- Các collection trong MongoDB được cấu trúc rất linh động, cho phép các dữ
liệu lưu giữ không cần tuân theo một cấu trúc chắc chắn.
1.2. Kiến trúc của MongoDB
MongoDB được thiết kế để đáp ứng nhu cầu của các ứng dụng hiện đại với nền
tảng công nghệ cho phép chúng ta:
• Mô hình hóa dữ liệu tài liệu: MongoDB đưa ra cho chúng ta cách tốt nhất để làm
việc với dữ liệu.
• Thiết kế hệ thống phân tán: cho phép chúng ta đưa dữ liệu vào nơi mình muốn
một cách thông minh.
• Một trải nghiệm thống nhất cho phép chúng ta tự do chạy ở bất cứ đâu - cho phép
chúng ta chứng minh công việc của mình trong tương lai và loại bỏ sự khóa chặt
của nhà cung cấp.
1.3. Các thành phần trong MongoDB
Database: là một container của các collection giống như là một cơ sở dữ liệu
chứa các bảng trong RDBMS. Mỗi database có một bộ các file trên hệ thống file. Server
của MongoDB có thể lưu trữ được nhiều database.

3
Collection: là một nhóm các dữ liệu thuộc cùng loại do người dùng quy định, sự
khác nhau giữa collection với table trong RDBMS đó là collection không có ràng buộc,
quan hệ với collection khác. Mỗi dữ liệu trong collection không cố định về số trường
như row trong table.
Document: là một tài liệu lưu trữ dưới dạng json. Nó tương đương với row trong
table của RDBMS nhưng dữ liệu trong document khá linh hoạt, nó không cố định có
bao nhiêu trường, dữ liệu trong mỗi trường phải là cố định.
_id: là trường bắt buộc phải có trong mỗi document. Trường này biểu diễn các
giá trị duy nhất cho từng document. Vì nó là bắt buộc nên nếu không thiết lập giá trị cho
nó MongoDB sẽ tự động sinh ra trường này.
Field: là một cặp key-value. Một document có thể không có trường nào hoặc có
thể có nhiều trường. Các trường này tương tự như các cột trong RDBMS.
Embedded Documents: Nếu trong RDBMS, chúng ta có kiểu join các bảng, ví
dụ bảng person join với bảng address để biết một person có những address nào thì trong
MongoDB, document của person sẽ chứa một array các document address.
❖ So sánh hệ quản trị cơ sở dữ liệu quan hệ và MongoDB
RDBMS MongoDB
Database Database
Table Collection
Row Document
Column Field
Table Join Embedded Documents
Primary Key Primary Key (mặc định là _id)
1.4. Các tính năng nổi bật của MongoDB
1.4.1. Truy vấn Ad hoc
Khi thiết kế lược đồ (schema) của cơ sở dữ liệu, không thể biết trước tất cả các
truy vấn sẽ được thực hiện bởi người dùng cuối. Truy vấn ad hoc là một lệnh tồn tại
trong thời gian ngắn có giá trị phụ thuộc vào một biến. Mỗi khi một truy vấn ad hoc
được thực thi, kết quả có thể khác nhau, tùy thuộc vào các biến được đề cập.
Việc tối ưu hóa cách thức xử lý các truy vấn ad hoc có thể tạo ra sự khác biệt
đáng kể trên quy mô lớn, khi hàng nghìn đến hàng triệu biến số có thể cần được xem
xét. Đây là lý do tại sao MongoDB, một cơ sở dữ liệu hướng tài liệu, lược đồ linh hoạt,
nổi bật như một nền tảng cơ sở dữ liệu đám mây được lựa chọn cho các ứng dụng doanh
nghiệp yêu cầu phân tích thời gian thực. Với hỗ trợ truy vấn ad hoc cho phép các nhà
phát triển cập nhật các truy vấn ad hoc trong thời gian thực, việc cải thiện hiệu suất có
thể thay đổi cuộc chơi.

4
MongoDB hỗ trợ truy vấn trường (field queries), truy vấn phạm vi (range queries)
và tìm kiếm biểu thức chính quy. Các truy vấn có thể trả về các trường cụ thể và cũng
tính đến các chức năng do người dùng xác định. Điều này được thực hiện bởi vì
MongoDB lập chỉ mục các tài liệu BSON và sử dụng ngôn ngữ truy vấn MongoDB
(MQL).
1.4.2. Indexing
Vấn đề số một mà nhiều nhóm hỗ trợ kỹ thuật không giải quyết được với người
dùng của họ là lập chỉ mục. Khi được thực hiện đúng, các chỉ mục nhằm cải thiện tốc
độ và hiệu suất tìm kiếm. Việc không xác định đúng các chỉ mục thích hợp có thể và
thường sẽ dẫn đến vô số vấn đề về khả năng truy cập, chẳng hạn như các vấn đề với
thực thi truy vấn và cân bằng tải.
Nếu không có các chỉ mục phù hợp, cơ sở dữ liệu buộc phải quét từng tài liệu
một để xác định những tài liệu phù hợp với câu lệnh truy vấn. Nhưng nếu tồn tại một
chỉ mục thích hợp cho mỗi truy vấn, các yêu cầu của người dùng có thể được máy chủ
thực thi một cách tối ưu. MongoDB cung cấp một loạt các chỉ số và tính năng với thứ
tự sắp xếp theo ngôn ngữ cụ thể hỗ trợ các mẫu truy cập phức tạp vào tập dữ liệu.
Đáng chú ý, các chỉ mục MongoDB có thể được tạo theo yêu cầu để đáp ứng các
yêu cầu ứng dụng và các mẫu truy vấn luôn thay đổi theo thời gian thực. Chúng cũng có
thể được khai báo trên bất kỳ trường nào trong bất kỳ tài liệu nào của bạn, kể cả những
trường được lồng trong mảng.
1.4.3. Replication
Khi dữ liệu của bạn chỉ nằm trong một cơ sở dữ liệu duy nhất, nó sẽ có nhiều
khuyết điểm tiềm ẩn, chẳng hạn như sự cố máy chủ, gián đoạn dịch vụ hoặc thậm chí là
lỗi phần cứng cũ. Bất kỳ sự kiện nào trong số này sẽ khiến việc truy cập dữ liệu của bạn
gần như không thể.
Nhân rộng cho phép bạn vượt qua những lỗ hổng này bằng cách triển khai nhiều
máy chủ để khôi phục và sao lưu sau thảm họa. Việc mở rộng quy mô theo chiều ngang
trên nhiều máy chủ chứa cùng một dữ liệu (hoặc các phân đoạn của cùng một dữ liệu
đó) có nghĩa là tính khả dụng và ổn định của dữ liệu được tăng lên đáng kể. Đương
nhiên, sao chép cũng giúp cân bằng tải. Khi nhiều người dùng truy cập vào cùng một dữ
liệu, tải có thể được phân bổ đồng đều trên các máy chủ.
Trong MongoDB, các tập hợp bản sao được sử dụng cho mục đích này. Một máy
chủ hoặc node chính chấp nhận tất cả các hoạt động ghi và áp dụng các hoạt động tương
tự đó trên các máy chủ phụ, sao chép dữ liệu. Nếu máy chủ chính gặp sự cố nghiêm
trọng, bất kỳ một trong các máy chủ phụ có thể được chọn trở thành nút chính mới. Và
nếu nút chính cũ trở lại trực tuyến, nó sẽ hoạt động như một máy chủ phụ cho nút chính
mới.

5
1.4.4. Sharding
Khi xử lý các tập dữ liệu đặc biệt lớn, sharding - quá trình tách các tập dữ liệu
lớn hơn thành nhiều tập hợp phân tán, hoặc “phân đoạn” - giúp cơ sở dữ liệu phân phối
và thực thi tốt hơn những gì có thể là các truy vấn có vấn đề và rườm rà. Nếu không có
sharding, việc mở rộng một ứng dụng web đang phát triển với hàng triệu người dùng
hàng ngày là gần như không thể. Giống như sao chép thông qua các bộ sao chép,
sharding trong MongoDB cho phép khả năng mở rộng theo chiều ngang lớn hơn nhiều.
Chia tỷ lệ theo chiều ngang có nghĩa là mỗi phân đoạn trong mỗi cụm chứa một phần
của tập dữ liệu được đề cập, về cơ bản hoạt động như một cơ sở dữ liệu riêng biệt. Tập
hợp các phân đoạn máy chủ phân tán tạo thành một cơ sở dữ liệu duy nhất, toàn diện,
phù hợp hơn nhiều để xử lý các nhu cầu của một ứng dụng đang phát triển, phổ biến mà
không có thời gian chết. Tất cả các hoạt động trong môi trường sharding được xử lý
thông qua một quy trình nhẹ được gọi là mongos. Mongos có thể hướng các truy vấn
đến đúng phân đoạn dựa trên khóa phân đoạn. Đương nhiên, sharding thích hợp cũng
góp phần đáng kể vào việc cân bằng tải tốt hơn.
1.4.5. Cân bằng tải
Vào cuối ngày, cân bằng tải tối ưu vẫn là một trong những giải pháp tốt của việc
quản lý cơ sở dữ liệu quy mô lớn cho các ứng dụng doanh nghiệp đang phát triển. Việc
phân phối hàng triệu yêu cầu của khách hàng đến hàng trăm hoặc hàng nghìn máy chủ
một cách thích hợp có thể dẫn đến sự khác biệt đáng chú ý (và được đánh giá cao) về
hiệu suất.
May mắn thay, thông qua các tính năng mở rộng quy mô ngang như sao chép và
sharding, MongoDB hỗ trợ cân bằng tải quy mô lớn. Nền tảng có thể xử lý nhiều yêu
cầu đọc và ghi đồng thời cho cùng một dữ liệu với các giao thức khóa và kiểm soát đồng
thời tốt nhất trong lớp để đảm bảo tính nhất quán của dữ liệu. Không cần thêm bộ cân
bằng tải bên ngoài - MongoDB đảm bảo rằng mỗi người dùng đều có chế độ xem nhất
quán và trải nghiệm chất lượng với dữ liệu họ cần truy cập.
1.5. Ưu, nhược điểm của MongoDB
1.5.1. Ưu điểm
• MongoDB là phần mềm mã nguồn mở miễn phí, có cộng đồng phát triển rất lớn
• Tốc độ truy vấn của MongoDB nhanh hơn hẳn so với các hệ quản trị cơ sở dữ
liệu quan hệ.
• Do MongoDB dùng lưu trữ dữ liệu dưới dạng Document JSON nên mỗi một
collection sẽ có các kích cỡ và các document không giống nhau, linh động trong
việc lưu giữ dữ liệu, bạn có thể insert thỏa mái dữ liệu mà mình muốn.

6
• Dữ liệu trong MongoDB không có sự ràng buộc lẫn nhau, không có join như
trong RDBMS nên khi insert, xóa hay update nó không luôn phải mất thời gian
kiểm duyệt xem có thỏa mãn các ràng buộc dữ liệu như trong RDBMS.
• MongoDB rất dễ mở rộng. Trong MongoDB có một khái niệm cluster là cụm các
node chứa dữ liệu ăn nói với nhau, khi mong muốn mở rộng bộ máy ta chỉ cần
thêm một node với vào cluster.
• Trường dữ liệu “_id” luôn được tự động đánh chỉ mục để tốc độ truy vấn nội
dung đạt hiệu năng cao nhất.
• Khi có một truy vấn dữ liệu, bản ghi được cached lên bộ nhớ Ram, để phục vụ
lượt truy vấn sau xảy ra nhanh hơn mà không cần phải đọc từ ổ cứng.
1.5.2. Nhược điểm
• Một điểm tốt nhất của MongoDB cũng chủ đạo là nhược điểm của nó. MongoDB
không hề có các thuộc tính ràng buộc như trong RDBMS nên dễ bị làm sai dữ
liệu. Do đó khi thực hành các bước với MongoDB thì phải hết sức cẩn thận.
• Không hỗ trợ join giống như RDBMS nên khi viết function join trong code ta
phải làm bằng tay khiến cho tốc độ truy vấn bị giảm.
• Tốn bộ nhớ do dữ liệu lưu dưới dạng key-value, các collection chỉ khác về value
thế nên key sẽ bị lặp lại. Không hỗ trợ join nên có thể dễ bị dư thừa dữ liệu (trong
RDBMS thì ta chỉ cần lưu một bản ghi rồi các bản ghi khác tham chiếu tới, còn
trong MongoDB thì không).
• Khi insert/update/remove bản ghi, MongoDB sẽ chưa cập nhật ngay xuống ổ
cứng, mà sau 60 giây MongoDB mới thực hiện ghi toàn bộ dữ liệu thay đổi từ
RAM xuống ổ cứng điều này sẽ là điểm không tốt vì sẽ có nguy cơ bị mất dữ liệu
khi xảy ra các tình huống như mất điện…

7
CHƯƠNG 2. CÁC CƠ CHẾ BẢO MẬT CỦA MONGODB

2.1. Cơ chế xác thực trong MongoDB


Xác thực là quá trình xác minh danh tính của người dùng. Khi kiểm soát truy cập
được kích hoạt, MongoDB yêu cầu tất cả các máy khách xác thực để xác định quyền
truy cập.
Mặc dù xác thực và ủy quyền có mối liên hệ chặt chẽ với nhau, nhưng xác thực
khác với ủy quyền. Xác thực giúp xác minh danh tính của người dùng; ủy quyền xác
định quyền của người dùng được truy cập và tương tác trong phạm vi tài nguyên giới
hạn.
2.1.1. Phương thức xác thực
Gồm 2 phương thức xác thực:
⁃ Xác thực với tư cách người dùng: cung cấp tên người dùng, mật khẩu đăng nhập
và cơ sở dữ liệu xác thực được liên kết với người dùng đó.
⁃ Xác thực bằng cách sử dụng mongoshell:
+ Sử dụng các tùy chọn câu lệnh mongo xác thực ( --username, --password và --
authenticationDatabase) khi kết nối với mongob hoặc mongos.
+Kết nối với mongod hoặc mongos, sau đó chạy lệnh authenticate hoặc phương
thức db.auth() dựa trên cơ sở dữ liệu xác thực.
Việc xác thực nhiều lần với tư cách khác nhau sẽ không làm mất thông tin đăng
nhập của những người dùng đã được xác thực trước đó. Điều này có thể dẫn đến kết nối
có nhiều quyền hơn chủ đích của người dùng và khiến các hoạt động trong một phiên
logic phát sinh lỗi.
2.1.2. Cơ chế xác thực
Trước khi có được quyền truy cập vào một hệ thống, người dùng phải xác thực
nhận dạng danh tính của mình trong MongoDB. Điều này đảm bảo rằng không có ứng
dụng nào khác truy cập vào dữ liệu được lưu trữ trong MongoDB mà không được cho
phép bởi người có quyền hạn.
MongoDB hỗ trợ hai cơ chế xác thực để người dùng xác minh danh tính của họ:
• SCRAM (Mặc định)
• Chứng chỉ X.509
Ngoài ra, MongoDB Enterprise cũng cung cấp hỗ trợ xác thực LDAP proxy và
xác thực Kerberos.
2.1.2.1. SCRAM
Cơ chế xác thực thách thức – phản hồi có Salt (Salted Challenge Response
Authentication Mechanism - SCRAM) là cơ chế xác thực mặc định cho MongoDB.

8
SCRAM dựa trên tiêu chuẩn IETF RFC 5802 xác định các phương pháp tốt nhất để triển
khai cơ chế này cho việc xác thực người dùng bằng mật khẩu.
MongoDB sử dụng SCRAM để xác minh thông tin người dùng đã cung cấp thông
qua tên đăng nhâp, mật khẩu và cơ sở dữ liệu xác thực của người dùng. Cơ sở dữ liệu
xác thực là cơ sở dữ liệu nơi người dùng được tạo cùng với tên đăng nhập của người
dùng, phục vụ cho việc xác minh người dùng.
Việc triển khai SCRAM của MongoDB cung cấp:
• Khả năng hiệu chỉnh luồng dữ liệu
• Thêm ngẫu nhiên hàm Salt vào mỗi người dùng
• Xác thực máy chủ đối với máy client và ngược lại.
MongoDB hỗ trợ 2 cơ chế SCRAM:
Cơ chế SCRAM Mô tả
SHA-1 - Sử dụng hàm băm SHA-1
- Thay đổi số lần lặp của mã SHA -1
SHA – 256 - Sử dụng hàm băm SHA – 256 ký tự và yêu cầu
featureCompatibilityVersion set tới phiên bản 4.0
- Thay đổi số lần lặp của mã SHA 256

2.1.2.2. Chứng chỉ X.509


❖ Certificate Authority
Để sử dụng trong phát triển phần mềm nói riêng và sản xuất nói chung, việc triển
khai MongoDB đòi hỏi phải có các chứng chỉ hợp lệ được tạo và ký bởi tổ chức phát
hành chứng thực số. Người dùng hoặc tổ chức của họ có thể tạo và duy trì một tổ chức
phát hành chứng thực độc lập hoặc sử dụng các chứng thực số được tạo bởi các nhà cung
cấp dịch vụ TLS / SSL bên thứ ba.
❖ Client x.509 Certificates
Để xác thực với máy chủ, máy Client có thể sử dụng chứng thực x.509 thay vì
tên người dùng và mật khẩu. Chứng thực số ở bên phía client phải có các thuộc tính sau:
• Tổ chức phát hành chứng thực số (CA) phải cấp chứng chỉ xác thực cho cả máy
client và máy chủ.
• Chứng thư số bên client phải chứa các trường sau:
keyUsage = digitalSignature;
extendedKeyUsage = clientAuth;
Ứng với mỗi người dùng chỉ tồn tại một chứng thư số duy nhất.
Đối tượng Client của X.509 chứa distinguished name (DN) khác với đối tượng
Member của X.509. Ít nhất một trong các thuộc tính Organization (O), Organizational
Unit (OU), hoặc Domain Component (DC) trong chứng thư số của client phải khác với

9
các thuộc tính chứng thư số của net.tls.clusterFile và net.tls.certificateKeyFile bên trong
máy chủ.
Nếu việc triển khai MongoDB đã được tlsX509ClusterAuthDNOverride set, thì
đối tượng của chứng chỉ X.509 bên client cũng phải khác với giá trị đó.
• Người dùng và cơ sở dữ liệu $external
Để xác thực bằng chứng thư client, trước tiên phải thêm giá trị của subject chứng
chỉ máy khách với tư cách là người dùng MongoDB. Với mỗi chứng thư client X.509
tương ứng với một người dùng MongoDB; tức là không thể sử dụng một chứng thư phía
client để xác thực nhiều người dùng MongoDB.
Để sử dụng phiên với người dùng xác thực trong $external (Kerberos, LDAP,
X.509), tên người dùng không được lớn hơn 10.000 bytes.
• Xác thực
Để kết nối và xác thực bằng chứng chỉ client X.509:
+ Đối với MongoDB 4.2 trở lên, bao gồm các tùy chọn sau cho ứng dụng khách:
--tls
--tlsCertificateKeyFile
--tlsCertificateKeyFilePassword nếu file khóa chứng thư được mã hóa
--authenticationDatabase '$external'
--authenticationMechanism MONGODB-X509
+ Đối với MongoDB 4.0 trở về trước, bao gồm các tùy chọn sau cho ứng dụng
máy khách:
--ssl
--sslPEMKeyFile
--sslPEMKeyPassword nếu --sslPEMKeyFile được mã hóa.
--authenticationDatabase '$external'
--authenticationMechanism MONGODB-X509
2.2. Cơ chế ủy quyền trong mongoDB
MongoDB cung cấp cơ chế kiểm soát truy cập dựa trên vai trò (Role-Based
Access Control - RBAC) để quản lý quyền truy cập vào hệ thống MongoDB. Người
dùng được cấp một hoặc nhiều role xác định quyền truy cập vào các hoạt động vào tài
nguyên cơ sở dữ liệu. Ngoài việc thực thi nhiệm vụ của mỗi role, người dùng không có
quyền truy cập vào hệ thống.
2.2.1. Tính kế thừa
Role có thể chứa một hoặc nhiều role đã tồn tại được xác định trước, trong trường
hợp đó, role kế thừa tất cả các đặc quyền từ các role khác trong cơ sở dữ liệu. Ngoài
ra, role được tạo trên cơ sở dữ liệu với quyền Admin có khả năng kế thừa đặc quyền từ
các role khác trong bất kỳ cơ sở dữ liệu nào.

10
2.2.2. Xem quyền của role
Người dùng có thể xem các đặc quyền của một role bằng cách đưa ra rolesInfo
với các trường showPrivileges và showBuiltinRoles cả được thiết lập thành true. Từ đó
có thể gán role cần thiết cho người dùng trong quá trình tạo user và cập nhật người dùng
hiện có để gán hoặc thu hồi role.
Người dùng được gán với một role nhất định sẽ nhận được tất cả các đặc quyền
của role đó. Trong MongoDB, một người dùng có thể có nhiều role. Bằng cách gán các
role cho người dùng trong các cơ sở dữ liệu khác nhau, người dùng được tạo trong đó
có thể thực thi quyền trên các cơ sở dữ liệu khác.
2.2.3. Tính năng kiểm soát truy cập
MongoDB mặc định không bật tính năng kiểm soát truy cập đối với quá trình bắt
đầu sử dụng. Người dùng có thể bật ủy quyền bằng cách thiết lập cài đặt --auth
hoặc security authorization. Ngoài ra, kích hoạt xác thực nội bộ sẽ đồng thời kích hoạt
cơ chế ủy quyền bên phía client. Sau khi bật kiểm soát truy cập sẽ bắt buộc người dùng
phải tự xác thực.
Một role có khả năng cung cấp các đặc quyền để thực hiện hành động được chỉ
định trên hệ thống cơ sở dữ liệu. Mỗi đặc quyền được chỉ định rõ ràng trong role hoặc
được kế thừa từ một role khác hoặc cả hai. Đặc quyền bao gồm một tài nguyên cụ thể
và các hành động được phép trên tài nguyên đó. Tài nguyên có thể là một cơ sở dữ liệu,
một set collection hoặc cluster. Nếu tài nguyên là cluster, các liên kết ảnh hưởng đến
trạng thái của hệ thống hơn so với một cơ sở dữ liệu hoặc collection cụ thể.
Một role chỉ định quyền hoạt động được phép trên vùng tài nguyên.
Khi bật kiểm soát truy cập hãy đảm bảo rằng người dùng có role userAdmin
hoặc userAdminAnyDatabase trong cơ sở dữ liệu admin. Người dùng này có thể quản
lý người dùng và có các vai trò như: tạo người dùng, gán hoặc thu hồi vai trò từ người
dùng và tạo hoặc sửa đổi role theo cấu hình của người dùng.
Quy trình:
Bước 1: Khởi động MongoDB không có cơ chế kiểm soát truy cập
mongod --port 27017 --dbpath /var/lib/mongodb

Bước 2: Kết nối với phiên bản MongoDB


mongo --port 27017

11
Bước 3: Tạo người dùng quyền admin

use admin
db.createUser(
{
user: "myUserAdmin",
pwd: passwordPrompt(), // or cleartext password
roles: [ { role: "userAdminAnyDatabase", db: "admin" },
"readWriteAnyDatabase" ]
}
)

Bước 4: Khởi động lại phiên bản MongoDB với cơ chế kiểm soát truy cập
+ Tắt mongod:
db.adminCommand({ shutdown: 1 })

+ Thoát khỏi mongo shell.


+ Khởi động mongod với tính năng kiểm soát truy cập
mongod --auth --port 27017 --dbpath /var/lib/mongodb

Bước 5: Kết nối và xác thực với quyền admin


mongo --port 27017 --authenticationDatabase "admin" -u
"myUserAdmin" -p

Bước 6: Tạo thêm người dùng cho việc triển khai


+ Sau khi xác thực dưới user administrator, sử dụng db.createUser() để tạo thêm
người dùng. Từ đó người dùng có thể thiết lập built-in roles hoặc user-defined role tới
người dùng.
+ Ví dụ: Thêm mới user myTester có quyền readWrite tới cơ sở dữ liệu test và
quyền read trong cơ sở dữ liệu database.

use test
db.createUser(
{
user: "myTester",
pwd: passwordPrompt(), // or cleartext password
roles: [ { role: "readWrite", db: "test" },
{ role: "read", db: "reporting" } ]
}
)

12
Bước 7: Kết nối tới phiên bản và xác thực với quyền người dùng đã được xác
thực.
mongo --port 27017 -u "myTester" --authenticationDatabase "test" -p

Bước 8: Đưa vào file document vào trong cơ sở dữ liệu


+ Xác thực user myTester và đưa file document vào trong collection của database
db.foo.insert( { x: 1, y: 1 } )

2.2.4. Quản lý người dùng và role


Quản lý người dùng và role của người dùng dựa trên mô hình ủy quyền của
Mongodb. Cơ chế này yêu cầu quá trình bật kiểm soát truy cập, bạn phải xác thực là
người dùng với các đặc quyền bắt buộc được chỉ định trong mỗi phần. Người dùng có
quyền admin với role userAdminAnyDatabase hoặc userAdmin bên trong cơ sở dữ liệu
cung cấp các quyền được yêu cầu để hiển thị danh sách hoạt động của đối tượng.
❖ Tạo user-defined roles
Role cung cấp cho người dùng quyền truy cập vào tài nguyên của
MongoDB. MongoDB cung cấp một số vai trò có sẵn mà admin có thể sử dụng để kiểm
soát quyền truy cập vào hệ thống MongoDB. Tuy nhiên, nếu các role này không đáp
ứng mô tả các quyền mong muốn, người dùng có thể tạo các role mới trong một cơ sở
dữ liệu cụ thể.
Ngoại trừ các role được tạo trong cơ sở dữ liệu admin, một role chỉ có thể chứa
các quyền áp dụng cho cơ sở dữ liệu của nó và chỉ có thể kế thừa từ các role khác trong
cơ sở dữ liệu của nó. Ngoài ra, role được tạo trong cơ sở dữ liệu admin có thể bao gồm
các quyền áp dụng cho chính cơ sở dữ liệu đó, cơ sở dữ liệu khác hoặc cho cluster và có
khả năng kế thừa từ các role trong mọi cơ sở dữ liệu khác.
Để tạo một role mới sử dụng phương thức db.createRole() chỉ định quyền trong
mảng privileges và các role kế thừa trong mảng roles. MongoDB sử dụng kết hợp tên
cơ sở dữ liệu và tên role để xác định một role duy nhất. Mỗi role được đặt trong phạm
vi cơ sở dữ liệu mà người dùng tạo ra, nhưng MongoDB lưu trữ tất cả thông tin role đó
trong admin.system.roles trong admin.
Để tạo một role trong cơ sở dữ liệu cần có:
• createRole trên database resource.
• grantRole trên cơ sở dữ liệu để xác định quyền đối với role mới cũng như xác
định role kế thừa nó.
Các role userAdmin và userAdminAnyDatabase tích hợp createRole và grantRole
trên các tương ứng tài nguyên.

13
❖ Tạo role để quản lý hoạt động
Bước 1: Kết nối tới MongoDB với quyền hợp lý
+ Kết nối tới mongod hoặc mongos với quyền tương ứng
+ Quy trình sau myUserAdmin được tạo trong bật kiểm soát truy cập
mongo --port 27017 -u myUserAdmin -p 'abc123' --
authenticationDatabase 'admin'
Bước 2: Tạo role mới để quản lý hoạt động
manageOpRole có các quyền hoạt động trên nhiều cơ sở dữ liệu cũng như trên
cluster. Như vậy, bạn phải role trong cơ sở dữ liệu admin.

use admin
db.createRole(
{
role: "manageOpRole",
privileges: [
{ resource: { cluster: true }, actions: [ "killop",
"inprog" ] },
{ resource: { db: "", collection: "" }, actions: [
"killCursors" ] }
],
roles: []
}
)

2.3. Cơ chế mã hóa trong MongoDB


Bất kỳ cơ chế hoạt động nào của cơ sở dữ liệu đều liên quan đến hai dạng dữ liệu:
dữ liệu ở trạng thái nghỉ hoặc dữ liệu trạng thái động. Dữ liệu trạng thái động là luồng
dữ liệu di chuyển qua các mạng hoặc phần mềm trong khi dữ liệu ở trạng thái tĩnh không
di chuyển đến bất kỳ đâu. Cả hai kiểu dữ liệu này đều dễ bị can thiệp từ bên ngoài bởi
người dùng ẩn danh, vì vậy mongodb cung cấp cho người dùng giải pháp mã hóa. Quá
trình mã hóa bao gồm:
• Tạo khóa master cho toàn bộ cơ sở dữ liệu
• Tạo các khóa riêng 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 tạo
• Mã hóa toàn bộ cơ sở dữ liệu bằng khóa master
2.3.1. Mã hóa dữ liệu trạng thái động
Dữ liệu di chuyển giữa MongoDB và máy chủ ứng dụng theo hai cách: thông qua
Bảo mật lớp truyền tải (TLS) và Lớp cổng bảo mật (SSL).

14
Đâ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ỉ có chính khách hàng đó mới có thể đọc
được.
TLS / SSL được sử dụng trong MongoDB với một số chứng thư số dưới dạng tệp
PEM được cấp bởi tổ chức phát hành chứng thư số hoặc có thể là chứng thư tự ký. Tiếp
theo là sự hạn chế ở kênh truyền được mã hóa nhưng không có xác thực đối với danh
tính máy chủ do đó dễ bị tấn công ở giữa đường truyền từ bên ngoài. Do đó, bạn nên sử
dụng các chứng thư của cơ quan đáng tin cậy cho phép MongoDB drivers xác minh
danh tính máy chủ.
Bên cạnh mã hóa, TLS / SSL có thể được sử dụng trong việc 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
các chứng chỉ.
❖ Cấu hình TLS/ SSL cho Client
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ụ: Kết nối với phiên bản Mongod có sử dụng mã hóa:
mongo --ssl --host hostname.example.com --sslCAFile
/etc/ssl/ca.pem

--ssl: Cho phép kết nối TLS / SSL.


--sslCAFile: Chỉ định tệp PEM của tổ chức phát hành chứng thư (CA) để xác
minh chứng thư được cung cấp bởi mongod hoặc mongos. Do đó, Mongo shell sẽ xác
minh chứng thư do cá thể mongod cấp dựa trên tệp CA được chỉ định và tên máy chủ.
Kết nối phiên bản MongoDB yêu cầu chứng thư từ ứng dụng client:
mongo --ssl --host hostname.example.com --sslPEMKeyFile
/etc/ssl/client.pem --sslCAFile /etc/ssl/ca.pem

--sslPEMKeyFile: Chỉ định tệp .pem có chứa chứng thư mongo shell và khóa để
hiển thị cho mongod hoặc mongos. Trong quá trình kết nối:
Mongo shell sẽ xác minh xem chứng chỉ có phải từ cơ quan cấp chứng thư được
chỉ định (--sslCAFile) hay không. Nếu không, shell sẽ tự ngắt kết nối.
Shell 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 thư được hiển thị bởi mongod hoặc mongos 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 thư tự ký, bạn phải đảm bảo mạng kết nối đáng
tin cậy.

15
Bên cạnh đó, cần giảm sự tiếp xúc của khóa bí mật, đặc biệt là những nơi có liên
quan đến replica sets / sharded cluster. Điều này có thể đạt được bằng cách sử dụng các
chứng thư 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: 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: Cho phép xác thực nếu client xuất
trình chứng thư, ngược lại nếu không có chứng thư, client 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: ngăn chặn máy chủ chấp nhận các kết nối đến sử dụng
các giao thức. Ví dụ:
mongod --sslMode requireSSL --sslDisabledProtocols
TLS1_0,TLS1_1 --sslPEMKeyFile /etc/ssl/mongodb.pem --sslCAFile
/etc/ssl/ca.pem

2.3.2. Mã hóa dữ liệu ở trạng thái tĩnh


Thuật toán mật mã mã hóa đượ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. Mã hóa có thể được bật
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 trong suốt (TDE) ở
tầng lưu trữ.
Bất cứ khi nào tệp được mã hóa, một khóa mã hóa riêng sẽ được tạo ra và dễ dàng
để 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 master.
Sự khác biệt giữa khóa cơ sở dữ liệu và khóa master 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 master khuyến
khích nên được lưu trữ trong một máy chủ khác với nơi dữ liệu được mã hóa.
Với dữ liệu được sao chép, các tiêu chuẩn 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 hoàn toàn thông qua dây nối. Người dùng có thể
sử dụng lại khóa cho các nút khác tuy nhiên nên sử dụng các khóa khác nhau cho mỗi
nút tương ứng khác nhau.
2.4. Kiểm toán
Cơ sở kiểm toán cho phép quản trị viên và người dùng theo dõi hoạt động của hệ
thống để triển khai với nhiều người dùng và ứng dụng, có thể ghi các sự kiệm kiểm toán
vào console, nhật ký hệ thống, tệp JSON hoặc tệp BSON.

16
Việc kiểm toán trong MongoDB không chỉ phát hiện các cấu hình sai, các lỗ hổng
và lỗi đã biết mà còn đưa ra lời khuyên cho đội vận hành, phát triển MongoDB.
Sau khi được kích hoạt, hệ thống kiểm toán có thể ghi lại các hoạt động sau:
− Schema (DDL).
− Replica Set và cụm sharded.
− Xác thực và trao quyền.
− Các hoạt động CRUD.
Ngoài ra, cụ thể kiểm toán trong MongoDB sẽ kiểm tra các thông tin sau:
− MongoDB đang có trạng thái “listen” với port khác port mặc định:
Việc sử dụng port mongoDB mặc định khiến kẻ tấn công dễ dàng xác định vị trí
và nhắm vào mục tiêu cụ thể.
− Máy chủ chỉ accept kết nối đến các host và mạng trong danh sách:
MongoDB chỉ nên “listen” các kết nối đến có IP gốc thuộc về các ứng dụng hoặc
hệ thống định sẵn, ứng với nghiệp vụ cụ thể.
− MongoDB HTTP không nên truy cập được trên port 28017
Giao diện trạng thái HTTP của MongoDB nên bị vô hiệu hóa để ngăn việc lộ dữ
liệu, rủi ro.
− MongoDB không hiển thị phiên bản.
Việc hiện thị phiên bản hiện tại của mongoDB sẽ giúp kẻ tấn công dễ dàng xác
định được lỗ hổng của phiên bản hiện tại của hệ thống.
− MongoDB phải đảm bảo đang sử dụng phiên bản mới nhất.
Các phiên bản Mongo từ 2.4 trở về trước có rất nhiều vấn đề về bảo mật, việc cập
nhập phiên bản mới nhất sẽ giúp hệ thống tạm thời an toàn hơn.
− Mã hóa TLS/SSL đang được enabled.
Mã hóa TLS/SSL các kết nối giữa máy chủ MongoDB và ứng dụng để tránh bị
tấn công “man in the middle”.
Ngoài ra, việc deploy mongoDB phải luôn sử dụng cert hợp lệ do tổ chức phát
hành cert tạo.
− Authentication đang được enabled
Yêu cầu tất cả các máy client muốn kết nối đến máy chủ mongoDB phải được
xác thực.
− Phương thức xác thực SCRAM-SHA-1 đang được enabled.
SCRAM-SHA-1an toàn hơn so với phương pháp xác thực MONGODB-CR ngày
trước, nó cung cấp salts ngẫu nhiên cho mỗi user, hàm băm mạnh hơn (SHA-1 thay vì
MD5) và xác thực 2 chiều.
− MongoDB server không được phép khởi chạy javascript.

17
Việc chạy query bên trong javascript làm cho mongoDB trở lên mạnh mẽ hơn
nhưng lại dễ bị tấn công thông qua việc inject vào file js hoặc tấn công thông qua DOS.
Javacript phải luôn được disabled trừ khi ứng dụng thực sự cần dùng đến nó.
− Mỗi người dùng chỉ có quyền hạn với một database duy nhất.
Mỗi người dùng chỉ nên có vai trò và quyền hạn đối với một DB duy nhất.
Hệ thống kiểm toán ghi mọi sự kiện kiểm toán vào bộ đệm trong bộ nhớ của các
sự kiện kiểm toán. MongoDB ghi bộ đệm này vào đĩa định kỳ. Đối với các sự kiện được
thu thập từ bất kỳ kết nối đơn lẻ nào, các sự kiện có tổng thứ tự: nếu MongoDB ghi một
sự kiện vào đĩa, hệ thống đảm bảo rằng nó đã ghi tất cả các sự kiện trước đó cho kết nối
đó vào đĩa.
Nếu mục nhập sự kiện kiểm toán tương ứng với một hoạt động ảnh hưởng đến
trạng thái lâu bền của cơ sở dữ liệu, chẳng hạn như sửa đổi dữ liệu, MongoDB sẽ luôn
ghi sự kiện kiểm toán vào đĩa trước khi ghi vào nhật ký cho mục nhập đó. Nghĩa là,
trước khi thêm một thao tác vào nhật ký, MongoDB viết tất cả các sự kiện kiểm toán
trên kết nối đã kích hoạt hoạt động, và bao gồm mục nhập cho hoạt động.
Các đảm bảo kiểm toán này yêu cầu MongoDB chạy với tính năng ghi nhật ký
được bật.

18
CHƯƠNG 3. QUẢN TRỊ CƠ SỞ DỮ LIỆU MONGODB
3.1. Tạo, xóa database
• Để tạo một database trong MongoDB ta sử dụng cú pháp:
use databaseName

Trong đó: databaseName là tên của database muốn tạo.


Lệnh use được sử dụng để chỉ rõ database mà bạn muốn kết nối tới. Nếu database
được gọi tới chưa tồn tại thì nó sẽ tự động tạo một database mới với tên là databaseName
bạn truyền vào.
• Để xem tất cả các database đã được tạo trên MongoDB ta sử dụng cú pháp:

show dbs hoặc show databases

Lệnh trên sẽ chỉ hiện ra các database đã có ít nhất một collection, còn nếu
database nào chưa có thì nó sẽ không hiện.
• Để xóa database trong MongoDB ta sử dụng cú pháp:
db.dropDatabase()

Lệnh này dùng để xóa database hiện đang sử dụng, nên khi sử dụng lệnh trên thì
bắt buộc bạn phải kết nối tới database cần xóa thì mới thành công.
3.2. Tạo, xóa collections
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.
• Để tạo collection trong MongoDB ta sử dụng cú pháp:
db.createCollection(collectionName, option)

Trong đó:
⁃ collectionName là tên của collection mà bạn muốn tạo.
⁃ option là một đối tượng chứa các tùy chọn riêng cho collection. Các tùy chọn
bao gồm:
o capped - là thông số cấu hình hành động sẽ xảy ra khi collection vượt
quá dung lượng cho phép (thông số size). Nếu capped: true thì khi dung
lượng quá hạn mức cho phép nó sẽ ghi đè các dữ liệu cũ nhất.
o autoIndexId - là thông số cấu hình xem có đánh chỉ mục cho trường _id
không. Nếu autoIndexId: true thì sẽ đánh chỉ mục cho trường _id (Phiên
bản 3.4 tùy chọn này sẽ bị xóa).
o size - Xác định kích cỡ tối ta collection có thể chứa (đơn vị byte).
o max - Xác định số tài liệu tối ta mà một capped collection có thể chứa.
o storageEngine - Cấu hình storageEngine cho collection
19
o validator - cấu hình định dạng cho dữ liệu của các trường
o validationLevel - xác định độ nghiêm ngặt của validator ở trên. Giá trị có
thể là:
▪ "off" - không validator khi insert hoặc update.
▪ "strict" - Đây là giá trị mặc định. Thiết lập validator với mọi câu lệnh
insert và update.
▪ "moderate" - thiết lập validator cho các rule được liệt kê ở validator,
nhếu trường nào không có thì nó sẽ không áp dụng.
o validationAction - thiết lập trạng thái khi dữ liệu không khớp với
validator. Giá trị có thể điền vào là "error" hoặc "warn".
o indexOptionDefaults
o viewOn
o pipeline
o collation
Lưu ý: Để có thể thực hiện được lệnh createCollection này thì ta cần phải khai
báo sử dụng database.
• Để xóa một collection trong MongoDB ta sử dụng cú pháp:
db.collectionName.drop()

• Để xem danh sách các collection đang có trong database ta sử dụng cú pháp:
show collections

3.3. Insert document


MongoDB cung cấp cho chúng ta 3 phương thức để thực hiện việc thêm mới dữ
liệu vào trong collection. Bao gồm các phương thức sau:
• insert
• insertOne
• inserMany
3.3.1. Insert
Phương thức insert trong MongoDB dùng để thêm mới một hoặc nhiều dữ liệu
vào trong MongoDB, cú pháp sử dụng:
db.collectionName.insert(data)

Trong đó:
• collectionName là tên của collection chúng ta cần thêm dữ liệu vào.
• data có thể là 1 object chứa các trường và giá trị của nó hoặc cũng có thẻ là một
mảng đối tượng (nếu như bạn muốn thêm nhiều bản ghi trên một lần khai báo).

20
3.3.2. InsertOne
Phương thức insertOne trong MongoDB có tác dụng cho phép chúng ta insert
một dữ liệu vào trong MongoDB trên một lần khai báo, cú pháp sử dụng:
db.collectionName.insertOne(data)

Trong đó:
• collectionName là tên của collection chúng ta cần thêm dữ liệu vào.
• data là một obejct chứa dữ liệu chúng ta cần thêm vào.
3.3.3. InsertMany
Phương thức insertMany cho phép chúng ta thêm mới nhiều dữ liệu vào trong
MongoDB, cú pháp sử dụng:
db.collectionName.insertMany(data)

Trong đó:
• collectionName là tên của collection chúng ta cần thêm dữ liệu vào.
• data là một mảng obejct chứa dữ liệu chúng ta cần thêm vào.
Chú ý: Với cả ba phương thức trên nếu như collectionName của chúng ta chưa
tồn tại trong hệ thống thì mặc định MongoDB sẽ tự động thêm mới collection và đồng
thời insert dữ liệu luôn.
3.4. Xóa document
Để xóa dữ liệu trong MongoDB thì ta sử dụng phương thức remove() với cú pháp:
db.collectionName.remove(
<query>,
{
justOne: <boolean>,
writeConcern: <document>,
collation: <document>
}
)

Trong đó:
• collectionName là tên của collection mà bạn muốn thực thi lệnh xóa document.
• query là object (hay còn gọi là document) chứa các câu truy vấn để lọc dữ liệu.
• justOne là tham số cấu hình số lượng bản ghi có thể xóa khi query thực thi khớp.
o Nếu justOne: true thì nó sẽ chỉ xóa 1 bản ghi duy nhất.
o Nếu justOne: false thì nó sẽ xóa tất cả các bản ghi khớp với điều kiện query.
• writeConcern là một document chứa write concern và không bắt buộc.
21
• collation là một document chứa các quy tắc và không bắt buộc.
Chú ý: Ngoài phương thức remove(), trong MongoDB còn có phương thức
deleteOne() và deleteMany() để xóa một và xóa nhiều document theo bộ lọc.
3.5. Truy vấn dữ liệu
3.5.1. Lấy tất cả dữ liệu trong collection
• Để lấy tất cả dữ liệu ở trong collection chúng ta sử dụng phương thức find()
với cú pháp:
db.collectionName.find()

Trong đó: collectionName là tên của collection mà các bạn muốn truy vấn.
Tuy nhiên, khi chỉ sử dụng mỗi phương thức find thì dữ liệu trả về sẽ dưới dạng
object nhưng không theo một cấu trúc nào cả.
• Để dữ liệu trả về được hiển thị theo cấu trúc đã được định sẵn thì ta sử dụng
phương thức pretty() với cú pháp:
db.collectionName.find().pretty()
3.5.2. Truy vấn có điều kiện
Để truy vấn có điều kiện trong MongoDB thì ta cũng sử dụng cú pháp tương tự
như lấy tất cả dữ liệu, nhưng lúc này chúng ta sẽ chèn thêm điều kiện vào trong hàm
find() với cú pháp sau:
db.collectionName.find(condition)

Trong đó:
• collectionName là tên của collection mà bạn muốn truy vấn.
• condition là object chứa mệnh đề điều kiện.
Phép toán Cú pháp Ví dụ
Bằng (Equality) {key: value} db.admin.find({name:
"Tran Huong" }).pretty()
Nhỏ hơn (Less Than ) {key: {$lt: value}} db.admin.find({age: {
$lt: 18}).pretty()
Nhỏ hơn bằng (Less {key: {$lte: value}} db.admin.find({age: {
Than Equals) $lte: 18}).pretty()
Lớn hơn (Greater {key: {$gt: value}} db.admin.find({age: {
Than) $gt: 12}).pretty()
Lớn hơn bằng {key: {$gte: value}} db.admin.find({age: {
(Greater Than Equals) $gte: 12}).pretty()
Khác (Not Equals) {key: {$ne: value}} db.admin.find({age: {
$ne: 12}).pretty()

22
Trong (In) {key: {$in: [value1, value2,..]}} db.admin.find({age: {
$in: [12, 18]}).pretty()
Không Thuộc (Not In) {key: {$nin: [value1, value2,..]}} db.admin.find({age: {
$nin: [12, 18]}).pretty()

Chú ý: Ngoài phương thức find(), trong MongoDB còn có phương thức findOne()
chỉ trả về một Document.
3.5.3. Truy vấn nhiều điều kiện
❖ AND
Trong phương thức find(), nếu bạn truyền nhiều key bằng cách phân biệt chúng
bởi dấu phẩy (,) thì MongoDB xem nó như là điều kiện AND. Cú pháp cơ bản của AND
trong MongoDB như sau:
db.collectionName.find({$and: [{key1: value1}, {key2:value2},…]})

❖ OR
Để sử dụng mệnh đề or (hoặc) trong MongoDB thì chúng ta cần phải truyền một
key scope có tên là $or vào làm key chứa mảng các điều kiện hoặc, với cú pháp:
db.collectionName.find({$or: [{key1: value1}, {key2:value2},...]})

❖ Kết hợp cả AND và OR


Để kết hợp cả AND và OR thì bạn chỉ cần làm tương tự như cách thực hiện truy
vấn AND, và nếu truy vấn nào là or thì object đó lại làm tương tự như truy vấn OR.
3.6. Lập chỉ mục
Trong MongoDB, index hỗ trợ thực hiện các câu truy vấn hiệu quả hơn. Nếu
không có index, MongoDB sẽ phải duyệt tất cả các document trong một collection để
tìm ra những document thoả mãn với điều kiện truy vấn. Nếu có một index tồn tại,
MongoDB có thể sử dụng nó để giới hạn số lượng document mà nó phải kiểm tra.
Indexs là một cấu trúc đặc biết lưu trữ một phần nhỏ của collection, nó sẽ lưu giá
trị của một field hoặc một tập các field được đánh index và sắp xếp chúng theo giá trị
của field.
Với việc lưu trữ indexs và sắp xếp chúng, giúp MongoDB nhanh chóng tìm được
khoảng mà nó cần tìm kiếm. Từ các index được tìm thấy có thể nhanh chóng truy xuất
đến document được lưu trữ trong database MongoDB.
3.6.1. Các loại index trong MongoDB
MongoDB cung cấp một số loại index khác nhau để hỗ trợ cho các kiểu dữ liệu
và câu truy vấn khác nhau.
• Single Field
Index trên một field duy nhất. Mặc định MongoDB lập single field index trên _id.

23
Thứ tự sắp xếp index trong single field là không quan trọng vì MongoDB có thể
đi từ 2 hướng đầu đến cuối và ngược lại.
• Compound index
MongoDB cũng hỗ trợ đánh index trên nhiều field. Lưu ý thứ tự của các field
được đánh index điều có ý nghĩa. Ví dụ như compound index {name: 1, userid: -1}, đầu
tiên MongoDB sẽ sắp sắp index theo name, sau đó với các name có cùng giá trị tiến
hành sắp xếp theo userid.
• Multikey index
MongoDB sử dụng multikey index để index các nội dung là array. Nếu bạn đánh
index trên field là array thì MongoDB sẽ tạo các index riêng biệt cho tất cả các phần tử
trong array.
Multikey index cho phéo truy vấn chọn các tài liệu bằng cách khớp với một hoặc
nhiều phần tử trong array.
Lưu ý: Multikey index là tự MongoDB thiết lập khi bạn đánh index trên field có
kiểu dữ liệu array. Bạn không cần chỉ định bất cứ thứ gì.
• Text index
Text index hỗ trợ tìm kiếm các nội dung có kiểu dữ liệu string trong collection.
Text index không lưu trữ ngôn ngữ (ví dụ: “the”, “a”, “an”) mà chỉ lưu các từ gốc.
3.6.2. Index Properties
• Unique indexs
Unique index property đảm bảo bảo rằng sẽ không có giá trị trùng lặp trên các
field được đánh chỉ mục unique.
• Sparse Index
Sparse index chỉ lưu trữ các document có dữ liệu tại field được lập chỉ mục ngay
cả khi nó có giá trị null. Nếu bạn không thêm field được đánh sparse index khi insert thì
nó sẽ bỏ qua.
Bạn có thể kết hợp sparse index với unique index để ngăn chặn việc thêm dữ liệu
trùng lặp và có thể bỏ qua khi field được index không được thêm vào khi insert.
• TTL index
TTL index là một loại index đặc biệt trong MongoDB tự động xoá document
trong collection sau một thời gian được định sẵn. TTL index phù hợp cho các loại dữ
liệu như event data, log, session.
Lưu ý: TTL index chỉ hoạt động với những field có kiểu là Date.
Trong các hệ cơ sở dữ liệu, index là một dạng cấu trúc dữ liệu được dùng để tăng
tốc độ đọc dữ liệu trong cơ sở dữ liệu. Cụ thể, trong MongoDB, Index là một cấu trúc
dữ liệu đặc biệt, nó lưu trữ một phần nhỏ dữ liệu của collection ở một dạng dễ dàng

24
duyệt được. Index lưu trữ giá trị của một trường cụ thể hoặc 1 tập hợp các trường của
collection và được sắp xếp theo giá trị của các trường đó.
Đánh chỉ mục là việc tách chọn thông tin của dữ liệu thành một cấu trúc nhằm
mục đích tăng tốc độ của việc truy xuất dữ liệu.
Để lập chỉ mục ta sử dụng phương thức createIndex() với cú pháp:
db.collectioName.createIndex( {<fieldName>: < 1 or -1 >, …} );

Phương thức createIndex() chỉ tạo chỉ mục nếu nó chưa tồn tại, để kiểm tra các
chỉ mục hiện có ta sử dụng phương thức getIndexes() với cú pháp:
db.collectionName.getIndexes()

Để xóa chỉ mục ta sử dụng phương thức dropIndex() với cú pháp:


db.collectionName.dropIndex( fieldName )

3.7. Tìm kiếm


MongoDB hỗ trợ các hoạt động truy vấn thực hiện tìm kiếm văn bản của nội dung
chuỗi. Để thực hiện tìm kiếm văn bản, MongoDB sử dụng text index và toán tử $text.
MongoDB cung cấp các chỉ mục văn bản (text indexes) để hỗ trợ các truy vấn
tìm kiếm văn bản trên nội dung chuỗi. Chỉ mục văn bản có thể bao gồm bất kỳ trường
nào có giá trị là một chuỗi hoặc một mảng các phần tử chuỗi (String).
Để thực hiện các truy vấn tìm kiếm văn bản, bạn phải có một chỉ mục văn bản
trong bộ sưu tập của mình. Một collection chỉ có thể có một chỉ mục tìm kiếm văn bản,
nhưng chỉ mục đó có thể bao gồm nhiều trường. Ví dụ:
db.stores.createIndex( { name: "text", description: "text" } )
Sử dụng toán tử truy vấn $text để thực hiện tìm kiếm văn bản trên một collection
có chỉ mục văn bản.
$text sẽ mã hóa chuỗi tìm kiếm bằng cách sử dụng khoảng trắng và hầu hết các
dấu câu làm dấu phân cách và thực hiện một logic OR của tất cả các mã thông báo như
vậy trong chuỗi tìm kiếm.
Ví dụ: bạn có thể sử dụng truy vấn sau để tìm tất cả các cửa hàng có chứa bất kỳ
cụm từ nào từ danh sách "coffee", "shop" và "java":
db.stores.find( { $text: { $search: "java coffee shop" } } )
❖ Cụm từ chính xác
Bạn cũng có thể tìm kiếm các cụm từ chính xác bằng cách đặt chúng trong dấu
ngoặc kép. Nếu chuỗi $search bao gồm một cụm từ và các cụm từ riêng lẻ, tìm kiếm văn
bản sẽ chỉ khớp với các tài liệu bao gồm cụm từ.
Ví dụ: phần sau sẽ tìm thấy tất cả các tài liệu có chứa "coffee shop":
db.stores.find( { $text: { $search: "\"coffee shop\"" } } )

25
❖ Loại trừ từ
Để loại trừ một từ, bạn có thể thêm vào trước một ký tự "-".
Ví dụ: để tìm tất cả các cửa hàng có chứa "java" hoặc "shop" nhưng không chứa
"coffee", hãy sử dụng như sau:
db.stores.find( { $text: { $search: "java shop -coffee" } } )

26
CHƯƠNG 4. CÀI ĐẶT VÀ DEMO

4.1. Cài đặt MongoDB trên Windows


Truy cập vào link https://www.mongodb.com/try/download/community để thực
hiện tải xuống file cài đặt.

Click đúp vào file vừa tải về thành công để tiến hành cài đặt.

Bấm Next để tiếp tục, sau đó chọn “I accept the terms in the License Agreement”
và bấm Next để sang bước tiếp theo.

27
Chọn kiểu setup thì với các những ai chưa quen thì chọn “Complete” để nó cài
đặt tất cả các phần mềm phụ trợ.

Trong trường hợp bạn muốn tùy chỉnh (Custom) thì nó sẽ hiện ra các mục mà
bạn muốn thiết lập.

Tiếp theo, chọn thư mục lưu data và log cho MongoDB.

28
Bấm Finish để kết thúc quá trình cài đặt.

29
Sau khi cài đặt thành công, tiếp theo ta tạo biến môi trường cho MongoDB: thêm
đường dẫn đến thư mục bin của MongoDB vào Path của System variables.

Chạy thử MongoDB bằng cách mở màn hình cmd hoặc powerShell và chạy lệnh
mongo:

30
4.2. Demo các lệnh quản trị MongoDB
Hiển thị các database hiện có:

Tạo database csdl-chat7:

Tạo collection trong database csdl-chat7:

Thêm dữ liệu (document) vào collection:

31
Hiển thị tất cả các bản ghi trong collection:

Cập nhật document:

32
Lọc các thành viên có tuổi nhỏ hơn hoặc bằng 24 và có job là “coder”:

Tạo chỉ mục đối với field là name, loại là text để hỗ trợ tìm kiếm chuỗi:

Tìm kiếm các thành viên mà thông tin có chứa chữ “Tran” và “Nguuyen”.

33
TÀI LIỆU THAM KHẢO

[1] Kiến trúc của MongoDB, https://www.mongodb.com/mongodb-architecture


[2] Các tính năng của MongoDB, https://www.mongodb.com/what-is-mongodb/features
[3] Cơ chế bảo mật trong MongoDB, https://docs.mongodb.com/manual/security/
[4] Tài liệu MongoDB, https://docs.mongodb.com/manual/
[5] Các hướng dẫn quản trị dữ liệu trên MongoDB, https://toidicode.com/hoc-mongodb

34

You might also like