Một phân tích gần đây cho thấy có ít nhất 30.000 trường hợp MongoDB không được bảo mật trên Internet, có nghĩa là bất kỳ ai cũng có thể truy cập dữ liệu mà không cần bất kỳ loại xác thực nào.

Tài liệu MongoDB chính thức có thể cảm thấy hơi phức tạp về cách thiết lập xác thực đúng trên MongoDB, vì vậy bài viết này hy vọng sẽ giúp bạn với một cấu hình cơ bản ban đầu.


Trước khi chúng ta bắt đầu hãy đảm bảo rằng bạn đã cài đặt MongoDB trên hệ thống của mình. Bài viết có thể áp dụng với các version mongodb từ 3.0.x trở lên.

Cũng lưu ý rằng MongoDB hỗ trợ nhiều hơn một cơ chế xác thực , về cơ bản là các thông số kỹ thuật của quá trình xác thực bằng mật khẩu.

Hãy nhớ rằng xác thực (authn) là quá trình xác minh danh tính của một thực thể, trong khi ủy quyền (authz) liên quan đến việc cấp hoặc từ chối các yêu cầu truy cập cụ thể đối với tài nguyên (ví dụ: database collections).

MongoDB 4.0 loại bỏ khả năng tương thích cho cơ chế xác thực được gọi là MONGODB-CR và thay vào đó sử dụng theo mặc định cả SCRAM-SHA-1 và SCRAM-SHA-256. Sự khác biệt là thuật toán băm được sử dụng trong process. Do SHA-1 bắt đầu bị xem xét là yếu đối với khả năng chống va chạm, SHA-256 hiện được MongoDB hỗ trợ.

Tóm lại, trong MongoDB 3.x, cơ chế authn mặc định là SCRAM-SHA-1, trong khi ở MongoDB 4.0, cả SCRAM-SHA-1 và SCRAM-SHA-256 đều được bật theo mặc định. Bạn có thể sẽ không cần phải lo lắng về điều này, nhưng bạn sẽ phải đảm bảo rằng ứng dụng client bạn đang sử dụng để kết nối với MongoDB hỗ trợ một trong hai cơ chế xác thực được đề cập ở trên.

Bạn có thể tìm hiểu thêm về SCRAM tại đây và về các thay đổi bảo mật trong MongoDB 4.0 tại đây .


Trong hướng dẫn này, chúng ta sẽ tạo 2 User .

  • người đầu tiên sẽ là User quản trị . Nó sẽ có quyền quản lý User trên mọi cơ sở dữ liệu của phiên bản MongoDB và bạn sẽ chỉ sử dụng User này với CLI mongo. Vai trò sẽ được trao cho User này được gọi là userAdminAnyDatabase. Bạn có thể tìm thấy các chi tiết của nó ở đây ;
  • User khác sẽ là chủ sở hữu của một cơ sở dữ liệu và sẽ có các đặc quyền đọc và ghi trên cơ sở dữ liệu. Bạn có thể tạo nhiều User như bạn muốn, để mọi cơ sở dữ liệu sẽ có User riêng. Bạn sẽ sử dụng tài khoản User này trong các ứng dụng của mình để kết nối với cơ sở dữ liệu mà bạn quan tâm. Các chi tiết cho vai trò dbOwner có sẵn ở đây , nhưng điều bạn cần biết là đó là sự kết hợp của các vai trò cho phép tạo các collection và đọc và ghi dữ liệu trong cơ sở dữ liệu.

Lưu ý rằng vai trò của “admin” và khác với vai trò của “owner”. Một database admin có thể thực hiện các hoạt động quản trị trên cơ sở dữ liệu, như tạo một collection mới, xóa nó, xem số liệu thống kê. Một user admin có thể quản lý User cho một cơ sở dữ liệu cụ thể. database owner có tất cả các đặc quyền được liệt kê ở trên, cộng với quyền đọc và ghi đầy đủ trên cơ sở dữ liệu.


Tạo User

Hãy bắt đầu bằng cách tạo User thực tế. Mở mongo shell của bạn và chuyển sang cơ sở dữ liệu admin:

use admin

Tạo user admin (bạn có thể gọi nó là bất cứ thứ gì bạn muốn)

db.createUser({ user: "admin", pwd: "adminpassword", roles: [{ role: "userAdminAnyDatabase", db: "admin" }] })

Có thể bạn thấy câu lệnh có vẻ phức tạp. Chúng ta đang chuyển một đối tượng user đến chức năng creatUser , trong đó có chứa một mảng role của User. Trong mảng chúng ta có một đối tượng role của User, trong đó xác định những gì User có thể làm và trên cơ sở dữ liệu nào.

Trong trường hợp này, chúng ta cung cấp cho User vai trò userAdminAnyDatabase. Điều này có nghĩa là User admin sẽ có thể quản lý (tạo, cập nhật, xóa) User trên tất cả các cơ sở dữ liệu của phiên bản MongoDB.

Đảm bảo bạn sử dụng mật khẩu an toàn cho User admin, tốt nhất là do người quản lý mật khẩu tạo ra.

Bạn có thể kiểm tra xem User đã được tạo chính xác bằng lệnh này chưa:

db.auth("admin", "adminpassword")

Lệnh sẽ đăng nhập bạn dưới dạng admin. Bây giờ thoát khỏi shell:

exit

Bây giờ chúng ta sẽ kích hoạt xác thực trên phiên bản MongoDB, bằng cách sửa đổi file mongod.conf. Nếu bạn đang dùng Linux:

sudo nano /etc/mongod.conf

Thêm các dòng này ở dưới cùng của tệp cấu hình YAML:

security:
    authorization: enabled

Điều này sẽ cho phép xác thực trên cơ sở dữ liệu của bạn. Với nano , lưu với CTRL + X và xác nhận với y.

Bây giờ khởi động lại service mongod (cú pháp Ubuntu).

sudo service mongod restart

Bạn có thể kiểm tra xem service có hoạt động không:

sudo service mongod status

Hãy quay trở lại trong mongo shell. Chuyển sang cơ sở dữ liệu admin và xác thực với User đã tạo trước đó (được gọi là quản trị viên Cameron). Cho rằng User có vai trò của UserAdAdmin, nó sẽ có thể tạo và quản lý những User khác.

use admin
db.auth("admin", "adminpassword")

Bây giờ chúng ta sẽ chuyển sang cơ sở dữ liệu đã được tạo và tạo một User mới dành riêng cho cơ sở dữ liệu.

Lệnh sau sẽ tạo User với role dbOwner trên cơ sở dữ liệu. Các role dbOwner sẽ cung cấp cho User quyền đọc và ghi trên tất cả các collection của cơ sở dữ liệu. Đọc thêm ở đây .

use yourdatabase
db.createUser({ user: "youruser", pwd: "yourpassword", roles: [{ role: "dbOwner", db: "yourdatabase" }] })

Kiểm tra xem mọi thứ đã ổn bằng cách cố gắng xác thực, với db.auth(user, pwd).

db.auth("youruser", "yourpassword")
show collections

Như vậy phiên bản MongoDB của bạn hiện được bảo mật, miễn là bạn đã sử dụng mật khẩu mạnh.

Khi kết nối với server MongoDB yêu thích của bạn từ một ứng dụng, hãy sử dụng chuỗi kết nối sẽ như thế này:

mongodb://youruser:yourpassword@localhost/yourdatabase

Bảo vệ khỏi truy cập bên ngoài

Bây giờ chúng ta sẽ kiểm tra xem phiên bản MongoDB chỉ nghe trên interface loopback. Điều này có nghĩa là DBMS sẽ chỉ chấp nhận kết nối với cơ sở dữ liệu khi chúng đến từ chính máy chủ.

Tất nhiên, bạn có thể điều chỉnh điều này theo nhu cầu của mình, ví dụ bằng cách cho phép truy cập trên giao diện mạng riêng, nhưng điều quan trọng cần hiểu là bạn nên quyết định cẩn thận những interface nào MongoDB nên listen. Do đó, bạn nên tránh để lộ port trên Internet nếu bạn không yêu cầu truy cập nó từ bên ngoài

Vì vậy, hãy mở lại mongod.conf trong chế độ chỉnh sửa, vì chúng ta sẽ kiểm tra tùy chọn net.bindIp. Tùy chọn đó cho biết quá trình mongod mà nó đang listen.

Ví dụ về cấu hình bindIp

net:
    bindIp: 127.0.0.1

Với cấu hình này, MongoDB sẽ chỉ nghe trên 127.0.0.1 ( localhost ). Điều đó có nghĩa là bạn sẽ chỉ có thể kết nối với cơ sở dữ liệu của mình bên trong server.

LƯU Ý : 127.0.0.1 là bind interface mặc định bắt đầu bằng MongoDB 3.6.0.

net: 
    bindIp: 0.0.0.0

Với cấu hình này, MongoDB sẽ listen 0.0.0.0 (tất cả các mạng mạng). Nó có nghĩa là mongod sẽ lắng nghe trên tất cả các interface được cấu hình trên hệ thống của bạn . Hãy chú ý rằng theo cách này, bạn có thể sẽ cho phép mọi người trên Internet truy cập cơ sở dữ liệu của bạn (tất nhiên là họ có thể không có thông tin xác thực, vì vậy, đặc biệt chú ý đến mật khẩu kém).

Bạn cũng có thể làm cho MongoDB nghe trên nhiều interface, bằng cách tách chúng bằng dấu phẩy. Điều này hữu ích nếu bạn muốn làm cho MongoDB nghe trên localhost và interface mạng riêng.

net: 
    bindIp: 127.0.0.1,172,21.200.200

Một giải pháp mà bạn có thể cân nhắc là đặt bindIp tùy chọn 0.0.0.0 và sau đó cấu hình tường lửa (như FireHOL ) để lọc các yêu cầu TCP đến trên cổng MongoDB và chỉ cho phép chúng trên các interface cụ thể.

Kết thúc

Sau khi bạn cấu hình thành công xác thực trên mongodb của bạn, bạn có thể phần nào an tâm hơn về nó. Tất nhiên việc bảo mật cơ sở dữ liệu không chỉ đơn giản như vậy mà bạn phải kết hợp nhiều cách thức khác để bảo vệ cơ sở dữ liệu của bạn an toàn trên internet. Có các bước khác bạn có thể thực hiện để bảo mật cho MongoBD của mình, bao gồm cấu hình của tường lửa và TLS để liên lạc với máy khách-máy chủ. Các chủ đề này được đề cập trong Hướng dẫn bảo mật chính thức .

Nếu bạn có bất kỳ câu hỏi, gợi ý hoặc chỉ muốn nói xin chào, vui lòng để lại nhận xét.

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments