Thứ năm, 08/10/2020 | 00:00 GMT+7

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ế:

Output
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:

Output
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
Output
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 ( {} ). Để 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 configlocal , 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 :

Output
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:

Output
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 :

/etc/mongod.conf
. . . #security:  #operationProfiling:  . . . 

Bỏ comment này bằng cách bỏ dấu thăng ( # ):

/etc/mongod.conf
. . . 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:

/etc/mongod.conf
. . . 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:

Output
● 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:

Output
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 :

Output
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.


Tags:

Các tin liên quan

Cách cài đặt mongodb trên ubuntu 18.04 từ trang chủ Mongodb
2020-10-08
Cách cấu hình quyền truy cập từ xa cho MongoDB trên Ubuntu 18.04
2020-10-08
Cách cài đặt MongoDB trên Ubuntu 18.04 từ kho APT mặc định
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 cài đặt Webmin trên Ubuntu 20.04
2020-08-26