Cài đặt và bảo mật MongoDB trên Ubuntu 16.04

2 năm trước

 

MongoDB là một cơ sở dữ liệu hướng tài liệu (document-oriented database) miễn phí mã nguồn mở. Nó được coi là một "NoSQL"database vì không được xây dựng trên một cấu trúc cơ sở dữ liệu quan hệ dựa trên bảng truyền thống mà sử dụng các tài liệu JSON với schema( giản đồ) động. Khác với MySQL, MongoDB không đòi hỏi một schema định sẵn trước khi bạn thêm dữ liệu vào database. Bạn có thể thay đổi schema bất cứ lúc nào cần thiết mà không cần phải thiết lập một database mới với một schema được cập nhật.

Bài viết này gồm 3 phần:

  • Phần 1: Cài đặt MongoDB.
  • Phần 2: Thiết lập cơ chế bảo mật cho MongoDB.
  • Phần 3: Cấu hình Remote Access để chỉ cho phép những kết nối cần thiết.

Yêu cầu

 

Phần 1: Cài đặt trên Server

 

Bước 1 — Thêm vào MongoDB Repository

MongoDB nằm trong kho package mặc định của Ubuntu, nhưng nguồn chính thức MongoDB cung cấp phiên bản chính thức mới nhất của nó, nên ta sẽ thêm kho ứng dụng này vào server và cài đặt MongoDB qua nó.

Import key của kho ứng dụng:

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

 

Output
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 " imported
gpg: Total number processed: 1
gpg: imported: 1 (RSA: 1)

Thêm vào các miêu tả cho nó để apt biết nơi tải về ứng dụng. Dùng lệnh sau để tạo ra một danh sách file 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 

 

Update local package index để cập nhật các package mới nhất.

sudo apt-get update 

 

Đến đây ta đã sẵn sàng để cài MongoDB.

 

Bước 2 — Cài MongoDB

Cài meta-package mongodb-org  chứa các daemon, các đoạn mã cấu hình, công cụ quản lí cùng nhiều thành phần khác của MongoDB bằng lệnh:

sudo apt-get install mongodb-org 

 

Gõ Y để tiếp tục. 

Khi cài đặt hoàn tất, khởi động Mongo daemon:

sudo systemctl start mongod 

 

Vì systemctl không hiển thị output ra màn hình, ta sẽ kiểm tra lại bằng cách check status của Mongo daemon với lệnh:

sudo systemctl status mongod 

 

Output
● 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

Bấm q để thoát. 
 

Cấu hình Mongo daemon để khởi động cùng hệ thống:

sudo systemctl enable mongod 

 

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

Nếu output hiển thị như trên. bạn đã cài thành công MongoDB trên server của mình. Bước tiếp theo là bảo mật cho nó.

 

Bước 2: Bảo mật MongoDB

 

Những phiên bản cũ của MongoDB rất dễ bị tấn công do không có cơ chế xác thực mặc định nào được yêu cầu để truy cập vào database. Tất cả user có thể khởi tạo và phá hủy, cũng như đọc và ghi dữ liệu vào database mà không gặp bất cứ trở ngại nào.

Mặc dù đã có vài điều chỉnh trên những phiên bản 3.x để vá lỗi, tuy nhiên vẫn chưa đảm bảo được sự bảo mật cho hệ thống. Ta cần tạo ra một admin user và kích hoạt xác thực bảo mật để khắc phục những lỗ hổng trên.

 

Bước 1 — Thêm Admin User

Kết nối tới Mongo Shell:

mongo

 


Ouput sẽ cảnh báo ta rằng việc điều khiển truy cập chưa được kích hoạt, và quyền đọc/ghi trên các file cấu hình và dữ liệu chưa được kiểm soát.

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]
>
 

Chọn một tên tùy ý cho admin user của bạn và một mật khẩu đủ mạnh. (thay thế giá trị cảu bạn vào phần chữ đỏ)

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

 

  •  

Khi gọi đến lệnh db.createUser , hệ thống sẽ xử lí và phản hồi lại như sau:

Outputuse 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"
}]
}
 

Gõ "exit" rồi ENTER hoặc tổ hợp phím CTRL+C để thoát.

Đến đây user của ta đã có thể nhập vào các lệnh, ta sẽ thêm vào xác thực bảo mật sau đó khởi động lại MongoDB.

 

Bước 2 — Kích hoạt Xác nhận Bảo mật

Mở file cấu hình mongod.conf để kích hoạt xác nhận bảo mật.

sudo nano /etc/mongod.conf 

 

Trong mục #security , xóa dấu "#" phía trước security và thêm vào một dòng cấu hình như bên dưới.

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

Note that the “security” line has no spaces at the beginning, and the “ line must be indented with two spaces

Chú ý rằng dòng "security" không chứa dấu cách ở đầu dòng và "authorization” phải bắt đầu bằng 2 dấu cách.

Sau khi lưu file, khởi động lại MongoDB:

sudo systemctl restart mongod

 

Check lại status xem quá trình cấu hình đã thành công chưa:

sudo systemctl status mongod

 

Nếu thấy Active: active (running) xuất hiện cùng một dòng kí tự như sau thì quá trình cấu hình đã thành công.

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

Bước 3 — Kiểm tra xem những User không được cấp quyền đã bị cấm truy cập chưa.

Nhập lệnh sau với quyền của user thường( không có sudo trước lệnh):

mongo 

 

Tất cả các cảnh báo ở trên đã được xóa b

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

 Thử xem user đã bị cấm truy cập chưa bằng lệnh show dbs

show dbs 
 
OutputMongoDB shell version v3.4.2 
connecting to: mongodb://127.0.0.1:27017 
MongoDB server version: 3.4.2
 

Ta sẽ không thể tạo user hay thực hiện các kệnh thông thường mà không xác nhận bảo mật.
 

Thoát.

exit 

 

 

Bước 4 — Kiểm tra truy cập từ Administrative User.

We'll connect as our administrator with the -u option to supply a username and -p to be prompted for a password. We will also need to supply the database where we stored the user's authentication credentials with the --authenticationDatabase option.

Kết nối bằng administrative user với tùy chọn -u cho username, -p cho mật khẩu tương ứng, cùng với  --authenticationDatabase cho database nơi lưu những thủ tục bảo mật

mongo -u AdminSammy -p --authenticationDatabase admin

 


Kết quả như sau:

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

Nhập vào mật khẩu khi đưuọc yêu cầu rồi gõ lệnh show dbs

show dbs 

 

Outputadmin 0.000GB local 0.000GB
 
 

Gõ exit hoặc dùng CTRL+C để thoát..

 

Phần 3: Cấu hình Remote Access Remote Access (Optional)

Giả sử trước khi bắt đầu, MongoDB đã được bảo vệ bởi một tường lửa, bởi một VPN hoặc đã được cấu hình để hạn chế truy cập bằng một bastion host, khi đó ta sẽ có những bước cài đặt đơn giản hơn.

 

Bước 1 — Kích hoạt UFW

Trong Thiết lập ban đầu cho server dùng Ubuntu 16.04 , ta đã cấu hình UFW để chỉ cho phép truy cập SSH. Trước khi thêm vào một cổng để kết nối vói terminal, kiểm tra lại status của UFW:

sudo ufw status

 

Note: Nếu UFW ở chế độ inactive, kích hoạt nó với:

sudo ufw enable
 

Sau đó khi nhập lại lệnh, sudo ufw status sẽ được hiển thị. Nếu cần thiết hãy chắc chắn đã cho phép SSH với lệnh

sudo ufw allow OpenSSH

Ta sẽ thấy SSH được kích hoạt:

Output:
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
 

Next, we'll allow access to the default MongoDB port, 27017, but restrict that access to a specific host. If you've changed the default port, be sure to update it in the command below.

Tiếp theo ta sẽ cho phép kết nối tới cổng mặc đingh cảu Mongo, 27017 và cấm truy cập đó đến một host cụ thể. Nếu bạn đã thay đổi cổng mặc định của Mongo, set lại về giá trị ban đầu với: 

sudo ufw allow from client_ip_address to any port 27017

 

Chạy ufw status một lần nữa:

sudo ufw status 

 

Output
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
27017 ALLOW client_ip_addressOpenSSH (v6) ALLOW Anywhere (v6)

Tiếp theo ta sẽ cấu hình cho Mongo nghe trên giao diện public của nó.

 

Bước 2 — Cấu hình một Public bindIP

Để cho phép remote control, mở file mongod.conf với nano:

sudo nano /etc/mongod.conf 

 

Trong mục net ,thêm địa chỉ IP của MongoHost  vào dòng bindIp

Excerpt of /etc/mongod.conf
 . . .
net:
port: 27017
bindIp: 127.0.0.1,IP_of_MongoHost . . .

Lưu và thoát, xong đó khởi động lại Mongo

sudo systemctl restart mongod 

 

Kiểm tra lại quá trình Restart với :

sudo systemctl status mongod 

 

Nếu output đoạn Active: active (running), thì Mongo đã đang nghe trên công mặc định của nó.

 

Bước 3 — Test Remote Access

Đàu tiên, thêm cờ --host vào địa chỉ IP trong file mongodb.conf.

mongo -u AdminSammy -p --authenticationDatabase admin --host IP_address_of_MongoHost

 

Nếu output gần giống với:

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

thì quá trình cấu hình đã thành công.

Tổng kết

Sau khi hoàn thành bài viết này, bạn đã biết cách cài đặt và cáu hình cơ bản cho MongoDB. Hãy truy cập vào ViCloud Community để theo dõi những bài viết mới nhất.