Professional Documents
Culture Documents
Hà Nội, 2021
MỤC LỤC
LỜI MỞ ĐẦU .............................................................................................................. 2
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
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
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
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
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 })
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
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: []
}
)
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
--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
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
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
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},...]})
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()
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
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ó:
31
Hiển thị tất cả các bản ghi trong collection:
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
34