Cách cài đặt và bảo mật MongoDB trên Ubuntu 16.04
MongoDB là một database hướng tài liệu, miễn phí và open-souce . Nó được gọ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 schemas động. Không giống như database quan hệ, MongoDB không yêu cầu schemas xác định trước trước khi bạn thêm dữ liệu vào database . Bạn có thể thay đổi schemas bất kỳ lúc nào và thường xuyên khi cần thiết mà không cần phải cài đặt một database mới với một schemas được cập nhật.Trong Phần một của hướng dẫn này, ta sẽ sử dụng Kho lưu trữ MongoDB để cài đặt version MongoDB mới nhất. Trong Phần hai, ta sẽ cài đặ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.
Yêu cầu
Để làm theo hướng dẫn này, bạn cần :
- Một server Ubuntu 16.04 được cấu hình với user
sudo
không phải root và firewall theo hướng dẫn cài đặt server ban đầu Ubuntu 16.04 .
Khi điều này được thực hiện, bạn đã sẵn sàng làm theo.
Phần một: Cài đặt server
Bước 1 - Thêm Kho lưu trữ MongoDB
MongoDB đã có trong repository Ubuntu, nhưng kho MongoDB chính thức cung cấp version mới nhất và là cách cài đặt phần mềm được khuyến khích . Trong bước này, ta sẽ thêm repository chính thức này vào server của ta .
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:
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
Vì 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
● 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:
OutputCreated 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 . Mọi user cũng có thể tạo và phá hủy database , cũng như đọc và ghi vào nội dung của họ theo mặc định. Điều này là phức tạp bởi 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, 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 mọi user 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 admin-user , cài đặt xác thực và kiểm tra.
Bước 1 - Thêm admin-user
Để thêm user của ta , 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 bật cho database và quyền truy cập đọc / ghi vào dữ liệu và cấu hình là không bị hạn chế.
OutputMongoDB 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 admin-user 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 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 chạy 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" } ] }
Gõ 'exit' và nhấn ENTER
hoặc sử dụng CTRL+C
để thoát khỏi ứng dụng client .
Đến đây, user của ta 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 - Cài đặ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:
. . . security: authorization: "enabled" . . .
Lưu ý 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 rằng 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:
OutputJan 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 của ta bị hạn chế:
- mongo
Bây giờ ta đã cài đặt xác thực , tất cả các cảnh báo trước đó đã được giải quyết.
OutputMongoDB 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 của ta có bị hạn chế hay không bằng lệnh show dbs
:
- show dbs
Output2017-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 việc 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ị của ta 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à administrator 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
:
OutputMongoDB 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
Outputadmin 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 phía 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 theo hướng đó, ta có thể thực hiện một 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 hoặc server cụ thể cần nó.
Bước 1 - Bật UFW
Trong Điều kiện tiên quyết trong Cài đặt 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
Khi nó được bật, hãy chạy lại trạng thái lệnh , 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 áp dụng các thay đổi đối với các yêu cầu , kết quả sẽ cho thấy chỉ OpenSSH mới được phép:
OutputStatus: 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
OutputTo 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 của ta vào file mongod.conf
.
- sudo nano /etc/mongod.conf
Trong net
đoạn thơ, thêm MongoHost
IP s' đến bindIp
dòng:
. . . 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
Đầu ra 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ó. Đế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 , phải 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 hiện có, thêm admin-user 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 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 kết nối từ các server yêu cầu quyền truy cập.
Bước tiếp theo:
- Để mã hóa dữ liệu khi chuyển tiếp, hãy xem tài liệu Bảo mật của MongoDB về Mã hóa Truyền tải
- Tìm hiểu thêm về cách sử dụng và quản trị MongoDB trong các bài viết cộng đồng DigitalOcean này .
Các tin liên quan
Cách cài đặt ionCube trên Ubuntu 16.042017-01-11
Cách thiết lập xác thực đa yếu tố cho SSH trên Ubuntu 16.04
2017-01-10
Cách chuyển cài đặt ownCloud sang Nextcloud trên Ubuntu 14.04
2017-01-06
Cách triển khai ứng dụng Node.js và MongoDB với Rancher trên Ubuntu 16.04
2017-01-05
Cách xây dựng Go từ Nguồn trên Ubuntu 16.04
2017-01-04
Cách thiết lập firewall với UFW trên Ubuntu 16.04
2016-12-22
Cách cài đặt và bảo mật Mosquitto MQTT Messaging Broker trên Ubuntu 16.04
2016-12-09
Cách cài đặt Puppet 4 trên Ubuntu 16.04
2016-12-09
Cách sử dụng Vault để bảo vệ dữ liệu nhạy cảm có thể xem được trên Ubuntu 16.04
2016-12-09
Cách cài đặt Discourse trên Ubuntu 16.04
2016-12-02