Hướng dẫn netstat mongodb - netstat mongodb

Giới thiệu

MongoDB là một cơ sở dữ liệu được sử dụng trong nhiều ứng dụng, web,... Nó là cơ sở dữ liệu NoSQL vì không dựa trên cấu trúc cơ sở dữ liệu 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 lược đồ động.

Theo mặc định MongoDB không bật xác thực theo mặc định, có nghĩa là bất kỳ người dùng nào có quyền truy cập vào máy chủ cơ sở dữ liệu đượ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 người dùng quản trị và kích hoạt xác thực.

Điều kiện tiên quyết

Máy chủ chạy Ubuntu 22.04. MongoDB được cài đặt trên máy chủ của chúng ta. Nếu máy chủ chúng ta chưa cài đặt Mongo thì có thể tham khảo hướng dẫn sau : Hướng dẫn cài đặt MongoDB trên Ubuntu 22.04 LTS .

Tạo user quản trị

Để tạo user quản trị, đăng nhập vào MongoDB shell, hãy chạy lệnh sau bên dưới.

MongoDB shell sẽ được thực thi.

Kết quả

Thực hiện 1 câu truy vấn dữ liệu như sau:

Kết quả trả về toàn bộ database có trên máy chủ của chúng ta:

Kết quả

Thực hiện 1 câu truy vấn dữ liệu như sau:

Kết quả trả về toàn bộ database có trên máy chủ của chúng ta:

Trong kết quả trên thì chỉ các cơ sở dữ liệu mặc định mới xuất hiện. Tuy nhiên, nếu chúng ta có bất kỳ cơ sở dữ liệu nào chứa dữ liệu nhạy cảm trên hệ thống, thì bất kỳ người dùng nào cũng có thể tìm thấy chúng bằng lệnh này.

Và MongoDB Shell sẽ cảnh báo chúng ta "The server generated these startup warnings when booting: Access control is not enabled for the database. Read and write access to data and configuration is unrestricted" như vậy 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.

Như vậy để giảm thiểu lỗ hổng này cần tiến hành tạo user quản trị, trước tiên ta cần kết nối đến Mongo shell:

Kết quả

Thực hiện 1 câu truy vấn dữ liệu như sau:

Kết quả trả về toàn bộ database có trên máy chủ của chúng ta:

Trong kết quả trên thì chỉ các cơ sở dữ liệu mặc định mới xuất hiện. Tuy nhiên, nếu chúng ta có bất kỳ cơ sở dữ liệu nào chứa dữ liệu nhạy cảm trên hệ thống, thì bất kỳ người dùng nào cũng có thể tìm thấy chúng bằng lệnh này.

Và MongoDB Shell sẽ cảnh báo chúng ta "The server generated these startup warnings when booting: Access control is not enabled for the database. Read and write access to data and configuration is unrestricted" như vậy 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.

Như vậy để giảm thiểu lỗ hổng này cần tiến hành tạo user quản trị, trước tiên ta cần kết nối đến Mongo shell:

Sau khi đã truy cập MongoDB Shell thực thi lệnh sau để 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:

Kết quả trả về:

Đến đây chúng ta đã kết thúc quá trình tạo tài khoản quản trị cho Mongodb, chúng ta 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 123host của chúng ta đã được phép sử dụng thông tin xác thực.

Kết quả

Thực hiện 1 câu truy vấn dữ liệu như sau:

Kết quả trả về toàn bộ database có trên máy chủ của chúng ta:

Kết quả

Thực hiện 1 câu truy vấn dữ liệu như sau:

Kết quả trả về toàn bộ database có trên máy chủ của chúng ta:

Trong kết quả trên thì chỉ các cơ sở dữ liệu mặc định mới xuất hiện. Tuy nhiên, nếu chúng ta có bất kỳ cơ sở dữ liệu nào chứa dữ liệu nhạy cảm trên hệ thống, thì bất kỳ người dùng nào cũng có thể tìm thấy chúng bằng lệnh này.

Và MongoDB Shell sẽ cảnh báo chúng ta "The server generated these startup warnings when booting: Access control is not enabled for the database. Read and write access to data and configuration is unrestricted" như vậy 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.

Như vậy để giảm thiểu lỗ hổng này cần tiến hành tạo user quản trị, trước tiên ta cần kết nối đến Mongo shell:

Kết quả

Thực hiện 1 câu truy vấn dữ liệu như sau:

Kết quả

Thực hiện 1 câu truy vấn dữ liệu như sau:

Kết quả trả về toàn bộ database có trên máy chủ của chúng ta:

Kết quả

Thực hiện 1 câu truy vấn dữ liệu như sau:

Kết quả trả về toàn bộ database có trên máy chủ của chúng ta:

Trong kết quả trên thì chỉ các cơ sở dữ liệu mặc định mới xuất hiện. Tuy nhiên, nếu chúng ta có bất kỳ cơ sở dữ liệu nào chứa dữ liệu nhạy cảm trên hệ thống, thì bất kỳ người dùng nào cũng có thể tìm thấy chúng bằng lệnh này.

Kết quả

Thực hiện 1 câu truy vấn dữ liệu như sau:

Kết quả trả về toàn bộ database có trên máy chủ của chúng ta:

Trong kết quả trên thì chỉ các cơ sở dữ liệu mặc định mới xuất hiện. Tuy nhiên, nếu chúng ta có bất kỳ cơ sở dữ liệu nào chứa dữ liệu nhạy cảm trên hệ thống, thì bất kỳ người dùng nào cũng có thể tìm thấy chúng bằng lệnh này.

Và MongoDB Shell sẽ cảnh báo chúng ta "The server generated these startup warnings when booting: Access control is not enabled for the database. Read and write access to data and configuration is unrestricted" như vậy 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.

Như vậy để giảm thiểu lỗ hổng này cần tiến hành tạo user quản trị, trước tiên ta cần kết nối đến Mongo shell:

Kết quả

Thực hiện 1 câu truy vấn dữ liệu như sau:

Kết quả trả về toàn bộ database có trên máy chủ của chúng ta:

Trong kết quả trên thì chỉ các cơ sở dữ liệu mặc định mới xuất hiện. Tuy nhiên, nếu chúng ta có bất kỳ cơ sở dữ liệu nào chứa dữ liệu nhạy cảm trên hệ thống, thì bất kỳ người dùng nào cũng có thể tìm thấy chúng bằng lệnh này.

Và MongoDB Shell sẽ cảnh báo chúng ta "The server generated these startup warnings when booting: Access control is not enabled for the database. Read and write access to data and configuration is unrestricted" như vậy 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.

Như vậy để giảm thiểu lỗ hổng này cần tiến hành tạo user quản trị, trước tiên ta cần kết nối đến Mongo shell:

Sau khi đã truy cập MongoDB Shell thực thi lệnh sau để 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:

Kết quả trả về:

Chúng ta có thể sử dụng lệnh netstat để đảm bảo rằng máy chủ MongoDB không lắng nghe bất kỳ port nào:

Thiết lập Remote Access cho Mongodb

Nếu chúng ta cài đặt Mongodb trên một instance riêng biệt, hoặc vì một yêu cầu thiết lập kết nối đến Mongodb từ môi trường bên ngoài, chúng ta buộc phải thiết lập Remote Access cho Mongodb

Thiết lập UFW

Trước tiên chúng ta 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

Kết quả như sau:

Kết quả

Nếu kết quả trả về là inactive, chúng ta cần phải kích hoạt lại:

Kết quả như sau:

Kết quả

Nếu kết quả trả về là inactive, chúng ta cần phải kích hoạt lại:

Cấu hình lại Public bindIp

Cho phép 1 IP cụ thể kết nối đến Mongodb

Bởi vì client của chúng ta 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 bằng cách thêm IP public của chúng ta vào file: /etc/mongod.conf

Tìm đến đoạn bindIp: 127.0.0.1 và thêm địa chỉ IP public của chúng ta:

Khởi động lại Mongodb:

Kiểm tra Remote Access

Chúng ta có thể dùng lệnh sau để kiểm tra kết nối đến Mongodb instance

Kết quả

Nếu kết quả trả về là inactive, chúng ta cần phải kích hoạt lại:

Cấu hình lại Public bindIp

Cho phép 1 IP cụ thể kết nối đến Mongodb

Bởi vì client của chúng ta 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 bằng cách thêm IP public của chúng ta vào file: /etc/mongod.conf

Tìm đến đoạn bindIp: 127.0.0.1 và thêm địa chỉ IP public của chúng ta:

Khởi động lại Mongodb:

Kiểm tra Remote Access

Chúng ta có thể dùng lệnh sau để kiểm tra kết nối đến Mongodb instance

Sau khi nhập mật khẩu chúng ta sẽ nhận được thông tin giống như khi mở Mongo shell tại local

Sử dụng xác thực X.509

Sử dụng xác thực server X.509

Cấu hình xác thực TLS của máy chủ cho phép kết nối của client để xác minh danh tính của máy chủ. Trước tiên, chúng ta cần lấy chứng chỉ TLS mà máy chủ của chúng ta sẽ hiển thị cho client và chứng chỉ CA mà client sẽ sử dụng để xác minh rằng chứng chỉ đã xuất trình được ký bởi một cơ quan đáng tin cậy.

  • Chúng ta có thể sử dụng certbot để nhận chứng chỉ TLS miễn phí từ Let's Encrypt hoặc chỉ cần tạo CA và ký chứng chỉ cục bộ bằng lệnh mongod.conf5.
  • Tiến hành tạo CA tự ký bằng cách thực hiện lệnh sau:
  • Tiếp theo tạo CSR của máy chủ bằng cách thực thi lệnh bên dưới:

Ký chứng chỉ máy chủ:

Đối với các cụm nhiều node, hãy ký một chứng chỉ cho mỗi node. MongoDB yêu cầu chứng chỉ và khóa phải nằm trong cùng một file, vì vậy hãy đặt chúng lại với nhau trong một file PEM:

Bây giờ chúng ta có thể cập nhật cấu hình máy chủ để bật TLS. Chúng ta cũng nên tắt các phiên bản TLS cũ và buộc client sử dụng TLS 1.3, bằng cách cấu hình file /etc/mongod.conf tại phần net: