Thứ sáu, 24/02/2017 | 00:00 GMT+7

How to Install and Secure MongoDB on Ubuntu 16.04


Giới thiệu

MongoDB là một database hướng tài liệu, miễn phí và mã nguồn mở. Nó được phân loại là database NoSQL vì nó không dựa trên cấu trúc database 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. Không giống như database quan hệ, MongoDB không yêu cầu lược đồ xác định trước trước khi bạn thêm dữ liệu vào database. Bạn có thể thay đổi lược đồ bất kỳ lúc nào và thường xuyên khi cần thiết mà không cần phải thiết lập một database mới với một lược đồ được cập nhật.

Trong Phần một của hướng dẫn này, ta sẽ sử dụng Repository MongoDB để cài đặt version MongoDB mới nhất. Trong Phần hai, ta sẽ bật xác thực để bảo mật nó trên hệ thống local. Cuối cùng, trong Phần ba, ta sẽ chỉ ra cách cho phép các kết nối từ xa an toàn hơn nếu chúng cần.

Điều kiện yêu cầu

Để làm theo hướng dẫn này, bạn cần:

Khi điều này được thực hiện, bạn đã sẵn sàng để làm theo.

Phần một: Thiết lập server

Bước 1 - Thêm Repository MongoDB

MongoDB đã có trong kho gói Ubuntu, nhưng kho MongoDB chính thức cung cấp version cập nhật nhất và là cách cài đặt phần mềm được khuyến nghị. Trong bước này, ta sẽ thêm repository chính thức này vào server .

Ubuntu đảm bảo tính xác thực của các gói phần mềm bằng cách xác minh chúng được ký bằng các khóa GPG, vì vậy trước tiên ta phải nhập khóa cho repository MongoDB chính thức.

  • sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6

Kết quả sau xác nhận ta đã nhập khóa thành công:

Kết quả
Executing: /tmp/tmp.IdwenTia0s/gpg.1.sh --keyserver
hkp://keyserver.ubuntu.com:80
--recv
0C49F3730359A14518585931BC711F9BA15703C6
gpg: requesting key A15703C6 from hkp server keyserver.ubuntu.com
gpg: key A15703C6: public key "MongoDB 3.4 Release Signing Key <packaging@mongodb.com>" imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)

Tiếp theo, ta sẽ thêm chi tiết repository MongoDB để apt sẽ biết nơi tải các gói. Đưa ra lệnh sau để tạo file danh sách cho MongoDB.

  • echo "deb [ arch=amd64,arm64 ] http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list

Cuối cùng, ta sẽ cập nhật danh sách gói.

  • sudo apt-get update

Bây giờ ta đã sẵn sàng cài đặt MongoDB.

Bước 2 - Cài đặt MongoDB

Ta sẽ cài đặt gói meta mongodb-org , bao gồm daemon, cấu hình và tập lệnh init, shell và công cụ quản lý trên server.

  • sudo apt-get install mongodb-org

Nhấn enter hoặc gõ Y để tiếp tục khi được yêu cầu. Khi quá trình cài đặt hoàn tất, ta sẽ khởi động daemon Mongo:

  • sudo systemctl start mongod

systemctl không cung cấp kết quả, ta sẽ kiểm tra trạng thái để xác minh dịch vụ đã bắt đầu đúng cách.

  • sudo systemctl status mongod
Kết quả
● mongod.service - High-performance, schema-free document-oriented database
   Loaded: loaded (/lib/systemd/system/mongod.service; disabled; vendor preset: enabled)
   Active: active (running) since Fri 2017-02-17 18:57:26 UTC; 17min ago
     Docs: https://docs.mongodb.org/manual
 Main PID: 2811 (mongod)
    Tasks: 17
   Memory: 56.8M
      CPU: 7.294s
   CGroup: /system.slice/mongod.service
           └─2811 /usr/bin/mongod --quiet --config /etc/mongod.conf

Nhấn q để thoát. Bây giờ ta đã khởi động daemon theo cách thủ công và xác minh nó đang chạy, ta sẽ đảm bảo nó tự động khởi động lại khi khởi động:

  • sudo systemctl enable mongod

Kết quả sau xác nhận lệnh đã thành công:

Output
Created symlink from /etc/systemd/system/multi-user.target.wants/mongod.service
to /lib/systemd/system/mongod.service.

Tiếp theo, ta sẽ thực hiện các bước cần thiết để bảo mật database của bạn.

Phần hai: Bảo mật MongoDB

Các version trước đó của MongoDB dễ bị khai thác tự động vì theo mặc định không cần xác thực để tương tác với database. Bất kỳ user nào cũng có thể tạo và phá hủy database, cũng như đọc và ghi vào nội dung của chúng theo mặc định. Điều này là phức tạp vì các version trước đó cũng cấu hình daemon MongoDB để lắng nghe trên tất cả các giao diện theo mặc định, có nghĩa là các tập lệnh tự động có thể phát hiện các version MongoDB không được bảo vệ bởi firewall và nếu xác thực chưa được bật, có quyền truy cập đầy đủ sang MongoDB.

Tình trạng này đã được giảm thiểu trong bản phát hành 3.x cũng như các version trước đó do một số trình quản lý gói cung cấp bởi vì daemon bây giờ bị ràng buộc với 127.0.0.1 nên nó sẽ chỉ chấp nhận các kết nối trên Unix socket. Nó không tự động mở ra Internet.

Tuy nhiên, xác thực vẫn bị tắt theo mặc định, vì vậy bất kỳ user nào trên hệ thống local đều có quyền truy cập đầy đủ vào database. Để bảo mật điều này, ta sẽ tạo một user quản trị, bật xác thực và kiểm tra.

Bước 1 - Thêm user quản trị

Để thêm user , ta sẽ kết nối với Mongo shell:

  • mongo

Kết quả kết quả khi ta sử dụng Mongo shell cảnh báo ta rằng kiểm soát truy cập không được kích hoạt cho database và quyền truy cập đọc / ghi dữ liệu và cấu hình không bị hạn chế.

Output
MongoDB shell version v3.4.2
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.2
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
        http://docs.mongodb.org/
Questions? Try the support group
        http://groups.google.com/group/mongodb-user
Server has startup warnings:
2017-02-21T19:10:42.446+0000 I STORAGE  [initandlisten]
2017-02-21T19:10:42.446+0000 I STORAGE  [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2017-02-21T19:10:42.446+0000 I STORAGE  [initandlisten] **          See http://dochub.mongodb.org/core/prodnotes-filesystem
2017-02-21T19:10:42.534+0000 I CONTROL  [initandlisten]
2017-02-21T19:10:42.534+0000 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
2017-02-21T19:10:42.534+0000 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
2017-02-21T19:10:42.534+0000 I CONTROL  [initandlisten]
>

Ta có thể tự do chọn tên cho user quản trị vì cấp quyền đến từ việc gán role người userAdminAnyDatabase . Database, admin chỉ định nơi lưu trữ thông tin đăng nhập. Bạn có thể tìm hiểu thêm về xác thực trong phần Xác thực bảo mật MongoDB.

Đặt tên user mà bạn chọn và đảm bảo chọn password an toàn của riêng bạn và thay thế chúng trong lệnh dưới đây:

  • use admin
  • db.createUser(
  • {
  • user: "AdminSammy",
  • pwd: "AdminSammy'sSecurePassword",
  • roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
  • }
  • )

Khi ta phát hành lệnh db.createUser , shell sẽ thêm ba dấu chấm trước mỗi dòng cho đến khi lệnh hoàn tất. Sau đó, ta sẽ nhận được phản hồi như sau khi user đã được thêm vào.

Output
> use admin
switched to db admin
> db.createUser(
...   {
...     user: "AdminSammy",
...     pwd: "AdminSammy'sSecurePassword",
...     roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
...   }
... )
Successfully added user: {
        "user" : "AdminSammy",
        "roles" : [
                {
                        "role" : "userAdminAnyDatabase",
                        "db" : "admin"
                }
        ]
}

Nhập 'thoát' và nhấn ENTER hoặc sử dụng CTRL+C để thoát khỏi ứng dụng client.

Tại thời điểm này, user sẽ được phép nhập thông tin đăng nhập, nhưng họ sẽ không bắt buộc phải làm như vậy cho đến khi ta kích hoạt xác thực và khởi động lại daemon MongoDB.

Bước 2 - Bật xác thực

Xác thực được bật trong file mongod.conf . Sau khi ta kích hoạt nó và khởi động lại mongod , user vẫn có thể kết nối với Mongo mà không cần xác thực, nhưng họ sẽ được yêu cầu cung cấp tên user và password trước khi có thể tương tác.

Hãy mở file cấu hình:

  • sudo nano /etc/mongod.conf

Trong phần #security , ta sẽ xóa hash trước security để kích hoạt stanza. Sau đó, ta sẽ thêm cài đặt ủy quyền. Khi ta hoàn thành, các dòng sẽ giống như đoạn trích dưới đây:

mongodb.conf
 . . .
security:
  authorization: "enabled"
 . . . 

Lưu ý rằng dòng "bảo mật" không có dấu cách ở đầu và dòng "ủy quyền" phải được thụt lề với hai dấu cách

Khi ta đã lưu và thoát file, ta sẽ khởi động lại daemon:

  • sudo systemctl restart mongod

Nếu ta đã mắc lỗi trong cấu hình, dameon sẽ không khởi động. Vì systemctl không cung cấp kết quả, ta sẽ sử dụng tùy chọn status của nó đảm bảo nó đã làm:.

  • sudo systemctl status mongod

Nếu ta thấy Active: active (running) trong kết quả và nó kết thúc bằng một cái gì đó giống như văn bản bên dưới, ta có thể chắc chắn rằng lệnh restart đã thành công:

Output
Jan 23 19:15:42 MongoHost systemd[1]: Started High-performance, schema-free document-oriented database.

Đã xác minh xong daemon, hãy kiểm tra xác thực.

Bước 3 - Xác minh User chưa được xác thực bị Hạn chế

Trước tiên, hãy kết nối mà không cần thông tin đăng nhập để xác minh các hành động bị hạn chế:

  • mongo

Bây giờ ta đã bật xác thực, tất cả các cảnh báo trước đó đã được giải quyết.

Output
MongoDB shell version v3.4.2
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.2

Ta đã kết nối với database test . Ta sẽ kiểm tra xem quyền truy cập bị hạn chế bằng lệnh show dbs :

  • show dbs
Output
2017-02-21T19:20:42.919+0000 E QUERY    [thread1] Error: listDatabases failed:{
        "ok" : 0,
        "errmsg" : "not authorized on admin to execute command { listDatabases: 1.0 }",
        "code" : 13,
        "codeName" : "Unauthorized"
 . . . 

Ta sẽ không thể tạo user hoặc các tác vụ có quyền tương tự nếu không xác thực.

Hãy thoát khỏi shell để tiếp tục:

  • exit

Tiếp theo, ta sẽ đảm bảo user Quản trị không có quyền truy cập.

Bước 4 - Xác minh Quyền truy cập của User Quản trị

Ta sẽ kết nối với quyền là quản trị viên của bạn với tùy chọn -u để cung cấp tên user và -p để được yêu cầu nhập password. Ta cũng cần cung cấp database nơi ta đã lưu trữ thông tin xác thực của user với tùy chọn --authenticationDatabase .

  • mongo -u AdminSammy -p --authenticationDatabase admin

Ta sẽ được yêu cầu nhập password, vì vậy hãy cung cấp password. Khi ta nhập đúng password, ta sẽ được đưa vào shell, nơi ta có thể đưa ra lệnh show dbs :

Output
MongoDB shell version v3.4.2
Enter password:
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.2

>

Thay vì bị từ chối truy cập, ta nên xem các database có sẵn:

  • show dbs
Output
admin  0.000GB
local  0.000GB

Nhập exit hoặc nhấn CTRL+C để thoát.

Xem tài liệu MongoDB để tìm hiểu thêm về Xác thực , Kiểm soát truy cập dựa trên role cũng như User và Role .

Phần ba: Cấu hình truy cập từ xa (Tùy chọn)

Trước khi ta bắt đầu làm việc với một cài đặt cho phép kết nối từ xa, lý tưởng nhất là ta sẽ có MongoDB đằng sau firewall bên ngoài, được bảo vệ bởi mạng riêng ảo (VPN) hoặc bị hạn chế thông qua server pháo đài. Tuy nhiên, khi ta làm việc hướng tới điều đó, ta có thể thực hiện bước ít phức tạp hơn là bật firewall trên server database và hạn chế quyền truy cập vào server cụ thể hoặc server cần nó.

Bước 1 - Bật UFW

Trong Điều kiện tiên quyết trong Thiết lập server ban đầu với Ubuntu 16.04 , ta đã bật UFW và chỉ cho phép các kết nối SSH. Trước khi ta mở một cổng cho client của bạn, hãy xác minh trạng thái của UFW:

  • sudo ufw status

Lưu ý: Nếu kết quả cho biết firewall inactive , hãy kích hoạt nó bằng:

  • sudo ufw enable

Sau khi nó được kích hoạt, hãy chạy lại lệnh trạng thái, trạng thái sudo ufw status sẽ hiển thị các luật. Nếu cần, hãy đảm bảo cho phép SSH.

  • sudo ufw allow OpenSSH

 

Trừ khi ta thực hiện các thay đổi đối với các điều kiện yêu cầu, kết quả sẽ cho thấy chỉ OpenSSH được phép:

Output
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

Tiếp theo, ta sẽ cho phép truy cập vào cổng MongoDB mặc định, 27017, nhưng hạn chế quyền truy cập đó vào một server cụ thể. Nếu bạn đã thay đổi cổng mặc định, hãy nhớ cập nhật cổng đó trong lệnh bên dưới.

  • sudo ufw allow from client_ip_address to any port 27017

Chạy lại lệnh này bằng địa chỉ IP cho từng client bổ sung cần quyền truy cập. Để kiểm tra kỹ luật, ta sẽ chạy lại ufw status :

  • sudo ufw status
Output
To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
27017                       ALLOW      client_ip_address
OpenSSH (v6)               ALLOW       Anywhere (v6)

Lưu ý: Nếu bạn chưa quen với UFW, bạn có thể tìm hiểu thêm trong hướng dẫn, UFW Essentials: Common Firewall Rules and Commands .

Với luật firewall này, ta đã sẵn sàng cấu hình MongoDB để lắng nghe trên giao diện công khai của nó.

Bước 2 - Cấu hình một bindIP công khai

Để cho phép các kết nối từ xa, ta sẽ thêm địa chỉ IP có thể định tuyến công khai của server vào file mongod.conf .

  • sudo nano /etc/mongod.conf

Trong net đoạn thơ, thêm MongoHost IP s' đến bindIp dòng:

Trích của /etc/mongod.conf
 . . .
net:
  port: 27017
  bindIp: 127.0.0.1,IP_of_MongoHost
 . . .

Ta sẽ lưu và thoát file, sau đó khởi động lại daemon:

  • sudo systemctl restart mongod

Như ta đã làm trước đó, ta sẽ xác nhận khởi động lại thành công:

  • sudo systemctl status mongod

Kết quả phải chứa Active: active (running) và ta có thể tiến hành thử nghiệm cuối cùng của bạn. Mongo hiện đang nghe trên cổng mặc định của nó.

Bước 3 - Kiểm tra kết nối từ xa

Ta sẽ kiểm tra xem Mongo đang lắng nghe trên giao diện công khai của nó bằng cách thêm cờ --host với địa chỉ IP từ file mongodb.conf .

  • mongo -u AdminSammy -p --authenticationDatabase admin --host IP_address_of_MongoHost
MongoDB shell version v3.4.2
Enter password:
connecting to: mongodb://107.170.233.82:27017/
MongoDB server version: 3.4.2

Tiếp cận dấu nhắc xác nhận daemon đang lắng nghe trên IP công cộng của nó. Tại thời điểm này, bất kỳ giao dịch nào giữa kết nối từ xa và server MongoDB đều không được mã hóa, vì vậy bước tiếp theo, trước khi kiểm tra firewall, nên bảo mật các quá trình chuyển đổi đó. Để được trợ giúp về việc này, hãy xem tài liệu Bảo mật của MongoDB về Mã hóa Truyền tải .

Kết luận

Trong hướng dẫn này, ta đã thêm repository MongoDB vào danh sách gói của bạn để cài đặt version MongoDB mới nhất có sẵn, thêm user quản trị và kích hoạt xác thực.

Ta cũng đã chỉ ra cách cấu hình MongoDB để chấp nhận các kết nối từ xa nhưng ngăn quảng cáo cài đặt MongoDB bằng cách cấu hình firewall của server để chỉ cho phép các kết nối từ các server yêu cầu quyền truy cập.

Bước tiếp theo:



Các tin trước

Cài đặt MySQL trên CentOS 7 2016-12-01

Cài đặt MySQL trên Ubuntu 16.04 2016-11-23

Cài đặt Node.js Application for Production trên Ubuntu 16.04 2016-11-01

Cài đặt Nginx Server Blocks (Virtual Hosts) trên Ubuntu 16.04 2016-05-19

Cài đặt OpenVPN Server trên Ubuntu 16.04 2016-05-04

Cài đặt JAVA với Apt-Get trên Ubuntu 16.04 2016-04-23

Cài đặt Linux, Apache, MySQL, PHP (LAMP) trên Ubuntu 16.04 2016-04-21

Cài đặt đăng nhập với ssh và key authentication trên Ubuntu 16.4 2016-04-21

Sử dụng UFW căn bản, các luật firewall phổ biến 2015-08-20

Nâng cấp lên Mysql 5.7 2015-04-20