NỘI DUNG

Hosting tốc độ cao Vietnix - tốc độ tải trang trung bình dưới 1 giây
VPS siêu tốc Vietnix - trải nghiệm mượt mà, ổn định
12/06/2023
Lượt xem

Hướng dẫn bảo mật MongoDB trên CentOS 8

12/06/2023
15 phút đọc
Lượt xem

Đánh giá

5/5 - (106 bình chọn)

MongoDB là một database mã nguồn mở được sử dụng trong nhiều web app. Mongo được phân loại là một NoSQL database vì không phụ thuộc và cấu trúc relational database. Thay vào đó, Mongo sử dụng document giống với JSON với schema linh hoạt. Ở bài viết này, Vietnix sẽ hướng dẫn bảo mật MongoDB trên CentOS 8 một cách chi tiết và dễ hiểu nhất.

Giới thiệu MongoDB trên CentOS 8

Mặc định MongoDB không được kích hoạt sẵn cơ chế xác thực, có nghĩa rằng bất kỳ user nào truy cập vào server cài database đều có thể tùy ý thêm xóa không giới hạn.

Giới thiệu MongoDB
Giới thiệu MongoDB

Vì vậy để bảo mật được nâng cao, bài viết sẽ hướng dẫn người dùng tạo user quản trị cũng như mở cơ chế xác thực. Bạn có thể thử nhiệm quá trình để đảm bảo chỉ có admin mới có quyền truy cập database.

Điều kiện cài đặt

Trước khi bắt đầu hướng dẫn này, bạn cần một số những điều kiện sau:

  • Một server chạy hệ điều hành CentOS 8. Server này nên có non-root user có đặc quyền sudo và một firewall được cấu hình với firewalld.
  • MongoDB đã được cài đặt trên server CentOS 8. Bạn có thể cài đặt theo hướng dẫn của Vietnix tại đây.

Nếu bạn chưa sở hữu máy chủ để cài đặt MongoDB trên CentOS 8, việc thuê máy chủ VPS từ Vietnix có thể là một lựa chọn tối ưu. Vietnix cung cấp dịch vụ thuê máy chủ VPS chất lượng cao, hỗ trợ hệ điều hành CentOS 8 với đa dạng cấu hình và mức giá phù hợp với nhu cầu khác nhau.

Các bước cài đặt

Bước 1 – Thêm admin user

Kể từ phiên bản 3.0 trở đi, MongoDB daemon đã được cấu hình chỉ chấp nhận kết nối từ Unix socket và không mở tự động cho toàn bộ Internet. Tuy nhiên, việc xác thực vẫn được vô hiệu hóa theo mặc định. Điều này có nghĩa là bất kỳ user nào có quyền truy cập vào server của MongoDB cũng có quyền truy cập đầy đủ vào database.

Nhờ vào lỗ hổng này, bạn có thể thêm một admin user. Sau đó, bật xác thực và kết nối với tài khoản admin này để truy cập vào database.

Để thêm một admin user, hãy kết nối với Mongo shell. Vì việc xác thực đã được vô hiệu hóa, bạn có thể làm điều này bằng lệnh mongo mà không cần thêm tùy chọn nào:

mongo

Một output sẽ được hiển thị như bên dưới. Việc bạn chưa bật xác thực sẽ bao gồm một cảnh báo rằng kiểm soát truy cập chưa được bật cho database và việc truy cập đọc và ghi dữ liệu cũng như cấu hình của database là không giới hạn.

MongoDB shell version v4.4.1  . . .  --- The server generated these startup warnings when booting:          2020-10-02T14:38:03.448+00:00: ***** SERVER RESTARTED *****         2020-10-02T14:38:04.209+00:00: Access control is not enabled for the database. Read and write access to data and configuration is unrestricted ---  . . . > 

Cảnh báo thứ hai sẽ biến mất sau khi bạn bật xác thực. Nhưng hiện tại bất kỳ ai truy cập vào server CentOS cũng có thể kiểm soát database của bạn.

Lưu ý: Nếu bạn không cài đặt MongoDB theo hướng dẫn ở phần yêu cầu, bạn có thể gặp một cảnh bảo khác trong prompt đang chạy:

. . .         2020-10-02T14:38:04.633+00:00: /sys/kernel/mm/transparent_hugepage/enabled is 'always'. We suggest setting it to 'never' . . .

Cảnh báo này liên quan đến THP (Transparent Huge Pages), một hệ thống quản lý bộ nhớ qua Linux được kích hoạt mặc định trên CentOS 8. THP sử dụng các trang bộ nhớ cực lớn để giảm ảnh hưởng đến bộ đệm TLB (Translation Lookaside Buffer) trên các máy tính có lượng bộ nhớ lớn.

Tuy nhiên, cảnh bảo này cho thấy hệ thống bị ảnh hưởng tiêu cực đến hiệu suất của database. Do đó bạn nên tắt hệ thống này.

Để minh họa danh sách database, chạy lệnh show dbs của Mongo:

> show dbs

Lệnh này trả về một danh sách các database trên server. Tuy nhiên, khi xác thực được kích hoạt, danh sách sẽ thay đổi dựa trên vai trò của Mongo user hoặc mức độ truy cập vào các database cụ thể. Tuy nhiên, do xác thực bị vô hiệu hóa, lệnh này sẽ trả về tất cả các database hiện có trên hệ thống mà không có bất kỳ hạn chế nào.

admin   0.000GB config  0.000GB local   0.000GB

Trong phần output, chỉ các database mặc định mới được hiển thị. Tuy nhiên, nếu bạn có bất kỳ database nào chứa dữ liệu nhạy cảm trên hệ thống, bất kỳ user nào cũng có thể tìm thấy bằng lệnh này.

Nhằm giảm thiểu lỗ hổng bảo mật này, bước này tập trung vào việc thêm admin user trên hệ thống. Để làm điều này, hãy kết nối với admin database. Đây là nơi lưu trữ thông tin về user, chẳng hạn như username, password và vai trò của user:

> use admin
switched to db admin

Thông thường, MongoDB được cài đặt với một số phương thức dựa trên JavaScript để quản lý database. Một trong số đó là db.createUser, được sử dụng để tạo user mới trên database.

Khởi tạo phương thức db.createUser bằng lệnh:

> db.createUser(

Phương thức này yêu cầu bạn chỉ định username và password cho user, cũng như bất kỳ vai trò nào bạn muốn cho user đó. Lưu ý MongoDB lưu trữ dữ liệu dưới dạng document giống như JSON. Khi tạo một user mới thì bạn chỉ đơn giản là tạo một document để lưu trữ dữ liệu của user dưới dạng các trường riêng biệt.

Tương tự JSON, các document trong MongoDB bắt đầu và kết thúc bằng dầu ngoặc nhọn ({}). Để thêm một user, hãy nhập một dấu ngoặc nhọn mở:

Lưu ý: Mongo sẽ không coi lệnh db.createUser là hoàn chỉnh cho đến khi bạn nhập dấu ngoặc đóng. Khi làm điều này, prompt sẽ thay đổi từ dấu (>) thành dấu ba chấm (...).

... {

Tiếp theo, nhập vào trường user với username là giá trị trong dấu ngoặc kép và sau đó là dấu phẩy. Ví dụ dưới đây chỉ định username là AdminVietnix, nhưng bạn có thể nhập bất kỳ username nào bạn muốn:

... user: "AdminVietnix",

Sau đó, nhập trường pwd với passwordPrompt() sẽ là giá trị của trường đó. Khi thực hiện phương thức db.createUser, phương thức passwordPrompt() sẽ cung cấp một thông báo để bạn nhập password của mình. Điều này an toàn hơn so với việc nhập password dạng văn bản.

Lưu ý: Phương thức passwordPrompt() chỉ tương thích với phiên bản MongoDB 4.2 trở lên. Nếu đang dùng phiên bản cũ hơn, bạn sẽ cần nhập password dưới dạng văn bản rõ ràng, tương tự như cách bạn đã nhập username của mình.

... pwd: "password",

Hãy đảm bảo kết thúc bằng dấu phẩy khi đã nhập xong một trường:

... pwd: passwordPrompt(),

Sau đó, nhập vai trò mà bạn muốn cho admin. Vì bạn đang tạo một admin user, ít nhất bạn nên thêm vai trò userAdminAnyDatabase trên admin database. Điều này sẽ cho phép admin user tạo và sửa đổi user và vai trò mới. Vì admin user có vai trò này trong admin database, điều này cung cấp admin quyền truy cập superuser vào toàn bộ cluster.

Ngoài ra, ví dụ sau cũng cấp cho admin user vai trò readWriteAnyDatabase. Điều này cho phép admin user đọc và chỉnh sửa dữ liệu trên bất kỳ database nào trong cluster từ database configlocal, những database này chủ yếu dùng cho mục đích nội bộ:

... roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]

Tiếp theo, nhập một dấu ngoặc nhọn để chỉ ra kết thúc của document:

... }

Sau đó, nhập một dấu ngoặc đóng để đóng và thực thi phương thức db.createUser:

... )

Tóm lại, dưới đây là phương thức db.createUser hoàn chỉnh mà bạn sẽ thấy:

> db.createUser( ... { ... user: "AdminVietnix", ... pwd: passwordPrompt(), ... roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ] ... } ... )

Nếu cú pháp của mỗi dòng chính xác, phương thức sẽ được thực thi và bạn sẽ được nhắc nhập mật khẩu:

Enter password: 

Nhập một mật khẩu theo mong muốn của bạn. Sau đó, bạn sẽ nhận được một thông báo xác nhận user đã được thêm:

Successfully added user: { 	"user" : "AdminVietnix", 	"roles" : [ 		{ 			"role" : "userAdminAnyDatabase", 			"db" : "admin" 		}, 		"readWriteAnyDatabase" 	] }

Thoát khỏi MongoDB client bằng lệnh:

> exit

Tại thời điểm này, user của bạn sẽ được phép nhập thông tin đăng nhập. Tuy nhiên, sẽ không bắt buộc thực hiện cho đến khi bạn kích hoạt xác thực và khởi động lại MongoDB daemon.

Bước 2 – Kích hoạt xác thực cho MongoDB

Để bật xác thực, bạn cần chỉnh sửa file cầu hình mongod.cof của MongoDB. Sau khi bật xác thực và khởi động lại dịch vụ Mongo, user vẫn có thể kết nối vào database mà không cần xác thực. Tuy nhiên, user vẫn không thể đọc hoặc sửa đổi bất kỳ dữ liệu nào cho đến khi cung cấp đúng username và password.

Mở file cấu hình bằng text editor bạn ưa thích.

sudo nano /etc/mongod.conf

Kéo xuống và tìm phần security có dấu comment:

. . . #security:  #operationProfiling:  . . .

Bỏ dấu (#) để uncomment dòng này:

. . . security:  #operationProfiling:  . . .

Sau đó, hãy thêm tham số authorization và đặt giá trị là "enabled". Khi hoàn thành, bạn sẽ thấy như sau:

. . . security:   authorization: "enabled" . . . 

Lưu ý, dòng authorization: được thụt vào bằng hai khoảng trắng.

Sau khi thêm các dòng này, lưu và đóng file. Nếu bạn sử dụng nano để mở file, bạn có thể nhấn CTRL + X, Y, sau đó là ENTER.

Tiếp theo khởi động lại dịch vụ để áp dụng các thay đổi mới:

sudo systemctl restart mongod

Tiếp theo, kiểm tra trạng thái của dịch vụ để đảm bảo đã được khởi động đúng cách:

sudo systemctl status mongod

Nếu lệnh restart thành công, bạn sẽ nhận được output cho biết dịch vụ mongod đang hoạt động và đã được khởi động gần đây:

● mongod.service - MongoDB Database Server    Loaded: loaded (/usr/lib/systemd/system/mongod.service; enabled; vendor preset: disabled)    Active: active (running) since Fri 2020-10-02 14:57:31 UTC; 7s ago      Docs: https://docs.mongodb.org/manual   Process: 15667 ExecStart=/usr/bin/mongod $OPTIONS (code=exited, status=0/SUCCESS)   Process: 15665 ExecStartPre=/usr/bin/chmod 0755 /var/run/mongodb (code=exited, status=0/SUCCESS)   Process: 15662 ExecStartPre=/usr/bin/chown mongod:mongod /var/run/mongodb (code=exited, status=0/SUCCESS)   Process: 15659 ExecStartPre=/usr/bin/mkdir -p /var/run/mongodb (code=exited, status=0/SUCCESS)  Main PID: 15669 (mongod)    Memory: 159.2M    CGroup: /system.slice/mongod.service            └─15669 /usr/bin/mongod -f /etc/mongod.conf

Sau khi đã xác mình dịch vụ hoạt động ổn định, hãy kiểm tra xem cài đặt xác thực mà bạn đã thêm có hoạt động như mong đợi không.

Bước 3 – Kiểm tra cài đặt xác thực

Để kiểm tra yêu cầu xác thực mà bạn đã thêm ở bước trước có hoạt động ổn định, hãy bắt đầu kết nối MongoDB mà không chỉ định bất kỳ thông tin xác thực nào:

mongo

Bây giờ khi đã kích hoạt xác thực, sẽ không có cảnh báo nào bạn đã gặp trước đó xuất hiện ở output:

MongoDB shell version v4.4.1 connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb Implicit session: session { "id" : UUID("d57987e5-24dc-427e-89b7-9ab362ebac6b") } MongoDB server version: 4.4.1 > 

Xác nhận xem quyền truy cập của bạn có bị hạn chế hay không bằng cách chạy lệnh show dbs:

> show dbs

Ở bước 1, có một vài database mặc định trên server. Tuy nhiên trong trường hợp này, lệnh này sẽ không có bất kỳ output nào vì bạn chưa xác thực như một user có đặc quyền.

Vì lệnh này không trả về bất kỳ thông tin nào, có thể nói rằng cài đặt xác thực đã hoạt động như mong đợi. Bạn cũng sẽ không thể tạo user hoặc thực hiện các tác vụ có đặc quyền khác mà không xác thực trước.

Tiếp theo hãy thoát khỏi Mongo Shell:

Lưu ý: Thay vì chạy lệnh exit, bạn có thể đóng shell bằng tổ hợp phím CTRL + C.

> exit

Hãy đảm bảo admin user có thể xác thực đúng bằng cách chạy lệnh mongo để kết nối với user này. Lệnh này bao gồm flag -u, đứng trước tên của user mà bạn muốn kết nối. Hãy chắc chắn thay thế AdminVietnix bằng tên admin user của bạn. Lệnh này cũng bao gồm flag -p, yêu cầu bạn đăng nhập password của user và xác định admin là database đã được xác thực:

mongo -u AdminVietnix -p --authenticationDatabase admin

Nhập password của user khi được yêu cầu, sau đó bạn sẽ được chuyển đến shell. Khi đó chạy chạy lệnh show dbs một lần nữa:

> show dbs

Ở lần này, khi bạn đã xác thực thành công, lệnh sẽ trả về một danh sách các database trên server:

admin   0.000GB config  0.000GB local   0.000GB

Điều này xác định được rằng cài đặt xác thực đã được kích hoạt thành công.

Vietnix với hơn 10 năm hoạt động đã đồng hành với hơn 50.000 khách hàng cá nhân và doanh nghiệp. Đến năm 2022 Vietnix vinh dự được nhận giải Thương hiệu Việt Nam xuất sắc. Đồng thời, với tỷ lệ 97% khách hàng sau khi sử dụng dịch vụ tại Vietnix đã giới thiệu đến bạn bè, đồng nghiệp cũng là một minh chứng cho chất lượng dịch vụ luôn đáp ứng được mọi nhu cầu của khách hàng.

Nhanh tay đăng ký VPS Vietnix ngay và trải nghiệm dịch vụ ổn định, tốc độ cao, hỗ trợ nhanh chóng với nhiều ưu đãi hấp dẫn nhất.

  • Địa chỉ: 265 Hồng Lạc, Phường 10, Quận Tân Bình, Thành Phố Hồ Chí Minh.
  • Hotline: 1800 1093
  • Email: sales@vietnix.com.vn

Lời kết

Khi hoàn thành hướng dẫn này, bạn đã thiết lập thành công admin user cho MongoDB. Đến đây bạn có thể sử dụng để tạo và sửa đổi user và các vai trò của user. Vietnix cũng đã hướng dẫn bạn cấu hình MongoDB để yêu cầu user xác thực bằng username và password trước khi tương tác với dữ liệu. Nếu có câu hỏi nào về bài viết này, bạn có thể để lại bình luận để nhận được sự hỗ trợ của Vietnix.

THEO DÕI VÀ CẬP NHẬT CHỦ ĐỀ BẠN QUAN TÂM

Đăng ký ngay để nhận những thông tin mới nhất từ blog của chúng tôi. Đừng bỏ lỡ cơ hội truy cập kiến thức và tin tức hàng ngày

Chọn chủ đề :

Hưng Nguyễn

Co-Founder
tại

Kết nối với mình qua

Kết nối với mình qua

Theo dõi
Thông báo của
guest
0 Comments
Phản hồi nội tuyến
Xem tất cả bình luận

Tăng tốc độ website - Nâng tầm giá trị thương hiệu

Tăng tốc tải trang

95 điểm

Nâng cao trải nghiệm người dùng

Tăng 8% tỷ lệ chuyển đổi

Thúc đẩy SEO, Google Ads hiệu quả

Tăng tốc ngay

SẢN PHẨM NỔI BẬT

7 NGÀY DÙNG THỬ HOSTING

NẮM BẮT CƠ HỘI, THÀNH CÔNG DẪN LỐI

Cùng trải nghiệm dịch vụ hosting tốc độ cao được hơn 100,000 khách hàng sử dụng

ĐĂNG KÝ NHẬN TÀI LIỆU THÀNH CÔNG
Cảm ơn bạn đã đăng ký nhận tài liệu mới nhất từ Vietnix!
ĐÓNG

ĐĂNG KÝ DÙNG THỬ HOSTING

7 NGÀY MIỄN PHÍ

ĐĂNG KÝ DÙNG THỬ HOSTING

7 NGÀY MIỄN PHÍ

XÁC NHẬN ĐĂNG KÝ DÙNG THỬ THÀNH CÔNG
Cảm ơn bạn đã đăng ký thông tin thành công. Đội ngũ CSKH sẽ liên hệ trực tiếp để kích hoạt dịch vụ cho bạn nhanh nhất!
ĐÓNG