Bảo mật mongodb trên Ubuntu 18
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 (bảng) độ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 (người-dùng-quản-trị) 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 các thành phần sau:
- Server chạy Ubuntu 18.04. Server này cần 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 cho Ubuntu 18.04 .
- MongoDB được cài đặt trên server. Hướng dẫn này đã được kiểm nghiệm với MongoDB version 4.4 , và có thể chạy với các version MongoDB cũ hơn. Để cài đặt Mongo trên server, hãy làm theo hướng dẫn 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ì ta chưa cài đặt xác thực, nên sẽ có một cảnh báo bảo mật quyền truy cập:
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, điều đó 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 kích hoạt xác thực, 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 các 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:
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. 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 hàm này, hàm db.createUser
, được sử dụng để tạo user mới trên database mà hàm được chạy trên đó.
Khởi db.createUser
hàm 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. Do đó, 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ý hàm 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 , có thể thay tên user bạn muốn:
- user: "AdminSammy",
Tiếp theo, nhập một trường pwd
với hàm passwordPrompt()
làm giá trị của nó. Khi bạn thực thi hàm db.createUser
, hàm 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 văn bản rõ ràng như bạn đã làm cho tên user.
Lưu ý : hàm 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:
- 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ó. 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 superuser 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 dành cho sử dụng nội bộ:
- roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
Sau đó, nhập 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 hàm db.createUser
:
- )
Tất cả cùng nhau, đây là hàm 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, hàm sẽ thực thi đúng cách và bạn cần 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 đó, ta có thể thoát khỏi ứng dụng MongoDB:
- exit
Đến đây, user sẽ được phép nhập thông tin đăng nhập.
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 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. Ở đây, ta 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"
. 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 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 sao lưu 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 có thông tin đăng nhập, để kiểm tra sự 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. 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 với quyền admin.
Vì lệnh này không trả lại bất kỳ thông tin nào, nên có thể nói 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.
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 như ở Bước 1, một cách khác để đóng shell là chỉ cần nhấn CTRL + C
- exit
Tiếp theo, hãy đảm bảo admin-user 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
, ở 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 user của admin-user. 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
Đến đây, bạn đã cài đặt user MongoDB quản trị và có thể sử dụng để tạo và sửa đổi user và role mới, cũng như quản lý version MongoDB. Bạn cũng đã cấu hình version MongoDB để 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 cách xác thực hoạt động trên MongoDB .
Ngoài ra nếu định tương tác từ xa với MongoDB, bạn có thể làm theo hướng dẫn về Cách cấu hình quyền truy cập từ xa cho MongoDB trên Ubuntu 18.04.
Các tin trước
Cài đặt anaconda python trên Ubuntu 18 2020-10-03 Tạo user mới và Phân quyền với Mysql 2020-09-29 Cài đặt LAMP (Apache MariaDb Php) trên CENTOS 8 2020-09-28 Cách cài đặt máy chủ Apache trên Centos 8 2020-09-28 Tổng quan sử dụng SSH, làm việc với SSH Client - Server 2020-09-28 Cách cài đặt SSH Key trên Centos 8, đăng nhập không cần password! 2020-09-27 Cài đặt bảo mật cơ bản cho Centos 8 2020-09-27 Lập lịch với Crontab trên Centos 8 2020-09-27 Bảo mật Apache với Lets Encrypt trên Centos 8 2020-09-19 Tạo chứng chỉ số tự ký trên Apache Centos 8 (self-signed-ssl-certificate) 2020-09-19