Hiển thị người dùng mongodb

Một phân vùng 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 chính thức MongoDB 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 có một cấu hình cơ bản ban đầu


Trước khi chúng ta bắt đầu, hãy chắc chắn 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 phiên bản 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ông cụ có thể đối với tài nguyên (ví dụ. bộ sưu tập cơ sở dữ liệu)

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 quá trình. Do SHA-1 bắt đầu được xem xét là yếu tố có khả năng chống va chạm, SHA-256 hiện được MongoDB hỗ trợ

Tóm tắt, trong MongoDB 3. x, cơ chế xác thực mặc định là SCRAM-SHA-1, trong khi ở MongoDB 4. 0, both SCRAM-SHA-1 and SCRAM-SHA-256 đều được bật theo mặc định. Bạn có thể không cần phải lắng nghe về điều này, nhưng bạn phải đảm bảo rằng ứng dụng khách 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 tôi sẽ tạo ra 2 Người dùng

  • người đầu tiên sẽ là người dùng quản trị. Nó sẽ có quyền quản lý Người dùng trên mọi cơ sở dữ liệu của phiên bản MongoDB và bạn sẽ chỉ sử dụng Người dùng này với CLI mongo. Vai trò sẽ được trao cho Người dùng này được gọi là userAdminAnyDatabase. Bạn có thể tìm thấy các thông tin chi tiết của nó;
  • Người dùng 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 Người dùng như bạn muốn, để mọi cơ sở dữ liệu sẽ có Người dùng riêng. Bạn sẽ sử dụng tài khoản Người dùng 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, nhưng điều bạn cần biết là sự kết hợp của các vai trò cho phép tạo bộ sưu tập 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 “chủ sở hữu”. Một

db.createUser({ user: "admin", pwd: "adminpassword", roles: [{ role: "userAdminAnyDatabase", db: "admin" }] })
5 có thể thực hiện các hoạt động quản trị trên cơ sở dữ liệu, chẳng hạn như tạo một bộ sưu tập mới, xóa nó, xem số liệu thống kê. Một
db.createUser({ user: "admin", pwd: "adminpassword", roles: [{ role: "userAdminAnyDatabase", db: "admin" }] })
6 có thể quản lý Người dùng cho một công cụ cơ sở dữ liệu.
db.createUser({ user: "admin", pwd: "adminpassword", roles: [{ role: "userAdminAnyDatabase", db: "admin" }] })
7 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


Nội dung chính

Tạo người dùng

Please started by how to create Người dùng thực tế. Open 

db.createUser({ user: "admin", pwd: "adminpassword", roles: [{ role: "userAdminAnyDatabase", db: "admin" }] })
8 shell của bạn và chuyển sang cơ sở dữ liệu 
db.createUser({ user: "admin", pwd: "adminpassword", roles: [{ role: "userAdminAnyDatabase", db: "admin" }] })
9

use admin

Tạo người dùng

db.createUser({ user: "admin", pwd: "adminpassword", roles: [{ role: "userAdminAnyDatabase", db: "admin" }] })
9 (bạn có thể gọi nó là bất cứ điều gì bạn muốn)

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

You can you see the command has a complex. Chúng ta đang chuyển một đối tượng

db.auth("admin", "adminpassword")
1 đến chức năng creatUser , trong đó có chứa một mảng
db.auth("admin", "adminpassword")
2 của User. Trong mảng chúng ta có một đối tượng
db.auth("admin", "adminpassword")
2 của Người dùng, trong đó xác định những gì Người dùng có thể làm và trên cơ sở dữ liệu nào

Trong trường hợp này, chúng tôi cung cấp cho Người dùng vai trò 

db.auth("admin", "adminpassword")
4. Điều này có nghĩa là Người dùng
db.createUser({ user: "admin", pwd: "adminpassword", roles: [{ role: "userAdminAnyDatabase", db: "admin" }] })
9 sẽ có thể quản lý (tạo, cập nhật, xóa) Người dùng trên tất cả các cơ sở dữ liệu của phiên bản MongoDB

Bảo đảm bạn sử dụng mật khẩu an toàn cho Người dùng 

db.createUser({ user: "admin", pwd: "adminpassword", roles: [{ role: "userAdminAnyDatabase", db: "admin" }] })
9, điều 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 Người dùng đã được tạo chính xác bằng lệnh này chưa

________số 8_______

Lệnh sẽ đăng nhập bạn theo định dạng 

db.createUser({ user: "admin", pwd: "adminpassword", roles: [{ role: "userAdminAnyDatabase", db: "admin" }] })
9. Now exit from 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 tệp 

db.auth("admin", "adminpassword")
8. Nếu bạn đang sử dụng Linux

sudo nano /etc/mongod.conf

Thêm các dòng này vào bên 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 bằng CTRL + X và xác nhận với 

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

Bây giờ khởi động lại dịch vụ mongod (cu pháp Ubuntu)

sudo service mongod restart

Bạn có thể kiểm tra xem dịch vụ có hoạt động không

sudo service mongod status

Please quay trở lại trong 

db.createUser({ user: "admin", pwd: "adminpassword", roles: [{ role: "userAdminAnyDatabase", db: "admin" }] })
8 shell. Chuyển sang cơ sở dữ liệu 
db.createUser({ user: "admin", pwd: "adminpassword", roles: [{ role: "userAdminAnyDatabase", db: "admin" }] })
9 và xác thực với người dùng đã tạo trước đó (được gọi là quản trị viên Cameron). Cho rằng Người dùng có vai trò trò chơi của UserAdAdmin, nó sẽ có thể tạo và quản lý những Người dùng 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 người dùng mới dành riêng cho cơ sở dữ liệu

Lệnh sau sẽ tạo Người dùng với vai trò

exit
2 trên cơ sở dữ liệu. Vai trò 
exit
2 sẽ cấp cho Người dùng quyền đọc và ghi trên tất cả các bộ sưu tập của cơ sở dữ liệu. Đọc thêm

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 

exit
4

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

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

Khi kết nối với máy chủ 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

db.createUser({ user: "admin", pwd: "adminpassword", roles: [{ role: "userAdminAnyDatabase", db: "admin" }] })
1 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 giao diện 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ừ máy chủ chính

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ụ như 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 giao diện MongoDB nào nên lắng nghe. Do đó, bạn nên tránh lộ cổng 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 

db.auth("admin", "adminpassword")
8 trong chế độ chỉnh sửa, vì chúng ta sẽ kiểm tra tùy chọn 
exit
6. Tùy chọn mà cho biết quá trình mongod mà nó đang lắng nghe

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

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

Với cấu hình này, MongoDB sẽ chỉ nghe trên 127. 0. 0. 1 ( máy chủ cục bộ ). Đ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 máy chủ

LƯU Ý. 127. 0. 0. 1 is bind interface default started by MongoDB 3. 6. 0

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

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

Bạn có thể làm cho MongoDB nghe trên nhiều giao diện, 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 máy chủ cục bộ và giao diện mạng riêng

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

Một giải pháp mà bạn có thể cân nhắc là đặt 

exit
7 tùy chọn 
exit
8 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 công cụ giao diện có thể

end

Sau khi bạn cấu hình thành công xác thực trên mongodb của mình, 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 theo nhiều cách thức khác nhau để bảo vệ cơ sở dữ liệu của bạn một cách an toàn trên internet. Có những 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