Bật tính năng xác thực trong file cấu hình MongoDB
Bước đầu tiên để bảo vệ database là buộc MongoDB yêu cầu xác thực cho mọi kết nối. Mặc định sau khi cài đặt, MongoDB chạy ở chế độ không bảo mật (noauth), cho phép bất kỳ ai cũng truy cập.
Chúng ta cần chỉnh sửa file cấu hình chính /etc/mongod.conf để thêm dòng security.authorization: enabled.
Thao tác này sẽ ngăn chặn tất cả các kết nối không có thông tin đăng nhập hợp lệ ngay khi service khởi động lại.
sudo nano /etc/mongod.conf
Trong file cấu hình, tìm đến phần security (nếu chưa có thì tạo mới) và đảm bảo nội dung như sau:
security:
authorization: enabled
Lưu file và thoát (Ctrl+O, Enter, Ctrl+X). Sau đó khởi động lại dịch vụ MongoDB để áp dụng thay đổi.
sudo systemctl restart mongod
Kết quả mong đợi: Dịch vụ sẽ khởi động lại thành công. Tuy nhiên, nếu bạn cố gắng kết nối ngay lúc này bằng lệnh mongosh mà không có tài khoản, bạn sẽ nhận được lỗi Authentication failed. Đây là dấu hiệu xác nhận tính năng bảo mật đã được kích hoạt.
Verify kết quả
Chạy lệnh kiểm tra trạng thái service để đảm bảo nó đang chạy bình thường sau khi bật bảo mật.
sudo systemctl status mongod
Cố gắng kết nối không xác thực để xác minh lỗi (bạn sẽ thấy lỗi Command failed hoặc Authentication failed).
mongosh --eval "db.runCommand({ ping: 1 })"
Tạo tài khoản quản trị viên (Admin) cấp hệ thống
Vì chúng ta vừa bật xác thực, hiện tại không còn tài khoản nào tồn tại để đăng nhập. Chúng ta cần tạo một user admin có quyền userAdminAnyDatabase hoặc root để quản lý toàn bộ hệ thống.
Trước khi tạo user, bạn cần kết nối vào MongoDB với quyền --eval để chạy lệnh tạo user. Vì hiện tại chưa có user nào, chúng ta phải tạm thời tắt xác thực để tạo user đầu tiên, hoặc sử dụng cách kết nối đặc biệt nếu MongoDB chưa restart xong.
Tuy nhiên, cách an toàn và chuẩn nhất là: Kết nối vào instance đang chạy (vừa bật auth) bằng cách sử dụng lệnh tạo user ngay lập tức trên shell, nhưng vì chưa có user, MongoDB sẽ từ chối. Do đó, chúng ta cần tạo user trước khi restart service lần cuối, hoặc nếu đã restart rồi, ta phải tạm thời disable auth để tạo user root, rồi enable lại.
Giả sử bạn đã restart service ở phần trên, hiện tại bạn không thể đăng nhập. Bạn cần tạm thời comment dòng authorization: enabled lại, restart service, tạo user, rồi bật lại.
sudo nano /etc/mongod.conf
Comment dòng authorization: enabled bằng cách thêm dấu # ở đầu dòng:
# authorization: enabled
Restart service để cho phép kết nối không xác thực một lần nữa.
sudo systemctl restart mongod
Bây giờ, kết nối vào MongoDB và tạo user admin trong database admin.
mongosh
Trong shell mongosh, thực hiện các lệnh sau để chuyển sang database admin và tạo user:
use admin
db.createUser({
user: "admin",
pwd: "YOUR_STRONG_PASSWORD_HERE",
roles: [
{ role: "root", db: "admin" },
{ role: "userAdminAnyDatabase", db: "admin" }
]
})
Kết quả mong đợi: MongoDB trả về thông báo Successfully added user. User admin hiện có quyền toàn quyền quản trị và tạo user khác.
Thoát khỏi shell mongosh:
exit
Re-enable bảo mật sau khi tạo Admin
Quay lại file cấu hình để bật lại tính năng xác thực. Đây là bước quan trọng nhất để khóa lại hệ thống sau khi đã có "chìa khóa" (user admin).
sudo nano /etc/mongod.conf
Bỏ comment dòng authorization: enabled:
authorization: enabled
Restart service lần cuối:
sudo systemctl restart mongod
Verify kết quả
Kiểm tra lại việc kết nối không xác thực đã bị từ chối.
mongosh --eval "db.runCommand({ ping: 1 })"
Thử kết nối với tài khoản admin vừa tạo. Thay thế YOUR_STRONG_PASSWORD_HERE bằng mật khẩu thực tế bạn đã đặt.
mongosh -u admin -p "YOUR_STRONG_PASSWORD_HERE" --authenticationDatabase admin
Kết quả: Kết nối thành công, bạn thấy prompt admin@mongod>... hoặc test@mongod>....
Tạo user chuyên dụng cho ứng dụng với Role cụ thể
Trong môi trường production, tuyệt đối không dùng tài khoản admin để kết nối từ ứng dụng (backend/frontend). Chúng ta cần tạo một user riêng với quyền hạn tối thiểu cần thiết (Principle of Least Privilege).
Giả sử chúng ta có một ứng dụng đặt tên là myapp và cần database myapp_db. User này chỉ cần quyền readWrite (đọc và ghi) trên database đó.
Đăng nhập bằng tài khoản admin đã tạo ở phần trước để thực hiện việc tạo user mới.
mongosh -u admin -p "YOUR_STRONG_PASSWORD_HERE" --authenticationDatabase admin
Trong shell, thực hiện lệnh tạo user mới:
use myapp_db
db.createUser({
user: "myapp_user",
pwd: "APP_SECRET_PASSWORD",
roles: [
{ role: "readWrite", db: "myapp_db" }
]
})
Kết quả mong đợi: Thông báo Successfully added user. User myapp_user chỉ có thể truy cập vào myapp_db và không thể làm gì trên các database khác hay database admin.
Thoát shell mongosh:
exit
Verify kết quả
Thử kết nối bằng user ứng dụng để xác nhận quyền truy cập.
mongosh -u myapp_user -p "APP_SECRET_PASSWORD" --authenticationDatabase myapp_db
Trong shell, thử truy cập database myapp_db (phải thành công) và thử truy cập database admin (phải bị lỗi).
use myapp_db
db.runCommand({ ping: 1 })
Thử truy cập database admin (sẽ bị lỗi not authorized on admin to execute command):
use admin
db.runCommand({ ping: 1 })
Kết quả: Lệnh trên database myapp_db chạy thành công, lệnh trên admin bị từ chối. Điều này chứng tỏ cấu hình role đã chính xác.
Kiểm tra kết nối và quản lý User qua mongosh
Để quản lý người dùng, bạn cần biết cách xem danh sách user hiện có và xóa user khi không cần thiết. Tất cả các thao tác này đều thực hiện trong database admin với quyền userAdminAnyDatabase.
Đăng nhập bằng tài khoản admin:
mongosh -u admin -p "YOUR_STRONG_PASSWORD_HERE" --authenticationDatabase admin
Lệnh xem danh sách tất cả user trong database admin:
use admin
db.system.users.find().pretty()
Lệnh xem danh sách user trong database cụ thể (ví dụ myapp_db):
use myapp_db
db.system.users.find().pretty()
Để xóa một user (ví dụ xóa user myapp_user nếu cần):
use myapp_db
db.dropUser("myapp_user")
Kết quả mong đợi: Thông báo { ok: 1 } khi xóa thành công.
Để kiểm tra lại quyền của một user (ví dụ xem role của admin):
use admin
db.system.users.find({ user: "admin" }).pretty()
Thoát shell sau khi kiểm tra xong:
exit
Verify kết quả
Chạy lệnh liệt kê user một lần nữa để đảm bảo danh sách đã được cập nhật (thêm hoặc xóa).
mongosh -u admin -p "YOUR_STRONG_PASSWORD_HERE" --authenticationDatabase admin --eval "use admin; db.system.users.find().pretty()"
Điều hướng series:
Mục lục: Series: Triển khai Database Document với MongoDB và Ubuntu 24.04
« Phần 2: Cài đặt MongoDB Community Edition chính thức trên Ubuntu 24.04
Phần 4: Quản lý dữ liệu, schema và thao tác CRUD cơ bản »