MongoDB là hệ quản trị cơ sở dữ liệu rất hiệu quả, tuy nhiên còn nhiều cấu hình mặc định và cần kết hợp các yếu tố bảo mật bên ngoài thì mới đảm bảo an ninh, an toàn cho hệ thống cơ sở dữ liệu. Sau đây tôi xin chém gió một loại điểm cần lưu ý khi bảo mật cho mongodb
1. Bật Authentication cho MongoDB
Cho đến thời điểm hiện tại thì các cơ chế Authentication vẫn mặc định bị tắt trên Mongodb, vì vậy dù Mongodb không bị access bởi các hacker từ bên ngoài nhưng bất kỳ user nảo tại local sysem cũng có khả năng access hoàn toàn vào db. Để ngăn chặn điều này chúng ta cần tạo tài khoản quản trị và bật Mongodb Authentication.
* Tạo user quản trị
Để tạo user quản trị, trước tiên ta cần kết nối đến Mongo shell:
mongo |
Mongo shell sẽ cảnh báo chúng ta rằng Access control is not enabled, bất kỳ hành động nào liên quan đến đọc, ghi dữ liệu hoặc config sẽ đều không bị cấm.
Tiếp theo ta sẽ tạo tài khoản quản trị thông qua Mongo shell, ta có thể tùy ý chọn bất kỳ tên nào cho user của mình. Quyền hạn của user được gán thông qua role userAdminAnyDatabase. DB admin được chỉ định là nơi sẽ lưu trữ thông tin xác thực.
use admin db.createUser( { user: “myusername”, pwd: “MyPassWord”, roles: [ { role: “userAdminAnyDatabase”, db: “admin” } ] } ) |
Khi thực thi lệnh db.createUser. Mongo shell sẽ thực hiện thêm user, kết quả sẽ được in ra khi lệnh này kết thúc
Successfully added user: { “user” : “myusername”, “roles” : [ { “role” : “userAdminAnyDatabase”, “db” : “admin” } ] } |
Đến đây, chúng ta đã kết thúc quá trình tạo tài khoản quản trị cho MongoDB, có thể thoát khỏi MongoDB shell bằng cách dùng lệnh exit hoặc CTRL+C.
Tại thời điểm này, user quản trị của chúng ta đã được phép sử dụng thông tin xác thực, tuy nhiên bạn vẫn có thể bỏ qua thông tin xác thực, đó là lý do cần thực hiện tiếp bước tiếp theo.
* Bật Authentication
Để có thể bật Authentication chúng ta cần sửa file mongod.conf:
sudo vim /etc/mongod.conf |
Chuyển đến dòng #security, bỏ comment #:
security: authorization: “enabled” |
Lưu ý, dòng security không có khoảng trống phía trước, authorization được indent bởi 2 khoảng cách.
Khởi động lại mongod:
sudo systemctl restart mongod |
Kiểm tra xem authentication đã hoạt động chưa
Chúng ta sẽ dùng luôn Mongo shell để kiểm tra trạng thái authentication
Mongo |
Lần này thì Mongo shell sẽ không còn cảnh báo như trước nữa
MongoDB shell version v3.4.2 connecting to: mongodb://127.0.0.1:27017 MongoDB server version: 3.4.2 |
Bất kỳ câu truy vấn đề dữ liệu nào cũng sẽ bị cấm
show dbs |
Kết quả như sau:
2017-02-21T19:20:42.919+0000 E QUERY [thread1] Error: listDatabases failed:{ “ok” : 0, “errmsg” : “not authorized on admin to execute command { listDatabases: 1.0 }”, “code” : 13, “codeName” : “Unauthorized” |
Kiểm tra với tài khoản quản trị đã tạo trước đó
mongo -u myusername -p –authenticationDatabase admin |
Ta sẽ được yêu cầu nhập vào password, sau khi nhập đúng password sẽ có output như sau:
MongoDB shell version v3.4.2 Enter password: connecting to: mongodb://127.0.0.1:27017 MongoDB server version: 3.4.2 |
2. Thiết lập Remote Access cho MongoDB
Nếu ta cài đặt MongoDB trên một instance riêng biệt, hoặc vì một yêu cầu nghiệp vụ đặc biệt nào đó cần thiết phải kết nối đến MongoDB từ môi trường bên ngoài, ta buộc phải thiết lập Remote Access cho MongoDB
* Thiết lập UFW
Trước tiên ta cần bật UFW và cài đặt để cho phép một IP cụ thể nào đó được kết nối đến instance chứa MongoDB thông qua cổng 27017
Kiếm tra trạng thái UFW
sudo ufw status |
nếu kết quả trả về là inactive, ta cần phải kích hoạt lại đó
sudo ufw enable |
* Cấu hình lại Public bindIp
Cho phép 1 IP cụ thể kết nối đến MongoDB:
sudo ufw allow from client_ip to any port 27017 |
Bởi vì client cần phải kết nối đến MongoDB thông qua public ip, do đó ngoài việc ràng buộc MongoDB listen tại 127.0.0.1, ta cần thông báo cho MongoDB để lắng nghe thêm tại public IP:
sudo vim /etc/mongod.conf |
tìm đến đoạn bindIp: 127.0.0.1 và sửa thành bindIp: 127.0.0.1,mongo_instance_ip khởi động lại MongoDB.
sudo systemctl restart mongod |
* Kiểm tra Remote Access
Có thể dùng lệnh sau để kiểm tra kết nối đến MongoDB instance:
mongo -u myusername -p –authenticationDatabase admin –host mongo_instance_ip |
Sau khi nhập mật khẩu sẽ nhận được thông tin giống như khi mở Mongo shell tại local.
Nếu có lỗi không thể kết nối, cần kiểm tra lại các bước bên trên xem server chứa MongoDB đã mở cổng 27017 chưa, hoặc ip của ta có được phép kết nối đến không.
Những việc sửa đổi, cập nhật trên đây không quá phức tạp nhưng lại mang ý nghĩa rất quan trọng trong việc giúp tăng cường bảo mật cho MongoDB server. Ngoài cách này ra có thể sử dụng thêm external firewall hoặc VPN để bảo vệ MongoDB server, tuy nhiên cách làm trên đây vẫn là hiệu quả và nhanh nhất.
* Phòng ngừa các kết nối ra ngoài
- Ta cần đảm bảo MongoDB chạy trong môi trường mạng đáng tin cậy và được cấu hình tường lửa để kiểm soát lưu lượng truy cập vào và ra cho MongoDB.
- Vô hiệu hóa quyền truy cập root SSH trực tiếp.
- Chỉ cho phép các máy tính tin cậy truy cập từ xa vào MongoDB.
3. Thực hiện chạy MongoDB với tài khoản HĐH riêng biệt
Chạy tiến trình MongoDB bằng một tài khoản riêng trên hệ điều hành. Cho phép tài khoản có quyền truy cập DB nhưng hạn chế các quyền không cần thiết khác.
4. Dễ bị tấn công SQL Injection (No SQLi)
Xem thêm tại https://securitydaily.net/hacking-nodejs-va-mongodb/
5. Mã hóa
Để đảm bảo dữ liệu chỉ được chuyển tới cho người có thẩm quyền, ta cần phải mã hóa cả đường truyền và dữ liệu để trên máy chủ đặt MongoDB.
* Mã hóa đường truyền (TLS/SSL)
Cấu hình MongoDB để sử dụng TLS/SSL cho tất cả các kết nối đến và đi. Sử dụng TLS/SSL để mã hóa giao tiếp giữa các thành phần mongod và mongos của MongoDB cũng như giữa tất cả các ứng dụng và MongoDB.
* Mã hóa dữ liệu
Hiện tại không có mã hóa tệp dữ liệu trong MongoDB. Đây là một nguyên nhân đáng lo ngại vì bất kỳ ai có quyền truy cập vào hệ thống tệp đều có thể trích xuất thông tin từ các tệp này.
Để ngăn chặn bất kỳ vấn đề nào phát sinh từ việc thiếu mã hóa như vậy, ứng dụng nên mã hóa rõ ràng tất cả các thông tin nhạy cảm trước khi ghi vào cơ sở dữ liệu của họ, đồng thời các quyền đối với tệp cũng phải được áp dụng đầy đủ để ngăn chặn bất kỳ người dùng trái phép nào truy cập vào chúng.
6. Kiểm toán các hoạt động xảy ra trên hệ thống MongoDB
Theo dõi đăng nhập, các thay đổi trong cấu hình và dữ liệu cơ sở dữ liệu bằng cách sử dụng phiên bản MongoDB Enterprise. Đây là một chức năng rất quan trọng để admin có thể rà soát các mối nguy hại đã xảy ra trên cơ sở dữ liệu Mongo của mình.
7. Chạy MongoDB với các option an toàn
MongoDB hỗ trợ thực thi mã JavaScript trên máy chủ như: mapReduce, $ where, $ Acculator và $ function. Nếu không sử dụng chúng, hãy vô hiệu hóa bằng cách sử dụng tùy chọn –noscripting.
Giữ cho xác thực đầu vào được bật. MongoDB cho phép xác thực đầu vào theo mặc định thông qua cài đặt net.wireObjectCheck. Điều này đảm bảo rằng tất cả các tài liệu được lưu trữ trên mongod là BSON hợp lệ.
8. Kiểm tra, cập nhật các bản vá an ninh
- Định kỳ kiểm tra các mã CVE liên quan tới MongoDB đồng thời nâng cấp MongoDB thường xuyên.
- Tham khảo ngày hết hạn sử dụng của MongoDB và nâng cấp cài đặt. MongoDB nếu cần. Nói chung, hãy cố gắng duy trì phiên bản mới nhất.
- Định kỳ nâng cấp bản vá cho Hệ điều hành.
- Xem lại các thay đổi về chính sách/quy trình, đặc biệt là các thay đổi đối với các tập luật mạng để ngăn việc MongoDB vô tình kết nối ra ngoài Internet.
- Xem xét người dùng cơ sở dữ liệu MongoDB theo định kỳ.