Cách đơn giản nhất để bắt đầu khởi chạy MongoDB là dùng docker:

docker run --name mongodb -p 27017:27017 mongo

Với chỉ định -p 27017:27017, bạn có thể kết nối tới database này bằng connection mongodb://localhost:27017 hoặc mongodb://0.0.0.0:27017, giống như cài đặt trực tiếp.

Ở đây giả định là chúng ta chỉ cần kết nối internal.

Đổi cổng mặc định

Nếu muốn mở rộng truy cập cho ứng dụng từ bên ngoài, hãy thay bằng:

docker run --name mongodb -p 0.0.0.0:27017:27017 mongo

Hoặc sửa file cấu hình:

docker run --name mongodb -p 27017:27017 -v /path/to/custom/mongod.conf:/etc/mongod.conf mongo

Trong đó mongod.conf có nội dung:

# mongod.conf

# other settings

# network interfaces
net:
  port: 27017
  # bindIp: 127.0.0.1  # this is default setting
  bindIp: 0.0.0.0  # this is what changed

# other settings

Lúc này, cổng database đã public, không còn an toàn nữa.

Theo kinh nghiệm của tôi, việc đầu tiên chúng ta nên làm là thay đổi cổng mặc định. Ví dụ:

docker run --name mongodb -p 27117:27017 -v /path/to/custom/mongod.conf:/etc/mongod.conf mongo

Mongodb sẽ bắt đầu lắng nghe ở cổng 27117 thay vì 27017.

Tuy nhiên, như vậy cũng không đủ, có nhiều bots liên tục tự động quét dò những cổng đang mở và tìm cách xâm nhập. Vì vậy, hãy tăng thêm độ khó cho chúng.

Kích hoạt authentication

Mặc định, MongoDB không kích hoạt chức năng authentication. Chúng ta hãy kích hoạt thủ công. Để dễ dàng quản lý, tôi thay bằng 1 file docker-compose.yaml như sau:

version: "3"

services:
  mongodb:
    image: mongo
    container_name: mongodb
    ports:
      - 0.0.0.0:27117:27017
    volumes:
      - ./mongod.conf:/etc/mongod.conf
    entrypoint: ["mongod", "--auth", "--config", "/etc/mongod.conf"]

Với thiết lập trên, chúng ta sửa entrypoint để chạy mongodb với cờ --auth. Đồng thời, chúng ta cũng đặt tên container là mongodb.

Tiếp theo đây là phần quan trọng nhất...

Tạo user với permissions cụ thể

Đến lúc này, MongoDB của chúng ta chưa có user nào. Chúng ta sẽ vào trong container để tạo users.

docker exec -it mongodb mongo

Từ mongo shell, chúng ta chuyển sang admin database và tạo user boss với quyền admin trên mọi database:

use admin
db.createUser({
  user: 'boss',
  pwd: 'YourVeryComplexPassword',
  roles:['userAdminAnyDatabase']
})

Xong, nhấn Ctrl + C để exit:

Đến thời điểm này, chúng ta đã có MongoDB chạy với authentication mode, và 1 admin user. Connection string cho boss user như sau:

mongodb://boss:YourVeryComplexPassword@IP_ADDR:27117

Đây là power user, đừng sử dụng nó tùy tiện. Thay vào đó, chúng ta sẽ tạo thêm các users khác cho từng mục đích.

Trở lại mongo shell với boss user:

docker exec -it mongodb mongo -u boss

Nhập mật khẩu của boss, sau đó bạn sẽ thấy:

Giả sử chúng ta có 1 database là blogs chứa các bài viết. Hãy thêm 1 user writer với quyền write lên database này, và 1 user reader chỉ có quyền read.

# go to database `admin`
use admin

# add writer
db.createUser({
  user: 'writer',
  pwd: 'YourComplexPassword',
  roles:[
    { 
      role: 'readWrite',
      db: 'blogs'
    }
  ]
})

# add reader
db.createUser({
  user: 'reader',
  pwd: 'YourSimplePassword',
  roles:[
    { 
      role: 'read',
      db: 'blogs'
    }
  ]
})

Xong, nhấn Ctrl + C để rời khỏi mongo shell.

Bây giờ chúng ta có 2 users mới, writer dùng cho read/write và reader dùng cho read. Connection strings như sau:

mongodb://writer:YourComplexPassword@IP_ADDR:27117
mongodb://reader:YourSimplePassword@IP_ADDR:27117

Với các ứng dụng hoặc dịch vụ chỉ load và hiển thị bài viết, chúng ta dùng reader. Khi cần tạo bài mới hoặc cập nhật, chúng ta sẽ dùng writer. Quyền cấp cho ứng dụng, dịch vụ là vừa đủ, không thừa không thiếu.

Bản tiếng Anh: How to make your MongoDB container more secure?