Lưu trữ mongodb

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ế chế độ. Để bảo mật lỗi 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 tôi. Nếu máy chủ của họ 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 người dùng quản trị

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

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

MongoDB shell version v5.0.9
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("6fbbef38-57b2-47c0-a1d0-a253ef7a5842") }
MongoDB server version: 5.0.9
================
Warning: the "mongo" shell has been superseded by "mongosh",
which delivers improved usability and compatibility.The "mongo" shell has been deprecated and will be removed in
an upcoming release.
For installation instructions, see
https://docs.mongodb.com/mongodb-shell/install/
================
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
    https://docs.mongodb.com/
Questions? Try the MongoDB Developer Community Forums
    https://community.mongodb.com
---
The server generated these startup warnings when booting:
        2022-07-12T10:12:03.522+07:00: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine. See http://dochub.mongodb.org/core/prodnotes-filesystem
        2022-07-12T10:12:04.401+07:00: Access control is not enabled for the database. Read and write access to data and configuration is unrestricted
---
---
        Enable MongoDB's free cloud-based monitoring service, which will then receive and display
        metrics about your deployment (disk utilization, CPU, operation statistics, etc).

        The monitoring data will be available on a MongoDB website with a unique URL accessible to you
        and anyone you share the URL with. MongoDB may use this information to make product
        improvements and to suggest MongoDB products and deployment options to you.

        To enable free monitoring, run the following command: db.enableFreeMonitoring()
        To permanently disable this reminder, run the following command: db.disableFreeMonitoring()
---
>

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

Kết quả trả về toàn bộ cơ sở dữ liệu có trên máy chủ của chúng tôi

admin   0.000GB
config  0.000GB
local   0.000GB

In the results on, only the database default new output. 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 "Máy chủ đã tạo các cảnh báo khởi động này khi khởi động. Kiểm soát truy cập không được kích hoạt cho cơ sở dữ liệu. Quyền truy cập đọc và ghi vào dữ liệu và cấu hình không bị hạn chế" như vậy bất kỳ hành động nào liên quan đến đọc, ghi dữ liệu hoặc cấu hình đều sẽ không bị cấm

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

Sau khi đã truy cập MongoDB Shell, hãy thực thi lệnh sau để cấp quyền cho người dùng được gán thông qua vai trò userAdminAnyDatabase. Quản trị viên DB được định nghĩa chỉ là nơi lưu trữ thông tin xác thực

use admin
db.createUser(
    {
        user: "123host",
        pwd: "123hostpassword",
        roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
    }
)

Kết quả trả về

Successfully added user: {
    "user" : "123host",
    "roles" : [
        {
            "role" : "userAdminAnyDatabase",
            "db" : "admin"
        }
    ]
}

Đế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 sử dụng lệnh exit hoặc CTRL+C

Tại thời điểm này, người dùng

use admin
db.createUser(
    {
        user: "123host",
        pwd: "123hostpassword",
        roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
    }
)
8 của họ đã được phép sử dụng thông tin xác thực

To could enable Authentication, chúng ta cần chỉnh sửa tệp

use admin
db.createUser(
    {
        user: "123host",
        pwd: "123hostpassword",
        roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
    }
)
9

Chuyển đến dòng #bảo mật, bỏ nhận xét # và bổ sung

Successfully added user: {
    "user" : "123host",
    "roles" : [
        {
            "role" : "userAdminAnyDatabase",
            "db" : "admin"
        }
    ]
}
0

security:
  authorization: "enabled"

Khởi động lại mongod

Tiến hành truy cập lại shell mongoDB để kiểm tra xem xác thực chưa hoạt động

Kết quả trả về như sau không còn cảnh báo như trước nữa

________số 8_______

Sau khi tiến hành cấu hình bảo mật cho mongoDB process process thực hiện 1 câu truy vấn dữ liệu như sau

Kết quả trả lại như sau

MongoServerError: command listDatabases requires authentication

Như vậy xác thực của chúng ta đã được kích hoạt thành công cho mongdb

Kiểm tra tài khoản quản trị đã tạo trước đó

Execute command after

mongo -u 123host -p --authenticationDatabase admin

Lưu ý. Thay

use admin
db.createUser(
    {
        user: "123host",
        pwd: "123hostpassword",
        roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
    }
)
8 sang tài khoản quản trị mà bạn đã tạo trước đó

Chúng ta sẽ được yêu cầu nhập mật khẩu

MongoDB shell version v5.0.9
Enter password:

Sau khi nhập đúng mật khẩu sẽ có đầu ra như sau

connecting to: mongodb://127.0.0.1:27017/?authSource=admin&compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("f55db66f-711b-4ae8-a0e6-9279ed0e34a3") }
MongoDB server version: 5.0.9
================
Warning: the "mongo" shell has been superseded by "mongosh",
which delivers improved usability and compatibility.The "mongo" shell has been deprecated and will be removed in
an upcoming release.
For installation instructions, see
https://docs.mongodb.com/mongodb-shell/install/
================
>

Từ đây chúng ta có thể thoải mái thực hiện các câu lệnh truy vấn dữ liệu mà không lo gì về xác thực nữa

Kết quả trả lại như sau

admin   0.000GB
config  0.000GB
local   0.000GB

Change port default mongoDB

Cũng giống như bất kỳ cơ sở dữ liệu nào khác, theo mặc định, MongoDB sẽ lắng nghe các kết nối trên một cổng đó là 27017. Chúng ta có thể sử dụng lệnh

Successfully added user: {
    "user" : "123host",
    "roles" : [
        {
            "role" : "userAdminAnyDatabase",
            "db" : "admin"
        }
    ]
}
2 để kiểm tra cuộc tấn công mà MongoDB đang lắng nghe

Chúng ta có thể thấy mongoDB đã lắng nghe cổng 27017

admin   0.000GB
config  0.000GB
local   0.000GB
1

Chúng ta có thể thay đổi cổng mặc định của mongoDB bằng cách tùy chỉnh phần

Successfully added user: {
    "user" : "123host",
    "roles" : [
        {
            "role" : "userAdminAnyDatabase",
            "db" : "admin"
        }
    ]
}
3 trong tệp
Successfully added user: {
    "user" : "123host",
    "roles" : [
        {
            "role" : "userAdminAnyDatabase",
            "db" : "admin"
        }
    ]
}
4

admin   0.000GB
config  0.000GB
local   0.000GB
2

Chúng ta có thể thay đổi sang cổng khác để phù hợp với nhu cầu của cá nhân

Sau khi chúng ta đã thay đổi cổng mặc định của mongoDB, thì chúng ta tiến hành khởi động lại dịch vụ mongoDB

Tiến hành sử dụng lệnh

Successfully added user: {
    "user" : "123host",
    "roles" : [
        {
            "role" : "userAdminAnyDatabase",
            "db" : "admin"
        }
    ]
}
2 để kiểm tra lại cổng mà chúng ta đã tiến hành thay đổi dịch vụ mongoDB

Chúng ta có thể thấy mongoDB đã lắng nghe cổng 21233

admin   0.000GB
config  0.000GB
local   0.000GB
3

Giới hạn IP lắng nghe

MongoDB lien kết với localhost theo mặc định. Đó là một điều tốt mặc định mà chúng ta có thể cần phải thay đổi trừ khi tất cả các máy khách của chúng ta kết nối từ cùng một nút

Tùy chọn sử dụng

Successfully added user: {
    "user" : "123host",
    "roles" : [
        {
            "role" : "userAdminAnyDatabase",
            "db" : "admin"
        }
    ]
}
3 cấu hình để chỉ định địa chỉ IP mà máy khách của chúng ta sẽ sử dụng để kết nối với máy chủ hoặc DNS bằng cách tiến hành tùy chỉnh trong tệp
Successfully added user: {
    "user" : "123host",
    "roles" : [
        {
            "role" : "userAdminAnyDatabase",
            "db" : "admin"
        }
    ]
}
4

admin   0.000GB
config  0.000GB
local   0.000GB
4

Lưu ý. Ứng dụng ngược chiều

Successfully added user: {
    "user" : "123host",
    "roles" : [
        {
            "role" : "userAdminAnyDatabase",
            "db" : "admin"
        }
    ]
}
8 làm IP và tùy chọn
Successfully added user: {
    "user" : "123host",
    "roles" : [
        {
            "role" : "userAdminAnyDatabase",
            "db" : "admin"
        }
    ]
}
9 điều này sẽ khiến máy chủ lắng nghe trên tất cả các IP kết nối

Use Unix domain sockets

Nếu kết nối từ cùng một nút, chúng ta có thể xem xét việc tắt hoàn toàn tính năng nghe cổng TCP và kết nối qua ổ cắm tên miền Unix, trên các hệ thống dựa trên Unix

Chúng ta có thể đặt đường dẫn socket làm IP và điều chỉnh quyền đối với ổ cắm tệp để cho phép kết nối bằng cách tùy chỉnh tệp

Successfully added user: {
    "user" : "123host",
    "roles" : [
        {
            "role" : "userAdminAnyDatabase",
            "db" : "admin"
        }
    ]
}
4

admin   0.000GB
config  0.000GB
local   0.000GB
5

Chúng ta có thể sử dụng lệnh

Successfully added user: {
    "user" : "123host",
    "roles" : [
        {
            "role" : "userAdminAnyDatabase",
            "db" : "admin"
        }
    ]
}
2 để đảm bảo rằng máy chủ MongoDB không lắng nghe bất kỳ cổng nào

admin   0.000GB
config  0.000GB
local   0.000GB
6

Thiết lập Remote Access cho Mongodb

Nếu chúng ta cài đặt Mongodb trên một phiên bản riêng biệt, hoặc do 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 Truy cập từ xa cho Mongodb

UFW setting

Đầu tiên chúng ta cần bật UFW và cài đặt để cho phép một công cụ IP có thể được kết nối với phiên bản chứa Mongodb thông qua cổng 27017

Status status status UFW

Kết quả như sau

Nếu kết quả trả về không hoạt động, chúng ta cần phải kích hoạt lại

Kết quả như sau

admin   0.000GB
config  0.000GB
local   0.000GB
7

Cấu hình lại Public bindIp

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

admin   0.000GB
config  0.000GB
local   0.000GB
8

Bởi vì khách hàng của chúng ta cần phải kết nối với Mongodb thông qua IP công khai, do đó bên ngoài buộc phải nghe Mongodb lắng nghe 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 tệp.

Successfully added user: {
    "user" : "123host",
    "roles" : [
        {
            "role" : "userAdminAnyDatabase",
            "db" : "admin"
        }
    ]
}
4

Find to bindIp đoạn. 127. 0. 0. 1 and add address IP public of them ta

admin   0.000GB
config  0.000GB
local   0.000GB
9

Khởi động lại Mongodb

Check tra Remote Access

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

use admin
db.createUser(
    {
        user: "123host",
        pwd: "123hostpassword",
        roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
    }
)
0

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

use admin
db.createUser(
    {
        user: "123host",
        pwd: "123hostpassword",
        roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
    }
)
1

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

Sử dụng xác thực máy chủ 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 máy khách để xác minh danh tính của máy chủ. Trước hết, 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 khách hàng và chứng chỉ CA mà khách hàng 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à bộ ký tự chứng chỉ cục bộ bằng lệnh

security:
  authorization: "enabled"
3

Tiến hành tạo các ký tự CA bằng cách thực hiện lệnh sau

use admin
db.createUser(
    {
        user: "123host",
        pwd: "123hostpassword",
        roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
    }
)
2

Tiếp tục tạo CSR của máy chủ bằng cách thực hiện lệnh bên dưới

use admin
db.createUser(
    {
        user: "123host",
        pwd: "123hostpassword",
        roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
    }
)
3

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

use admin
db.createUser(
    {
        user: "123host",
        pwd: "123hostpassword",
        roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
    }
)
4

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

use admin
db.createUser(
    {
        user: "123host",
        pwd: "123hostpassword",
        roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
    }
)
5

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 phiên bản TLS cũ và buộc client sử dụng TLS 1. 3, by way config file

Successfully added user: {
    "user" : "123host",
    "roles" : [
        {
            "role" : "userAdminAnyDatabase",
            "db" : "admin"
        }
    ]
}
4 at section
Successfully added user: {
    "user" : "123host",
    "roles" : [
        {
            "role" : "userAdminAnyDatabase",
            "db" : "admin"
        }
    ]
}
3

use admin
db.createUser(
    {
        user: "123host",
        pwd: "123hostpassword",
        roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
    }
)
6

Cho phép truy cập và ghi nhật ký

Để kiểm tra chi tiết là một phần không thể thiếu trong quá trình tăng cường bảo mật của bất kỳ hệ thống nào. MongoDB không cung cấp khả năng ghi nhật ký kiểm tra hợp lệ trong phiên bản mã nguồn mở của nó. Chúng ta có thể bật tính năng ghi nhật ký

Hệ thống ghi nhật ký của MongoDB dựa trên thành phần

  • security:
      authorization: "enabled"
    
    6. to catch the connection
  • security:
      authorization: "enabled"
    
    7. để bắt thông tin xác thực
  • security:
      authorization: "enabled"
    
    8 và
    security:
      authorization: "enabled"
    
    9. to hold the active of mongoDB

Tiến hành kích hoạt trong cấu hình của mongoDB tại

Successfully added user: {
    "user" : "123host",
    "roles" : [
        {
            "role" : "userAdminAnyDatabase",
            "db" : "admin"
        }
    ]
}
4 tại phần
MongoDB shell version v5.0.9
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("cbc36865-5378-42cf-9ee0-1d8499dd96fc") }
MongoDB server version: 5.0.9
================
Warning: the "mongo" shell has been superseded by "mongosh",
which delivers improved usability and compatibility.The "mongo" shell has been deprecated and will be removed in
an upcoming release.
For installation instructions, see
https://docs.mongodb.com/mongodb-shell/install/
================
>
1

use admin
db.createUser(
    {
        user: "123host",
        pwd: "123hostpassword",
        roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
    }
)
7

Lời Kết

Bằng cách hoàn thành hướng dẫn này, chúng tôi đã thiết lập một người dùng MongoDB quản trị mà chúng tôi có thể sử dụng để tạo và sửa đổi người dùng và vai trò trò chơi mới, cũng như quản lý phiên bản MongoDB. Chúng ta cũng đã định cấu hình phiên bản MongoDB để yêu cầu xác thực người dùng bằng tên người dùng và mật khẩu hợp lệ trước khi họ có thể tương tác với bất kỳ dữ liệu nào