Cơ sở dữ liệu luôn là một phần quan trọng không thể thiếu khi triển khai một web server. Tuy nhiên, việc đảm bảo cho cơ sở dữ liệu được an toàn là một vấn đề nhiều cá nhân và tổ chức phải đối mặt hiện nay. Để tìm hiểu một trong các phương pháp bảo mật cơ sở dữ liệu MongoDB trên Ubuntu, mời bạn cùng theo dõi bài viết về cách bảo mật MongoDB trên Ubuntu 20.04 sau đây của Vietnix.
Khái niệm MongoDB là gì?
MongoDB là một cơ sở dữ liệu hướng tài liệu (document database) được nhiều ứng dụng web hiện nay sử dụng. MongoDB thuộc nhóm cơ sở dữ liệu phi quan hệ (NoSQL database). Thay vì cấu trúc bảng truyền thống, MongoDB sử dụng lược đồ dữ liệu động (dynamic schema) và các document có định dạng JSON để tổ chức và lưu trữ dữ liệu.
Mặc định, MongoDB không bật xác thực người dùng. Bất cứ ai truy cập được server cài đặt Mongo đều có toàn quyền thêm, xóa, sửa với dữ liệu được lưu. Để khắc phục lỗ hổng này, Vietnix sẽ hướng dẫn các bạn cách tạo một người dùng quản trị (administrative user) và bật xác thực người dùng nhằm đảm bảo quản trị viên là người duy nhất có quyền truy cập cơ sở dữ liệu.
Chuẩn bị để bảo mật MongoDB trên Ubuntu 20.04
Trước khi bắt đầu bài hướng dẫn, các bạn cần chuẩn bị:
- Một server chạy Ubuntu 20.04, một tài khoản non-root có quyền
sudo
và cấu hình UFW cho tường lửa. - Cài đặt MongoDB vào server của bạn (Hướng dẫn chi tiết cách cài đặt MongoDB trên Ubuntu 20.04 tại đây). Trong bài viết này, Vietnix sử dụng MongoDB bản cập nhật
4.4
(bạn có thể sử dụng phiên bản khác).
Nếu bạn đang tìm kiếm một giải pháp lưu trữ đáng tin cậy và tiết kiệm chi phí thì VPS Vietnix là một lựa chọn tuyệt vời. Với các gói VPS Vietnix, bạn sẽ không cần phải đầu tư một khoản lớn để sở hữu một máy chủ riêng của riêng mình.
Hiện nay, Vietnix cung cấp các gói dịch vụ máy chủ ảo phù hợp với nhu cầu của cá nhân, doanh nghiệp, với nhiều tùy chọn về cấu hình và mức giá như VPS Giá Rẻ, VPS Phổ Thông, VPS Cao Cấp, VPS NVMe, VPS GPU. Bạn có thể chọn một gói theo nhu cầu của mình và Vietnix sẽ cung cấp cho bạn một máy chủ ảo với toàn quyền quản trị tài nguyên của mình. Liên hệ với Vietnix để được tư vấn nhanh chóng và chi tiết nhất.
Bước 1 – Tạo người dùng quản trị cho MongoDB
Từ bản cập nhật 3.0
, tiến trình quản lý tác vụ của MongoDB (MongoDB daemon) không còn cho phép Mongo tự động kết nối truy cập ngoại mạng mà chỉ có thể kết nối cục bộ từ socket Unix. Dù vậy, mặc định MongoDB vẫn chưa bật xác thực người dùng. Chỉ cần truy cập vào server, bất cứ ai cũng có toàn quyền quản lí các cơ sở dữ liệu.
Để hạn chế việc này, bạn sẽ tạo một người dùng quản trị, bật xác thực người dùng của MongoDB và đăng nhập với tư cách quản trị viên để truy cập cơ sở dữ liệu.
Đầu tiên, bạn kết nối bash shell Mongo bằng lệnh mongo
để tạo người dùng quản trị. Vì xác thực người dùng chưa được bật, bạn không cần thêm các tham số khác.
$ mongo
Output sau sẽ xuất hiện trước shell prompt của Mongo để cảnh báo quản lí truy cập dữ liệu chưa được giới hạn:
Output
MongoDB shell version v4.4.0
. . .
2020-06-09T13:26:51.391+0000 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database.
2020-06-09T13:26:51.391+0000 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted.
. . .
>
Cảnh báo trên sẽ biến mất sau khi bảo mật Mongo. Tạm thời, output cho biết bất cứ ai có khả năng truy cập vào server Ubuntu đều có quyền quản lí cơ sở dữ liệu.
Để rõ hơn, bạn gọi lệnh show dbs
:
> show dbs
Lúc này, show dbs
sẽ liệt kê tất cả cơ sở dữ liệu hiện có trên server. Sau khi xác thực người dùng được kích hoạt, danh sách này sẽ thay đổi tùy theo role hoặc giới hạn truy cập của người dùng đối với từng cơ sở dữ liệu:
Output
admin 0.000GB
config 0.000GB
local 0.000GB
Trong ví dụ trên, output chỉ hiển thị các cơ sở dữ liệu mặc định. Tuy nhiên, nếu hệ thống có các cơ sở dữ liệu chứa thông tin nhạy cảm, bất cứ người dùng nào cũng có thể tìm thấy những cơ sở dữ liệu này khi gọi lệnh show dbs
.
Để thêm một người dùng quản trị, bạn tiến hành kết nối tới cơ sở dữ liệu admin
– nơi lưu các thông tin như tên đăng nhập, mật khẩu và role của người dùng:
> use admin
Output
switched to db admin
MongoDB hỗ trợ phương thức db.createUser
để thêm người dùng mới cho cơ sở dữ liệu. Đây là một trong các phương thức JavaScript chạy trên shell (JavaScript-based shell method) được tích hợp khi cài đặt Mongo.
Bạn gọi db.createUser
theo cú pháp:
> db.createUser(
Lưu ý: Cho đến khi kết thúc lệnh bằng dấu đóng ngoặc đơn, Mongo sẽ không thực thi phương thức db.createUser
và prompt sẽ hiển thị dấu ba chấm (…
) đầu dòng thay vì dấu lớn (>
).
Bạn chuẩn bị tên đăng nhập, mật khẩu cũng như các role của người dùng quản trị. Vì dữ liệu được lưu dưới hình thức các document có dạng JSON, do đó khi thêm người dùng mới cho Mongo đồng nghĩa với việc thêm một document chứa thông tin người dùng trong các khóa.
Tương tự JSON object, một document bắt đầu và kết thúc bằng cặp dấu ngoặc nhọn ({
và }
). Sau lời gọi db.createUser
, bạn mở ngoặc nhọn để tiến hành thiết lập thông tin người dùng.
... {
Tạo khóa user:
với giá trị là tên đăng nhập đặt trong cặp dấu nháy kép. Bài viết sử dụng tên AdminSammy nhưng bạn có thể chọn tên đăng nhập tùy thích. Đừng quên ngắt khóa bằng dấu phẩy trước khi đến khóa tiếp theo:
... user: "AdminSammy",
Tiếp tục thêm khóa pwd
được gán phương thức passwordPrompt()
làm giá trị. Khi thực thi, db.createUser
sẽ gọi passwordPrompt()
để yêu cầu bạn nhập mật khẩu. Cách làm này an toàn hơn việc nhập mật khẩu ở dạng ký tự như tên đăng nhập.
Lưu ý: passwordPrompt()
chỉ được MongoDB hỗ trợ từ bản cập nhật 4.2
trở đi. Các phiên bản cũ hơn vẫn hiển thị mật khẩu dưới dạng ký tự thuần như tên đăng nhập.
... pwd: "password",
Ngắt khóa bằng dấu phẩy:
... pwd: passwordPrompt(),
Tiếp theo, bạn thêm role mong muốn cho người dùng quản trị. Là quản trị viên, ít nhất người dùng này cần role userAdminAnyDatabase
trên cơ sở dữ liệu admin
. Role này giúp quản trị viên có quyền thêm, chỉnh sửa và phân quyền cho các người dùng khác, đồng thời có quyền truy cập siêu người dùng (superuser) trên toàn bộ cluster (cụm cơ sở dữ liệu trong server).
Các bạn cũng thêm role readWriteAnyDatabase
để cho phép quản trị viên đọc và chỉnh sửa tất cả cơ sở dữ liệu còn lại ngoại trừ config
và local
(chủ yếu dùng để cấu hình cục bộ).
... roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
Đóng ngoặc nhọn để kết thúc document:
... }
Tiếp tục đóng ngoặc đơn để thực thi phương thức db.createUser
:
... )
Bạn có thể kiểm tra lại lời gọi db.createUser
hoàn chỉnh:
> db.createUser(
... {
... user: "AdminSammy",
... pwd: passwordPrompt(),
... roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
... }
... )
Nếu không mắc lỗi cú pháp, db.createUser
sẽ thực thi và yêu cầu nhập mật khẩu cho người dùng mới:
Output
Enter password:
Bạn nên đặt cho quản trị viên một mật khẩu mạnh. Sau khi nhập xong, bạn sẽ nhận được thông báo thêm mới người dùng thành công:
Output
Successfully added user: {
"user" : "AdminSammy",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
},
"readWriteAnyDatabase"
]
}
Thoát MongoDB client bằng lệnh exit
:
> exit
Đến đây, cơ sở dữ liệu đã có thể truy cập bằng người dùng vừa tạo. Tuy nhiên, bạn sẽ không được yêu cầu đăng nhập trước khi bật xác thực người dùng và khởi động lại MongoDB daemon.
Bước 2 – Kích hoạt xác thực người dùng cho Mongo
ở bước này, bạn sẽ tiến hành cấu hình file mongodb.conf
để bật tính năng xác thực người dùng cho MongoDB. Sau khi service tái khởi động, tuy người dùng vẫn có thể kết nối ẩn danh nhưng không thể xem hoặc chỉnh sửa cơ sở dữ liệu nếu không cung cấp tên đăng nhập và mật khẩu chính xác.
Sử dụng nano
hoặc trình biên tập văn bản yêu thích để mở file cấu hình:
$ sudo nano /etc/mongod.conf
Bạn tìm mục security
đã được comment (chú thích) theo mặc định:
. . .
#security:
#operationProfiling:
. . .
Xóa ký tự #
đầu dòng để bỏ comment:
. . .
security:
#operationProfiling:
. . .
Thêm vào security
tham số authorization
với giá trị enabled
:
. . .
security:
authorization: enabled
. . .
Chú ý không chừa khoảng trắng đầu dòng security
và lùi 2 khoảng trắng cho tham số authorization
.
Lưu lại thay đổi sau khi thiết lập. Nếu sử dụng nano
, bạn nhấn tổ hợp phím CTRL+X
, chọn Y
rồi ENTER
để đóng và lưu file.
Khởi động lại daemon để cấu hình mới được áp dụng:
$ sudo systemctl restart mongod
Bạn có thể kiểm tra service bằng lệnh dưới đây:
$ sudo systemctl status mongod
Nếu restart
thành công, output sẽ hiển thị thông báo service mongo
đã chạy ổn định sau khi tái khởi động:
Output
● mongod.service - MongoDB Database Server
Loaded: loaded (/lib/systemd/system/mongod.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2020-06-09 22:06:20 UTC; 7s ago
Docs: https://docs.mongodb.org/manual
Main PID: 15370 (mongod)
Memory: 170.1M
CGroup: /system.slice/mongod.service
└─15370 /usr/bin/mongod --config /etc/mongod.conf
Jun 09 22:06:20 your_host systemd[1]: Started MongoDB Database Server.
Bước tiếp theo, bạn sẽ tiến hành kiểm tra lại nhằm đảm bảo các thiết lập xác thực đã hoạt động.
Bước 3 – Kiểm tra thiết lập xác thực người dùng
Trước khi bắt đầu, bạn kết nối cơ sở dữ liệu theo cách tương tự bước 1 để xác nhận MongoDB đã được giới hạn truy cập:
$ mongo
Output không còn hiển thị các cảnh báo bảo mật sau khi Mongo bật xác thực người dùng:
Output
MongoDB shell version v4.4.0
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("5d50ed96-f7e1-493a-b4da-076067b2d898") }
MongoDB server version: 4.4.0
>
Gọi lệnh show dbs
để chắc chắn truy cập đã bị giới hạn:
> show dbs
Lần này, show dbs
không còn hiển thị các cơ sở dữ liệu mặc định như trước vì người dùng hiện tại không có quyền truy cập Mongo. Nếu không nhận được output đồng nghĩa với việc các bạn đã thiết lập xác thực người dùng thành công. Ngoài ra, Mongo cũng không cho phép thêm người dùng hoặc thực hiện các hành động yêu cầu phân quyền khác khi chưa đăng nhập.
Sau đó, bạn tạm thoát shell MongoDB.
Lưu ý: Tổ hợp phím CTRL+C
là một cách khác để đóng shell thay cho lệnh exit
:
> exit
Kế đến, bạn đăng nhập cơ sở dữ liệu với tư cách quản trị viên để chắc chắn các thiết lập của người dùng này đã được áp dụng. Thêm vào lời gọi mongo
cờ -u
cho tên đăng nhập, cờ -p
để yêu cầu mật khẩu và cơ sở dữ liệu xác thực admin
được cấu hình cho quản trị viên ở bước 2:
$ mongo -u AdminSammy -p --authenticationDatabase admin
Sau khi nhập mật khẩu và kết nối thành công MongoDB shell, bạn gọi lại lệnh show dbs
:
> show dbs
Nếu người dùng quản trị đã được xác thực, output sẽ hiển thị danh sách tất cả cơ sở dữ liệu hiện có trên server:
Output
admin 0.000GB
config 0.000GB
local 0.000GB
Đến đây, MongoDB của các bạn đã được cấu hình xác thực thành công.
Nếu bạn gặp vấn đề khi thực hiện các thao tác bảo mật MongoDB trên hệ thống, hoặc cảm thấy chúng quá phức tạp thì cũng đừng lo lắng. Bạn có thể tham khảo sử dụng dịch vụ VPS của Vietnix để được hỗ trợ cài đặt nhanh chóng. Với hơn 11 năm kinh nghiệm trong lĩnh vực này, Vietnix đã kích hoạt hơn 100.000 dịch vụ và đồng hành cùng hơn 50.000 khách hàng cá nhân, doanh nghiệp như GTV, UB Group, iVIVU, Vietnamworks, SEOSONA, SAGO Media,… Đội ngũ kỹ thuật của Vietnix luôn túc trực 247 sẵn sàng hỗ trợ mọi vấn đề phát sinh trong quá trình sử dụng.
Không chỉ vậy, có đến 97% khách hàng còn giới thiệu dịch vụ của Vietnix sau khi sử dụng. Đây cũng là một trong những lý do giúp Vietnix nhận được giải thưởng Thương hiệu Việt Nam xuất sắc năm 2022. Hãy để Vietnix trở thành người đồng hành giúp bạn có thể an tâm kinh doanh trên internet.
Mọi vấn đề thắc mắc cần tư vấn, quý khách vui lòng liên hệ:
- Đị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
Bên trên là toàn bộ các thao tác để tạo một người dùng quản trị và bảo mật MongoDB bằng cách kích hoạt tính năng xác thực người dùng. Mong rằng qua bài viết hướng dẫn bảo mật MongoDB trên Ubuntu 20.04 này đã giúp bạn tự thay đổi cấu hình phiên bản MongoDB theo nhu cầu bảo mật của mình. Rất cảm ơn bạn đã cùng Vietnix theo dõi bài viết và mong được gặp lại các bạn trong những bài viết tiếp theo về chủ đề MongoDB.