Khái niệm về NoSQL NoSQL là một thuật ngữ tổng quát được sử dụng để mô tả các hệ thống quản lý cơ sở dữ liệu DBMS không sử dụng mô hình quan hệ SQL Structured Query Language để tổ chức
Trang 1HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG
KHOA AN TOÀN THÔNG TIN
BÀI TẬP LỚN
ĐỀ TÀI: Tìm hiểu về hệ quản trị CSDL MongoDB
Môn học: An Toàn ứng dụng web và CSDL
Nhóm: 08
Giảng viên hướng dẫn: ThS Ninh Thị Thu Trang
Hà Nội – 2024
Trang 2MỤC LỤC
CHƯƠNG 1 TỔNG QUAN VỀ NOSQL DATABASES 1
1.1 Khái niệm về NoSQL 1
1.2 Các loại NoSQL database 1
CHƯƠNG 2 MONGODB 2
2.1 MongoDB là gì? 2
2.2 Đặc điểm của MongoDB 2
2.2.1 Đặc điểm 2
2.2.2 Các thuật ngữ MongoDB thường dùng 2
2.2.3 Ưu điểm 3
2.2.4 Nhược điểm 3
2.3 Kiến trúc của MongoDB 4
2.3.1 Các thành phần chính 4
2.3.2 Tính năng 5
2.3.3 So sánh MongoDB và SQLDB 9
CHƯƠNG 3 CƠ CHẾ BẢO MẬT CỦA MONGODB VÀ CÁC NGUY CƠ LỖ HỔNG 10
3.1 Cơ chế xác thực (Authentication) 10
3.1.1 Phương thức xác thực 10
3.2 Cơ chế ủy quyền (Authorization) 12
3.2.1 Tính kế thừa 12
3.2.2 Tính năng kiểm soát truy cập 12
3.2.3 Quản lý người dùng và role 12
3.3 Cơ chế mã hóa (Encryption) 13
3.3.1 Mã hóa dữ liệu trạng thái động 13
3.3.2 Mã hóa dữ liệu ở trạng thái tĩnh 14
3.4 Kiểm toán (Audit) 14
3.5 Các nguy cơ lỗ hổng 15
3.5.1 Cấu hình không an toàn 15
3.5.2 Không kích hoạt xác thực 15
3.5.3 Không mã hóa dữ liệu 16
3.5.4 Tấn công Injection (NoSQL Injection) 16
Trang 33.5.5 Quản lý không đúng quyền hạn 16
3.5.6 Không bảo vệ mật khẩu và khóa 16
CHƯƠNG 4 CÀI ĐẶT VÀ QUẢN TRỊ 17
4.1 Cài đặt MongoDB 17
4.1.1 Cài đặt MongoDB 17
4.1.2 Truy cập MongoDB qua Mongo Shell Sau khi cài đặt thành công, bạn có thể truy cập MongoDB bằng lệnh: 17
4.1.3 Tạo cơ sở dữ liệu 18
4.1.4 Tạo Collection và Chèn Dữ liệu 18
4.2 Truy vấn dữ liệu trong MongoDB 18
4.2.1 Tìm kiếm tài liệu 18
4.2.2 Sử dụng các toán tử truy vấn 19
4.3 Cập nhật và xóa dữ liệu 20
4.3.1 Cập nhật tài liệu 20
4.3.2 Xóa tài liệu 20
4.4 Lập chỉ mục (Indexing) 21
4.4.1 Cơ chế hoạt động của chỉ mục 21
4.4.2 Các loại chỉ mục trong MongoDB 21
4.4.3 Xây dựng và Quản lý Chỉ mục 22
TÀI LIỆU THAM KHẢO 23
Trang 4CHƯƠNG 1 TỔNG QUAN VỀ NOSQL DATABASES
1.1 Khái niệm về NoSQL
NoSQL là một thuật ngữ tổng quát được sử dụng để mô tả các hệ thống quản lý cơ sở
dữ liệu (DBMS) không sử dụng mô hình quan hệ SQL (Structured Query Language) để tổ chức dữ liệu Thay vì đó, NoSQL thường tập trung vào các mô hình lưu trữ dữ liệu linh hoạt hơn và có thể mở rộng tốt khi xử lý dữ liệu lớn và phân tán
NoSQL xuất hiện giúp giải quyết, khắc phục các vấn đề của SQL:
Đầu tiên phải kể đến là vấn đề hiệu suất
Giúp cải thiện hiệu suất đáng kể so với RDBMS trước đó
Khả năng khả mở rộng: dễ dàng mở rộng, thêm sửa xóa đơn giản Có thể sử dụng nhiều server để lưu trữ dữ liệu
1.2 Các loại NoSQL database
NoSQL databases là các hệ quản trị cơ sở dữ liệu không tuân theo mô hình bảng của
cơ sở dữ liệu quan hệ (SQL) Dưới đây là các loại NoSQL database phổ biến, phân loại theo cấu trúc và cách lưu trữ dữ liệu:
Cơ sở dữ liệu Key-Value (Ví dụ: Redis, DynamoDB): Lưu trữ dữ liệu dưới dạng cặp key-value, giúp truy xuất dữ liệu nhanh chóng
Cơ sở dữ liệu Document (Ví dụ: MongoDB, CouchDB): Mỗi object được lưu trữ trong cơ sở dữ liệu dưới dạng document Dữ liệu sẽ được lưu trữ dưới dạng
BSON/JSON/XML dưới database Với dạng này chúng ta có thể dễ dàng thêm, sửa, xóa trường một cách linh hoạt vì vậy nó khắc phục được cấu trúc cứng nhắc của Schema
Cơ sở dữ liệu Wide-Column Store (Ví dụ: Apache Cassandra, HBase): Dữ liệu được tổ chức thành các cột thay vì hàng, giúp tối ưu cho việc truy xuất dữ liệu theo cột
Cơ sở dữ liệu Graph (Ví dụ: Neo4j, ArangoDB): Dùng để lưu trữ dữ liệu có mối quan hệ phức tạp, ví dụ như mạng lưới mối quan hệ giữa các đối tượng
Trang 5CHƯƠNG 2 MONGODB
2.1 MongoDB là gì?
MongoDB được sử dụng rất nhiều tại thời điểm hiện tại MongoDB là một hệ quản trị
cơ sở dữ liệu dạng Document được sử dụng để lưu trữ các dữ liệu lớn MongoDB được đưa ra vào giữa những năm 2000 Đây là một trong những hệ quản trị cơ sở dữ liệu NoSQL (phi quan hệ)
Hiện nay, có nhiều công ty toàn cầu sử dụng MongoDB để lưu trữ lượng dữ liệu
“khổng lồ” của họ như Facebook, Nokia, eBay, Adobe, Google, …
2.2 Đặc điểm của MongoDB
2.2.1 Đặc điểm
Mỗi cơ sở dữ liệu bao gồm nhiều collection, mỗi collection lại chứa nhiều Document Mỗi Document có thể khác nhau về số lượng các trường dữ liệu Kích thước và nội dung của mỗi Document đều có thể khác nhau
Cấu trúc của Document phù hợp với việc các nhà phát triển xây dựng các class
và object bằng các ngôn ngữ lập trình tương ứng Các nhà phát triển sẽ thường phát biểu rằng cấu trúc của họ không có các hàng và các cột nhưng vẫn có một cấu trúc dữ liệu rõ ràng với các cặp key-value
Các hàng (hay có thể là documents được gọi trong MongoDB) không cần phải định nghĩa schema Thay vào đó, các trường có thể được tạo linh hoạt
Mô hình dữ liệu sẵn có trong MongoDB cho phép bạn biểu diễn các mối quan
hệ phân cấp, để lưu trữ mảng và các cấu trúc phức tạp khác dễ dàng hơn
Khả năng mở rộng - MongoDB có tính mở rộng cao Trên thực tế các công ty trên toàn thế giới đã xác định được các cụm với số node được chạy trên 100 nodes với khoảng hàng triệu document trong cơ sở dữ liệu
2.2.2 Các thuật ngữ MongoDB thường dùng
_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 chẳng may có quên thì MongoDB sẽ tự động sinh ra trường này
collection: là một tập các Documents Một collection tương đương với một bảng được tạo bởi bất kỳ một hệ quản trị cơ sở dữ liệu quan hệ nào có thể là Oracle hay MySQL Một collection tồn tại trong cơ sở dữ liệu và nó không có bất kỳ một loại cấu trúc nào
Cursor: là con trỏ trỏ tới tập kết quả của một tập truy vấn Client có thể lặp qua một con trỏ để lấy kết quả của dữ liệu
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
Trang 6 Document: là một bản ghi trong 1 collection của MongoDB tương ứng được gọi là 1 document Document lần lượt bao gồm có tên trường và giá trị tương ứng
Field: là một cặp key-value 1 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
JSON: được biết đến như là một ký hiệu đối tượng JavaScript Đây là một dạng văn bản đơn giản, dễ đọc để thể hiện dữ liệu có cấu trúc Hiện tại JSON được
hỗ trợ trong nhiều ngôn ngữ lập trình
2.2.3 Ưu điểm
Tính linh hoạt: MongoDB là một hệ thống cơ sở dữ liệu phi quan hệ, nó cung cấp khả năng lưu trữ dữ liệu bất cứ khi nào, bất cứ nơi đâu, không cần phải tuân thủ một mô hình quan hệ cụ thể Phát triển hệ thống tệp riêng GridFS, gần giống với hệ thống tệp phân tán Hadoop (sử dụng hệ thống tệp nhằm để lưu trữ các tệp vượt qua kích thước giới hạn của BSON (16 MB cho mỗi document))
Không schema: Giống như các cơ sở dữ liệu NoSQL khác, MongoDB không yêu cầu các schema được xác định trước
Khả năng mở rộng: MongoDB có khả năng mở rộng dễ dàng, nhờ tính năng sharding cho phép phân chia dữ liệu thành nhiều phần và lưu trữ trên nhiều máy chủ
Tốc độ truy xuất nhanh: MongoDB có thể đáp ứng các yêu cầu truy vấn dữ liệu trong thời gian ngắn hơn so với các hệ thống cơ sở dữ liệu quan hệ truyền thống
Tính khả dụng cao: MongoDB cung cấp tính năng sao lưu và phục hồi dữ liệu, giúp người dùng bảo vệ dữ liệu của mình khỏi những rủi ro
Hỗ trợ bên thứ ba: MongoDB hỗ trợ một số công cụ lưu trữ và cung cấp API công cụ lưu trữ có thể cắm được (pluggable storage engine API) cho phép các bên thứ ba phát triển công cụ lưu trữ dữ liệu riêng
2.2.4 Nhược điểm
Tính liên tục: Với chiến lược chuyển đổi dự phòng tự động, người dùng chỉ có thể thiết lập một node master trong cụm MongoDB Nếu node master bị lỗi, một node khác sẽ tự động chuyển đổi thành master mới Quá trình chuyển đổi này đảm bảo tính liên tục, nhưng không diễn ra tức thời mà có thể mất tới một phút
Giới hạn ghi: Node master duy nhất của MongoDB cũng làm giới hạn lại tốc độ ghi dữ liệu vào cơ sở dữ liệu
Tính nhất quán của dữ liệu: MongoDB không cung cấp tính toàn vẹn tham chiếu đầy đủ thông qua việc sử dụng các ràng buộc khóa ngoại (foreign-key), điều này có thể ảnh hưởng đến tính nhất quán của dữ liệu
Trang 7 Bảo mật: Tính năng xác thực người dùng không được mặc định bật trong cơ sở
dữ liệu MongoDB Để bảo mật hệ thống trước các cuộc tấn công của tin tặc, bạn có thể thủ công thiết lập các cài đặt chặn những kết nối lạ và không an toàn
2.3 Kiến trúc của MongoDB
Kiến trúc của MongoDB được thể hiện ở hình dưới đây:
Hình 2.1 Kiến trúc của MongoDB
2.3.1 Các thành phần chính
Các thành phần chính trong kiến trúc của MongoDB gồm [1]:
Driver: Các ứng dụng sẽ sử dụng Node.js MongoDB driver để tạo kết nối với MongoDB và chạy các chương trình Phần này cũng hỗ trợ các trình điều khiển khác như:
o Trình điều khiển C
o Trình điều khiển C ++
o Trình điều khiển C #
o Go Driver
o Trình điều khiển Java
o Trình điều khiển Node.js
o Trình điều khiển PHP
o Trình điều khiển Python
o Trình điều khiển Ruby
o Trình điều khiển Rust
o Trình điều khiển Scala
o Trình điều khiển Swift
Trang 8 Query router: là một thành phần giúp điều phối các truy vấn trong sharded cluster, nhận yêu cầu từ ứng dụng, định tuyến chúng đến các shard thích hợp, và trả kết quả về cho ứng dụng Điều này giúp ứng dụng không cần quan tâm đến cách dữ liệu được phân chia trên nhiều shard, đồng thời tối ưu hóa việc truy xuất và xử lý
dữ liệu trong các môi trường có quy mô lớn
Shard: MongoDB Sharding là một kỹ thuật để phân phối dữ liệu trên multinode
Nó giúp hệ thống mở rộng theo chiều ngang để lưu trữ dữ liệu trên nhiều máy chủ khác nhau
Primary Replica Set Member: được sử dụng để nhận tất cả các thao tác ghi, đọc và
xử lý dữ liệu Nó duy trì oplog cho tất cả các hoạt động ghi đang được thực hiện trên tập dữ liệu
Secondary Replica Set Member: được sử dụng để duy trì các tập dữ liệu chính Nó đọc oplog của primary và áp dụng các thay đổi trong tập dữ liệu của nó một cách không đồng bộ
Trang 9Tính dự phòng và tính sẵn sàng của MongoDB được thể hiện ở bộ bản sao thông qua việc bầu cử Bộ bản sao sẽ tiến hành bầu cử để xác định nút phụ nào sẽ trở thành nút chính khi có một số hoạt động như[3]:
Thêm một nút mới vào bộ bản sao
Tạo một bộ bản sao mới
Xác định nút phụ đã cập nhật dữ liệu gần đây nhất từ nút chính
Heartbeat và trạng thái kết nối với các thành viên tập bản sao khác
Các mức độ ưu tiên do người dùng xác định được chỉ định cho các thành viên tập bản sao
Hình 2.3 Bầu chọn một nút phụ làm nút chính
Trang 10Để đảm bảo cho việc bầu cử có thể diễn ra nhanh chóng, MongoDB cung cấp nút Arbiter Nút Arbiter không chứa bản sao dữ liệu của nút chính và không thể trở thành nút chính, nó chỉ có thể bầu cử cho nút phụ khác trở thành nút chính[5] Nút Arbiter sẽ giúp hệ thống tiết kiệm tài nguyên do nó không chứa dữ liệu, đồng thời đảm bảo rằng số nút trong một bộ bản sao là số lẻ
Hình 2.4 Nút Arbiter trong replica sets
b Sharding
Sharding là phương pháp mở rộng theo chiều ngang, nó giúp phân tán dữ liệu trên nhiều máy khác nhau Một cụm phân mảnh (sharded cluster) gồm các thành phần sau[6]:
Shard: mỗi shard chứa một phần của dữ liệu được phân đoạn Mỗi phân đoạn phải được triển khai dưới dạng một bộ bản sao
Router: hoạt động như một bộ định tuyến truy vấn, cung cấp giao diện giữa ứng dụng và cụm phân mảnh
Config server: nó lưu trữ siêu dữ liệu và cấu hình cài đặt của cụm
Hình 2.5 Sharding
Trang 11MongoDB phân đoạn dữ liệu tới mức collection (tương đương với một bảng trong hệ quản trị cơ sở dữ liệu thường), phân phối collection data vào các shard trong cụm Việc phân phối dữ liệu sẽ được thực hiện dựa trên shard keys và
chunks, trong đó mỗi shard key sẽ bao gồm một hoặc một số trường trong một bản ghi, còn chunk là một tập hợp các bản ghi được lưu trên một shard và chứa một phạm vi giá trị khóa[7]
Khi có một bản ghi mới, dữ liệu thuộc các trường trong shard key sẽ được dùng
để xác định rằng bản ghi đó sẽ được lưu trong shard nào Có hai cách để phân tán
dữ liệu trên cụm phân mảnh[6]:
Hashed Shard Key: Dữ liệu được phân mảnh dựa trên giá trị băm của trường shard key Điều này đảm bảo việc phân phối dữ liệu đồng đều trên các shard Nó thường được sử dụng khi muốn phân phối dữ liệu một cách ngẫu nhiên nhưng đồng đều giữa các shard, tránh hiện tượng hotspot
Hình 2.6 Hashed Shard Key
Range-based Shard Key: dữ liệu được phân phối theo dải giá trị của shard key Điều này cho phép lưu trữ các tài liệu có giá trị tương tự nhau ở cùng một shard Phương pháp này thích hợp cho các truy vấn có tính chất tuần tự hoặc tìm kiếm theo phạm vi, nhưng có thể dẫn đến sự mất cân bằng trong phân phối dữ liệu nếu giá trị của shard key tăng tuyến tính, dẫn đến tình trạng hotspot
Hình 2.7 Range-based Shard Key
Trang 12quy mô theo chiều ngang
MySQL sử dụng khả năng điều chỉnh quy mô theo chiều dọc và bản sao chỉ
có quyền đọc để cải thiện hiệu suất ở quy mô lớn
MongoDB không có lược đồ, nhờ đó
mang lại tính linh hoạt cao hơn và
cho phép cơ sở dữ liệu này thao tác
với dữ liệu phi cấu trúc, bán cấu trúc
và có cấu trúc
MongoDB sử dụng các chứng chỉ Kerberos, X.509 và LDAP để xác thực người dùng
Trang 13CHƯƠNG 3 CƠ CHẾ BẢO MẬT CỦA MONGODB VÀ CÁC NGUY CƠ LỖ
HỔNG
3.1 Cơ chế xác thực (Authentication)
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[8]
3.1.1 Phương thức 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ọ:
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:
SCRAM-SHA-1 - Sử dụng hàm băm SHA-1
- Thay đổi số lần lặp của mã SHA -1 SCRAM-SHA-256 - Sử dụng hàm băm SHA – 256
- Thay đổi số lần lặp của mã SHA 256
Trang 143.1.1.2 X.509
Xác thực bằng x.509 certificates là một cơ chế an toàn trong MongoDB, cho phép sử dụng các chứng chỉ số thay cho tên người dùng và mật khẩu để xác thực giữa các máy khách (client) và máy chủ (server) Ngoài ra, MongoDB cũng hỗ trợ
sử dụng chứng chỉ x.509 để xác thực nội bộ giữa các thành viên của replica set và sharded cluster
X.509 là một tiêu chuẩn cho các chứng chỉ mã hóa sử dụng trong các kết nối bảo mật thông qua TLS/SSL Chứng chỉ X.509 có thể được sử dụng để xác minh danh tính của máy khách, máy chủ và các thành viên trong hệ thống MongoDB
Certificate Authority (CA)
Để sử dụng chứng chỉ X.509 trong môi trường sản xuất, MongoDB yêu cầu các chứng chỉ hợp lệ được tạo ra và ký bởi một Certificate Authority (CA) đáng tin cậy
CA có thể là một cơ quan độc lập, tổ chức của bạn, hoặc các bên cung cấp chứng chỉ bên thứ ba
MongoDB yêu cầu tất cả chứng chỉ của các thành viên trong replica set hoặc sharded cluster phải được phát hành bởi cùng một CA
b Yêu cầu về nội dung chứng chỉ khách hàng
Chứng chỉ của khách hàng phải chứa các trường sau:
keyUsage = digitalSignature
extendedKeyUsage = clientAuth Xác thực giữa các thành viên của Replica Set và Sharded Cluster
Có thể sử dụng chứng chỉ X.509 để xác thực nội bộ giữa các thành viên của replica sets và sharded clusters, thay cho việc sử dụng keyfiles
Yêu cầu về chứng chỉ cho thành viên nội bộ
Tất cả các chứng chỉ của thành viên trong replica set hoặc sharded cluster phải được phát hành bởi cùng một CA