Cài đặt và bảo mật MongoDB trên Ubuntu 16.04
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
- Một server Ubuntu 16.04 với một non-root
sudo
user cùng một firewall đã được cấu hình cơ bản theo bài viết Thiết lập ban đầu cho server dùng Ubuntu 16.04
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
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
● 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.
. . .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
. . .
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.