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?