Cách bảo mật MongoDB trên Ubuntu 18.04
MongoDB , còn gọi là Mongo , là một opensource database được sử dụng trong nhiều ứng dụng web hiện đại. Nó được gọi là database NoSQL vì nó không dựa trên cấu trúc database quan hệ dựa trên bảng truyền thống. Thay vào đó, nó sử dụng các tài liệu giống JSON với các schemas động.
MongoDB không cài đặt xác thực theo mặc định, nghĩa là mọi user có quyền truy cập vào server nơi database được cài đặt đều có thể thêm và xóa dữ liệu mà không bị hạn chế. Để bảo mật lỗ hổng này, hướng dẫn này sẽ hướng dẫn bạn cách tạo admin-user và cài đặt xác thực . Sau đó, bạn sẽ kiểm tra để xác nhận chỉ admin-user này mới có quyền truy cập vào database .
Yêu cầu
Để hoàn thành hướng dẫn này, bạn cần những thứ sau:
- Server chạy Ubuntu 18.04. Server này phải có admin-user không phải root và firewall được cấu hình bằng UFW. Cài đặt điều này theo hướng dẫn cài đặt server ban đầu của ta cho Ubuntu 18.04 .
- MongoDB được cài đặt trên server của bạn. Hướng dẫn này đã được kiểm nghiệm bằng cách sử dụng MongoDB version 4.4 , mặc dù nó thường hoạt động với các version MongoDB cũ hơn. Để cài đặt Mongo trên server của bạn, hãy làm theo hướng dẫn của ta về Cách cài đặt MongoDB trên Ubuntu 18.04 .
Bước 1 - Thêm admin-user
Kể từ khi phát hành version 3.0 , daemon MongoDB được cấu hình để chỉ chấp nhận các kết nối từ socket Unix local và nó không tự động mở ra Internet rộng hơn. Tuy nhiên, xác thực vẫn bị tắt theo mặc định. Điều này nghĩa là mọi user có quyền truy cập vào server nơi MongoDB được cài đặt cũng có quyền truy cập đầy đủ vào database .
Bước đầu tiên để bảo mật lỗ hổng này, bạn sẽ tạo một admin-user . Sau đó, bạn sẽ cài đặt xác thực và kết nối với quyền là admin-user này để truy cập database .
Để thêm  admin-user , trước tiên bạn phải kết nối với Mongo shell. Vì xác thực bị vô hiệu hóa nên bạn có thể làm như vậy với lệnh mongo mà không có bất kỳ tùy chọn nào khác:
- mongo
Sẽ có một số kết quả phía trên dấu nhắc Mongo shell. Vì bạn chưa cài đặt xác thực , điều này sẽ bao gồm một cảnh báo rằng kiểm soát truy cập không được bật cho database và quyền truy cập đọc và ghi vào dữ liệu và cấu hình của database là không bị hạn chế:
MongoDB shell version v4.4.1 . . .  2020-10-06T15:08:11.202+00:00: Access control is not enabled for the database. Read and write access to data and configuration is unrestricted . . . >  Cảnh báo này sẽ không xuất hiện sau khi bạn cài đặt xác thực , nhưng hiện tại nó nghĩa là bất kỳ ai có thể truy cập server Ubuntu của bạn cũng có thể kiểm soát database của bạn.
Để minh họa, hãy chạy lệnh show dbs của Mongo:
- show dbs
Lệnh này trả về danh sách mọi database trên server . Tuy nhiên, khi xác thực được bật, danh sách sẽ thay đổi dựa trên role của user Mongo hoặc cấp độ truy cập của nó đối với một số database nhất định. Tuy nhiên, vì xác thực bị vô hiệu hóa, nó sẽ trả về mọi database hiện có trên hệ thống mà không có giới hạn:
admin   0.000GB config  0.000GB local   0.000GB Trong kết quả ví dụ này, chỉ các database mặc định mới xuất hiện. Tuy nhiên, nếu bạn có database nào chứa dữ liệu nhạy cảm trên hệ thống của bạn , thì mọi user cũng có thể tìm thấy chúng bằng lệnh này.
Là một phần của việc giảm thiểu lỗ hổng này, bước này tập trung vào việc thêm  admin-user . Để làm điều này, trước tiên bạn phải kết nối với database  admin . Đây là nơi lưu trữ thông tin về  user , như tên  user , password  và  role  của họ:
- use admin
switched to db admin MongoDB được cài đặt với một số phương pháp shell dựa trên JavaScript mà bạn có thể sử dụng để quản lý database   của bạn . Một trong những phương thức này, phương thức db.createUser , được sử dụng để tạo  user  mới trên database  mà phương thức được chạy trên đó.
Khởi db.createUser phương thức db.createUser :
- db.createUser(
Phương pháp này yêu cầu bạn chỉ định tên user và password cho user , cũng như bất kỳ role nào bạn muốn user có. Nhớ lại rằng MongoDB lưu trữ dữ liệu của nó trong các tài liệu giống như JSON. Như vậy, khi bạn tạo user mới, tất cả những gì bạn đang làm là tạo tài liệu để lưu giữ dữ liệu user thích hợp dưới dạng các trường riêng lẻ.
Giống như các đối tượng trong JSON, các tài liệu trong MongoDB bắt đầu và kết thúc bằng dấu ngoặc nhọn ( { và } ). Để bắt đầu thêm  user , hãy nhập một dấu ngoặc nhọn mở:
Lưu ý : Mongo sẽ không đăng ký phương thức db.createUser hoàn chỉnh cho đến khi bạn nhập dấu ngoặc đóng. Cho đến khi bạn làm như vậy,  dấu nhắc  sẽ thay đổi từ dấu lớn hơn ( > ) thành dấu chấm lửng ( ... ).
- {
Tiếp theo, nhập trường user: :, với tên  user  mong muốn của bạn làm giá trị trong dấu ngoặc kép, theo sau là dấu phẩy. Ví dụ sau chỉ định tên  user  AdminSammy , nhưng bạn có thể nhập bất kỳ tên  user  nào bạn thích:
- user: "AdminSammy",
Tiếp theo, nhập một trường pwd với phương thức passwordPrompt() làm giá trị của nó. Khi bạn thực thi phương thức db.createUser , phương thức passwordPrompt() sẽ đưa ra  dấu nhắc  để bạn nhập password   của bạn . Cách này an toàn hơn cách thay thế, đó là nhập password  của bạn  bằng text  rõ ràng như bạn đã làm cho tên  user   của bạn .
Lưu ý : Phương thức passwordPrompt() chỉ tương thích với MongoDB version  4.2 và mới hơn. Nếu bạn đang sử dụng version  Mongo cũ hơn, thì bạn sẽ phải viết password   của bạn   bằng text  rõ ràng, tương tự như cách bạn viết tên  user   của bạn :
- pwd: "password",
Hãy chắc chắn theo dõi trường này bằng dấu phẩy:
- pwd: passwordPrompt(),
Sau đó, nhập các  role  bạn muốn  admin-user   của bạn  có.  Vì bạn  đang tạo một  admin-user , tối thiểu bạn nên cấp cho họ  role  userAdminAnyDatabase trên database  admin . Điều này sẽ cho phép  admin-user  tạo và sửa đổi  user  và  role  mới. Bởi vì  admin-user  có  role  này trong database  admin , điều này cũng sẽ cấp cho nó quyền truy cập siêu  user  vào toàn bộ cụm .
Ngoài ra, ví dụ sau cũng cấp cho  admin-user   role  readWriteAnyDatabase . Điều này cấp cho  admin-user  khả năng đọc và sửa đổi dữ liệu trên bất kỳ database  nào trong cụm ngoại trừ database  config và local , chủ yếu là để sử dụng nội bộ:
- roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
Sau đó, nhập một dấu ngoặc nhọn để biểu thị phần cuối của tài liệu:
- }
Sau đó nhập dấu ngoặc đơn đóng để đóng và thực thi phương thức db.createUser :
- )
Tất cả cùng nhau, đây là phương thức db.createUser của bạn sẽ trông như thế nào:
> db.createUser( ... { ... user: "AdminSammy", ... pwd: passwordPrompt(), ... roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ] ... } ... ) Nếu cú pháp của mỗi dòng là chính xác, phương thức sẽ thực thi đúng cách và bạn sẽ được yêu cầu nhập password :
Enter password:  Nhập password mạnh mà bạn chọn. Sau đó, bạn sẽ nhận được xác nhận user đã được thêm vào:
Successfully added user: {     "user" : "AdminSammy",     "roles" : [         {             "role" : "userAdminAnyDatabase",             "db" : "admin"         },         "readWriteAnyDatabase"     ] } Sau đó, bạn có thể thoát khỏi ứng dụng client MongoDB:
- exit
Đến đây, user của bạn sẽ được phép nhập thông tin đăng nhập. Tuy nhiên, họ sẽ không bắt buộc phải làm như vậy cho đến khi bạn kích hoạt xác thực và khởi động lại daemon MongoDB.
Bước 2 - Cài đặt xác thực
Để kích hoạt xác thực, bạn phải chỉnh sửa mongod.conf , file  cấu hình của MongoDB. Sau khi bạn kích hoạt nó và khởi động lại dịch vụ Mongo,  user  sẽ vẫn có thể kết nối với database  mà không cần xác thực. Tuy nhiên, họ sẽ không thể đọc hoặc sửa đổi bất kỳ dữ liệu nào cho đến khi họ cung cấp tên  user  và password  chính xác.
Mở file  cấu hình bằng editor   bạn muốn . Ở đây,  ta  sẽ sử dụng nano :
- sudo nano /etc/mongod.conf
Cuộn xuống để tìm phần security đã  comment :
. . . #security:  #operationProfiling:  . . . Bỏ  comment  này bằng cách bỏ dấu thăng ( # ):
. . . security:  #operationProfiling:  . . . Sau đó, thêm thông số authorization và đặt nó thành "enabled" . Khi bạn hoàn thành, các dòng sẽ trông như thế này:
. . . security:   authorization: "enabled" . . .   Lưu ý  dòng security: không có dấu cách ở đầu, trong khi dòng authorization: được thụt lề với hai dấu cách.
Sau khi thêm các dòng này, hãy  lưu file  . Nếu bạn sử dụng nano để mở file , hãy làm như vậy bằng cách nhấn CTRL + X , Y , sau đó ENTER .
Sau đó khởi động lại daemon để những thay đổi mới này có hiệu lực:
- sudo systemctl restart mongod
Tiếp theo, hãy kiểm tra trạng thái của dịch vụ đảm bảo rằng nó đã khởi động lại chính xác:
- sudo systemctl status mongod
Nếu lệnh restart thành công, bạn sẽ nhận được  kết quả  cho biết rằng dịch vụ mongod đang hoạt động và đã được khởi động gần đây:
● mongod.service - MongoDB Database Server    Loaded: loaded (/lib/systemd/system/mongod.service; enabled; vendor preset: enabled)    Active: active (running) since Tue 2020-10-06 15:24:44 UTC; 5s ago      Docs: https://docs.mongodb.org/manual  Main PID: 13660 (mongod)    CGroup: /system.slice/mongod.service            └─13660 /usr/bin/mongod --config /etc/mongod.conf  Oct 06 15:24:44 mongo-18-01 systemd[1]: Started MongoDB Database Server. Sau khi xác minh daemon được backup và chạy, bạn có thể kiểm tra xem cài đặt xác thực bạn đã thêm có hoạt động như mong đợi hay không.
Bước 3 - Kiểm tra cài đặt xác thực
Để bắt đầu kiểm tra xem các yêu cầu xác thực bạn đã thêm trong bước trước có hoạt động chính xác hay không, hãy bắt đầu bằng cách kết nối mà không chỉ định bất kỳ thông tin đăng nhập nào để xác minh các hành động của bạn thực sự bị hạn chế:
- mongo
Đến đây bạn đã cài đặt xác thực , không có cảnh báo nào bạn gặp phải trước đó sẽ xuất hiện:
MongoDB shell version v4.4.1 connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb Implicit session: session { "id" : UUID("ed0e92b6-bee5-4867-9d87-8b57155aea40") } 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ại lệnh show dbs :
- show dbs
Nhớ lại từ Bước 1 rằng có ít nhất một vài database mặc định trên server của bạn. Tuy nhiên, trong trường hợp này, lệnh sẽ không có bất kỳ kết quả nào vì bạn chưa xác thực là user có quyền .
Vì lệnh này không trả về bất kỳ thông tin nào, nên có thể nói rằng cài đặt xác thực đang 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 việc quyền khác mà không xác thực trước.
Tiếp tục và thoát khỏi shell MongoDB:
Lưu ý : Thay vì chạy lệnh exit sau như bạn đã làm trước đó ở Bước 1, một cách thay thế để đóng  shell  là chỉ cần nhấn CTRL + C
- exit
Tiếp theo, hãy  đảm bảo   admin-user  của bạn có thể xác thực đúng cách bằng cách chạy lệnh mongo sau để kết nối  với quyền  là  user  này. Lệnh này bao gồm cờ -u , cờ này đứng trước tên của  user  bạn muốn kết nối. Đảm bảo thay thế AdminSammy bằng tên  admin-user   của bạn . Nó cũng bao gồm cờ -p , sẽ nhắc bạn nhập password  của  user  và chỉ định admin là database  xác thực nơi tên  user  được chỉ định được tạo:
- mongo -u AdminSammy -p --authenticationDatabase admin
Nhập password  của  user  khi  được yêu cầu , và sau đó bạn sẽ được đưa vào  shell . Khi đó, hãy thử  chạy lại lệnh  show dbs :
- show dbs
Lần này, vì bạn đã xác thực đúng cách, lệnh sẽ trả về thành công danh sách tất cả các database hiện có trên server :
admin   0.000GB config  0.000GB local   0.000GB Điều này xác nhận xác thực đã được kích hoạt thành công.
Kết luận
Bằng cách hoàn thành hướng dẫn này, bạn đã cài đặt user MongoDB quản trị mà bạn có thể sử dụng để tạo và sửa đổi user và role mới, đồng thời quản lý version MongoDB của bạn. Bạn cũng đã cấu hình version MongoDB của bạn để yêu cầu user xác thực bằng tên user và password hợp lệ trước khi họ có thể tương tác với bất kỳ dữ liệu nào.
Để biết thêm thông tin về cách quản lý user MongoDB, hãy xem tài liệu chính thức về chủ đề này . Bạn cũng có thể quan tâm đến việc tìm hiểu thêm về cách xác thực hoạt động trên MongoDB .
Ngoài ra, nếu bạn định tương tác từ xa với version MongoDB của bạn , bạn có thể làm theo hướng dẫn của ta về Cách cấu hình quyền truy cập từ xa cho MongoDB trên Ubuntu 18.04 để cài đặt điều này.
Các tin liên quan
Cách cấu hình quyền truy cập từ xa cho MongoDB trên Ubuntu 18.042020-10-08
Cách cài đặt MongoDB trên Ubuntu 18.04 từ kho APT mặc định
2020-10-08
Cách cài đặt mongodb trên ubuntu 18.04 từ trang chủ Mongodb
2020-10-08
Làm thế nào để quản lý client OpenSSH trên Ubuntu 18.04
2020-09-30
Cách cài đặt và sử dụng ClickHouse trên Ubuntu 20.04
2020-09-22
Cách cài đặt và cấu hình Mahara trên Ubuntu 18.04
2020-09-21
Cách cài đặt Jitsi Meet trên Ubuntu 20.04
2020-09-18
Cách xử lý sandbox với Systemd trên Ubuntu 20.04
2020-09-16
Cách cài đặt và cấu hình Neo4j trên Ubuntu 20.04
2020-09-15
Cách thiết lập môi trường JupyterLab trên Ubuntu 18.04
2020-08-26
 

